<div style="overflow:auto; font-family:sans-serif; font-size:12px;"><?php/** * @author graveguard * @authorurl http://www.graveguard.de * @license GNU Lesser General Public License <http://opensource.org/licenses/lgpl-license.php> */class IrcBot{ protected $server; protected $port; protected $start_channel; protected $owner_nick; protected $socket; protected $devmode; var $prefix = "~"; /** * * Initialisierung der Klasse und anschließendes Verbinden mit dem IRC-Server * * Folgende Daten müssen angegeben: * $server: Host des IRC-Servers * $start_channel: Channel in den der Bot joinen soll * $owner_nick: Gibt an wie der Inhaber des Bots heißt * * Folgende Daten müssen bei Bedarf angegeben werden: * $port: Port, über den der IRC-Server läuft * $devmode: False = Saubere Ausgabe der Nachrichten im Browser. Jedoch nur Messages * True = Komplette Ausgabe, wie es vom Server ankommt * * Diese Daten müssen bei der Initialisierung der Klasse angegeben werden. * * Außerhalb der Klasse aufrubar */ public function __construct($server, $start_channel, $owner_nick, $port = "6667", $devmode = FALSE) { if(isset($server)) $this->server = $server; else die("Es wurde kein Server angegeben!"); if(isset($start_channel)) $this->start_channel = $start_channel; else die("Es wurde kein Channel angegeben!"); if(isset($owner_nick)) $this->owner_nick = $owner_nick; else die("Es wurde kein Botinhaber angegeben!"); $this->devmode = $devmode; $this->port = $port; ob_implicit_flush(); $this->connect(); } /** * * Stellt die Verbindung zum Server her. * * Nur innerhalb der Klasse aufrubar */ protected function connect() { $this->socket = socket_create(AF_INET, SOCK_STREAM, 0) or die("Socket konnte nicht erstellt werden!"); socket_connect($this->socket, $this->server, $this->port); $this->send("NICK :GraveBot\r\n"); $this->send("USER Gravebot 0 0 :gg\r\n"); $this->send("JOIN :".$this->start_channel."\r\n"); } /** * * Empfängt die Daten des IRC-Servers * * $size: Gibt die Anzahl der Bytes an, die aufeinmal empfangen werden sollen (Standardwert: 1024) * * Außerhalb der Klasse aufrubar */ public function read_data($size = 1024) { set_time_limit(0); if($out = socket_read($this->socket, $size)) { $this->do_actions($out); return $this->parse_data($out); } else return false; } /** * * Gemischte Aktionen (Quitbefehl, Pong) * * $data: Überlieferte Daten des Servers * * Nur innerhalb der Klasse aufrubar */ private function do_actions($data) { if(preg_match("/:".$this->owner_nick."!(.*)@(.*) PRIVMSG (.*) :".$this->prefix."quit/", $data)) $this->disconnect(); if(preg_match("/PING :(:*)/", $data, $matches)) $this->send("PONG :".$matches[1]); } /** * * Verarbeitet die Serverdaten für die Browserausgabe * * $data: Gibt die Daten an, die für die Ausgabe bearbeitet werden * * Nur innerhalb der Klasse aufrubar */ private function parse_data($data) { if($this->devmode = FALSE) { if(preg_match("/:(.*)!(.*)@(.*) PRIVMSG (.*) :(.*)/", $data, $matches) != 0) { $return["nick"] = $matches[1]; $return["host"] = $matches[2]; $return["channel"] = $matches[4]; $return["message"] = $matches[5]; return "<b>(".$return["nick"].") </b>".$return["message"]."<br />"; } else return ""; } elseif($this->devmode = TRUE) return nl2br($data); } /** * * Sendet Daten an den Server. * * $message: Die Nachricht die an den Server gesendet werden soll. * * Außerhalb der Klasse aufrubar */ public function send($message) { if(isset($message)) { socket_write($this->socket, $message) or print("Folgende Anweisung konnte nicht gesendet werden: ".$message); } } /** * * Schließt die Verbindung zum IRC-Server * * Außerhalb der Klasse aufrubar */ public function disconnect() { $this->send("QUIT :Mein Besitzer will das ich gehe...\r\n"); socket_close($this->socket); die(); }}$irc_bot = new IrcBot("irc.freenode.net", "#botted", "graveguard", 6667, TRUE);while(TRUE){ $out = $irc_bot->read_data(); echo $out;}?></div>