Initial commit
This commit is contained in:
commit
f7218b5005
1
.gitignore
vendored
Normal file
1
.gitignore
vendored
Normal file
|
@ -0,0 +1 @@
|
||||||
|
result
|
21
LICENSE
Normal file
21
LICENSE
Normal file
|
@ -0,0 +1,21 @@
|
||||||
|
MIT License
|
||||||
|
|
||||||
|
Copyright (c) 2023 h7x4
|
||||||
|
|
||||||
|
Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||||
|
of this software and associated documentation files (the "Software"), to deal
|
||||||
|
in the Software without restriction, including without limitation the rights
|
||||||
|
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||||
|
copies of the Software, and to permit persons to whom the Software is
|
||||||
|
furnished to do so, subject to the following conditions:
|
||||||
|
|
||||||
|
The above copyright notice and this permission notice shall be included in all
|
||||||
|
copies or substantial portions of the Software.
|
||||||
|
|
||||||
|
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||||
|
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||||
|
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||||
|
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||||
|
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||||
|
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
||||||
|
SOFTWARE.
|
60
README.md
Normal file
60
README.md
Normal file
|
@ -0,0 +1,60 @@
|
||||||
|
[![built with nix](https://builtwithnix.org/badge.svg)](https://builtwithnix.org)
|
||||||
|
|
||||||
|
# maunium-stickerpicker-nix
|
||||||
|
|
||||||
|
Nix wrapper for [maunium/stickerpicker][maunium-stickerpicker]
|
||||||
|
|
||||||
|
## Usage:
|
||||||
|
|
||||||
|
Here's an example of a stickerpicker
|
||||||
|
|
||||||
|
```nix
|
||||||
|
myStickerPicker = createStickerPicker {
|
||||||
|
homeserver = "https://my.matrix.server";
|
||||||
|
userId = "@stickerbot:my.matrix.server";
|
||||||
|
# You should probably encrypt this with either agenix, sops-nix or whatever else
|
||||||
|
accessTokenFile = ./stickerbot_access_token.txt;
|
||||||
|
sha256 = "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA=";
|
||||||
|
packs = [
|
||||||
|
{
|
||||||
|
type = "chatsticker";
|
||||||
|
name = "pompom-tao3";
|
||||||
|
}
|
||||||
|
{
|
||||||
|
type = "directory";
|
||||||
|
src = ./myHomemadeStickers;
|
||||||
|
}
|
||||||
|
];
|
||||||
|
};
|
||||||
|
```
|
||||||
|
|
||||||
|
Afterwards, you can easily host it in an nginx config
|
||||||
|
|
||||||
|
```nix
|
||||||
|
{ ... }:
|
||||||
|
{
|
||||||
|
services.nginx.enable = true;
|
||||||
|
services.nginx.virtualHosts."stickers.myhost.org" = {
|
||||||
|
root = myStickerPicker;
|
||||||
|
};
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
## List of available fetchers
|
||||||
|
|
||||||
|
| Site | Type Name |Required Arguments |
|
||||||
|
|------|-----------|-------------------|
|
||||||
|
| `<local dir>` | `directory` | `src` (path to a local dir with image files) |
|
||||||
|
| https://chatsticker.com | `chatsticker` | `name` (see url) |
|
||||||
|
|
||||||
|
## Some notes
|
||||||
|
|
||||||
|
To use this, leave the `sha256` empty at first, build the stickerspicker with whatever stickers you'd like, and paste the `sha256` from the error message back into your code.
|
||||||
|
|
||||||
|
Normally, [maunium/stickerpicker][maunium-stickerpicker] would cache the stickers in a config file, and reuse the config file on the next run in order not to.
|
||||||
|
This does not work with Nix' determinism.
|
||||||
|
Thus every time you want to add just 1 more stickerpack (or any other kind of edit), this will reupload all stickers.
|
||||||
|
In order to make it easier to delete all sticker once in a while, I would recommend creating a separate user (I've called mine `stickerbot`), whose only purpose is to be the owner of a bunch of sticker media files.
|
||||||
|
Whenever you want to clean up the media store, just delete all the media file of `stickerbot` (**THIS WILL BREAK OLDER MESSAGES**)
|
||||||
|
|
||||||
|
[maunium-stickerpicker]: https://github.com/maunium/stickerpicker
|
85
createStickerPicker.nix
Normal file
85
createStickerPicker.nix
Normal file
|
@ -0,0 +1,85 @@
|
||||||
|
{
|
||||||
|
lib,
|
||||||
|
maunium-stickerpicker,
|
||||||
|
stickerpicker-tools,
|
||||||
|
fetchers,
|
||||||
|
|
||||||
|
callPackage,
|
||||||
|
stdenvNoCC,
|
||||||
|
writeText,
|
||||||
|
|
||||||
|
cacert,
|
||||||
|
...
|
||||||
|
}:
|
||||||
|
{
|
||||||
|
homeserver ? "https://matrix.org",
|
||||||
|
userId,
|
||||||
|
accessTokenFile,
|
||||||
|
packs,
|
||||||
|
hash ? "",
|
||||||
|
sha256 ? ""
|
||||||
|
}:
|
||||||
|
with lib;
|
||||||
|
if !(all builtins.isAttrs packs) then
|
||||||
|
throw "createStickerPack: not all packs are attrsets"
|
||||||
|
else if !(all (x: x ? "type") packs) then
|
||||||
|
throw ''createStickerPack: Not all packs have the "type" attribute''
|
||||||
|
else if !(all (x: builtins.isString x.type) packs) then
|
||||||
|
throw ''createStickerPack: Not all packs have a "type" attribute of type string''
|
||||||
|
else let
|
||||||
|
invalidTypes = filter (x: !(fetchers ? "${x.type}-build")) packs;
|
||||||
|
in if invalidTypes != [ ] then throw ''
|
||||||
|
createStickerPack: Not all packs have a valid "type" attribute.
|
||||||
|
|
||||||
|
The following types does not exist:
|
||||||
|
${concatStringsSep "\n" (map (x: " ${x.type}") invalidTypes)}
|
||||||
|
''
|
||||||
|
else let
|
||||||
|
stickerDownloadInstructions = pipe packs [
|
||||||
|
(map (x: fetchers."${x.type}-build" x))
|
||||||
|
(concatStringsSep "\n")
|
||||||
|
];
|
||||||
|
|
||||||
|
stickerDownloadDependencies = pipe packs [
|
||||||
|
(map (x: fetchers."${x.type}-deps"))
|
||||||
|
builtins.concatLists
|
||||||
|
];
|
||||||
|
|
||||||
|
config-json = writeText "stickerpicker-config.json" ''
|
||||||
|
{
|
||||||
|
"homeserver": "${homeserver}",
|
||||||
|
"user_id": "${userId}",
|
||||||
|
"access_token": "${fileContents accessTokenFile}"
|
||||||
|
}
|
||||||
|
'';
|
||||||
|
in stdenvNoCC.mkDerivation {
|
||||||
|
name = "stickerpicker";
|
||||||
|
src = maunium-stickerpicker;
|
||||||
|
|
||||||
|
outputHashAlgo = if hash != "" then null else "sha256";
|
||||||
|
outputHashMode = "recursive";
|
||||||
|
outputHash = if hash != "" then
|
||||||
|
hash
|
||||||
|
else if sha256 != "" then
|
||||||
|
sha256
|
||||||
|
else
|
||||||
|
fakeSha256;
|
||||||
|
|
||||||
|
buildInputs = [
|
||||||
|
stickerpicker-tools
|
||||||
|
cacert
|
||||||
|
] ++ stickerDownloadDependencies;
|
||||||
|
|
||||||
|
buildPhase = ''
|
||||||
|
mkdir images
|
||||||
|
IMG_DIR="$(pwd)/images"
|
||||||
|
STICKERPACKS_DIR="$(pwd)/web/packs"
|
||||||
|
STICKER_CONFIG="${config-json}"
|
||||||
|
|
||||||
|
${stickerDownloadInstructions}
|
||||||
|
'';
|
||||||
|
|
||||||
|
installPhase = ''
|
||||||
|
mv web $out
|
||||||
|
'';
|
||||||
|
}
|
50
fetchers.nix
Normal file
50
fetchers.nix
Normal file
|
@ -0,0 +1,50 @@
|
||||||
|
{ pkgs, lib, ... }: let
|
||||||
|
baseFetcher = { instructions, type, title, id ? "", dir }: let
|
||||||
|
dirname = "${type}-${dir}";
|
||||||
|
in ''
|
||||||
|
pushd $IMG_DIR
|
||||||
|
mkdir '${dirname}'
|
||||||
|
pushd '${dirname}'
|
||||||
|
|
||||||
|
${instructions}
|
||||||
|
|
||||||
|
popd
|
||||||
|
|
||||||
|
sticker-pack \
|
||||||
|
--config "$STICKER_CONFIG" \
|
||||||
|
--add-to-index "$STICKERPACKS_DIR" \
|
||||||
|
--title '${title}' \
|
||||||
|
'${dirname}'
|
||||||
|
|
||||||
|
popd
|
||||||
|
'';
|
||||||
|
in {
|
||||||
|
directory-deps = [ ];
|
||||||
|
directory-build = { src, id ? "", title ? "", ... }: baseFetcher {
|
||||||
|
inherit id title;
|
||||||
|
type = "directory";
|
||||||
|
dir = builtins.baseNameOf src;
|
||||||
|
instructions = ''
|
||||||
|
ln -s ${src}/* .
|
||||||
|
'';
|
||||||
|
};
|
||||||
|
|
||||||
|
chatsticker-deps = with pkgs; [ wget html-xml-utils ];
|
||||||
|
chatsticker-build = { name, id ? "", title ? "", ... }: baseFetcher {
|
||||||
|
inherit id title;
|
||||||
|
type = "chatstickers";
|
||||||
|
dir = name;
|
||||||
|
instructions = ''
|
||||||
|
wget "https://chatsticker.com/sticker/${name}" -O raw.html
|
||||||
|
hxnormalize -l 240 -x raw.html > normalized.html
|
||||||
|
cat normalized.html | hxselect -s '\n' -c ".img-fluid::attr(src)" > images.txt;
|
||||||
|
sed -i 's|;compress=true||' images.txt
|
||||||
|
|
||||||
|
for url in $(cat images.txt); do
|
||||||
|
wget $url
|
||||||
|
done
|
||||||
|
|
||||||
|
rm raw.html normalized.html images.txt
|
||||||
|
'';
|
||||||
|
};
|
||||||
|
}
|
43
flake.lock
Normal file
43
flake.lock
Normal file
|
@ -0,0 +1,43 @@
|
||||||
|
{
|
||||||
|
"nodes": {
|
||||||
|
"maunium-stickerpicker": {
|
||||||
|
"flake": false,
|
||||||
|
"locked": {
|
||||||
|
"lastModified": 1668509918,
|
||||||
|
"narHash": "sha256-5Kbok9vJIlOti+ikpJXv2skdADhQQTjX5mVmBTM0wGU=",
|
||||||
|
"owner": "maunium",
|
||||||
|
"repo": "stickerpicker",
|
||||||
|
"rev": "f59406a47a6778cd402e656ffb64f667335f665a",
|
||||||
|
"type": "github"
|
||||||
|
},
|
||||||
|
"original": {
|
||||||
|
"owner": "maunium",
|
||||||
|
"repo": "stickerpicker",
|
||||||
|
"type": "github"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"nixpkgs": {
|
||||||
|
"locked": {
|
||||||
|
"lastModified": 1672441588,
|
||||||
|
"narHash": "sha256-jx5kxOyeObnVD44HRebKYL3cjWrcKhhcDmEYm0/naDY=",
|
||||||
|
"owner": "NixOS",
|
||||||
|
"repo": "nixpkgs",
|
||||||
|
"rev": "6a0d2701705c3cf6f42c15aa92b7885f1f8a477f",
|
||||||
|
"type": "github"
|
||||||
|
},
|
||||||
|
"original": {
|
||||||
|
"id": "nixpkgs",
|
||||||
|
"ref": "nixos-22.11",
|
||||||
|
"type": "indirect"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"root": {
|
||||||
|
"inputs": {
|
||||||
|
"maunium-stickerpicker": "maunium-stickerpicker",
|
||||||
|
"nixpkgs": "nixpkgs"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"root": "root",
|
||||||
|
"version": 7
|
||||||
|
}
|
41
flake.nix
Normal file
41
flake.nix
Normal file
|
@ -0,0 +1,41 @@
|
||||||
|
{
|
||||||
|
inputs = {
|
||||||
|
nixpkgs.url = "nixpkgs/nixos-22.11";
|
||||||
|
|
||||||
|
maunium-stickerpicker = {
|
||||||
|
url = "github:maunium/stickerpicker";
|
||||||
|
flake = false;
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
|
outputs = { self, nixpkgs, maunium-stickerpicker }: let
|
||||||
|
system = "x86_64-linux";
|
||||||
|
pkgs = nixpkgs.legacyPackages.${system};
|
||||||
|
fetchers = pkgs.callPackage ./fetchers.nix { };
|
||||||
|
createStickerPicker = pkgs.callPackage ./createStickerPicker.nix {
|
||||||
|
inherit maunium-stickerpicker fetchers;
|
||||||
|
inherit (self.packages.${system}) stickerpicker-tools;
|
||||||
|
};
|
||||||
|
in {
|
||||||
|
inherit createStickerPicker;
|
||||||
|
|
||||||
|
packages.${system} = {
|
||||||
|
default = self.packages.${system}.stickerpicker-tools;
|
||||||
|
stickerpicker-tools = pkgs.python3Packages.buildPythonPackage {
|
||||||
|
name = "stickerpicker-tools";
|
||||||
|
src = maunium-stickerpicker;
|
||||||
|
|
||||||
|
propagatedBuildInputs = with pkgs.python3Packages; [
|
||||||
|
aiohttp
|
||||||
|
yarl
|
||||||
|
pillow
|
||||||
|
telethon
|
||||||
|
cryptg
|
||||||
|
python-magic
|
||||||
|
pkgs.cacert
|
||||||
|
];
|
||||||
|
doCheck = false;
|
||||||
|
};
|
||||||
|
};
|
||||||
|
};
|
||||||
|
}
|
Loading…
Reference in a new issue