function check_push_events_bitbucket($repo) { $data = get_api_data("/api/1.0/repositories/{$repo}/events", "bitbucket"); $changesets = get_api_data("/api/1.0/repositories/{$repo}/changesets?limit=10", "bitbucket"); for ($i = 0; $i < count($data["events"]); $i++) { if (isset($data["events"][$i]["utc_created_on"]) == False) { continue; } $timestamp = $data["events"][$i]["utc_created_on"]; $t = convert_timestamp($timestamp, "Y-m-d H:i:s "); $dt = microtime(True) - $t; if ($dt <= TIME_LIMIT_SEC) { if ($data["events"][$i]["event"] == "pushed") { pm(FEED_CHAN, chr(3) . "13" . "push to https://bitbucket.org/{$repo} @ " . date("H:i:s", $t) . " by " . $data["events"][$i]["user"]["username"]); $commits = $data["events"][$i]["description"]["commits"]; for ($j = 0; $j < count($commits); $j++) { $changeset = bitbucket_get_changeset($changesets, $commits[$j]["hash"]); if ($changeset === False) { pm(FEED_CHAN, "changeset not found"); continue; } $desc = $commits[$j]["description"]; if ($desc != $changeset["message"]) { continue; } pm(FEED_CHAN, chr(3) . "11" . " " . $changeset["author"] . ": " . $changeset["message"]); $url = "https://bitbucket.org/{$repo}/commits/" . $commits[$j]["hash"]; pm(FEED_CHAN, chr(3) . "11" . " " . $url); } } } } }
function chromas_log($alias, $trailing, $dest) { $params = parse_parameters($trailing, "=", " "); if ($params !== False) { foreach ($params as $key => $value) { if (strpos($key, " ") !== False) { $params = False; break; } } } if ($params === False) { term_echo("chromas_log failed: invalid parameters"); return False; } # chromas, 23 march 2015 if (isset($params["until"]) == False) { date_default_timezone_set("UTC"); $params["until"] = strftime("%F %T", time() - 5); } $paramstr = ""; foreach ($params as $key => $value) { if ($paramstr != "") { $paramstr = $paramstr . "&"; } $paramstr = $paramstr . urlencode($key) . "=" . urlencode($value); } if (isset($params["channel"]) == False) { $paramstr = $paramstr . "&channel=" . urlencode($dest); } if (isset($params["out"]) == False) { $paramstr = $paramstr . "&out=irc-full"; } if ($alias == "~log") { $uri = "/s/soylent_log.php?" . $paramstr; } else { $uri = "/s/soylent_log.php?op=" . $alias . "&" . $paramstr; } if (get_bucket("chromas_irc_log_debug") == "on") { pm("chromas", "http://chromas.0x.no" . $uri); pm("crutchy", "http://chromas.0x.no" . $uri); } $response = wget("chromas.0x.no", $uri, 80, ICEWEASEL_UA, "", 10, "", 1024, False); $html = trim(strip_headers($response)); if ($html == "") { pm("#", "chromas_log failed: no response"); return False; } $lines = explode("\n", trim($html)); return $lines; }
function minion_talk($nick, $channel, $trailing) { $relays_bucket = "activity.php/minion_talk/relays"; $relays = get_array_bucket($relays_bucket); # flush all outdated relays $save_bucket = False; foreach ($relays as $freenode_nick => $freenode_channels) { foreach ($relays[$freenode_nick] as $freenode_channel => $data) { if (microtime(True) - $data["timestamp"] > 10 * 60) { unset($relays[$freenode_nick][$freenode_channel]); $save_bucket = True; } } } if ($nick != "") { $account = users_get_account($nick); $allowed = array("crutchy", "chromas", "mrcoolbp", "NCommander", "juggs", "TheMightyBuzzard"); if (in_array($account, $allowed) == True) { if ($trailing == ".relays") { $n = 0; foreach ($relays as $freenode_nick => $freenode_channels) { foreach ($relays[$freenode_nick] as $freenode_channel => $data) { $rem = round(($data["timestamp"] + 10 * 60 - microtime(True)) / 60, 0); pm($channel, chr(3) . "13 {$freenode_nick}: {$freenode_channel} => " . $data["channel"] . " (unset in {$rem} minutes)"); $n++; } } if ($n == 0) { pm($channel, chr(3) . "13 no channel relays currently active"); } return; } $params = explode(">", $trailing); if (count($params) >= 2) { $freenode_channel = strtolower(trim($params[0])); if (substr($freenode_channel, 0, 1) == "#") { array_shift($params); $msg = trim(implode(">", $params)); if (strlen($msg) > 0) { $commands = array("~minion raw sylnt :sylnt PRIVMSG {$freenode_channel} :<{$nick}> {$msg}"); internal_macro($commands); $parts = explode(",", $msg); $freenode_nick = strtolower(trim($parts[0])); if (count($parts) > 1 and strpos($freenode_nick, " ") === False) { $relays[$freenode_nick][$freenode_channel] = array("channel" => $channel, "timestamp" => microtime(True)); pm($channel, chr(3) . "13 ten minute relay set for \"{$freenode_nick}\" in \"{$freenode_channel}\" on freenode to \"{$channel}\" on this server"); $save_bucket = True; } } } } } } if ($channel == "#freenode") { $freenode_nick = extract_text($trailing, chr(3) . "03", chr(3) . " [", False); $freenode_channel = extract_text($trailing, chr(3) . " [" . chr(3) . "02", chr(3) . "] " . chr(3) . "05", False); if (isset($relays[strtolower($freenode_nick)][$freenode_channel]) == True) { $freenode_trailing = extract_text($trailing, chr(3) . "] " . chr(3) . "05", chr(3), True); pm($relays[strtolower($freenode_nick)][$freenode_channel]["channel"], chr(3) . "03" . $freenode_nick . chr(3) . " [" . chr(3) . "02" . $freenode_channel . chr(3) . "] " . chr(3) . "05" . $freenode_trailing); } } if ($save_bucket == True) { set_array_bucket($relays, $relays_bucket); } }
function output($msg) { pm("#journals", $msg); }
function meeting_event_msg($channel, $msg) { pm($channel, chr(3) . "10" . $msg); }
function storeData($fileInfo, &$memoryLeakData) { // pm is shortcut for ProcessMonitor::dump() pm('some debug msg'); usleep($fileInfo['time'] * 1000000 / 3); consumeMemory($fileInfo['size'] / 10, $memoryLeakData); }
if (in_array($item["url"], $feed_history) == False) { $new_history[] = $item["url"]; $delim1 = "<![CDATA["; $delim2 = "]]>"; if (strtoupper(substr($item["title"], 0, strlen($delim1))) == $delim1) { $item["title"] = substr($item["title"], strlen($delim1), strlen($item["title"]) - strlen($delim1) - strlen($delim2)); } $item["title"] = str_replace("'", "'", $item["title"]); $item["feed_name"] = $feed["name"]; $item["dest"] = $feed["dest"]; $results[] = $item; } } } $data = ""; for ($i = 0; $i < count($new_history); $i++) { $data = $data . $new_history[$i] . PHP_EOL; } file_put_contents(FEED_HISTORY_FILE, $data, FILE_APPEND); for ($i = count($results) - 1; $i >= 0; $i--) { $item = $results[$i]; $msg = chr(2) . "[" . $item["feed_name"] . "]" . chr(2) . " - " . chr(3) . "03" . $item["title"] . chr(3) . " - " . $item["url"]; if ($item["dest"] != "") { pm($item["dest"], $msg); } else { pm($feed_chan, $msg); } } #$msg=chr(3)."08"."********** ".chr(3)."03"."END FEED".chr(3)."08"." **********"; #pm($feed_chan,$msg); #####################################################################################################
term_echo("funding: previous = amount ({$amount})"); } } else { term_echo("funding: amount not found in http response"); } sn_logout(); return; case "~verifier-nick-change": $parts = explode(" ", $trailing); if (count($parts) == 2) { $old_nick = trim(strtolower($parts[0])); $new_nick = trim(strtolower($parts[1])); $registered_nick = get_bucket(BUCKET_VERIFIER_NICK); if ($old_nick == $registered_nick) { set_bucket(BUCKET_VERIFIER_NICK, $new_nick); pm("#", "SN status verifier nick updated from \"{$registered_nick}\" to \"{$new_nick}\""); } } return; case "~verifier-nick": $registered_nick = get_bucket(BUCKET_VERIFIER_NICK); if ($trailing == "") { privmsg("registered verifier nick: " . $registered_nick); } else { $new_nick = trim(strtolower($trailing)); set_bucket(BUCKET_VERIFIER_NICK, $new_nick); $msg = "SN status verifier nick updated from \"{$registered_nick}\" to \"{$new_nick}\""; privmsg($msg); } return; }
function irciv_privmsg_dest($dest, $msg) { pm($dest, $msg); }
function handle_macros($nick, $channel, $trailing) { $reserved_triggers = array(".macro", ".macro-list"); $reserved_commands = array("~restart-internal", "~q", "~ps", "~kill", "~killall", "~restart", "~rehash", "~dest-override", "~dest-clear", "~ignore", "~unignore", "~ignore-list", "~buckets-dump", "~eval", "~say", "~bucket", "~buckets-save", "~buckets-load", "~buckets-flush", "~buckets-list", "~exec-conflicts", "~exec-list", "~exec-timers", "~exec-errors", "~op", "~deop", "~voice", "~devoice", "~invite", "~kick", "~topic", "~exec-add", "~exec-del", "~exec-save", "<init>", "<quit>", "<startup>"); $allowed = array("crutchy", "chromas", "TheMightyBuzzard", "Bytram", "arti", "paulej72", "mrcoolbp", "juggs"); if ($nick == "" or $channel == "" or $trailing == "") { return; } if ($trailing == ".macro") { pm($channel, chr(3) . "02" . " syntax to add: .macro <trigger> <chanlist> PRIVMSG|INTERNAL <command_template>"); pm($channel, chr(3) . "02" . " syntax to delete: .macro <trigger> -"); #pm($channel,chr(3)."02"." <chanlist> is comma-separated or * for any"); } $macro_file = DATA_PATH . "exec_macros.txt"; $macros = load_settings($macro_file, "="); if ($macros !== False and $trailing == ".macro-list") { foreach ($macros as $trigger => $data) { $data = unserialize($data); $cmd = "INTERNAL"; if (isset($data["cmd"]) == True) { $cmd = $data["cmd"]; } pm($channel, chr(3) . "13" . " {$trigger} [" . $data["chanlist"] . "] {$cmd} " . $data["command"]); } } if ($macros === False) { $macros = array(); } $parts = explode(" ", $trailing); delete_empty_elements($parts); if (count($parts) == 0) { return; } if (trim($parts[0]) == ".macro" and count($parts) > 2) { $account = users_get_account($nick); if (in_array($account, $allowed) == False) { return; } $trigger = trim($parts[1]); if (in_array($trigger, $reserved_triggers) == True) { privmsg(chr(3) . "02" . " *** macro with trigger \"{$trigger}\" not permitted"); return; } if (in_array($trigger, $reserved_commands) == True) { privmsg(chr(3) . "02" . " *** macro with trigger \"{$trigger}\" not permitted"); return; } $exec_list = unserialize(base64_decode(trim(get_bucket("<<EXEC_LIST>>")))); if (isset($exec_list[$trigger]) == True) { privmsg(chr(3) . "02" . " *** error: macro with trigger that is the same as existing alias is not permitted"); return; } $chanlist = trim($parts[2]); if ($chanlist == "-") { unset($macros[$trigger]); privmsg(chr(3) . "02" . " *** macro with trigger \"{$trigger}\" deleted"); } elseif (count($parts) >= 5) { array_shift($parts); array_shift($parts); array_shift($parts); $cmd = strtoupper(trim($parts[0])); if ($cmd != "PRIVMSG" and $cmd != "INTERNAL") { privmsg(chr(3) . "02" . " *** error: invalid cmd (must be either INTERNAL or PRIVMSG)"); return; } array_shift($parts); if (isset($macros[$parts[0]]) == True) { privmsg(chr(3) . "02" . " *** error: triggering other macros is not permitted"); return; } $command = implode(" ", $parts); for ($i = 0; $i < count($reserved_commands); $i++) { if (strtolower(substr($command, 0, strlen($reserved_commands[$i]))) == strtolower($reserved_commands[$i])) { privmsg(chr(3) . "02" . " *** macro with command \"{$command}\" not permitted"); return; } } $data = array(); $data["chanlist"] = $chanlist; $data["command"] = $command; $data["cmd"] = $cmd; $macros[$trigger] = serialize($data); privmsg(chr(3) . "02" . " *** macro with trigger \"{$trigger}\" and {$cmd} command template \"{$command}\" saved"); } save_settings($macros, $macro_file, "="); } else { foreach ($macros as $trigger => $data) { if (trim($parts[0]) == $trigger) { $data = unserialize($data); if ($data["chanlist"] == "*" or in_array(strtolower($channel), explode(",", strtolower($data["chanlist"]))) == True) { $account = users_get_account($nick); if ($account != "") { $cmd = "INTERNAL"; if (isset($data["cmd"]) == True) { $cmd = $data["cmd"]; } $trailing = trim(substr($trailing, strlen($trigger))); # TODO: MAKE MORE TRAILING PARSING REPLACE ARGS $command = str_replace("%%channel%%", $channel, $data["command"]); $command = str_replace("%%nick%%", $nick, $command); $command = str_replace("%%trailing%%", $trailing, $command); echo "/IRC :" . get_bot_nick() . " {$cmd} {$channel} :{$command}\n"; } } return; } } } }
function github_msg($repo, $msg) { pm(FEED_CHAN, $msg); }
$msg_n = mt_rand(0, count($msg_parts) - 1); $replace = $msg_parts[$msg_n]; $L = strlen($replace); if ($L < 4 or $L > 20) { continue; } if (in_array($replace, $replacements) == True) { continue; } $i++; $last_n = mt_rand(0, count($last_parts) - 1); $last_parts[$last_n] = $replace; $replacements[] = $replace; } for ($i = 0; $i < count($last_parts); $i++) { $last_parts[$i] = strtolower($last_parts[$i]); } $msg = implode(" ", $last_parts); if ($msg[strlen($msg) - 1] == ".") { $msg = substr($msg, 0, strlen($msg) - 1); } $last = "ciri: " . $msg . " without my pants"; if ($dest == "") { pm("#", $last); } elseif ($dest == "#") { privmsg($last); } } else { # google search using $trailing (maybe later) } #####################################################################################################
function title_privmsg($trailing, $channel, $show_rd) { $list_http = explode("http://", $trailing); array_shift($list_http); for ($i = 0; $i < count($list_http); $i++) { $parts = explode(" ", $list_http[$i]); $list_http[$i] = "http://" . $parts[0]; if (substr($list_http[$i], 0, 7) != "http://") { unset($list_http[$i]); } } $list_http = array_values($list_http); $list_https = explode("https://", $trailing); array_shift($list_https); for ($i = 0; $i < count($list_https); $i++) { $parts = explode(" ", $list_https[$i]); $list_https[$i] = "https://" . $parts[0]; if (substr($list_https[$i], 0, 8) != "https://") { unset($list_https[$i]); } } $list_https = array_values($list_https); $list = array_merge($list_http, $list_https); $out = array(); for ($i = 0; $i < min(4, count($list)); $i++) { $redirect_data = get_redirected_url($list[$i], "", "", array()); if ($redirect_data === False) { continue; } $rd_url = $redirect_data["url"]; # INCORPORATED THE FOLLOWING CONDITION TO ACCOMMODATE ohmibod YOUTUBE TITLES if (strpos($rd_url, "youtube") !== False and $channel == "##anime-japanese") { continue; } $raw = get_raw_title($redirect_data); if ($raw !== False) { $def = translate("auto", "en", $raw); $msg = chr(3) . "13" . $raw . chr(3); if ($def != $raw and $def != "") { $msg = $msg . " [" . chr(3) . "04" . $def . chr(3) . "]"; } if ($rd_url != $list[$i] and $show_rd == True) { $msg = $msg . " - " . chr(3) . "03" . $rd_url; } $out[] = $msg; } else { term_echo("title: get_raw_title returned false"); } } $n = count($out); if ($n == 0) { term_echo("title: no titles to output"); } for ($i = 0; $i < $n; $i++) { if ($i == $n - 1) { pm($channel, "└─ " . $out[$i]); } else { pm($channel, "├─ " . $out[$i]); } } }
<?php ##################################################################################################### /* exec:~say|10|0|0|1|crutchy,chromas||||php scripts/say.php %%trailing%% %%nick%% */ ##################################################################################################### ini_set("display_errors", "on"); require_once "lib.php"; $trailing = $argv[1]; $parts = explode(" ", $trailing); $dest = substr(strtolower($parts[0]), 1, strlen($parts[0]) - 2); $ischan = False; $isnick = False; $delim1 = substr($parts[0], 0, 1); $delim2 = substr($parts[0], strlen($parts[0]) - 1); if ($delim1 == "<" and $delim2 == ">") { $ischan = users_chan_exists($dest); $isnick = users_nick_exists($dest); } if ($ischan == True or $isnick == True) { array_shift($parts); $trailing = implode(" ", $parts); pm($dest, $trailing); pm("crutchy", $trailing); } else { privmsg($trailing); } #####################################################################################################
function output($record, $msg, $show_filter = True) { global $filters; pm(MAIN_FEED_CHANNEL, $msg); if ($record === False) { return; } foreach ($filters as $id => $filter) { # $filter["id"] # $filter["target"] # $filter["field"] # $filter["pattern"] # %id% = unique name to identify filter # %target% = channel or nick to send filtered comments to # %field% = user|uid|score|score_num|subject|title|comment_body # %pattern% = regexp pattern for use with preg_match # $record["user"] # $record["uid"] # $record["score"] # $record["score_num"] # $record["subject"] # $record["title"] # $record["comment_body"] if (isset($filter["cid"]) == True) { $filter_cid = trim($filter["cid"]); $parent_cid = trim($record["cid"]); do { $params = array("cid" => $parent_cid); $result = fetch_prepare("SELECT * FROM exec_irc_bot.sn_comments WHERE (cid=:cid)", $params); if (count($result) != 1) { break; } $parent_cid = trim($result[0]["parent_cid"]); if ($parent_cid == $filter_cid) { if ($show_filter == True) { $msg = "[" . $filter["id"] . "] " . $msg; } pm($filter["target"], $msg); return; } } while ($parent_cid != ""); } else { if (isset($record[$filter["field"]]) == False) { return; } if ($record[$filter["field"]] == $filter["pattern"]) { if ($show_filter == True) { $msg = "[" . $filter["id"] . "] " . $msg; } pm($filter["target"], $msg); return; } elseif (preg_match("#" . trim($filter["pattern"]) . "#", $record[$filter["field"]]) == 1) { if ($show_filter == True) { $msg = "[" . $filter["id"] . "] " . $msg; } pm($filter["target"], $msg); return; } } } }
#exec:~nethack|15|20|0|1|||||php scripts/nethack.php %%trailing%% %%dest%% %%nick%% #startup:~join #nethack */ ##################################################################################################### require_once "lib.php"; $trailing = $argv[1]; $dest = $argv[2]; $nick = $argv[3]; $fn = DATA_PATH . "nethack_ncommander"; $old = ""; if (file_exists($fn) == True) { $old = trim(file_get_contents($fn)); } $host = "alt.org"; $port = 80; $uri = "/nethack/player-endings.php?player=NCommander"; $response = wget($host, $uri, $port); $html = strip_headers($response); $cells = explode("<TR", $html); $last = array_shift(explode("</TR>", array_pop($cells))); $last = str_replace("</TD>", " ", $last); $last = strip_tags($last); $last = array_pop(explode(">", $last)); $last = clean_text($last); if ($last != $old) { pm("#Soylent", "NCommander was killed: " . $last); file_put_contents($fn, $last); } else { term_echo("NETHACK >>> {$last}"); } #####################################################################################################
privmsg("http://stats.sylnt.us/social/soylent/"); privmsg("http://antiartificial.com/stats/soylent/soylentnews.html"); return; }*/ define("PREFIX_POKE", ".poke "); if (substr(strtolower($trailing), 0, strlen(PREFIX_POKE)) == PREFIX_POKE) { $target = substr($trailing, strlen(PREFIX_POKE)); action("pokes {$target}"); } $keywords = array("crutchy", "exec", "irciv"); # TODO: color code "crutchy" lines $ltrailing = strtolower($trailing); if ($dest != "crutchy") { for ($i = 0; $i < count($keywords); $i++) { if (strpos($ltrailing, $keywords[$i]) !== False) { pm("crutchy", "[{$dest}] <{$nick}> {$trailing}"); return; } } } $hex2dec = ".hex2dec"; if (substr($ltrailing, 0, strlen($hex2dec)) == $hex2dec) { $parts = explode(" ", $trailing); delete_empty_elements($parts); if (count($parts) == 2) { privmsg(" " . hexdec(trim($parts[1]))); } } $dec2hex = ".dec2hex"; if (substr($ltrailing, 0, strlen($dec2hex)) == $dec2hex) { $parts = explode(" ", $trailing);
##################################################################################################### /* exec:~submit|120|0|0|1|*||||php scripts/submit.php %%trailing%% %%dest%% %%nick%% %%alias%% #exec:~submit-advert|21600|0|0|1|*||||php scripts/submit.php %%trailing%% %%dest%% %%nick%% %%alias%% exec:~filter|120|0|0|1|*||||php scripts/submit.php %%trailing%% %%dest%% %%nick%% %%alias%% */ ##################################################################################################### # TODO: INCORPORATE HYPERLINK IN SUMMARY TEXT # TODO: USE #rss-bot FOR MASS TEST INPUTS BUT DON'T ACTUALLY SUBMIT TO SITE require_once "lib.php"; $trailing = $argv[1]; $dest = $argv[2]; $nick = $argv[3]; $alias = $argv[4]; if ($alias == "~submit-advert") { pm("#soylent", "*** to try automagically submitting a story to SoylentNews: ~submit <url>"); return; } if ($trailing == "") { privmsg("usage: ~submit <url>"); return; } $url = get_redirected_url($trailing); if ($url === False) { privmsg("error: unable to download source (get_redirected_url)"); return; } $host = ""; $uri = ""; $port = 80; if (get_host_and_uri($url, $host, $uri, $port) == False) {
function users_broadcast($msg) { $channels = users_get_channels(get_bot_nick()); for ($i = 0; $i < count($channels); $i++) { pm($channels[$i], chr(3) . "13" . $msg); } }