stormbot/bot.sh

183 lines
6.4 KiB
Bash
Executable File

#!/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