From 5d9a4a1fdc468eb46e9490d0096f086c47c9c6f2 Mon Sep 17 00:00:00 2001
From: Jaidyn Ann <10477760+JadedCtrl@users.noreply.github.com>
Date: Thu, 16 Nov 2023 14:57:31 -0600
Subject: [PATCH] Init
---
sfeed_mastodon | 96 ++++++++++++++++++++++++++++++++++++++++++++++++++
1 file changed, 96 insertions(+)
create mode 100755 sfeed_mastodon
diff --git a/sfeed_mastodon b/sfeed_mastodon
new file mode 100755
index 0000000..7e891d0
--- /dev/null
+++ b/sfeed_mastodon
@@ -0,0 +1,96 @@
+#!/bin/sh
+#―――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――
+# Name: sfeed_mastodon
+# Desc: Post feed data from sfeed to the fediverse.
+# Reqs: curl, jq
+# Date: 2023-11-16
+# Lisc: GPLv3
+# Auth: @jadedctrl@jam.xwx.moe
+#―――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――
+
+# Takes a post’s contents and create the corresponding client-API JSON.
+post_json() {
+ local message_text="$1"
+ printf '{ "content_type": "text/html", "visibility": "unlisted",'
+ printf '"status": "%s" }\n' "$message_text"
+}
+
+
+# Post a status with HTML content to the given Mastodon-compatible server.
+post_status() {
+ local server="$1"
+ local auth_token="$2"
+ local message_text="$3"
+
+ curl --request POST \
+ --header "Authorization: Bearer $auth_token" \
+ --header "Content-Type: application/json" \
+ --data "$(post_json "$message_text" | tr -d '\n')" \
+ "${server}/api/v1/statuses"
+}
+
+
+usage() {
+ echo "usage: $(basename "$0") server_url" 1>&2
+ echo "" 1>&2
+ echo "Your authorization key must be borrowed from your web-browser and" 1>&2
+ echo 'placed in the $FEDI_AUTH environment variable.' 1>&2
+ exit 2
+}
+
+
+url_deescape() {
+ sed 's@+@ @g;s@%@\\x@g' \
+ | xargs -0 printf "%b"
+}
+
+
+sfeed_post_text() {
+ local sfeed_line="$1"
+ local unix_date="$(echo "$line" | awk --field-separator '\t' '{print $1}')"
+ local title="$(echo "$line" | awk --field-separator '\t' '{print $2}')"
+ local url="$(echo "$line" | awk --field-separator '\t' '{print $3}' | url_deescape)"
+ local desc="$(echo "$line" | awk --field-separator '\t' '{print $4}' | tr -d '\n')"
+ local desc_snip="$(echo "$desc" | head -c250)[…]"
+
+ printf "$TEMPLATE" \
+ | tr -d '|' \
+ | sed "s|{{title}}|$title|g" \
+ | sed "s|{{unix_date}}|$unix_date|g" \
+ | sed "s|{{url}}|$url|g" \
+ | sed "s|{{desc}}|$desc|g" \
+ | sed "s|{{desc_short}}|$desc_snip|g"
+}
+
+
+post_sfeed_line() {
+ local server="$1"
+ local auth="$2"
+ local line="$3"
+ local message_text="$(sfeed_post_text "$line")"
+ post_status "$server" "$auth" "$message_text"
+}
+
+
+if test -z "$FEDI_AUTH"; then
+ echo 'You need to set the environment variable $FEDI_AUTH!' 1>&2
+ echo 'You can find your auth key by examining the "Authentication: Bearer" header' 1>&2
+ echo "used in requests by your server's web-client." 1>&2
+ echo 'In Firefox, F12→Network.' 1>&2
+ echo "" 1>&2
+ usage
+fi
+
+TEMPLATE='{{title}}
{{url}}
{{desc_short}}' + +SERVER_URL="$1" +if test -z "$SERVER_URL" -o "$1" = "-h" -o "$1" = "--help"; then + usage +fi + +IFS=" +" +while read line; do + post_sfeed_line "$SERVER_URL" "$FEDI_AUTH" "$line" +done +