Tutorials

PHP'en naar IRC

Met PHP een verbinding tot stand brengen met een IRC server en vervolgens een bot draaien!

Pagina 1

Inleiding

Om te beginnen gaan we eerst even uitleggen wat we nodig hebben, wat we gaan doen en hoe we dat gaan doen, en een lul verhaaltje er om heen om het nog meer interresant te maken.

Wat we nodig hebben is PHP. Zelf heb ik dit op een linux systeem, en geef ook alleen garantie dat het daar werkt. Kan misschien onder windows ook werken, maar daarvoor help ik je niet :)

Wat we gaan doen is met PHP is nog niet eens zo heel lastig. Een socket openen naar een IRC server. Dit is niets anders dan verbinden naar een FTP server of wat voor server dan ook.

Wat waarschijnlijk wel iets anders is, is dat de socket nooit mag worden gesloten, want dan is ons IRC botje weg (: Dit doen we met een while die constant de socket controleerd, en om de te voorkopen dat de bot een 'Ping Timeout' krijgt van de server, moeten we af en toe PING? PONG!`en.

Genoeg gelul, tijd voor gescript.
Pagina 2

Gegevens verzamelen en socket openen

We gaan eerst wat gegevens verzamelen. Waar moeten we naartoe verbinden, welke poort, hoe wil ik mijn bot noemen, noem maar op.

Deze gegevens zetten we voor de eenvoud in een array en dat doen we als volgt:

<?
$bot = array();
$bot['nickname'] = "PHP^Bot";
$bot['realname'] = "Mr. PHP Bot";
$bot['ident'] = "php";
$bot['hostname'] = "host.of.ip.van.je.internet";
$bot['server'] = "irc.nl.uu.net";
$bot['poort'] = "6667";
$bot['kanaal'] = "#PHPBot";
?>

Nu we de gegevens hebben verzameld, gaan we proberen een verbinding te maken.

<?

if (!$bot['socket']=socket_create(AF_INET,SOCK_STREAM,SOL_TCP)) {
die("De socket kon niet worden aangemaakt.");
}
if (!@socket_bind($bot['socket'],$bot['hostname'])) {
die("Kon de verbinding niet koppelen aan <b>".$bot['hostname']."</b>. Misschien fout?");
}
if (!@socket_connect($bot['socket'],$bot['server'],$bot['poort'])) {
die("Kon geen verbinding maken met de server: <b>".$bot['server']."</b>. Misschien fout?");
}

?>

Mochten we dit stadium bereikt hebben, dan is de verbinding gemaakt en kunnen we de bot vertellen wat hij moet doen.
Pagina 3

Data versturen, en de socket open houden

De gegevens die we hebben verzameld, gaan we nou naar de server sturen om deze te laten verwerken.

Daarna maken we een while zodat de socket actief blijft, en vervolgens een PING? PONG! script zodat de IRC server de verbinding niet verbreekt

Maar voordat we dat doen, maken we even een functie aan, wat het versturen van data makkelijker maakt.

<?

function sockwrite($data){
global $bot;
socket_write($bot['socket'],$data."\r\n");
}

sockwrite("USER ".$bot['ident']." ".$bot['hostname']." ".$bot['server']." :".$bot['realname']);
sockwrite("NICK ".$bot['nickname']);

$channel = 0; // Deze var komt later wel terug :)
while ($data=@socket_read($bot['socket'],65000,PHP_NORMAL_READ)) {
if($data == "\n") continue;
// De data die we binnen krijgen, splitten we alvast op voor het makkelijk aanspreken.
$edata = explode(" ",$data);
for($i=0; isset($edata[$i]); $i++) {
$edata[$i]=trim($edata[$i]);
}
// De variable $channel die net is geset, gaan we nou controleren.
if ($channel == "0") {
// De variable is nog 0, we moeten nog een kanaal in !
sockwrite("JOIN ".$bot['kanaal']);
$channel = 1;
}
// Hier is er een PING binnengekomen. Deze gaan we antwoorden met PONG
if($edata[0] == "PING") {
sockwrite("PONG ".$edata[1]);
}

// Hier komen alle scripts te staan.
require('scripts.php');
}

?>
Pagina 4

En nu?

De bot is nu online, wat is te controleren door een /WHOIS $bot['nickname'] of $bot['kanaal'] te joinen.

Nu kan je er wat scripts inbouwen. Hiervoor is de require('scripts.php'); in de while.

:scripts.php

<?

global $edata,$data,$bot;

if ($edata[1] == "JOIN") { // Dit betekend dat er iemand een kanaal binnenkomt waar de bot ook is.
$kanaal = substr($edata[2],1);
sockwrite("PRIVMSG $kanaal :Hoi"); // We zeggen netjes hoi!
}

?>

Zo, en de rest is aan jou :)
Maak leuke modules/scripts en post ze!

Om de bot draaiend te zien kan je komen naar irc.nl.uu.net in het kanaal #PHPBot

Reacties

0
Nog geen reacties.