#!/bin/bash if [ "$(whoami)" = "root" ]; then echo "This bot should not be ran as root." exit 1 fi # Load required files. for i in "bot.cfg" "functions.sh" ; do if [[ -f "$i" ]]; then source "$i" else echo "Could not find required file \"${i}\"." exit 1 fi done # Variables important to modules need to be exported here. export allowList export channel export input export ignoreList export nick export quitMessage # Function called on exit to remove the temporary input file. rm_input() { if [[ -f "$input" ]]; then rm -f "$input" fi } # Trap exiting ffrom the program to remove the temporary input file. trap rm_input EXIT # Set up the connection. echo -e "Session started $(date "+%I:%M%p%n %A, %B %d, %Y").\n\nTo gracefully exit, make sure you are in the allow list and send the command exit to the bot.\n\n" | tee "$log" echo "NICK $nick" > "$input" echo "USER $user" >> "$input" echo "JOIN #$channel" >> "$input" # The main loop of the program where we watch for output from irc. 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 # Handle nick changes ":"*"NICK :"*) # Get the original nick originalNick="${result#:}" originalNick="${originalNick%%!*}" # If the old nick was in the ignore list, update it. if [[ "${originalNick}" =~ [${ignoreList}] ]]; then export ignoreList="${ignoreList/${originalNick}/${result#:*:}}" fi ;; # 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 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" "#$channel" $will # Enable wildcards set +f else reply "$who" "$(shuf -n1 "response/error.txt")" fi 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 # To make sure that modules are only called when they are supposed to be, had to combine string monipulation with regexp. elif [[ "${result#:*PRIVMSG*:}" =~ ^[${botCaller}][a-zA-Z0-9_].* ]]; 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 rm_input exit 0