Exemple #1
0
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 "" . date("Y-m-d H:i:s", microtime(True)) . " > {$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)
        }
    }
}
Exemple #2
0
$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) {