*/
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 "(".$return["nick"].") ".$return["message"]."
";
}
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;
}
?>