Add invocation/command arguments/help message

Now it’s actually somewhat useable! ^_^
This commit is contained in:
Jaidyn Ann 2024-04-10 18:14:36 -05:00
parent fbcc683cd9
commit 7f82bb79ee

102
manicito
View File

@ -6,7 +6,41 @@
# Date: 2024-04-10 # Date: 2024-04-10
#――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――― #―――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――
MANICITO_TEMPLATE='$USER (<a href="$USER_URL">$USERHOST</a>) <a href="$POST_URL">posted</a> about $TAG: <blockquote>$(echo "$POST" | head -c 200)</blockquote>' if test -z "$MANICITO_TEMPLATE"; then
MANICITO_TEMPLATE='$USER (<a href="$USER_URL">$USERHOST</a>) <a href="$POST_URL">posted</a> about $HASHTAG: <blockquote>$(echo "$POST" | head -c 200)</blockquote>'
fi
# Prints a simple usage message.
usage() {
echo "usage: $(basename $0) [-h] [-H HISTORY_FILE] HASHTAG SERVER_URL"
echo 'Mastodon/Pleroma/etc script to quote-posts all posts of a given hashtag.'
echo
echo ' -h print this message and exit'
echo ' -H file used to store/check quoted posts; to avoid duplicates'
echo
echo 'Posts tagged under HASHTAG will all be quote-posted to the'
echo 'Mastodon-compatible server at SERVER_URL.'
echo
echo 'In order to make these posts, you must set the environment variable $FEDI_AUTH'
echo 'to your authorization token. To find your authorization token, you can snoop '
echo 'through request headers in your web-browser. In Firefox, you can do:'
echo ' Developer Tools (F12) → Network → Headers'
echo 'Look for your $FEDI_AUTH value in the Authorization header like so:'
echo ' Authorization: Bearer $FEDI_AUTH'
echo
echo 'To avoid duplicate-posts, you should specify a “history” file with the -H'
echo 'parameter. With this, all quoted post IDs will be saved in this file, and'
echo 'on subsequent runs (so long as you dont change the history-file), no post'
echo 'will be quoted twice.'
echo
echo 'The environment variable $MANICITO_TEMPLATE is used create the body of your'
echo 'quote-posts. It substitutes the following shell-variables in templates:'
echo ' • $HASHTAG'
echo ' • $POST'
echo ' • $POST_URL'
echo ' • $USER'
echo ' • $USER_URL'
}
# Given a posts JSON, create and submit a quote-post for it. # Given a posts JSON, create and submit a quote-post for it.
@ -67,16 +101,28 @@ post_body() {
# echo $post_array_json | filter_posts $history_file # echo $post_array_json | filter_posts $history_file
filter_posts() { filter_posts() {
local history_file="$1" local history_file="$1"
local ids_to_filter="$(history_post_ids "$history_file")"
# If the history file exists and has more than five characters, use it to filter… (sanity check) # If the history file exists and has more than five characters, use it to filter… (sanity check)
if test -f "$history_file" -a "$(wc --bytes "$history_file" | awk '{print $1}')" -gt 5; then if test -n "$ids_to_filter" -a "$(wc --bytes "$ids_to_filter" | awk '{print $1}')" -gt 5; then
jq -cr .[] \ jq -cr .[] \
| grep --invert-match $(sort "$history_file" | uniq | grep -v '^[[:space:]]*$' | sed 's%^%-e %') | grep --invert-match $(echo "$ids_to_filter" | sed 's%^%-e %')
else else
jq -cr .[] jq -cr .[]
fi fi
} }
history_post_ids() {
local history_file="$1"
if test -f "$history_file"; then
sort -n "$history_file" \
| uniq \
| grep -v '^[[:space:]]*$' \
| awk '{ print $2 }'
fi
}
# Pipe in fediverse posts in JSON format; these will all be echoed into the given # Pipe in fediverse posts in JSON format; these will all be echoed into the given
# “history file”, so that they can be filtered out and avoided on subsequent # “history file”, so that they can be filtered out and avoided on subsequent
# runs. # runs.
@ -86,7 +132,6 @@ update_filter() {
if test -f "$history_file"; then if test -f "$history_file"; then
jq -r '(.created_at + "\t" + .id)' \ jq -r '(.created_at + "\t" + .id)' \
| sort -n \ | sort -n \
| awk -F '\t' '{print $2}' \
>> "$history_file" >> "$history_file"
fi fi
} }
@ -115,8 +160,49 @@ env_subst() {
} }
FEDI_SERVER="https://jam.xwx.moe"
curl "$FEDI_SERVER/api/v1/timelines/tag/esperanto" \ while getopts 'hH:' arg; do
| filter_posts "m" \ case $arg in
h)
usage
exit 0
;;
H)
HISTORY_FILE="$OPTARG"
;;
esac
done
shift $((OPTIND-1))
HASHTAG="$1"
FEDI_SERVER="$2"
if test -z "$HASHTAG"; then
usage
exit 1
fi
if test -z "$FEDI_AUTH"; then
1>&2 echo 'You need to set the environment variable $FEDI_AUTH!'
1>&2 echo 'You can find your auth key by examining the "Authorization: Bearer" header'
1>&2 echo "used in requests by your server's web-client."
1>&2 echo 'In Firefox, F12→Network.'
1>&2 echo ""
exit 2
fi
if test -z "$FEDI_SERVER"; then
1>&2 echo 'No server specified!'
1>&2 echo 'Make sure to provide a hashtag (like #esperanto) and a'
1>&2 echo 'server URL (like https://fedi.server) as the last two arguments.'
1>&2 echo
1>&2 echo 'Run with -h for more information.'
exit 3
fi
curl "$FEDI_SERVER/api/v1/timelines/tag/$HASHTAG" \
| filter_posts "$HISTORY_FILE" \
| quote_posts \ | quote_posts \
| update_filter "m" | update_filter "$HISTORY_FILE"