[b]De Class[/b]
[code]
<?php
	class Ircbot
	{
		private $config = array();
		private $actions = array();
		private $online_owners = array();
		public function __construct($server, $port, $channel)
		{
			$this->config['server'] = $server; //Set $this->config['server'] to the server
			$this->config['port'] = $port; //Set $this->config['port'] to the port
			$this->config['channel'] = $channel;
		}
		public function setIdentity($nickname, $realname, $ident)
		{
			$this->config['identity'] = array('nickname'=>$nickname, 'realname'=>$realname, 'ident'=>$ident); // Set $this->config['identity'] to a array with the identity
		}
		public function setOwners($owners)
		{
			
			foreach($owners as $name=>$password)
			{
				$this->config['owners'][$name] = $password;
			}
		}
		public function addAction($name, $function, $owner = false)
		{
			$this->actions[$name] = array('function'=>$function, 'owner'=>$owner); //$this->actions[$name] to $function
		}
		public function write($data)
		{
			socket_write($this->socket,$data."\r\n");
		}
		public function nickname($str)
		{
			return substr(array_shift(explode('!',$str)),1);
		}
		public function connect()
		{
			if(!$this->socket = socket_create(AF_INET,SOCK_STREAM,SOL_TCP))
			{
				echo 'De socket kan niet worden aangemaakt.';
				exit();
			} 
			echo 'Socket is aangamaakt.'."\n";
			if(isset($this->config['hostname'])) { $hostname = $this->config['hostname']; } else { $hostname = 0; }
			if(!socket_bind($this->socket,$hostname))
			{
				echo 'Verbinding kon niet worden gekoppeld aan hostname '.$hostname;
				exit();
			}
			echo 'Verbinding gekoppeld aan hostname'."\n";
			if(!isset($this->config['server']) || !isset($this->config['port']))
			{
				echo 'De gegevens voor de sever of de poort missen.';
				exit();
			}
			if(!socket_connect($this->socket,$this->config['server'],$this->config['port'])) 
			{
				echo 'Verbinding met server kon niet tot stand worden gebracht.';
				exit();
			}
			echo 'Maken van verbinding...'."\n";
			if(!isset($this->config['identity']['ident']) || !isset($this->config['identity']['realname']) || !isset($this->config['identity']['nickname']))
			{
				echo 'Er missen vereiste gegevens. Weet u zeker dat u setIdentity(nickname, realname, ident) heeft gebruikt?';
				exit();
			}
			$this->write('USER '.$this->config['identity']['ident'].' 0 '.$this->config['server'].' :'.$this->config['identity']['realname']);
			$this->write('NICK '.$this->config['identity']['nickname']);
			$this->inChannel = false;
			
			while($data = socket_read($this->socket,65000,PHP_NORMAL_READ)) 
			{
				
				if($data == "\n") continue;
				$eData    = explode(" ",$data);
    			for($i = 0; isset($eData[$i]); $i++) {
        			$eData[$i]    = trim($eData[$i]);
    			}
				echo $data."\n";
				if($this->inChannel == false && strstr($data,'MOTD')) 
				{
    				$this->write('JOIN '.$this->config['channel']);
        			$this->inChannel = true;
				}
				if($eData[0] == 'PING') {
        			$this->write('PONG '.$eData[1]);
    			}
				if(isset($eData[3]) && preg_match('#:login#', $eData[3], $matches))
				{
					if($eData[1] == 'PRIVMSG')
					{

						if(isset($this->config['owners'][$eData[4]]))
						{
							if($eData[5] == $this->config['owners'][$eData[4]])
							{
								$this->online_owners[$this->nickname($eData[0])] = $eData[4];
								$this->write('NOTICE '.$this->nickname($eData[0]).' : Je bent succesvol ingelogd!');
								print_r($this->online_owners);
							}
							else
							{
								$this->write('NOTICE '.$this->nickname($eData[0]).' : Je gegevens kloppen niet');
							}
						}
						else
						{
							$this->write('NOTICE '.$this->nickname($eData[0]).' : Je gegevens kloppen niet');
						}
					}
				}
				if($eData[1] == 'QUIT')
				{
					$nick = $this->nickname($eData[0]);
					if(isset($this->online_owners[$nick]))
					{
						unset($this->online_owners[$nick]);
						echo $nick.' is uitgelogd, zijn sessie is verwijderd!';
					}
				}
    			if(isset($eData[3]) && preg_match('#:!(.*)#', $eData[3], $matches))
    			{
    				$name = $matches[1];
    				if(isset($this->actions[$name]))
    				{
    					
    					$action = $this->actions[$name];
    					$name = $action['function'];
    					if($action['owner'])
    					{
    						$acces = false;
    						
    							if( isset( $this->online_owners[$this->nickname($eData[0])] ) )
    							{
    								$acces = true;
    							}
    						
    						if($acces)
    						{
    							$name($this, $eData);
    						}
    						else
    						{
    							$this->write('NOTICE '.$this->nickname($eData[0]).' : Je hebt geen recht om deze actie uit te voeren!');
    						}
    					}
    					else
    					{
    						$name($this, $eData);
    					}
    					
    				}

    			}
			}
		}
			
	}
