Compare commits

..

No commits in common. "master" and "master" have entirely different histories.

10 changed files with 148 additions and 216 deletions

View File

@ -1,10 +0,0 @@
---
kind: pipeline
name: shellcheck
steps:
- name: shellcheck
image: koalaman/shellcheck-alpine:stable
commands:
- shellcheck -x bot.sh

4
.gitignore vendored
View File

@ -1,9 +1,7 @@
toot.json
*-toot.json
input.txt
log.txt
.bot.cfg
subscribers.txt
email-subscribers.txt
now_playing.txt
account.ini

View File

@ -1,4 +1,4 @@
# radiobot (legacy)
# radiobot
super simple bot
@ -8,8 +8,3 @@ it:
drop webhook.php somewhere in a webroot and update `now_playing_file` in bot.properties to point to now_playing.txt in that dir.
this code is very bad and should probably be rewritten from scratch.
UPDATE: it has been rewritten from scratch as a module for [bitbot](https://bitbot.dev)
the module code can be found [here](https://tildegit.org/ben/bitbot-modules/src/branch/master/tilderadio.py)

View File

@ -1,3 +0,0 @@
account=bensbots
password=my super secret password

View File

@ -2,8 +2,9 @@ server="localhost"
port="6667"
npfile="now_playing.txt"
channel="tilderadio"
notify_channels="meta team club $channel"
notify_channels="meta team yourtilde club tildetel envs $channel"
link="https://tilderadio.org/listen"
schedule="https://tilderadio.org/schedule/"
source="https://tildegit.org/tilderadio/radiobot"
source="https://tildegit.org/ben/radiobot"
nick="radiobot"
log="log.txt"

309
bot.sh
View File

@ -1,211 +1,176 @@
#!/usr/bin/env bash
#!/bin/bash
# read configs
. bot.properties
input=".bot.cfg"
echo "Starting session: $(date "+[%y:%m:%d %T]")" > $log
echo "NICK $nick" > $input
echo "USER $nick 0 * :$nick" >> $input
echo "MODE $nick +B" >> $input
# not registered and identified
reg=""
# reset input file
rm input.txt && touch input.txt
printf "starting %s: %s\n" "$nick" "$(date "+[%y:%m:%d %T]")"
function send {
printf "> %s: %s\n" "$(date "+[%y:%m:%d %T]")" "$1"
printf "%b\r\n" "$1" >> input.txt
}
function msg {
send "PRIVMSG $1 :$2"
function save_info {
now_playing=$(<$npfile)
}
function parse_dj {
grep -Eo '^\([^)]*\)' $npfile | sed 's/[()]//g' | xargs
grep -Eo '^\([^)]*\)' $npfile | sed 's/[()]//g' | xargs
}
# save current dj info on startup
now_playing=$(<$npfile)
function msg {
echo "PRIVMSG ${1} :${2}" >> $input
}
# save info on startup
save_info
dj=$(parse_dj)
# connect and register
send "NICK $nick"
send "USER $nick 0 * :$nick"
send "MODE $nick +B"
# main loop
tail -f input.txt | telnet $server $port | while read -r buf
tail -f $input | telnet $server $port | while read res
do
# trim \r's
line=$(printf %b "$buf" | tr -d $'\r')
# log the session
echo "$(date "+[%y:%m:%d %T]")$res" >> $log
# log the received line
printf "< %s: %s\n" "$(date "+[%y:%m:%d %T]")" "$line"
# now playing
if [[ $now_playing != "$(<$npfile)" ]]; then
save_info
[[ ! -z "${dj}" ]] && echo -e "PRIVMSG #$channel :\x0303$now_playing" >> $input
fi
# now playing
if [ "$now_playing" != "$(<$npfile)" ]; then
now_playing=$(<$npfile)
# new dj!
if [[ $dj != $(parse_dj) ]]; then
dj=$(parse_dj)
if [[ ! -z "${dj}" ]]; then
for chan in $notify_channels; do
msg "#$chan" "$dj is now online playing $now_playing! tune in now here: $link"
done
# print the new song if a dj is streaming
if [ -n "$dj" ]; then
msg "#$channel" "\x0303$now_playing"
fi
while read -u 10 subscriber; do
msg $subscriber "$dj is now online playing $now_playing! tune in now here: $link"
done 10< subscribers.txt
while read -u 11 subscriber email_addr; do
sed -e "s/<dj>/$dj/g" \
-e "s|<link>|$link|g" \
-e "s/<now_playing>/$now_playing/g" \
-e "s/<email_addr>/$email_addr/g" dj-online-email.tmpl \
| sendmail $email_addr
done 11< email-subscribers.txt
for json in . ./yourtilde ./team; do
TOOT_JSON_PATH=$json toot "dj $dj is now streaming live on https://tilderadio.org! tune in here: $link"
done
fi
fi
# new dj!
if [ "$dj" != "$(parse_dj)" ]; then
dj=$(parse_dj)
if [ -n "$dj" ]; then
for chan in $notify_channels; do
msg "#$chan" "$dj is now online playing $now_playing! tune in now here: $link"
done
# do things when you see output
case "$res" in
# respond to ping requests from the server
PING*)
echo "$res" | sed "s/I/O/" >> $input
;;
while IFS= read -r -u 10 subscriber; do
msg "$subscriber" "$dj is now online playing $now_playing! tune in now here: $link"
done 10< subscribers.txt
# make sure we're joined
*376*|*404*)
for chan in $notify_channels; do
echo "JOIN #$chan" >> $input
done
;;
while read -r -u 11 subscriber email_addr; do
sed -e "s/<dj>/$dj/g" \
-e "s|<link>|$link|g" \
-e "s/<now_playing>/$now_playing/g" \
-e "s/<email_addr>/$subscriber <$email_addr>/g" dj-online-email.tmpl \
| sendmail "$email_addr"
done 11< email-subscribers.txt
# run when a message is seen
*PRIVMSG*)
echo "$res"
who=$(echo "$res" | perl -pe "s/:(.*)\!.*@.*/\1/")
from=$(echo "$res" | perl -pe "s/.*PRIVMSG (.*[#]?([a-zA-Z]|\-)*) :.*/\1/")
echo $who $from
for json in ./*-toot.json; do
toot --creds "$json" "dj $dj is now streaming live on #tilderadio! tune in here: $link"
done
fi
fi
# "#" would mean it's a channel
if [ "$(echo "$from" | grep '^#')" ]; then
test "$(echo "$res" | grep ":$nick:")" || continue
will=$(echo "$res" | perl -pe "s/.*:$nick:(.*)/\1/")
else
will=$(echo "$res" | perl -pe "s/.*$nick :(.*)/\1/")
from=$who
fi
will=$(echo "$will" | perl -pe "s/^ //")
com=$(echo "$will" | cut -d " " -f1)
# do things when you see output
case "$line" in
# respond to ping requests from the server
PING*)
send "$(printf %s "$line" | sed "s/I/O/")"
;;
case "$com" in
subscribe)
if grep -q $who subscribers.txt; then
msg $from "you're already subscribed! :)"
else
echo $who >> subscribers.txt
msg $from "i'll send you a direct message when a dj starts streaming!"
fi
;;
# log in to services
*001*) # RPL_WELCOME
if [ -z "$reg" ] && [ -f account.ini ]; then
. account.ini
send "SQUERY NickServ identify $account $password"
fi
;;
unsubscribe)
sed -i "/$who/d" subscribers.txt
msg $from "i'll stop sending you updates."
;;
# grab account name if authentication successful
*900*) # RPL_LOGGEDIN
reg=$(printf %s "$line" | sed -E "s/.* (.*) :.*/\1/")
printf "successfully logged in as '%s'\n" "$reg"
;;
email-subscribe)
if grep -q $who email-subscribers.txt; then
msg $from "you're already subscribed! :)"
else
email_addr=$(echo "$will" | cut -d " " -f2)
echo "$who $email_addr" >> email-subscribers.txt
msg $from "i'll send you an email when a dj starts streaming!"
fi
;;
# make sure we're joined
*376*) # RPL_ENDOFMOTD
for chan in $notify_channels; do
send "JOIN #$chan"
done
;;
email-unsubscribe)
sed -i "/$who/d" email-subscribers.txt
msg $from "i'll stop sending you email updates."
;;
# run when a message is seen
*PRIVMSG*)
who=$(printf "%s" "$line" | sed -E "s/:(.*)\!.*@.*/\1/")
from=$(printf "%s" "$line" | sed -E "s/.*PRIVMSG (.*[#]?([a-zA-Z]|\-)*) :.*/\1/")
time)
msg $from "$(TZ=UTC date)"
;;
# "#" would mean it's a channel
if printf %s "$from" | grep -q "^#"; then
# channel messages need to contain our nick
printf %s "$line" | grep -q ":$nick:" || continue
trailing=$(printf %s "$line" | sed -E "s/.*:$nick:(.*)/\1/")
else
trailing=$(printf %s "$line" | sed -E "s/.*$nick :(.*)/\1/")
from="$who"
fi
np)
msg $from "$now_playing"
;;
# trim leading and split args on space
IFS=" " read -r -a args <<< "$(printf %s "$trailing" | sed -E "s/^ //")"
dj)
msg $from "${dj:-"no one"} is on the air now"
;;
case "${args[0]}" in
subscribe)
if grep -q "$who" subscribers.txt; then
msg "$from" "you're already subscribed! :)"
else
printf "%s\n" "$who" >> subscribers.txt
msg "$from" "i'll send you a direct message when a dj starts streaming!"
fi
;;
link)
msg $from "$link"
;;
unsubscribe)
sed -i"" "/$who/d" subscribers.txt
msg "$from" "i'll stop sending you updates."
;;
source)
msg $from "$source"
;;
email-subscribe)
if grep -q "$who" email-subscribers.txt; then
msg "$from" "you're already subscribed! :)"
else
if (( "${#args[1]}" > 0 )); then
printf "%s %s\n" "$who" "${args[1]}" >> email-subscribers.txt
msg "$from" "i'll send you an email when a dj starts streaming!"
else
msg "$from" "please provide an address to email when a dj starts streaming"
fi
fi
;;
schedule)
msg $from "$schedule"
;;
email-unsubscribe)
sed -i"" "/$who/d" email-subscribers.txt
msg "$from" "i'll stop sending you email updates."
;;
help)
msg $from "hey hi, my commands are subscribe, unsubscribe, np, dj, link, slogan, and schedule. if you prefer email notifications, you can use radiobot: email-subscribe you@example.com"
;;
time|date|now)
msg "$from" "UTC time is currently $(LANG=C TZ=UTC date)"
;;
radio|slogan)
msg $from "$(shuf -n1 slogans.txt)"
;;
np)
msg "$from" "$now_playing"
;;
paymybills)
msg $from "whaddya mean?! i'm broker than you!"
;;
dj)
msg "$from" "${dj:-"no one"} is on the air now"
;;
*)
echo "no command: $res"
;;
link)
msg "$from" "$link"
;;
esac
;;
source)
msg "$from" "$source"
;;
schedule|upnext|un)
# get next scheduled streaming time
json=$(curl -s "https://radio.tildeverse.org/api/station/1/schedule?rows=1" | jq ".[]")
nextdj=$(jq -r .name <<< "$json")
nexttime=$(LANG=C TZ=UTC date -d "$(jq -r .start <<< "$json")")
nexttimesecs=$(LANG=C TZ=UTC date -d "$nexttime" +%s)
timediff=$(TZ=UTC awk -v d="$nexttimesecs" 'BEGIN { then=d; now=systime(); print strftime("%Hh %Mm", then - now); }')
msg "$from" "$schedule - $nextdj will be on at $nexttime (in $timediff)"
;;
help)
msg "$from" "hey hi, my commands are np, dj, link, slogan, schedule, time, [un]subscribe, email-[un]subscribe. please provide an address when subscribing via email."
;;
radio|slogan)
msg "$from" "$(shuf -n1 slogans.txt)"
;;
paymybills)
msg "$from" "whaddya mean?! i'm broker than you!"
;;
*) ;;
esac
;;
# else
*) ;;
esac
# else
*)
echo "$res"
;;
esac
done

