8 rm -f .bashbotfifo{in,out}
10 mkfifo .bashbotfifoout
12 # Setup some fds to talk to IRC
13 exec 3<> .bashbotfifoin
14 exec 4<> .bashbotfifoout
21 echo "QUIT :Going back to hell" >&4
24 if [[ $irc_process -gt 0 ]]; then
25 if (ps -p $irc_process > /dev/null); then
29 rm .bashbotfifo{in,out}
34 my_hostname="$(hostname)"
35 my_irc_channel="#alug"
38 my_irc_server="irc.alug.org.uk"
41 # now if there's a settings file, source that...
42 if [ -e "$(dirname $(readlink -f $0))/.botsettings.sh" ]; then
43 . "$(dirname $(readlink -f $0))/.botsettings.sh"
47 gnutls-cli --crlf $my_irc_server:$my_irc_port <&4 >&3 2>&3 &
50 while [ $connected == 0 ]; do
52 if [[ "$line" =~ NOTICE\ ]]; then
54 send_line PASS $my_irc_password
55 send_line NICK $my_irc_nick
56 send_line USER $my_irc_nick $my_hostname $my_irc_server $my_irc_nick
57 send_line JOIN $my_irc_channel
63 # Format of server messages
64 #:thingsendingmessage command params
66 #:iDunno!~brettp@mail.ipv6.sommitrealweird.co.uk PRIVMSG #bp :hello.
72 privmsg_regex="^[^ ]* PRIVMSG"
73 if [[ "${line}" =~ $ping_regex ]]; then
76 elif [[ "${line}" =~ $privmsg_regex ]]; then
83 echo "Processing $line"
88 # last character of the last element is going to be a \r so remove it
89 parts[-1]=${parts[-1]%$'\r'}
91 if [[ "${parts[1]}" == "PRIVMSG" ]]; then
97 if [[ ${parts[3]} =~ [:]*$my_irc_nick[:]*$ ]]; then
100 bot_command=${parts[4]}
101 options="${parts[@]:5}"
104 bot_command=${parts[3]}
105 bot_command=${bot_command#:}
106 channel=${parts[0]%\!*}
108 options="${parts[@]:4}"
112 if [[ $do_command -gt 0 ]]; then
115 send_help_message $channel
121 send_version $channel
124 add_reminder $channel "$options"
127 list_reminders $channel
130 send_line "PRIVMSG $channel :Sorry, don't know how to $bot_command."
142 send_help_message() {
145 send_line "PRIVMSG $channel :Help:"
146 send_line "PRIVMSG $channel : An IRC bot written in bash!"
147 send_line "PRIVMSG $channel : help - display this message"
148 send_line "PRIVMSG $channel : version - display version number"
149 send_line "PRIVMSG $channel : quit - make the bot quit IRC"
150 send_line "PRIVMSG $channel : add YYYY-mm-dd HH:MM reminder text"
151 send_line "PRIVMSG $channel : list - list reminders"
156 send_line "PRIVMSG $channel :Version: $version"
162 read -a dataparts <<-EOF
165 # we now have a list of parts, they should be of the form
166 # YYYY-mm-dd HH:MM the text of the reminder
167 timestamp=$(date +"%s" --date="${dataparts[0]} ${dataparts[1]}")
168 if [[ $? -ne 0 ]]; then
169 send_line "PRIVMSG $channel :Couldn't parse date/time ${dataparts[0]} ${dataparts[1]}"
171 send_line "PRIVMSG $channel :Added reminder for ${dataparts[0]} ${dataparts[1]}: ${dataparts[@]:2}"
172 reminders[$timestamp]="${dataparts[@]:2}"
177 current_timestamp="$(date +"%s")"
178 # loop through the reminders keys to see if it's past and alert if so
179 for ts in ${!reminders[@]}; do
180 if [[ $ts -le $current_timestamp ]]; then
181 send_line "PRIVMSG $my_irc_channel :${reminders[$ts]}"
182 # we need to remove this from the array now
183 unset "reminders[$ts]"
190 for ts in ${!reminders[@]}; do
191 date_stamp="$(date --date="@$ts" +"%Y-%m-%d %H:%M")"
192 send_line "PRIVMSG $channel :$date_stamp ${reminders[$ts]}"
197 trap cleanup EXIT SIGINT
200 # see if there's anything to read
201 read -t 0.2 -u 3 aline
207 # check that the irc_process is still running, restart it if not
208 if ( ! kill -0 $irc_process ); then