#!/bin/bash if [ "$(whoami)" = "root" ]; then echo "This bot should not be ran as root." exit 1 fi [ -f functions.sh ] && source functions.sh [ -f bot.cfg ] && source bot.cfg input=".botinput" close_bot() { echo -en "QUIT :${quitMessage}\r\n" | telnet "$server" "$port" rm "$input" exit 0 } trap close_bot EXIT $? echo "Session started $(date "+%I:%M%p%n %A, %B %d, %Y")" | tee "$log" echo "NICK $nick" > "$input" echo "USER $user" >> "$input" echo "JOIN #$channel" >> "$input" tail -f "$input" | telnet "$server" "$port" | while read -r result ; do # log the session echo "$(date "+[$dateFormat]") $result" >> "$log" # do things when you see output case "$result" in # respond to ping requests from the server PING*) echo "${result/I/O}" >> "$input" ;; # for pings on nick/user *"You have not"*) echo "JOIN #$channel" | tee -a "$input" ;; # Run on kick :*!*@*" KICK "*" $nick :"*) if [ "$autoRejoinChannel" = "true" ]; then echo "JOIN #$channel" | tee -a "$input" fi if [ "$curseKicker" = "true" ]; then kickerName="${result%!*}" kickerName="${kickerName:1}" kickerChannel="${result##*#}" kickerChannel="#${kickerChannel%% *}" msg "$kickerChannel" "$kickerName: $(shuf -e -n1 "fuck you" "go fuck yourself")!" fi ;; # run when someone joins *"JOIN :#"*) who="${result%%!*}" who="${who:1}" from="${result#*#}" from="#$from" if [ "$who" = "$nick" ]; then continue fi echo "MODE #$channel +o $who" | tee -a "$input" if [ "${greet^^}" = "TRUE" ]; then set -f ./triggers/greet/greet.sh "$who" "$from" set +f fi ;; # run when someone leaves *"PART #"*) who="${result%%!*}" who="${who:1}" from="${result#*#}" from="#$from" if [ "$who" = "$nick" ]; then continue fi if [ "${leave^^}" = "TRUE" ]; then set -f ./triggers/bye/bye.sh "$who" "$from" set +f fi ;; # run when a private message is seen *"PRIVMSG "[[:alnum:]-_]*) echo "$result" >> "$log" who="${result%%!*}" who="${who:1}" from="${who%!*}" command="${result#:* PRIVMSG [[:alnum:]_-]*:}" command="${command//# /}" will="${command#* }" command="${command%% *}" if [[ "$from" =~ $allowList ]]; then ./modules/say/say.sh "$who" "#$channel" $from really loves me, they sent me a private message saying $command $will else reply "$who" "You are not in the allowed list for this bot. If you think this is an error, please contact the bot's administrator." fi ;; # run when a message is seen *PRIVMSG*) echo "$result" >> "$log" who="${result%%!*}" who="${who:1}" from="${result#*#}" from="${from%% *}" from="#${from:-$channel}" # Trigger stuff happens here. # Call link trigger if msg contains a link: if [[ "$result" =~ .*http://|https://|www\..* ]]; then set -f echo "Calling link.sh with \"$who\" \"$from\" \"$result\"" >> "$log" ./triggers/link/link.sh "$who" "$from" "$result" set -f # Although this calls modules, it triggers on text other than the bot's nick elif [[ "$result" =~ ^.*PRIVMSG.*:[${botCaller}].* ]]; then command="${result#*:[[:punct:]]}" command="${command//# /}" will="${command#* }" command="${command%% *}" if command -v "./modules/${command% *}/${command% *}.sh" ; then echo "Calling module ./modules/${command% *}/${command% *}/${command% *}.sh \"$who\" \"$from\" $will" >> "$log" # Disable wildcards set -f ./modules/${command% *}/${command% *}.sh "$who" "$from" $will # Enable wildcards set +f else ./modules/say/say.sh "$who" "$from" "$who: $(shuf -n1 "response/error.txt")" fi else if ! [[ "$who" =~ $ignoreList ]]; then set -f ./triggers/keywords/keywords.sh "$who" "$from" "$result" set +f fi fi ;; *) echo "$result" >> "$log" ;; esac done