} catch (Exception $e) { $irc->message(SMARTIRC_TYPE_CHANNEL, GAMECHANNEL, CTRL_B . $data->nick . CTRL_B . ": An internal error occured trying to send your Dogecoins.. Unfortunately, you win nothing.. :("); $this->game = false; return; } // aaand kill the game finally $this->game = false; $irc->message(SMARTIRC_TYPE_CHANNEL, GAMECHANNEL, CTRL_B . $data->nick . CTRL_B . ": You won " . DOGE . $amount . "!"); file_put_contents("/tmp/moon.info", ""); } } $bot = new monopoly(); $irc = new Net_SmartIRC(); $irc->setDebug(SMARTIRC_DEBUG_NONE); //$irc->setUseSockets(true); $irc->setChannelSyncing(true); $irc->registerActionHandler(SMARTIRC_TYPE_CHANNEL, '/^!taketurn$/', $bot, "takeTurn"); $irc->registerActionHandler(SMARTIRC_TYPE_CHANNEL, '/^!endturn$/', $bot, "endTurn"); $irc->registerActionHandler(SMARTIRC_TYPE_CHANNEL, '/^!payfine$/', $bot, "payFine"); $irc->registerActionHandler(SMARTIRC_TYPE_CHANNEL, '/^!usecard$/', $bot, "useCard"); $irc->registerActionHandler(SMARTIRC_TYPE_CHANNEL, '/^!buy$/', $bot, "buyProperty"); $irc->registerActionHandler(SMARTIRC_TYPE_CHANNEL, '/^!auction$/', $bot, "auctionProperty"); $irc->registerActionHandler(SMARTIRC_TYPE_CHANNEL, '/^!bid\\s/', $bot, "bidProperty"); $irc->registerActionHandler(SMARTIRC_TYPE_CHANNEL, '/^!buildhouse/', $bot, "buildHouse"); $irc->registerActionHandler(SMARTIRC_TYPE_CHANNEL, '/^!sellhouse/', $bot, "sellHouse"); $irc->registerActionHandler(SMARTIRC_TYPE_CHANNEL, '/^!mortgage/', $bot, "mortgageProperty"); $irc->registerActionHandler(SMARTIRC_TYPE_CHANNEL, '/^!unmortgage/', $bot, "unmortgageProperty"); $irc->registerActionHandler(SMARTIRC_TYPE_CHANNEL, '/^!starttrade/', $bot, "startTrade"); $irc->registerActionHandler(SMARTIRC_TYPE_CHANNEL, '/^!stoptrade$/', $bot, "stopTrade"); $irc->registerActionHandler(SMARTIRC_TYPE_CHANNEL, '/^!addprop.*/', $bot, "addProp"); $irc->registerActionHandler(SMARTIRC_TYPE_CHANNEL, '/^!delprop.*/', $bot, "delProp");
// prevent MySQL timeouts on slow channels. db_query('SET SESSION wait_timeout = %d', 24 * 60 * 60); // initialize the bot with some sane defaults. global $irc; // allow it to be slurped by Drupal modules if need be. $bot = new drupal_wrapper(); // wrapper that integrates with Drupal hooks. $irc = new Net_SmartIRC(); // MmmmmmM. The IRC object itself. Magick happens here. $irc->setDebug(variable_get('bot_debugging', 0) ? SMARTIRC_DEBUG_ALL : SMARTIRC_DEBUG_NONE); // the (boolean) here is required, as Net_SmartIRC doesn't respect a FAPI checkbox value of 1, only TRUE. $irc->setAutoReconnect((bool) variable_get('bot_auto_reconnect', 1)); // reconnect to the server if disconnected. $irc->setAutoRetry((bool) variable_get('bot_auto_retry', 1)); // retry if a server connection fails. $irc->setChannelSyncing(TRUE); // keep a list of joined users per channel. $irc->setUseSockets(TRUE); // uses real sockets instead of fsock(). // send every message type the library supports to our wrapper class. // we can automate the creation of these actionhandlers, but not the // class methods below (only PHP 5 supports default methods easily). $irc_message_types = array('UNKNOWN', 'CHANNEL', 'QUERY', 'CTCP', 'NOTICE', 'WHO', 'JOIN', 'INVITE', 'ACTION', 'TOPICCHANGE', 'NICKCHANGE', 'KICK', 'QUIT', 'LOGIN', 'INFO', 'LIST', 'NAME', 'MOTD', 'MODECHANGE', 'PART', 'ERROR', 'BANLIST', 'TOPIC', 'NONRELEVANT', 'WHOIS', 'WHOWAS', 'USERMODE', 'CHANNELMODE', 'CTCP_REQUEST', 'CTCP_REPLY'); foreach ($irc_message_types as $irc_message_type) { $irc->registerActionhandler(constant('SMARTIRC_TYPE_' . $irc_message_type), '.*', $bot, 'invoke_irc_msg_' . strtolower($irc_message_type)); } // set up a timers similar to Drupal's hook_cron(), multiple types. I would have // liked to just pass a parameter to a single function, but SmartIRC can't do that. $irc->registerTimehandler(300000, $bot, 'invoke_irc_bot_cron'); // 5 minutes. $irc->registerTimehandler(60000, $bot, 'invoke_irc_bot_cron_faster');
/** * Create IRC Bot, connect, login and listen for events, and finally disconnect. */ public function run() { $config = $this->config; // setup logging // redirect stderr to a log ini_set('log_errors', 'On'); ini_set('error_log', $config['error_log']); $this->irc = $irc = new Net_SmartIRC(); if (isset($config['debuglevel'])) { $irc->setDebugLevel($config['debuglevel']); } if (isset($config['logfile'])) { $irc->setLogdestination(SMARTIRC_FILE); $irc->setLogfile($config['logfile']); } // reconnect is poorly designed, do not use it // @see https://pear.php.net/bugs/bug.php?id=20974 //$irc->setAutoRetry(true); $irc->setAutoRetry(false); $irc->setAutoRetryMax(PHP_INT_MAX); $irc->setReconnectDelay(10000); $irc->setReceiveTimeout(600); $irc->setTransmitTimeout(600); // enable user and channel syncing, // users are accessible via $irc->user array, i.e $irc->user['meebey']->host; $irc->setChannelSyncing(true); $irc->setUserSyncing(true); $this->registerHandlers($this->irc); $irc->connect($config['hostname'], $config['port']); if (empty($config['username'])) { $irc->login($config['nickname'], $config['realname']); } elseif (empty($config['password'])) { $irc->login($config['nickname'], $config['realname'], 0, $config['username']); } else { $irc->login($config['nickname'], $config['realname'], 0, $config['username'], $config['password']); } $this->joinChannels($irc); // loop forever, reconnect and retry // @see https://pear.php.net/bugs/bug.php?id=20974 while (!$this->shutdown) { $irc->listen(); $irc->reconnect(); } $irc->disconnect(); }