All pastes #135844 Raw Edit

PHP IRC Bot

public php v1 · immutable
#135844 ·published 2006-08-17 06:34 UTC
rendered paste body
<?php/* CONFIG */set_time_limit(0);$config = array();$config['init'] = 1;$config['server'] = 'irc.netgamers.org';$config['port'] = '6667';$config['usernick'] = 'Tommeh';$config['altnick'] = 'Tommmeh';$config['username'] = 'Tommeh';$config['channels'] =	array(		'#melons',	);/* INITIATE CONNECTION */print('Connecting to ' . $config['server'] . ' on port ' . $config['port'] . "\n");$connection = array();$connection['buffer'] = array();$connection['settings'] = array();$connection['server'] = array();$connection['channels'] = array();$connection['socket'] = fsockopen($config['server'],$config['port']);if ($connection['socket']) {	raw('USER ' . $config['usernick'] . ' localhost localhost :' . $config['username']);	raw('NICK ' . $config['usernick'] . ' localhost');	$connection['settings']['nick'] = $config['usernick'];}else {	print('Unable to connect.');}/* CONNECTION LOOP */while (!feof($connection['socket'])) {	$connection['buffer']['all'] = trim(fgets($connection['socket'],4096));	if ($connection['buffer']['all'] != $oldbuffer) {		if (substr($connection['buffer']['all'],0,6) == 'PING :') {			raw('PONG :' . substr($connection['buffer']['all'],6));			if ($config['init'] == 1) {				$config['init'] = 0;				init();			}		}		else {			parsebuffer();			checkbuffer();		}	}	$oldbuffer = $connection['buffer']['all'];}?><?php/* ENGINE FUNCTIONS */function init() {	global $connection, $config;	foreach ($config['channels'] as $channel) {		raw('JOIN ' . $channel);	}}function raw($what) {	global $connection, $config;	print date("[d/m - H:i:s]") . " -> " . $what . "\n";	fputs($connection['socket'],$what . "\r\n");}function parsebuffer() {	global $connection, $config;	print date("[d/m - H:i:s]") . " <- " . $connection['buffer']['all'] . "\n";	$buffer = explode(' ',$connection['buffer']['all'],4);	foreach ($buffer as $i => $j) {		if (substr($j,0,1) == ":") {			buffer[$i] = substr($j,1);		}	}	$posex = strpos($buffer[0],'!');	$posat = strpos($buffer[0],'@');	$connection['buffer']['usernick'] = substr($buffer[0],1,$posex-1);	$connection['buffer']['identd'] = substr($buffer[0],$posex+1,$posat-$posex-1);	$connection['buffer']['hostname'] = substr($buffer[0],$posat+1);		$connection['buffer']['command'] = $buffer[1];	$connection['buffer']['target'] = $buffer[2];	$connection['buffer']['arguments'] = $buffer[3];}function checkbuffer() {	global $connection, $config;	switch($connection['buffer']['command']) {		/* ### Nick in use ###		If first nick in use, re-send NICK command with alternate nick and change settings to match */		case '433':			raw('NICK ' . $config['altnick']);			$connection['settings']['nick'] = $config['altnick'];			break;				/* ### Server info / modes ###		Get server cmodes, umodes, settings */		case '005':			$settings = $connection['buffer']['argument'];			if (preg_match('/^.*PREFIX=\(([a-zA-Z]+)\)([^\s]+).*$/',$settings,$matches)) {				$connection['server']['modes']['umodes'] = str_split($matches[1]);				$connection['server']['modes']['prefixes'] = str_split($matches[2]);				foreach ($connection['server']['modes']['prefixes'] as $pr) {					$connection['server']['modes']['prefixlist'] .= '\\' . $pr;				}			}			if (preg_match('/^.*CHANMODES=([^\s]+).*$/',$settings,$matches)) {				$connection['server']['modes']['cmodes'] = str_split($matches[1]);			}			break;		/* ### JOIN ###		On JOIN, check for self: if so, create arrays for channel; if someone else, add them to the channel userlist */		case 'JOIN':			$channel = $connection['buffer']['target'];			$nick = $connection['buffer']['usernick'];			if ($nick == $connection['settings']['nick']) {				$connection['channels'][$channel] = array();				$connection['channels'][$channel]['topic'] = array();				$connection['channels'][$channel]['modes'] = array();				$connection['channels'][$channel]['names'] = 0;			}			else {				$connection['channels'][$channel]['users'][$nick] = "1";			}			break;		/* ### PART and QUIT ###		On PART, unset nick value in channel; On QUIT, unset nick value in all channels */		case 'PART':			$channel = $connection['buffer']['target'];			$nick = $connection['buffer']['usernick'];			if ($nick == $connection['settings']['nick']) {				unset($connection['channels'][$channel]);			}			else {				unset($connection['channels'][$channel]['users'][$nick]);			}			break;		case 'QUIT':			$nick = $connection['buffer']['usernick'];			if ($nick != $connection['settings']['nick']) {				foreach ($connection['channels'] as $channel) {					if (isset($connection['channels'][$channel][$nick])) {						unset($connection['channels'][$channel][$nick]);					}				}			}			break;		/* ### NICK ###		On NICK, if self, change settings; if someone else, copy and unset nick value in all channels */		case 'NICK':			$nick = $connection['buffer']['usernick'];			$newnick = $connection['buffer']['target'];			if ($nick = $connection['settings']['nick']) {				$connection['settings']['nick'] = $newnick;			}			foreach ($connection['channels'] as $channel) {				if (isset($connection['channels'][$channel][$nick])) {					$connection['channels'][$channel][$newnick] = $connection['channels'][$channel][$nick];					unset($connection['channels'][$channel][$nick]);				}			}			break;		/* ### /NAMES list ###		When given /NAMES list, mark channel as compiling list and clear if first list, add nicks to channel, add umodes to users */		case '353':			$list = substr($connection['buffer']['arguments'],strpos($connection['buffer']['arguments'],"#"));			$channel = substr($list,0,strpos($list," ") - 1);			if ($connection['channels'][$channel]['names'] = 0) {				$connection['channels'][$channel]['users'] = array();				$connection['channels'][$channel]['names'] = 1;			}			$nicks = substr($list,strpos($list,":"));			$nicks = explode(" ",$nicks);			foreach ($nicks as $nick) {				$umode = "1";				if (preg_match('/^[' . $connection['server']['modes']['prefixlist'] . '].*$/',$nick)) {					$umode = substr($nick,0,1);					$nick = substr($nick,1);				}				$connection['channels'][$channel]['users'][$nick] = $umode;			}			break;		/* ### End of /NAMES list ###		Mark channel as not compiling list */		case '356':			$channel = $connection['buffer']['target'];			$connection['channels'][$channel]['names'] = 0;						break;	}}?>