function handle_data($data, $is_sock = False, $auth = False, $exec = False) { global $buckets; global $alias_locks; global $dest_overrides; global $admin_accounts; global $admin_data; global $admin_is_sock; global $admin_aliases; global $exec_errors; global $exec_list; global $throttle_time; global $ignore_list; if ($auth == False) { echo "[33m" . date("Y-m-d H:i:s", microtime(True)) . " > [0m{$data}"; handle_errors($data); } else { term_echo("*** auth = true"); } $items = parse_data($data); if ($items !== False) { write_out_buffer_data($items); if ($items["destination"] == DEBUG_CHAN) { return; } if ($auth == False and $is_sock == True) { log_items($items); } if (in_array($items["nick"], $ignore_list) == True) { return; } if (isset($buckets[BUCKET_IGNORE_NEXT]) == True and $items["nick"] == get_bot_nick()) { unset($buckets[BUCKET_IGNORE_NEXT]); return; } if ($items["prefix"] == IRC_HOST and strpos(strtolower($items["trailing"]), "throttled") !== False) { term_echo("*** THROTTLED BY SERVER - REFUSING ALL OUTGOING MESSAGES TO SERVER FOR " . THROTTLE_LOCKOUT_TIME . " SECONDS ***"); $throttle_time = microtime(True); return; } if ($items["cmd"] == 330) { authenticate($items); } if ($items["cmd"] == 376) { dojoin(INIT_CHAN_LIST); } if ($items["cmd"] == "NOTICE" and $items["nick"] == "NickServ" and $items["trailing"] == NICKSERV_IDENTIFY_PROMPT) { if (file_exists(PASSWORD_FILE) == True and NICKSERV_IDENTIFY === "1") { rawmsg("NickServ IDENTIFY " . trim(file_get_contents(PASSWORD_FILE)), True); } startup(); } $args = explode(" ", $items["trailing"]); if (in_array($args[0], $admin_aliases) == True or has_account_list($args[0]) == True) { if ($auth == False and $is_sock == True) { term_echo("authenticating \"" . $args[0] . "\"..."); $admin_data = $items["data"]; $admin_is_sock = $is_sock; rawmsg("WHOIS " . $items["nick"]); return; } } $alias = $args[0]; handle_events($items); switch ($alias) { case ALIAS_ADMIN_NICK: if (count($args) == 2) { rawmsg(":" . get_bot_nick() . " NICK :" . trim($args[1])); set_bot_nick(trim($args[1])); } break; case ALIAS_ADMIN_QUIT: if (count($args) == 1) { write_out_buffer_command($items, "quit"); process_scripts($items, ALIAS_QUIT); } break; case ALIAS_ADMIN_PS: if (count($args) == 1) { write_out_buffer_command($items, "ps"); ps($items); } break; case ALIAS_ADMIN_KILL: if (count($args) == 2) { write_out_buffer_command($items, "kill"); kill($items, $args[1]); } break; case ALIAS_ADMIN_KILLALL: if (count($args) == 1) { write_out_buffer_command($items, "killall"); killall($items); } break; case ALIAS_LIST: if (check_nick($items, $alias) == True) { if (count($args) == 1) { write_out_buffer_command($items, "list"); get_list($items); } } break; case ALIAS_LIST_AUTH: if (check_nick($items, $alias) == True) { if (count($args) == 1) { write_out_buffer_command($items, "listauth"); get_list_auth($items); } } break; case ALIAS_LOCK: if (check_nick($items, $alias) == True) { if (count($args) == 2) { write_out_buffer_command($items, "lock"); $alias_locks[$items["nick"]][$items["destination"]] = $args[1]; privmsg($items["destination"], $items["nick"], "alias \"" . $args[1] . "\" locked for nick \"" . $items["nick"] . "\" in \"" . $items["destination"] . "\""); } else { privmsg($items["destination"], $items["nick"], "syntax: " . ALIAS_LOCK . " <alias>"); } } break; case ALIAS_UNLOCK: if (check_nick($items, $alias) == True and isset($alias_locks[$items["nick"]][$items["destination"]]) == True) { write_out_buffer_command($items, "unlock"); privmsg($items["destination"], $items["nick"], "alias \"" . $alias_locks[$items["nick"]][$items["destination"]] . "\" unlocked for nick \"" . $items["nick"] . "\" in \"" . $items["destination"] . "\""); unset($alias_locks[$items["nick"]][$items["destination"]]); } break; case ALIAS_ADMIN_DEST_OVERRIDE: if (count($args) == 2) { write_out_buffer_command($items, "dest_override"); privmsg($items["destination"], $items["nick"], "destination override \"" . $args[1] . "\" set for nick \"" . $items["nick"] . "\" in \"" . $items["destination"] . "\""); $dest_overrides[$items["nick"]][$items["destination"]] = $args[1]; } else { privmsg($items["destination"], $items["nick"], "syntax: " . ALIAS_ADMIN_DEST_OVERRIDE . " <dest>"); } break; case ALIAS_ADMIN_DEST_CLEAR: if (isset($dest_overrides[$items["nick"]][$items["destination"]]) == True) { write_out_buffer_command($items, "dest_clear"); $override = $dest_overrides[$items["nick"]][$items["destination"]]; unset($dest_overrides[$items["nick"]][$items["destination"]]); privmsg($items["destination"], $items["nick"], "destination override \"{$override}\" cleared for nick \"" . $items["nick"] . "\" in \"" . $items["destination"] . "\""); } break; case ALIAS_ADMIN_IGNORE: if (count($args) == 2) { if (in_array($args[1], $ignore_list) == False) { write_out_buffer_command($items, "ignore"); privmsg($items["destination"], $items["nick"], get_bot_nick() . " set to ignore " . $args[1]); $ignore_list[] = $args[1]; if (file_put_contents(IGNORE_FILE, implode("\n", $ignore_list)) === False) { privmsg($items["destination"], $items["nick"], "error saving ignore file"); } } } else { privmsg($items["destination"], $items["nick"], "syntax: " . ALIAS_ADMIN_IGNORE . " <nick>"); } break; case ALIAS_ADMIN_UNIGNORE: if (count($args) == 2) { if (in_array($args[1], $ignore_list) == True) { $i = array_search($args[1], $ignore_list); if ($i !== False) { write_out_buffer_command($items, "unignore"); privmsg($items["destination"], $items["nick"], get_bot_nick() . " set to listen to " . $args[1]); unset($ignore_list[$i]); $ignore_list = array_values($ignore_list); if (file_put_contents(IGNORE_FILE, implode("\n", $ignore_list)) === False) { privmsg($items["destination"], $items["nick"], "error saving ignore file"); } } else { privmsg($items["destination"], $items["nick"], $args[1] . " not found in " . get_bot_nick() . " ignore list"); } } } else { privmsg($items["destination"], $items["nick"], "syntax: " . ALIAS_ADMIN_UNIGNORE . " <nick>"); } break; case ALIAS_ADMIN_LIST_IGNORE: if (count($ignore_list) > 0) { write_out_buffer_command($items, "ignorelist"); privmsg($items["destination"], $items["nick"], get_bot_nick() . " ignore list: " . implode(", ", $ignore_list)); } else { privmsg($items["destination"], $items["nick"], get_bot_nick() . " isn't ignoring anyone"); } break; case ALIAS_ADMIN_REHASH: if (count($args) == 1) { if (exec_load() === False) { privmsg($items["destination"], $items["nick"], "error reloading exec file"); doquit(); } else { write_out_buffer_command($items, "rehash"); process_exec_helps(); process_exec_inits(); process_exec_startups(); $users = get_users(); foreach ($users[get_bot_nick()]["channels"] as $channel => $timestamp) { rawmsg("NAMES {$channel}"); } privmsg($items["destination"], $items["nick"], "successfully reloaded exec file (" . count($exec_list) . " aliases)"); } } break; case ALIAS_ADMIN_BUCKETS_DUMP: if (count($args) == 1) { write_out_buffer_command($items, "buckets_dump"); buckets_dump($items); } break; case ALIAS_ADMIN_BUCKETS_SAVE: if (count($args) == 1) { write_out_buffer_command($items, "buckets_save"); buckets_save($items); } break; case ALIAS_ADMIN_BUCKETS_LOAD: if (count($args) == 1) { write_out_buffer_command($items, "buckets_load"); buckets_load($items); } break; case ALIAS_ADMIN_BUCKETS_FLUSH: if (count($args) == 1) { write_out_buffer_command($items, "buckets_flush"); buckets_flush($items); } break; case ALIAS_ADMIN_BUCKETS_LIST: if (count($args) == 1) { write_out_buffer_command($items, "buckets_list"); buckets_list($items); } break; case ALIAS_INTERNAL_RESTART: if (count($args) == 1 and $items["cmd"] == CMD_INTERNAL) { define("RESTART", True); process_scripts($items, ALIAS_QUIT); } break; case ALIAS_ADMIN_RESTART: if (count($args) == 1) { write_out_buffer_command($items, "restart"); define("RESTART", True); process_scripts($items, ALIAS_QUIT); } break; case ALIAS_ADMIN_EXEC_CONFLICTS: if (count($args) == 1) { # TODO # $admin_aliases $reserved_aliases } break; case ALIAS_ADMIN_EXEC_LIST: if (count($args) == 1) { # TODO } break; case ALIAS_ADMIN_EXEC_TIMERS: if (count($args) == 1) { # TODO } break; case ALIAS_ADMIN_EXEC_ERRORS: if (count($args) == 1) { $n = count($exec_errors); if ($n > 0) { write_out_buffer_command($items, "exec_load_errors"); privmsg($items["destination"], $items["nick"], "exec load errors:"); $i = 0; foreach ($exec_errors as $filename => $messages) { if ($i == $n - 1) { privmsg($items["destination"], $items["nick"], " └─" . $filename); for ($j = 0; $j < count($messages); $j++) { if ($j == count($messages) - 1) { privmsg($items["destination"], $items["nick"], " └─" . $messages[$j]); } else { privmsg($items["destination"], $items["nick"], " ├─" . $messages[$j]); } } } else { privmsg($items["destination"], $items["nick"], " ├─" . $filename); for ($j = 0; $j < count($messages); $j++) { if ($j == count($messages) - 1) { privmsg($items["destination"], $items["nick"], " │ └─" . $messages[$j]); } else { privmsg($items["destination"], $items["nick"], " │ ├─" . $messages[$j]); } } } $i++; } } else { privmsg($items["destination"], $items["nick"], "no errors"); } } break; default: process_scripts($items, ""); # execute scripts occurring for a specific alias process_scripts($items, ALIAS_ALL); # process scripts occuring for every line (* alias) } } }
$throttle_time = False; # set when "throttled" is detected in a message from the server $rawmsg_times = array(); $operator_aliases = array(); # aliases that may only be executed by the bot operator account $admin_aliases = array(ALIAS_ADMIN_QUIT, ALIAS_ADMIN_NICK, ALIAS_ADMIN_RESTART, ALIAS_ADMIN_PS, ALIAS_ADMIN_KILL, ALIAS_ADMIN_KILLALL, ALIAS_ADMIN_REHASH, ALIAS_ADMIN_DEST_OVERRIDE, ALIAS_ADMIN_DEST_CLEAR, ALIAS_ADMIN_BUCKETS_DUMP, ALIAS_ADMIN_BUCKETS_SAVE, ALIAS_ADMIN_BUCKETS_LOAD, ALIAS_ADMIN_BUCKETS_FLUSH, ALIAS_ADMIN_BUCKETS_LIST, ALIAS_ADMIN_IGNORE, ALIAS_ADMIN_UNIGNORE, ALIAS_ADMIN_LIST_IGNORE, ALIAS_ADMIN_EXEC_CONFLICTS, ALIAS_ADMIN_EXEC_LIST, ALIAS_ADMIN_EXEC_TIMERS, ALIAS_ADMIN_EXEC_ERRORS); $reserved_aliases = array(ALIAS_ALL, ALIAS_INIT, ALIAS_STARTUP, ALIAS_QUIT); $silent_timeout_commands = array(CMD_INTERNAL, CMD_BUCKET_GET, CMD_BUCKET_SET, CMD_BUCKET_UNSET, CMD_BUCKET_APPEND, CMD_BUCKET_LIST, CMD_PAUSE, CMD_UNPAUSE); $valid_data_cmd = get_valid_data_cmd(); $init = array(); $startup = array(); $help = array(); initialize_buckets(); $exec_errors = array(); # stores exec load errors $exec_list = exec_load(); if ($exec_list === False) { term_echo("error loading exec file"); return; } $ignore_list = array(); if (file_exists(IGNORE_FILE) == True) { $ignore_data = file_get_contents(IGNORE_FILE); if ($ignore_data !== False) { $ignore_list = explode("\n", $ignore_data); } } delete_empty_elements($ignore_list); $direct_stdin = fopen("php://stdin", "r"); stream_set_blocking($direct_stdin, 0); if (file_exists(EXEC_OUTPUT_BUFFER_FILE) == True) {