irc-bot/irc-bot
2018-11-21 19:09:52 +01:00

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