?>
[/code]

[b]Hoe moet ik de bot gebruiken??[/b]

Het gebruik van deze bot is niet al te moeilijk. Het belangrijkste is om de class file bovenaan te includen. Hierna dient te bot class te worden gestart. Hierna moeten nog een aantal dingen gedaan worden zoals het setten van de owners. Dit komt er uiteindelijk zo uit te zien:
[code]
<?php
require_once('ircbot.inc.php');
$bot = new Ircbot('server', 6667, '#kanaal');
$bot->setOwners(array('gebruiker1'=>'wachtwoord', 'gebruiker2'=>'anderwachtwoord'));
$bot->setIdentity('Nickname', 'realname', 'ident');
$bot->connect(); //Start de bot
?>
[/code]

Als je de bot nu zal starten in bijvoorbeeld CMD, zal hij na een aantal seconden verschijnen in het irc kanaal. 

Misschien zoals je nu ziet heeft de bot nog geen functies, de functies kunnen we toevoegen door gebruik te maken van closures:
[code]
<?php
$function = function($class, $data)
{
	$string    = trim(array_pop(explode('!google',$data[4])));  
    $url             = 'http://www.google.nl/search?hl=nl&q='.urlencode($string);
	$class->write('PRIVMSG #devhouse : Google Zoeken: '.$url);
};

$bot->addAction('google', $function);
?>
[/code]

Deze bovenstaande code zorgt ervoor dat als de gebruiker [b]!google zoekwoord[/b] hij een google link terug krijgt.
Door de code hierboven de gebruiken, kun je vele handige of onnozele functies maken. Maar je wilt natuurlijk ook een paar functies die zo beveiligd zijn dat alleen de eigenaren(owners) ze kunnen gebruiken. Dit kun je doen door een derde parameter met als waarde true mee te geven aan addAction(). Dit zal er dan ongeveer zo uitzien:
[code]
$bot->addAction('google', $function, true);
[/code]

Om owner te worden van de bot dien je eerst 2 dingen te doen, een account aanmaken door setOwners() en inloggen door [b]login gebruikersnaam wachtwoord[/b] tegen de bot te zeggen. Dit dien je zo in een irc client te doen:
[code]
/msg NaamVanBot login gebruikersnaam wachtwoord[/code]

Ik hoop dat ik zo duidelijk genoeg ben geweest, vragen kunnen altijd gesteld worden.

[b]Edit:[/b]

Even een voorbeeldje van hoe mijn bot er nu uitziet:
[code]
<?php
require_once('ircbot.inc.php');
$bot = new Ircbot('irc.chatfactory.net', 6667, '#devhouse');
$bot->setOwners(array('gbnaam'=>'wwoord'));
$bot->setIdentity('Nickname, 'Realname', 'ident');
$function = function($class, $data)
{
	$string    = trim(array_pop(explode('!google',$data[4])));  
    $url             = 'http://www.google.nl/search?hl=nl&q='.urlencode($string);
	$class->write('PRIVMSG #devhouse : Google Zoeken: '.$url);
};

$bot->addAction('google', $function);

$function = function($class, $data)
{
	$class->write('QUIT : Ik ga slapie doen!:P');
	exit();
};

$bot->addAction('quit', $function, true);
$bot->connect();
[/code]
