checking for toots
The mastodon cli client toot
is pretty nice for tootin’. If I want to post something I can just toot post "some really unique thought"
and BAM it’s out there on the internet forever. It even supports media – EG echo 'can I pipe stuff into toot?' | toot post -m $(shot)
and I can put adhoc screenshots in there:
This is all well and good, but then I’m blind to when replies to toots happen (and with FOMO, I end up checking more often than I have too). Luckily, the toot cli client has a way to check for notifications. Unluckily, the toot nofications don’t come through in a very structured way, and there’s no way to get “unseen” notifications, it just sends everything (or well, some last N notifications):
$ toot notifications ──────────────────────────────────────────────────────────────────────────────────────────────────── @friend@linuxrocks.online mentioned you in @friend@linuxrocks.online 2020-04-28 16:22 @neeasade Hidden windows as in minimized? I thought, bspwm doesn't have that...? ID 104077129364588593 ↲ In reply to 104076791236950072 ──────────────────────────────────────────────────────────────────────────────────────────────────── ⁉️ Lazr ⁉️ @lazr@mstdn.io reblogged your status kitten mittens @neeasade 2020-04-28 14:56 bspwm breaks a little on with lots of hidden windows (see the smooshed boi in the gap) Media: https://mastodon.social/media/H7EiE9_nJzLtHDbPRxs ID 104076791236950072 ──────────────────────────────────────────────────────────────────────────────────────────────────── hazel :blobcatcomfy: @hazel@is.nota.live now follows you ──────────────────────────────────────────────────────────────────────────────────────────────────── ...
Note: There is the ability to clear all notifications, but then you also lose upstream history – I’d like to preserve that.
1. Rolling my own #
Alright, I need 2 things – a way to mark the current set of notifications as ’seen’ and a way to check the content of ’unseen’ notifications (I only care if mentions happen, not necessarily boots or favs). I need to delimit based on that weird separator.. at first I reached for grep and sed, but they don’t quite handle multiline iteration that well – awk has me covered though! After some searching I stumble upon the internal RS (record separator) variable. Since the value it takes is a regex, I can do the following to map over toots:
toot notifications | awk 'BEGIN { RS="\n─+\n" }; {print $0}'
And with diff, I can check if anything has changed (provided I save the seen notifications output somewhere). First I isolate to just the new content, and then I count how many of the new notifications contain “mentioned you” (I only have FOMO about conversation):
#!/usr/bin/env bash # to save the 'seen' state (will mapped to a click on the panel): # toot notifications >/tmp/toot-notifications.txt count=0 if ! diff=$(diff <(toot notifications) <(cat /tmp/toot-notifications)); then new_content=$(echo "$diff" | grep '^<' | sed 's/< //') count=$(echo "$new_content" | awk 'BEGIN { RS="\n─+\n" }; /mentioned you/{print "mentioned"}' | wc -l) fi echo "toot mentions: $count"
From there it’s a short trip to have a panel button, you just call the script!
With a click action to “Mark toots as seen”(just updating the temp file) and open up mastodon, I’m all set for some distration free tootin’ without the FOMO of mentions.