All pastes #496157 Raw Edit

Someone

public php v1 · immutable
·published 2007-05-19 02:43 UTC
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 &copy; 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;}?>