67 lines
1.7 KiB
Bash
Executable file
67 lines
1.7 KiB
Bash
Executable file
#!/bin/bash
|
|
|
|
# Super simple IRC bot.
|
|
|
|
NICK="bitlair"
|
|
CHANNEL="#bitlair"
|
|
SERVER="irc.smurfnet.ch"
|
|
INPORT="31337"
|
|
SPACESTATEFILE="/tmp/SPACESTATE"
|
|
SETTOPICFILE="/tmp/SETTOPIC"
|
|
|
|
touch $SPACESTATEFILE
|
|
touch $SETTOPICFILE
|
|
|
|
set -eu
|
|
set -o pipefail
|
|
|
|
trap 'kill $(jobs -p)' INT TERM EXIT
|
|
|
|
loop="/tmp/irc-bot-loop"
|
|
mkfifo "$loop"
|
|
trap "rm -f $loop" INT TERM EXIT
|
|
|
|
{
|
|
echo "NICK $NICK"
|
|
sleep 0.2
|
|
echo "USER $NICK +i * :$0"
|
|
sleep 6
|
|
echo "JOIN $CHANNEL"
|
|
|
|
# FIXME: Possible race condition between loop and stdin.
|
|
tail -f "$loop" &
|
|
|
|
while true; do
|
|
input=$(nc -lp "$INPORT" | tr -c -d '[:print:]')
|
|
echo "NOTICE $CHANNEL $input"
|
|
if [ "$input" == "Bitlair is now closed" ]; then
|
|
echo "1" > $SETTOPICFILE
|
|
echo "closed" > $SPACESTATEFILE
|
|
echo "TOPIC $CHANNEL"
|
|
fi
|
|
if [ "$input" == "Bitlair is now open!" ]; then
|
|
echo "1" > $SETTOPICFILE
|
|
echo "OPEN" > $SPACESTATEFILE
|
|
echo "TOPIC $CHANNEL"
|
|
fi
|
|
done
|
|
} | \
|
|
nc "$SERVER" 6667 | while read message; do
|
|
case "$message" in
|
|
PING*) echo "PONG ${message#PING :}" > "$loop";;
|
|
ERROR*) echo "$message"; exit;;
|
|
*PRIVMSG*) echo "${message}" | sed -nr "s/^:([^!]+).*PRIVMSG[^:]+:(.*)/[$(date '+%R')] <\1> \2/p";;
|
|
*332*)
|
|
TOPIC=$(echo "$message" | cut -d \: -f 3-)
|
|
SPACESTATE=$(cat $SPACESTATEFILE)
|
|
SETTOPIC=$(cat $SETTOPICFILE)
|
|
if [ "$SETTOPIC" == "1" ]; then
|
|
rest=$(echo "$TOPIC" | cut -d \% -s -f2-)
|
|
echo "TOPIC $CHANNEL Hackerspace Bitlair is $SPACESTATE %$rest" > "$loop"
|
|
echo "0" > $SETTOPICFILE
|
|
fi
|
|
echo "TOPIC --> $TOPIC"
|
|
;;
|
|
*) echo "${message}";;
|
|
esac
|
|
done
|