rendered paste body<?php/** * SimpleIRC PHP IRC Framework * * This is a simple IRC framework that relies on sockets and PCRE to handle * events and messages. * * @author Dean Newman < webmaster@auscoder.com > * @copyright Copyright © Dean Newman, 2007 * @license GNU/General Public License v2 */// Make sure sockets are loadedif ( !extension_loaded('sockets') ){ trigger_error('SimpleIRC Error: Sockets extension is not loaded!');}// IRC Reply codes$irc_reply_codes = array( 'RPL_WELCOME' => '001', 'RPL_YOURHOST' => '002', 'RPL_CREATED' => '003', 'RPL_MYINFO' => '004', 'RPL_BOUNCE' => '005', 'RPL_TRACELINK' => '200', 'RPL_TRACECONNECTING' => '201', 'RPL_TRACEHANDSHAKE' => '202', 'RPL_TRACEUNKNOWN' => '203', 'RPL_TRACEOPERATOR' => '204', 'RPL_TRACEUSER' => '205', 'RPL_TRACESERVER' => '206', 'RPL_TRACESERVICE' => '207', 'RPL_TRACENEWTYPE' => '208', 'RPL_TRACECLASS' => '209', 'RPL_TRACERECONNECT' => '210', 'RPL_STATSLINKINFO' => '211', 'RPL_STATSCOMMANDS' => '212', 'RPL_ENDOFSTATS' => '219', 'RPL_UMODEIS' => '221', 'RPL_SERVLIST' => '234', 'RPL_SERVLISTEND' => '235', 'RPL_STATSUPTIME' => '242', 'RPL_STATSOLINE' => '243', 'RPL_LUSERCLIENT' => '251', 'RPL_LUSEROP' => '252', 'RPL_LUSERUNKNOWN' => '253', 'RPL_LUSERCHANNELS' => '254', 'RPL_LUSERME' => '255', 'RPL_ADMINME' => '256', 'RPL_ADMINLOC1' => '257', 'RPL_ADMINLOC2' => '258', 'RPL_ADMINEMAIL' => '259', 'RPL_TRACELOG' => '261', 'RPL_TRACEEND' => '262', 'RPL_TRYAGAIN' => '263', 'RPL_AWAY' => '301', 'RPL_USERHOST' => '302', 'RPL_ISON' => '303', 'RPL_UNAWAY' => '305', 'RPL_NOWAWAY' => '306', 'RPL_WHOISUSER' => '311', 'RPL_WHOISSERVER' => '312', 'RPL_WHOISOPERATOR' => '313', 'RPL_WHOWASUSER' => '314', 'RPL_ENDOFWHO' => '315', 'RPL_WHOISIDLE' => '317', 'RPL_ENDOFWHOIS' => '318', 'RPL_WHOISCHANNELS' => '319', 'RPL_LISTSTART' => '321', 'RPL_LIST' => '322', 'RPL_LISTEND' => '323', 'RPL_CHANNELMODEIS' => '324', 'RPL_UNIQOPIS' => '325', 'RPL_NOTOPIC' => '331', 'RPL_TOPIC' => '332', 'RPL_INVITING' => '341', 'RPL_SUMMONING' => '342', 'RPL_INVITELIST' => '346', 'RPL_ENDOFINVITELIST' => '347', 'RPL_EXCEPTLIST' => '348', 'RPL_ENDOFEXCEPTLIST' => '349', 'RPL_VERSION' => '351', 'RPL_WHOREPLY' => '352', 'RPL_NAMREPLY' => '353', 'RPL_LINKS' => '364', 'RPL_ENDOFLINKS' => '365', 'RPL_ENDOFNAMES' => '366', 'RPL_BANLIST' => '367', 'RPL_ENDOFBANLIST' => '368', 'RPL_ENDOFWHOWAS' => '369', 'RPL_INFO' => '371', 'RPL_MOTD' => '372', 'RPL_ENDOFINFO' => '374', 'RPL_MOTDSTART' => '375', 'RPL_ENDOFMOTD' => '376', 'RPL_YOUREOPER' => '381', 'RPL_REHASHING' => '382', 'RPL_YOURESERVICE' => '383', 'RPL_TIME' => '391', 'RPL_USERSSTART' => '392', 'RPL_USERS' => '393', 'RPL_ENDOFUSERS' => '394', 'RPL_NOUSERS' => '395', 'ERR_NOSUCHNICK' => '401', 'ERR_NOSUCHSERVER' => '402', 'ERR_NOSUCHCHANNEL' => '403', 'ERR_CANNOTSENDTOCHAN' => '404', 'ERR_TOOMANYCHANNELS' => '405', 'ERR_WASNOSUCHNICK' => '406', 'ERR_TOOMANYTARGETS' => '407', 'ERR_NOSUCHSERVICE' => '408', 'ERR_NOORIGIN' => '409', 'ERR_NORECIPIENT' => '411', 'ERR_NOTEXTTOSEND' => '412', 'ERR_NOTOPLEVEL' => '413', 'ERR_WILDTOPLEVEL' => '414', 'ERR_BADMASK' => '415', 'ERR_UNKNOWNCOMMAND' => '421', 'ERR_NOMOTD' => '422', 'ERR_NOADMININFO' => '423', 'ERR_FILEERROR' => '424', 'ERR_NONICKNAMEGIVEN' => '431', 'ERR_ERRONEUSNICKNAME' => '432', 'ERR_NICKNAMEINUSE' => '433', 'ERR_NICKCOLLISION' => '436', 'ERR_UNAVAILRESOURCE' => '437', 'ERR_USERNOTINCHANNEL' => '441', 'ERR_NOTONCHANNEL' => '442', 'ERR_USERONCHANNEL' => '443', 'ERR_NOLOGIN' => '444', 'ERR_SUMMONDISABLED' => '445', 'ERR_USERSDISABLED' => '446', 'ERR_NOTREGISTERED' => '451', 'ERR_NEEDMOREPARAMS' => '461', 'ERR_ALREADYREGISTRED' => '462', 'ERR_NOPERMFORHOST' => '463', 'ERR_PASSWDMISMATCH' => '464', 'ERR_YOUREBANNEDCREEP' => '465', 'ERR_YOUWILLBEBANNED' => '466', 'ERR_KEYSET' => '467', 'ERR_CHANNELISFULL' => '471', 'ERR_UNKNOWNMODE' => '472', 'ERR_INVITEONLYCHAN' => '473', 'ERR_BANNEDFROMCHAN' => '474', 'ERR_BADCHANNELKEY' => '475', 'ERR_BADCHANMASK' => '476', 'ERR_NOCHANMODES' => '477', 'ERR_BANLISTFULL' => '478', 'ERR_NOPRIVILEGES' => '481', 'ERR_CHANOPRIVSNEEDED' => '482', 'ERR_CANTKILLSERVER' => '483', 'ERR_RESTRICTED' => '484', 'ERR_UNIQOPPRIVSNEEDED' => '485', 'ERR_NOOPERHOST' => '491', 'ERR_UMODEUNKNOWNFLAG' => '501', 'ERR_USERSDONTMATCH' => '502',);foreach ($irc_reply_codes as $key => $value){ define('IRC_' . $key, $value);}unset($irc_reply_codes);// Action handler codesdefine('TYPE_UNKNOWN', 1);define('TYPE_CHANNEL', 2);define('TYPE_QUERY', 4);define('TYPE_CTCP', 8);define('TYPE_NOTICE', 16);define('TYPE_WHO', 32);define('TYPE_JOIN', 64);define('TYPE_INVITE', 128);define('TYPE_ACTION', 256);define('TYPE_TOPICCHANGE', 512);define('TYPE_NICKCHANGE', 1024);define('TYPE_KICK', 2048);define('TYPE_QUIT', 4096);define('TYPE_LOGIN', 8192);define('TYPE_INFO', 16384);define('TYPE_LIST', 32768);define('TYPE_NAME', 65536);define('TYPE_MOTD', 131072);define('TYPE_MODECHANGE', 262144);define('TYPE_PART', 524288);define('TYPE_ERROR', 1048576);define('TYPE_BANLIST', 2097152);define('TYPE_TOPIC', 4194304);define('TYPE_NONRELEVANT', 8388608);define('TYPE_WHOIS', 16777216);define('TYPE_WHOWAS', 33554432);define('TYPE_USERMODE', 67108864);define('TYPE_CHANNELMODE', 134217728);define('TYPE_CTCP_REQUEST', 268435456);define('TYPE_CTCP_REPLY', 536870912);define('TYPE_ALL', 1073741823);// Connection statesdefine('SIMPLEIRC_DISCONNECTED', 0);define('SIMPLEIRC_CONNECTED', 1);class SimpleIRC{ private $_fp; private $_actions; private $_num_actions; private $_username; private $_password; private $_channels; private $_motd; private $_loggedin; private $_usermode; private $_realname; private $_server; private $_port; private $_channels; public function SimpleIRC() { } public function connect($server, $identd_user = 'SimpleIRC', $identd_os = 'PHP_SimpleIRC_Application') { } public function login($username, $password = false) { } public function join($channels) { } public function listen() { while ( $response = $this->_raw_receive() ) { $this->_handle_actions($response->type, $response); $this->_log_response($response); } } public function quit() { } public function registerAction($type, $regex, $object, $method) { $handler = new SimpleIRC_Action; $handler->id = $this->_num_actions++; $handler->type = $type; $handler->regex = $regex; $handler->object =&$object $handler->method = $method; $this->_actions[$handler->id] = $handler; return $handler->id; } public function unregisterAction($id) { if ( is_array($this->_actions) && array_search($id, $this->_actions) ) { unset($this->_actions[$id]); } return true; } private function _raw_send($command) { if ( $this->_state != SIMPLEIRC_CONNECTED ) { return; } } /** * Read the incoming data in to a response object * @return Object: SimpleIRC_response */ private function _raw_receive() { // Check we are connected first if ( $this->_state != SIMPLEIRC_CONNECTED ) { return; } // Read the buffer $buffer = @socket_read($this->_fp, 4096); // Process the reply in to memory $response_type = $this->_receive_type($buffer); $response_message = $this->_receive_message($buffer); $response_channel = $this->_receive_channel($buffer); $response_user = $this->_receive_user($buffer); // Process the channel name into existing object if ( $response->type & TYPE_ACTION|TYPE_CHANNEL|TYPE_QUERY|TYPE_NOTICE|TYPE_JOIN|TYPE_TOPICCHANGE |TYPE_NICKCHANGE|TYPE_KICK|TYPE_PART|TYPE_MODE_CHANGE|TYPE_QUIT && !empty($response_channel) ) { $response_channel = $this->_channel_data($response_channel); } // Fill in the response object $response = new SimpleIRC_Response; $response->type = $response_type; $response->message = $response_message; $response->user = $response_user; $response->channel = $response_channel; // Return the response object return $response; } private function _log_response($response) { if ( !$response instanceof SimpleIRC_Response ) { return; } } private function _handle_actions($type, $data) { if ( !$data instanceof SimpleIRC_Response ) { return; } $actions = array(); foreach ( $this->_actions AS $action ) { if ( ($action->type & $type) && preg_match($action->regex, $data->message) ) { $action->object->$method($this, $data); } } return $actions; } private function _receive_type($line) { if ( preg_match('/^:.* [0-9]{3} .*$/', $line) == 1 ) { $lineex = explode(' ', $line); $code = $lineex[1]; switch ( $code ) { case IRC_RPL_WELCOME: return TYPE_LOGIN; case IRC_RPL_YOURHOST: return TYPE_LOGIN; case IRC_RPL_CREATED: return TYPE_LOGIN; case IRC_RPL_MYINFO: return TYPE_LOGIN; case IRC_RPL_BOUNCE: return TYPE_LOGIN; case IRC_RPL_LUSERCLIENT: return TYPE_INFO; case IRC_RPL_LUSEROP: return TYPE_INFO; case IRC_RPL_LUSERUNKNOWN: return TYPE_INFO; case IRC_RPL_LUSERME: return TYPE_INFO; case IRC_RPL_LUSERCHANNELS: return TYPE_INFO; case IRC_RPL_MOTDSTART: return TYPE_MOTD; case IRC_RPL_MOTD: return TYPE_MOTD; case IRC_RPL_ENDOFMOTD: return TYPE_MOTD; case IRC_RPL_NAMREPLY: return TYPE_NAME; case IRC_RPL_ENDOFNAMES: return TYPE_NAME; case IRC_RPL_WHOREPLY: return TYPE_WHO; case IRC_RPL_ENDOFWHO: return TYPE_WHO; case IRC_RPL_LISTSTART: return TYPE_NONRELEVANT; case IRC_RPL_LIST: return TYPE_LIST; case IRC_RPL_LISTEND: return TYPE_LIST; case IRC_RPL_BANLIST: return TYPE_BANLIST; case IRC_RPL_ENDOFBANLIST: return TYPE_BANLIST; case IRC_RPL_TOPIC: return TYPE_TOPIC; case IRC_RPL_WHOISUSER: return TYPE_WHOIS; case IRC_RPL_WHOISSERVER: return TYPE_WHOIS; case IRC_RPL_WHOISOPERATOR: return TYPE_WHOIS; case IRC_RPL_WHOISIDLE: return TYPE_WHOIS; case IRC_RPL_WHOISIDLE: return TYPE_WHOIS; case IRC_RPL_ENDOFWHOIS: return TYPE_WHOIS; case IRC_RPL_WHOISCHANNELS: return TYPE_WHOIS; case IRC_RPL_WHOWASUSER: return TYPE_WHOWAS; case IRC_RPL_ENDOFWHOWAS: return TYPE_WHOWAS; case IRC_RPL_UMODEIS: return TYPE_USERMODE; case IRC_RPL_CHANNELMODEIS: return TYPE_CHANNELMODE; case IRC_ERR_NICKNAMEINUSE: return TYPE_ERROR; case IRC_ERR_NOTREGISTERED: return TYPE_ERROR; default: return TYPE_UNKNOWN; } } switch ( true ) { case (preg_match('/^:.* PRIVMSG .* :'.chr(1).'ACTION .*'.chr(1).'$/', $line) == 1): return TYPE_ACTION; case (preg_match('/^:.* PRIVMSG .* :'.chr(1).'.*'.chr(1).'$/', $line) == 1): return TYPE_CTCP; case (preg_match('/^:.* PRIVMSG (\&|\#|\+|\!).* :.*$/', $line) == 1): return TYPE_CHANNEL; case (preg_match('/^:.* PRIVMSG .*:.*$/', $line) == 1): return TYPE_QUERY; case (preg_match('/^:.* NOTICE .* :.*$/', $line) == 1): return TYPE_NOTICE; case (preg_match('/^:.* INVITE .* .*$/', $line) == 1): return TYPE_INVITE; case (preg_match('/^:.* JOIN .*$/', $line) == 1): return TYPE_JOIN; case (preg_match('/^:.* TOPIC .* :.*$/', $line) == 1): return TYPE_TOPICCHANGE; case (preg_match('/^:.* NICK .*$/', $line) == 1): return TYPE_NICKCHANGE; case (preg_match('/^:.* KICK .* .*$/', $line) == 1): return TYPE_KICK; case (preg_match('/^:.* PART .*$/', $line) == 1): return TYPE_PART; case (preg_match('/^:.* MODE .* .*$/', $line) == 1): return TYPE_MODE_CHANGE; case (preg_match('/^:.* QUIT :.*$/', $line) == 1): return TYPE_QUIT; default: return TYPE_UNKNOWN; } }}class SimpleIRC_Action{ public $id; public $action; public $type; public $regex; public $object; public $method;}class SimpleIRC_Response{ public $user; public $message; public $type; public $channel;}class SimpleIRC_Channel{ public $channel; public $users; public $voice; public $ops; public $status; public $mode;}class SimpleIRC_User{ public $nick; public $mode; public $channels; public $identified;}?>