View File

@ -5,7 +5,7 @@ After=radiobot.service
[Service]
Type=simple
WorkingDirectory=/home/ben/workspace/radiobot
ExecStart=/bin/bash bot.sh
ExecStart=/bin/bash /home/ben/workspace/radiobot/bot.sh
Restart=always
RestartSec=5
StartLimitInterval=60s

View File

@ -27,5 +27,3 @@ music for your brain meats
Dizzy? We stop the world from spinning
Where Disney Princesses Go Slumming
any slogan but "eat the poop or die"
that's not what she said!
not product placement, we promise! (tildestore.com)

View File

@ -1,22 +1,14 @@
<?php
$debug = false;
$input = file_get_contents("php://input");
$tilderadio = json_decode($input, true);
if ($debug) {
$timestamp = date("c");
file_put_contents("$timestamp.json", $input);
print_r($tilderadio);
}
$json = json_decode(file_get_contents('php://input'));
$msg = "";
if ($tilderadio["live"]["is_live"])
$msg .= "({$tilderadio["live"]["streamer_name"]}) ";
if ($json->live->is_live)
$msg .= "({$json->live->streamer_name}) ";
$msg .= "now playing: ";
$msg .= $tilderadio["now_playing"]["song"]["text"] . " ";
$msg .= "~~ {$tilderadio["listeners"]["current"]} listeners";
$msg .= $json->now_playing->song->text . " ";
$msg .= "~~ {$json->listeners->current} listeners";
echo $msg;
file_put_contents(__DIR__."/../now_playing.txt", $msg);

View File

@ -1,4 +0,0 @@
<?php
$slogans = file("../slogans.txt");
echo $slogans[array_rand($slogans)];