#! /bin/bash # This function reads tags of xml in the same way read normally reads lines. function rdom { local IFS=\> read -d \< element content } source common_codez function l33t_codes { channel_it_came_from="$( echo ${line} | cut -d ' ' -f 3 )" person="${sender%%!*}" # Remove any forward slashes. personoslash="${person//\/}" ###################### # Echo injected data # ###################### # Should send a message like: echo 'This is the message' > /tmp/un-provoked-message-store injected_data=0 line_half_filtered="${line##*PRIVMSG}" line_filtered=${line_half_filtered##* :} if [[ ${personoslash} == tlCJ99mfZl ]] then send_msg "${channel_it_came_from}" "${line_filtered}" injected_data=1 else ########################## # Shared libraries error # ########################## the_time_now=$(date +%s) # If someone complains about error while loading shared libraries error # then recomend them to the bug tracker. if [[ ${line} == *"error while loading shared libraries"* ]] then yepyep=1 # Make sure they have not already been recommended to the bug # tracker less than one day ago. if [[ -f announcements/people/${personoslash}/seen ]] && (( ( $( stat -c %Y announcements/people/${personoslash}/shared_libs ) + 86400 ) > the_time_now )) then yepyep=0 fi if (( yepyep )) then send_msg "${channel_it_came_from}" "${person}: please report a bug, specifying the exact error message, package of the failing command and architecture: http://labs.parabola.nu" touch "announcements/people/${personoslash}/shared_libs" fi fi ########## # Repeat # ########## stuff_said="$( echo ${line} | cut --complement -d ' ' -f 1,2,3 )" stuff_said="${stuff_said#:}" [[ ${stuff_said} != ${i_repeated} ]] && say_again=yesyes # If two different people say the same thing in a row then say it again # for fun. if [[ ${stuff_said} == ${lastline} ]] && [[ ${person} != ${lastsender} ]] && [[ ${say_again} != nono ]] && [[ ${stuff_said} != 'pbot: '* ]] # If two different people say the same thing to me in quick sucession I shouldn't repeat them. then send_msg "${channel_it_came_from}" "${stuff_said}" i_repeated="${stuff_said}" say_again=nono fi lastline="${stuff_said}" lastsender="${person}" ################# # Announcements # ################# # Make this person a folder if they don't already have one. if ! [[ -d "announcements/people/${personoslash}" ]] then mkdir -p "announcements/people/${personoslash}" touch "announcements/people/${personoslash}/phrases" cat << EOF > "announcements/people/${personoslash}/settings" enabled=yes locked=no EOF fi the_time_now=$(date +%s) # If this person has announcements enabled and there is at least one # phrase in their file and their seen log exists. if grep 'enabled=yes' "announcements/people/${personoslash}/settings" > \ /dev/null && (( $( wc -l "announcements/people/${personoslash}/phrases" | cut -d ' ' -f 1 ) )) && [[ -f announcements/people/${personoslash}/seen ]] then # Check if they were last present more than three hours ago. if (( ( $( stat -c %Y announcements/people/${personoslash}/seen ) + 10800 ) < the_time_now )) then send_msg "${channel_it_came_from}" \ "$( shuf "announcements/people/${personoslash}/phrases" | head -1 )" fi fi # If someone has sent this person a message then echo it to them. if [[ -f "announcements/people/${personoslash}/messages" ]] then uniq "announcements/people/${personoslash}/messages" | while read line do send_msg "${channel_it_came_from}" "${personoslash}: ${line}" done rm "announcements/people/${personoslash}/messages" fi # Record that the person has been seen, and when. touch "announcements/people/${personoslash}/seen" ##################### # Page title getter # ##################### # If pbot is present record it. #[[ ${sender%%!*} == pbot ]] && echo yes > pbot_present # commented out because pbot-ng now uses the pbot nickname # We don't want to get the page title if it's injected data. if [[ ${line} =~ http://[^\ ]+ ]] || [[ ${line} =~ https://[^\ ]+ ]] && (( ! injected_data )) then url_to_get="${BASH_REMATCH}" # If pbot is not present. if grep no pbot_present > /dev/null then the_title=$( curl -L --compressed "${url_to_get}" 2> /dev/null | while rdom do if [[ ${element} = title ]] then sed 's/ / /g' <<< "${content}" | replace_wierd_html_chars fi done ) if ! [[ -z ${the_title} ]] then send_msg "${channel_it_came_from}" "Page title: \`${the_title}'" fi fi fi ######## # Seen # ######## shopt -s extglob # We want to get only the message part of the line sentence="${line#* }" sentence="${sentence#* }" sentence="${sentence#* :}" # This one depends on the previous to record the last time the person # was seen and create the `the_time_now' var. case "${sentence}" in "pbot: when did you last see"* ) subject="${sentence##pbot: when did you last see }" subject="${subject##pbot: when did you last see: }" # If there's an `:', we can still handle it. subject="${subject%?}" subject="${subject%% *}" if [[ -f announcements/people/${subject}/seen ]] then seconds_ago_seen="$(( the_time_now - $( stat -c %Y announcements/people/${subject}/seen ) ))" minutes_ago_seen="$(( ( the_time_now - $( stat -c %Y announcements/people/${subject}/seen ) ) / 60 ))" hours_ago_seen="$(( ( the_time_now - $( stat -c %Y announcements/people/${subject}/seen ) ) / 3600 ))" days_ago_seen="$(( ( the_time_now - $( stat -c %Y announcements/people/${subject}/seen ) ) / 86400 ))" months_ago_seen="$(( ( the_time_now - $( stat -c %Y announcements/people/${subject}/seen ) ) / 2592000 ))" years_ago_seen="$(( ( the_time_now - $( stat -c %Y announcements/people/${subject}/seen ) ) / 946080000 ))" if (( seconds_ago_seen < 120 )) then send_msg "${channel_it_came_from}" "I last saw ${subject} speak ${seconds_ago_seen} seconds ago." elif (( minutes_ago_seen < 120 )) then send_msg "${channel_it_came_from}" "I last saw ${subject} speak ${minutes_ago_seen} minutes ago." elif (( hours_ago_seen < 48 )) then send_msg "${channel_it_came_from}" "I last saw ${subject} speak ${hours_ago_seen} hours ago." elif (( days_ago_seen < 60 )) then send_msg "${channel_it_came_from}" "I last saw ${subject} speak ${days_ago_seen} days ago." elif (( months_ago_seen < 24 )) then send_msg "${channel_it_came_from}" "I last saw ${subject} speak ${months_ago_seen} months ago." else send_msg "${channel_it_came_from}" "I last saw ${subject} speak ${years_ago_seen} years ago." fi else send_msg "${channel_it_came_from}" "I never saw ${subject} speak." fi ;; "pbot: tell "+([![:space:]])": "+([![:space:]])* ) # The line will be something such as: # pbot: tell fauno: you suck process="${sentence##pbot: tell }" subject="${process%%:*}" message="${process#*:}" message="${message# }" [[ -d "announcements/people/${subject}" ]] || mkdir -p "announcements/people/${subject}" echo "${personoslash} told me to tell you: ${message}" >> "announcements/people/${subject}/messages" response=$(shuf -e 'certainly' 'I will do' 'OK' | head -1) send_msg "${channel_it_came_from}" "${personoslash}: ${response}" ;; "pbot: "+([![:space:]])" is "+([![:space:]])* ) thing="${sentence#pbot: }" thing="${thing%% is *}" is="${sentence#* is }" echo "${is}" >> "info/${thing}" send_msg "${channel_it_came_from}" "${personoslash}: Remembered." ;; "pbot: "+([![:space:]])" is: "+([![:space:]])* ) thing="${sentence#pbot: }" thing="${thing%% is: *}" is="${sentence#* is: }" echo "${is}" >> "info/${thing}" send_msg "${channel_it_came_from}" "${personoslash}: Remembered." ;; "pbot: "+([![:space:]])" isn't "+([![:space:]])* ) thing="${sentence#pbot: }" thing="${thing%% isn\'t *}" isnt="${sentence#* isn\'t }" echo "thing: ${thing}" >> pstd.txt echo "inst: ${thing}" >> pstd.txt if grep "${isnt}" "info/${thing}" >/dev/null then grep -v "${isnt}" "info/${thing}" | sponge "info/${thing}" send_msg "${channel_it_came_from}" "${personoslash}: OK, entry removed." else send_msg "${channel_it_came_from}" "${personoslash}: I know." fi ;; "pbot: "+([![:space:]])" isn't: "+([![:space:]])* ) thing="${sentence#pbot: }" thing="${thing%% isn\'t: *}" isnt="${sentence#* isn\'t: }" if grep "${isnt}" "info/${thing}" >/dev/null then grep -v "${isnt}" "info/${thing}" | sponge "info/${thing}" send_msg "${channel_it_came_from}" "${personoslash}: OK, entry removed." else send_msg "${channel_it_came_from}" "${personoslash}: I know." fi ;; ','+([![:space:]]) ) thing="${sentence#,}" if [[ -f "info/${thing}" ]] then # For the first entry we will say like: `thing is: ' first="${thing} is: " uniq "info/${thing}" | while read line do send_msg "${channel_it_came_from}" "${first}${line}" first='' done fi ;; pbot:* ) while read line do send_msg "${channel_it_came_from}" "${line}" done <<< cat << EOF Command not recognised. Example commands: pbot: tell Jack: hi Jack pbot: when did you last see Jill? pbot: lemon is yummy pbot: lemon isn't yummy ,lemon EOF ;; esac # TODO: add a birthday announcement feature, cointoss feature, timer # feature. ######### # Tests # ######### #echo "${line}" fi }