diff --git a/matrixpack.sh b/matrixpack.sh new file mode 100644 index 0000000000000000000000000000000000000000..2b81610a5b4d3216ac6fd33eee6cb92bbeee9d54 --- /dev/null +++ b/matrixpack.sh @@ -0,0 +1,165 @@ +#!/bin/bash +# Usage +# matrixpack token homeserver directory... +# +# Pack name is the directory name +# Sticker name is the file name +# /!\ Token is a sensitive information + +# UTILITY FUNCTIONS +function require { + hash $1 2>/dev/null || { + echo >&2 "Error: '$1' is required, but was not found."; exit 1; + } +} + +function slugify () { + echo "$1" | iconv -c -t ascii//TRANSLIT | sed -E 's/[~^]+//g' | sed -E 's/[^a-zA-Z0-9]+/-/g' | sed -E 's/^-+|-+$//g' | tr A-Z a-z +} + +# Display usage funtion +display_usage (){ + echo -e "\nUsage : ./matrixpack.sh token homeserver directory\n" +} + +# Erase http:// or https:// if added in the homeserver +slug_homeserver() { + echo "$1" | iconv -c -t ascii//TRANSLIT | sed -E 's/^http:\/\/|^https:\/\///g' | sed -E 's/^-+|-+$//g' +} + +# COMMON REQUIRED BINARIES +require convert +require montage +require identify +require python +require curl +require sed +require tr + +# Checking params +if test $# -lt 3 ; then + echo 1>&2 "$0:FATAL: invalid argument number (expected 3)" + display_usage + exit 1 +fi + +# Setting variables +token=$1 +homeserver=$(slug_homeserver $2) + +# Checking if the homeserver exist. +# If the homeserver does not exist, the file headers is not created +curl "https://$homeserver" -I -o headers -s +if test -f "headers"; then + rm headers +else + echo 1>&2 "$0:FATAL: The homeserver \"$2\" is incorrect." + exit 1 +fi + +# Checking if the token exist. +# Save the error value on file "headers" and +# evaluate it to verify the token +curl -s -X POST "https://$homeserver/_matrix/media/r0/upload?access_token=$token" | python3 -c "import sys, json; print(json.load(sys.stdin)['errcode'])" >> headers +while read line; do + if [[ ($line == "M_UNKNOWN") ]] + then + rm headers + else if [[ ($line == "M_UNKNOWN_TOKEN") ]] + then + echo "$0:ERROR: The token provided is incorrect or does not exist in this homeserver" + rm headers + exit 1 + else + echo "$0:ERROR: Not yet implemented error" + exit 1 + fi + fi +done < headers + +for i in "$@" +do + if [ -d "$i" ]; then + + # Changing directory to work directly in it + cd "$i" + dir=$(pwd) + packname=${dir##*/} + slug=$(slugify "$packname") + + # Printing informations + echo -e "Creating sticker pack : \033[94;1m$packname\033[0m\nhomeserver=\033[94m$homeserver\033[0m\noutput=\033[94m$slug\033[0m" + + # Making result folder + if ! [ -d $slug ]; then mkdir $slug; fi + if ! [ -d "$slug/tmp" ]; then mkdir "$slug/tmp"; fi + echo -n "{\"title\":\"$packname\",\"id\":\"$slug\",\"stickers\":[" > "$slug/$slug.json" + + first="" + for f in * + do + # Ignore folders + if [ -f "$f" ]; then + + # Resizing large images + width=$(identify -format "%w" "$f"[0])> /dev/null + height=$(identify -format "%h" "$f"[0])> /dev/null + if [ $width -gt 256 ]; then + width="256"; + fi + if [ $height -gt 256 ]; then + height="256"; + fi + + echo -n "$f : " + type="png" + opts="-type TrueColor PNG32:" + + # Gif + if [[ "$f" == *.gif ]]; then + type="gif" + opts="" + fi + + # Erase the extension of the image + sticker_name=$(echo "$f" | cut -f 1 -d '.') + + # Trim, resize and remove indexed palette from image + echo -n "trimming and resizing" + convert "$f" -bordercolor none -border 1 "$slug/tmp/$f.$type" + echo -n "." + convert "$slug/tmp/$f.$type" -trim +repage "$slug/tmp/$f.$type" + echo -n "." + convert -background none -gravity center "$slug/tmp/$f.$type" -resize "${width}x$height" $opts"$slug/tmp/$f.$type" + echo -ne ". \033[92mdone\033[0m! " + + # First item in array + echo -n "$first" >> "$slug/$slug.json" + + # Uploading image + echo -n "uploading." + mxc=$(curl -s -X POST -H "Content-Type: image/$type" --data-binary "@$slug/tmp/$f.$type" "https://$homeserver/_matrix/media/r0/upload?access_token=$token" | python -c "import sys, json; print(json.load(sys.stdin)['content_uri'])") + echo -n "." + + # Calculating 128x128> format + convert "$slug/tmp/$f.$type" -resize "128x128" "$slug/tmp/size" + width=$(identify -format "%w" "$slug/tmp/size"[0])> /dev/null + height=$(identify -format "%h" "$slug/tmp/size"[0])> /dev/null + + # Appending to json + echo -n "{\"body\":\"$sticker_name\",\"info\":{\"mimetype\":\"image/$type\",\"h\":$height,\"w\":$width,\"thumbnail_url\":\"$mxc\"},\"msgtype\":\"m.sticker\",\"url\":\"$mxc\",\"id\":\"$packname-$sticker_name\"}" >> "$slug/$slug.json" + first="," + echo -e ". \033[92msuccess\033[0m!" + fi + done + + rm "$slug/tmp/size" + montage "$slug/tmp/*"[0] -background none "$slug/preview.png" + rm -r "$slug/tmp" + echo -ne "# $packname \n" > "$slug/README.md" + echo -n "]}" >> "$slug/$slug.json" + cd - > /dev/null + echo -e "\033[92;1mPack successfully created!\n\033[0mCheck \033[94;1m$dir/$slug \033[0mfor output" + + fi +done diff --git a/stpkg b/stpkg index 79372f711f7e3ed1f527a952f0785caeb71d4d5a..451d115bdc8e6db8229238b38d1ccf9f05ab3569 100755 --- a/stpkg +++ b/stpkg @@ -605,10 +605,12 @@ __edit() { local ST_JSON=$(create_sticker_json "$PACK_NAME" "$NAME" "$WIDTH" "$HEIGHT" "$TYPE" "$MXC") jq ".stickers += [$ST_JSON]" < $TEMP | sponge $TEMP ;; + del) [ $# -ne 0 ] && die "Extra argument are present: $*" jq "del(.stickers[] | select(.body == \"$STICKER_NAME\"))" < "$TEMP" | sponge "$TEMP" ;; + *) die "Unknown action '$ACTION', should be 'add' or 'del'" ;;