diff options
author | Joseph Graham <joseph@xylon.me.uk> | 2017-06-03 18:48:12 +0100 |
---|---|---|
committer | Joseph Graham <joseph@xylon.me.uk> | 2017-06-03 18:48:12 +0100 |
commit | ff6119f99a9a4c804936a8e07f69a2d94795a77a (patch) | |
tree | 0fbf083551594e75366f6efff3c69000b515ea6b | |
parent | e1c4ef87e665a1a8476e063f03797f4e0496ac8b (diff) |
started abusing it to spam the channel and other users on
FreeNode. The feature could be secured but since nobody normally uses
it anyway I think it's not worth it.
Also tidied up to code a bit and got rid of some old files.
-rw-r--r-- | HACKING | 8 | ||||
-rw-r--r-- | INSTALL | 2 | ||||
-rwxr-xr-x | bug_tracker_change_detector | 94 | ||||
-rwxr-xr-x | chili_change_detector | 224 | ||||
-rw-r--r-- | lib/main.sh | 35 | ||||
-rw-r--r-- | process_event (renamed from hack_of_all_hacks) | 50 |
6 files changed, 47 insertions, 366 deletions
@@ -1,13 +1,13 @@ -Hi, this file was made by xyon. +Hi, this file was made by Xylon. Basically I made this bot by getting envbot and hacking it. When I first ran envbot it didn't do anything and I couldn't be bothered to read the documentation of how to use/add modules so i just opened up the main file and started hacking it up. -I modified lib/main.sh to source `hack_of_all_hacks' file once per minute and -I put all the code in `l33t_codes' function in that file. So you can modify/add -more code without having to restart the bot. +I modified lib/main.sh to source `process_event' file once per minute +and I put all the code in a function in that file. So you can +modify/add more code without having to restart the bot. Originally the bot was kind of; event driven, it could only respond to stuff that happens in the channel but couldn't say stuff `out of the blue', so in @@ -21,7 +21,7 @@ Copy over all necessary files. bot_settings.sh common_codez envbot - hack_of_all_hacks + process_event labs_change_detector pbot pbot-ng_fixer diff --git a/bug_tracker_change_detector b/bug_tracker_change_detector deleted file mode 100755 index e4de7ba..0000000 --- a/bug_tracker_change_detector +++ /dev/null @@ -1,94 +0,0 @@ -#! /bin/bash - -while true -do - source common_codez - - log_file=bug_sums - - temp_file=$( mktemp ) - - temp_changes=$( mktemp ) - - changes="/tmp/un-provoked-message-store" - - for url in $( curl --compressed "https://bugs.parabolagnulinux.org/bugs/issue?@pagesize=99999" 2> /dev/null | grep -E 'href="issue[[:digit:]]+' | cut -d '"' -f 2 ) - do - tfile="$( mktemp )" - - try_count=1 - - # Get the URL and make sure it's not empty. - until curl --compressed "https://bugs.parabolagnulinux.org/bugs/${url}" > "${tfile}" 2> /dev/null && (( $( wc -l "${tfile}" 2> /dev/null | cut -d ' ' -f 1 ) )) - do - # The time we sleep doubles each time up to a maximum of 512 - # seconds, before restarting the entire script. - sleep "${try_count}" - - if (( try_count < 512 )) - then - try_count=$(( try_count * 2 )) - else - continue 2 - fi - done - - echo "${url} $( md5sum < ${tfile} | cut -d ' ' -f 1 )" >> "${temp_file}" - - rm "${tfile}" - done - - # Check that the log file is not empty as a sanity check. TODO record WHEN - # it last checked the bug tracker for changes so we can also check if it was - # too long ago. - if (( $( wc -l "${log_file}" 2> /dev/null | cut -d ' ' -f 1 ) )) - then - cat "${temp_file}" | - while read -r line - do - bug_number="${line%% *}" - # If this bug is not in the log file then it must be new. - if { ! grep "${bug_number}" "${log_file}" > /dev/null ; } - then - tdir="$( mktemp -d )" - curl --compressed "https://bugs.parabolagnulinux.org/bugs/${bug_number}" 2> /dev/null | csplit -f "${tdir}/xx" - '%<title>%1' - bug_title=$( head -1 ${tdir}/xx* | replace_wierd_html_chars ) - cat ${tdir}/xx* | csplit -f "${tdir}/gg" - '%<th class="required">Priority</th>%1' - priority=$( head -1 ${tdir}/gg* ) - priority=${priority#*>} - priority=${priority%<*} - rm -r "${tdir}" - echo "${bug_number} created: https://bugs.parabolagnulinux.org/bugs/${bug_number} (${bug_title% - Parabola\'s issue tracker} [${priority}])" >> "${temp_changes}" - # It is in the log file so now we check if the entire line is there, - # because if it's not then the md5sum must have changed. - elif { ! grep "${line}" "${log_file}" > /dev/null ; } - then - tdir="$( mktemp -d )" - curl --compressed "https://bugs.parabolagnulinux.org/bugs/${bug_number}" 2> /dev/null | csplit -f "${tdir}/xx" - '%<title>%1' - bug_title=$( head -1 ${tdir}/xx* | replace_wierd_html_chars ) - cat ${tdir}/xx* | csplit -f "${tdir}/gg" - '%<th class="required">Priority</th>%1' - priority=$( head -1 ${tdir}/gg* ) - priority=${priority#*>} - priority=${priority%<*} - rm -r "${tdir}" - echo "${bug_number} changed: https://bugs.parabolagnulinux.org/bugs/${bug_number} (${bug_title% - Parabola\'s issue tracker} [${priority}])" >> "${temp_changes}" - fi - done - fi - - if (( $( wc -l "${temp_changes}" 2> /dev/null | cut -d ' ' -f 1 ) > 12 )) - then - echo "More than 12 changes have been detected on the bug tracker. Ignoring." >> "${changes}" - else - while read line - do - echo "${line}" >> "${changes}" - done < "${temp_changes}" - fi - - mv "${temp_file}" "${log_file}" - - rm -f "${temp_changes}" - - sleep 5m -done diff --git a/chili_change_detector b/chili_change_detector deleted file mode 100755 index 030f6f2..0000000 --- a/chili_change_detector +++ /dev/null @@ -1,224 +0,0 @@ -#! /bin/bash - -check_every="37s" # Put `m' or `s' on the end because this will be used with the - # `sleep' command. -seen_issues_log="seen_issues_log" -atom_feed_log="atom_feed_log" -atom_url="https://labs.parabola.nu/activity.atom" -bot_ipc="/tmp/un-provoked-message-store" -# fauno wants him to deliver messages spaced out by two minutes so I need nother -# fifo -another_fifo="/tmp/pbot-ng_chili_change_detector_fifo" - -# If the fifo doesn't exist then create it. -[[ -p ${another_fifo} ]] || mkfifo "${another_fifo}" - -# OK this code will forward no more than two messages onto pbot-ng every two -# minutes (fauno doesn't want flood). It runs in the background. It could be -# sensible to split this out into a seperate file so it can tidily be used by -# other pbot-ng modules but I cba. This code is quite l33t actually because it -# doesn't delay the messages at all unless two messages get delivered in two -# minutes. -tail -f "${another_fifo}" | while true -do - read smile && echo "${smile}" >> "${bot_ipc}" - read -t 120 smile && echo "${smile}" >> "${bot_ipc}" || - continue - sleep 2m -done & - -declare -A bugs -declare -A old_bugs - -function get_feed_make_array -{ - # Download the feed. - feed=$( mktemp ) - header_dump=$( mktemp ) - - if [[ -n ${etag} ]] - then - curl --user-agent "pbot-ng" -D "${header_dump}" -H "If-None-Match: \"${etag}\"" "${atom_url}" 2> /dev/null > "${feed}" - ret_val="${?}" - else - curl --user-agent "pbot-ng" -D "${header_dump}" "${atom_url}" 2> /dev/null > "${feed}" - ret_val="${?}" - fi - - # Get the first line of the headers. - read http_response < "${header_dump}" - - # If curl's exit status was zero and the http response was 200. - if (( ! ret_val )) && [[ ${http_response} == *' 200 '* ]] - then - # Is there an ETag? - if etag_line=$( grep 'ETag:' "${header_dump}" ) - then - etag_line="${etag_line#*\"}" - etag="${etag_line%\"*}" # Now we have the ETag. - else - # It seems that the server no longer sends Etags - unset etag - fi - else - # This indicates either a failure to download the page or that the page - # has not changed since the last time it was downloaded. - rm "${feed}" - rm "${header_dump}" - return 1 - fi - - unset bugs - declare -A -g bugs - - # We want an array of all the bug titles and their urls. - stage=0 - while read -r line - do - case "${stage}" in - 0 ) - [[ ${line} == *'<entry>'* ]] && - { - title="" - url="" - updated="" - stage=1 - } - - ;; - 1 ) - case "${line}" in - *'<title>'*'</title>'* ) - booboo="${line#*>}" - title="${booboo%<*}" - ;; - *'<link '* ) - yumyum="${line##*href=\"}" - url="${yumyum%%\"*}" - ;; - *'<updated>'*'</updated>'* ) - foobar="${line#*>}" - updated="${foobar%<*}" - ;; - *'</entry>'* ) - # We don't want revisions. - if [[ -n ${title} ]] && [[ -n ${url} ]] && [[ -n ${updated} ]] && [[ "${title}" != *' - Revision '* ]] - then - # Add this to the array, fixing the url if it's - # broken. - bugs["${title}🐵${updated}"]="${url/chili/labs.parabola.nu}" - fi - stage=0 - ;; - esac - ;; - esac - done < "${feed}" - - rm "${feed}" - rm "${header_dump}" - - return 0 -} - -function slide_and_write -{ - # We need to make the new array the old one. - unset old_bugs - declare -A -g old_bugs - - for key in "${!bugs[@]}" - do - ii=$( sed 's/([^)]\+)//' <<< "${key}" ) - old_bugs[${ii}]=${bugs[${key}]} - done - - # We now write this to the file. We seperate the fields with some sort of - # cat face: 🐱 - for i in "${!old_bugs[@]}" - do - echo "${i}🐱 ${old_bugs[${i}]}" - done > ${atom_feed_log} -} - -if [[ -f ${atom_feed_log} ]] -then - # Get the array that stores the info of all bug titles and their urls out of - # the file it's stored in. - while read -r line - do - old_bugs["${line%%🐱 *}"]="${line##*🐱 }" - done < "${atom_feed_log}" -else - # The log does not exist so we create it! - get_feed_make_array - slide_and_write - - # Also we need to create the log of seen issues. - for i in "${!bugs[@]}" - do - ii=$( sed 's/([^)]\+)//' <<< "${i}" ) - [[ "${ii%%🐵*}" =~ \#[[:digit:]]+ ]] # match the bug number e.g. #390 - echo "${BASH_REMATCH}" - done > "${seen_issues_log}" -fi - -while true -do - # Download the feed and make an array of the bugs in it. If it fails or - # hasn't changed then we just wait until it's time to check again and then - # continue with the next iteration of the loop. - get_feed_make_array || { sleep "${check_every}" ; continue ; } - - temp_changes=$( mktemp ) - - # Compare this array to the previous. If any new have appeared since last - # time then we check if it's in a log of seen issues, and if not, we add it, - # and we know that this is a creation, not a change. - for i in "${!bugs[@]}" - do - ii=$( sed 's/([^)]\+)//' <<< "${i}" ) - # If this bug is new since last time. - if [[ -z ${old_bugs[${ii}]} ]] - then - # Check the log of seen issues to find out if this is a creation or - # a change. - [[ "${ii%%🐵*}" =~ \#[[:digit:]]+ ]] # match the bug number e.g. #390 - - if grep "${BASH_REMATCH}" "${seen_issues_log}" > /dev/null 2> /dev/null - then - creation_or_change="changed" - else - creation_or_change="created" - - # Add this issue to the log. - echo "${BASH_REMATCH}" >> "${seen_issues_log}" - fi - - real_title="${i%%🐵*}" - real_title_a="${real_title%%:*}" - real_title_b="${real_title#*:}" - cat="${real_title_a%% - *}" # e.g. `pbot-ng' - num="${real_title_a#* - }" - echo "${num} ${creation_or_change}: ( ${cat} -${real_title_b} ) ${bugs[${i}]}" >> "${temp_changes}" - fi - done - - if (( $( wc -l "${temp_changes}" 2> /dev/null | cut -d ' ' -f 1 ) > 12 )) - then - echo "More than 12 changes have been detected on the bug tracker. Ignoring." >> "${bot_ipc}" - else - while read line - do - echo "${line}" >> "${another_fifo}" - done < "${temp_changes}" - fi - - rm -f "${temp_changes}" - - # Make this array the old one and write it to the file in case we need to - # retrieve it later. - slide_and_write - - sleep "${check_every}" -done diff --git a/lib/main.sh b/lib/main.sh index 4fc1adf..7bb7041 100644 --- a/lib/main.sh +++ b/lib/main.sh @@ -440,32 +440,19 @@ while true; do # Check if there is a command. commands_call_command "$sender" "$target" "$query" -################################################################################ -################################################################################ + # What happens next is important + config_update_time=-100 -# Hack of all hacks!!! + time_n0w=$( date +%s ) -# if [[ "${identified}" != yep ]] -# then -# send_msg "NickServ" "identify csukwHrqH9" -# identified=yep -# fi - -config_update_time=-100 - -time_n0w=$( date +%s ) - -# If it's been more than a minute since we updated the config. -if (( ( time_n0w - 60 ) > config_update_time )) -then - source hack_of_all_hacks - config_update_time=${time_n0w} -fi - -l33t_codes + # If it's been more than a minute since we updated the config. + if (( ( time_n0w - 60 ) > config_update_time )) + then + source process_event + config_update_time=${time_n0w} + fi -################################################################################ -################################################################################ + process_event # Check return code case $? in @@ -567,7 +554,7 @@ l33t_codes if (( yepyep )) then - if (( $(wc -l hack_of_all_hacks | cut -d ' ' -f 1) > 1 )) + if (( $(wc -l "announcements/people/${personoslashlower}/messages" | cut -d ' ' -f 1) > 1 )) then send_msg "${channel}" "${personoslash}: you have messages, type something to see them." else diff --git a/hack_of_all_hacks b/process_event index 547b64c..7d93ed5 100644 --- a/hack_of_all_hacks +++ b/process_event @@ -62,7 +62,7 @@ function forget_fact esac } -function l33t_codes +function process_event { my_own_name='pbot' @@ -400,30 +400,42 @@ ${my_own_name}: when did you last see Jill? ${my_own_name}: lemon is yummy ${my_own_name}: lemon isn't yummy ,lemon -,tell jack about foo EOF ;; esac # ' this comment fixes a bug in emacs shell-script-mode that messes up the syntax highlighting - ########################### - # answer nicks over query # - ########################### - - if [[ "${line}" =~ ,tell\ [^\ ]+\ about\ [^\ ]+ ]] - then - gotit="${BASH_REMATCH}" # will be like: `,tell jack about blah' - - dudep1="${gotit#,tell }" - dude="${dudep1%% *}" - thing="${gotit##* }" - - if [[ -n "${dude}" ]] && [[ -n "${thing}" ]] - then - tell_fact "${thing}" "${dude}" || send_msg "${channel_it_came_from}" "${personoslash}: Error, failed to tell ${dude} about ${thing}" - fi - fi + # I'm dissabling this feature for now as it was being abused + # and would need an overhaul to be abuse-proof + nobody uses it afaik + # ########################## + # # tell someone something # + # ########################## + + # # TODO: this should be in the case statement + + # if [[ "${sentence}" =~ ${my_own_name}: tell\ [^\ ]+\ about\ [^\ ]+ ]] + # then + # # TODO: There should be the following three constraints to + # # prevent abuse. + # # 1. People may only ask the bot to tell someone about + # # something in the #parabola channel, not by query. + # # 2. pbot will only tell someone something if they're a user + # # he has seen in the past week + # # 3. each person may use tell no more than 10 times in + # # three hours. + + # gotit="${BASH_REMATCH}" # will be like: `,tell jack about blah' + + # dudep1="${gotit#,tell }" + # dude="${dudep1%% *}" + # thing="${gotit##* }" + + # if [[ -n "${dude}" ]] && [[ -n "${thing}" ]] + # then + # tell_fact "${thing}" "${dude}" || send_msg "${channel_it_came_from}" "${personoslash}: Error, failed to tell ${dude} about ${thing}" + # fi + # fi # TODO: add a birthday announcement feature, cointoss feature, timer # feature. |