Tutorials
IRC Bot
IRC bot? Wat is dat? Hoe maak je zoiets? In deze tutorial laat ik je zien hoe je een automatisch PHP script kunt maken die een verbinding maakt met een IRC server.
Pagina 1
Inleiding
Een PHP Cli IRC bot maken kun je natuurlijk van de bron, maar met de PEAR klasse NET_SmartIRC gaat het eigenlijk net zo goed, dus waarom moeilijk doen? ;)
Een goede directory structuur zou zijn:
ircbots
+- pear
+- bot1
[etc]
Waarin je in de pear map uit het PEAR package (http://pear.php.net/package/PEAR) de PEAR.php en SYSTEM.php zet. Tevens uit het Net_SmartIRC pakket (http://pear.php.net/package/Net_SmartIRC) de map SmartIRC en SmartIRC.php.
Vervolgens begin je met het ecte werk, de bot =).
in dit voorbeeld zou dat bot1 in de map bot1 zijn.
Een goede directory structuur zou zijn:
ircbots
+- pear
+- bot1
[etc]
Waarin je in de pear map uit het PEAR package (http://pear.php.net/package/PEAR) de PEAR.php en SYSTEM.php zet. Tevens uit het Net_SmartIRC pakket (http://pear.php.net/package/Net_SmartIRC) de map SmartIRC en SmartIRC.php.
Vervolgens begin je met het ecte werk, de bot =).
in dit voorbeeld zou dat bot1 in de map bot1 zijn.
Pagina 2
Basis bot
Hier volgt een opzetje voor de basis bot, het framework vanwaaruit je werkt
<?php
// De IRC class
require_once('../pear/SmartIRC.php');
// De bot class
class myBot {
// Constructor
function myBot() {
}
// Reactie op het help commando
function help(&$irc, &$data) {
$irc->message(SMARTIRC_TYPE_CHANNEL, $data->channel, 'U zei "' . $data->message . '"?');
}
}
// Command line vars
$args = $_SERVER['argv'];
$host = ((isset($args[1]) && !empty($args[1])) ? $args[1] : 'irc.xs4all.nl');
$channel = ((isset($args[2]) && !empty($args[2])) ? $args[2] : '#phpircbot-test');
// Initialisatie
$bot = &new myBot();
$irc = &new Net_SmartIRC();
$irc->setDebug(SMARTIRC_DEBUG_ALL);
$irc->setLogfile('./mybot.log'); // Log file
$irc->setLogdestination(SMARTIRC_FILE);
$irc->setAutoReconnect(true); // Auto reconnect?
$irc->setUseSockets(true);
// Handlers, reageert op de regex '!help.*' met de functie 'help'
$irc->registerActionhandler(SMARTIRC_TYPE_CHANNEL, '!help.*', $bot, 'help');
$irc->connect($host, 6667); // Verbind
$irc->login('MyBot', 'MyBot 1.0', 0, 'mybot'); // Log in
$irc->join(array($channel)); // Kies kanaal
$irc->listen(); // Ga luisteren
$irc->disconnect(); // Doei =)
?>
als je deze op windows zou aanroepen:
c:\php\cli\php -q c:\scripts\ircbots\mybot\mybot.php irc.server.org #kanaal
Gaat de bot draaien, en elke keer als je iets wat met de regex '!help.*' matcht reageert hij met: 'U zei "!help[***]"?'.
<?php
// De IRC class
require_once('../pear/SmartIRC.php');
// De bot class
class myBot {
// Constructor
function myBot() {
}
// Reactie op het help commando
function help(&$irc, &$data) {
$irc->message(SMARTIRC_TYPE_CHANNEL, $data->channel, 'U zei "' . $data->message . '"?');
}
}
// Command line vars
$args = $_SERVER['argv'];
$host = ((isset($args[1]) && !empty($args[1])) ? $args[1] : 'irc.xs4all.nl');
$channel = ((isset($args[2]) && !empty($args[2])) ? $args[2] : '#phpircbot-test');
// Initialisatie
$bot = &new myBot();
$irc = &new Net_SmartIRC();
$irc->setDebug(SMARTIRC_DEBUG_ALL);
$irc->setLogfile('./mybot.log'); // Log file
$irc->setLogdestination(SMARTIRC_FILE);
$irc->setAutoReconnect(true); // Auto reconnect?
$irc->setUseSockets(true);
// Handlers, reageert op de regex '!help.*' met de functie 'help'
$irc->registerActionhandler(SMARTIRC_TYPE_CHANNEL, '!help.*', $bot, 'help');
$irc->connect($host, 6667); // Verbind
$irc->login('MyBot', 'MyBot 1.0', 0, 'mybot'); // Log in
$irc->join(array($channel)); // Kies kanaal
$irc->listen(); // Ga luisteren
$irc->disconnect(); // Doei =)
?>
als je deze op windows zou aanroepen:
c:\php\cli\php -q c:\scripts\ircbots\mybot\mybot.php irc.server.org #kanaal
Gaat de bot draaien, en elke keer als je iets wat met de regex '!help.*' matcht reageert hij met: 'U zei "!help[***]"?'.
Pagina 3
Handlers toevoegen
Je hebt twee basis handlers, tijd en actie:
Tijd
Tijd handlers registreer je zo:
<?php
// Roep elke seconde $bot->commando(); aan (met als param &$irc)
$irc->registerTimeHandler(1000, $bot, 'commando');
?>
Actie
Actie handlers registreer je zo:
<?php
// Roep na elk bericht dat matcht met '.*' $bot->commando(); aan (met als params &$irc en &$data)
$irc->registerActionHandler(SMARTIRC_TYPE_CHANNEL, '.*', $bot, 'commando');
?>
Er zijn nog meer actie types: (http://www.irchelp.org/irchelp/ircprimer.html#QRef legt ze redelijk uit)
SMARTIRC_TYPE_UNKNOWN
SMARTIRC_TYPE_CHANNEL
SMARTIRC_TYPE_QUERY
SMARTIRC_TYPE_CTCP
SMARTIRC_TYPE_NOTICE
SMARTIRC_TYPE_WHO
SMARTIRC_TYPE_JOIN
SMARTIRC_TYPE_INVITE
SMARTIRC_TYPE_ACTION
SMARTIRC_TYPE_TOPICCHANGE
SMARTIRC_TYPE_NICKCHANGE
SMARTIRC_TYPE_KICK
SMARTIRC_TYPE_QUIT
SMARTIRC_TYPE_LOGIN
SMARTIRC_TYPE_INFO
SMARTIRC_TYPE_LIST
SMARTIRC_TYPE_NAME
SMARTIRC_TYPE_MOTD
SMARTIRC_TYPE_MODECHANGE
SMARTIRC_TYPE_PART
SMARTIRC_TYPE_ERROR
SMARTIRC_TYPE_BANLIST
SMARTIRC_TYPE_TOPIC
SMARTIRC_TYPE_NONRELEVANT
SMARTIRC_TYPE_WHOIS
SMARTIRC_TYPE_WHOWAS
SMARTIRC_TYPE_USERMODE
SMARTIRC_TYPE_CHANNELMODE
SMARTIRC_TYPE_CTCP_REQUEST
SMARTIRC_TYPE_CTCP_REPLY
Een voorbeeldje: onjoin
<?php
//Func
function onjoin_greeting(&$irc, &$data) {
if ($data->nick == $irc->_nick) {
$irc->message(SMARTIRC_TYPE_CHANNEL, $data->channel, 'Ik ben er =)');
}
return;
}
$irc->message(SMARTIRC_TYPE_CHANNEL, $data->channel, 'Lo ' . $data->nick . '! =)');
}
// Register
$irc->registerActionhandler(SMARTIRC_TYPE_JOIN, '.*', $bot, 'onjoin_greeting');
?>
Tijd
Tijd handlers registreer je zo:
<?php
// Roep elke seconde $bot->commando(); aan (met als param &$irc)
$irc->registerTimeHandler(1000, $bot, 'commando');
?>
Actie
Actie handlers registreer je zo:
<?php
// Roep na elk bericht dat matcht met '.*' $bot->commando(); aan (met als params &$irc en &$data)
$irc->registerActionHandler(SMARTIRC_TYPE_CHANNEL, '.*', $bot, 'commando');
?>
Er zijn nog meer actie types: (http://www.irchelp.org/irchelp/ircprimer.html#QRef legt ze redelijk uit)
SMARTIRC_TYPE_UNKNOWN
SMARTIRC_TYPE_CHANNEL
SMARTIRC_TYPE_QUERY
SMARTIRC_TYPE_CTCP
SMARTIRC_TYPE_NOTICE
SMARTIRC_TYPE_WHO
SMARTIRC_TYPE_JOIN
SMARTIRC_TYPE_INVITE
SMARTIRC_TYPE_ACTION
SMARTIRC_TYPE_TOPICCHANGE
SMARTIRC_TYPE_NICKCHANGE
SMARTIRC_TYPE_KICK
SMARTIRC_TYPE_QUIT
SMARTIRC_TYPE_LOGIN
SMARTIRC_TYPE_INFO
SMARTIRC_TYPE_LIST
SMARTIRC_TYPE_NAME
SMARTIRC_TYPE_MOTD
SMARTIRC_TYPE_MODECHANGE
SMARTIRC_TYPE_PART
SMARTIRC_TYPE_ERROR
SMARTIRC_TYPE_BANLIST
SMARTIRC_TYPE_TOPIC
SMARTIRC_TYPE_NONRELEVANT
SMARTIRC_TYPE_WHOIS
SMARTIRC_TYPE_WHOWAS
SMARTIRC_TYPE_USERMODE
SMARTIRC_TYPE_CHANNELMODE
SMARTIRC_TYPE_CTCP_REQUEST
SMARTIRC_TYPE_CTCP_REPLY
Een voorbeeldje: onjoin
<?php
//Func
function onjoin_greeting(&$irc, &$data) {
if ($data->nick == $irc->_nick) {
$irc->message(SMARTIRC_TYPE_CHANNEL, $data->channel, 'Ik ben er =)');
}
return;
}
$irc->message(SMARTIRC_TYPE_CHANNEL, $data->channel, 'Lo ' . $data->nick . '! =)');
}
// Register
$irc->registerActionhandler(SMARTIRC_TYPE_JOIN, '.*', $bot, 'onjoin_greeting');
?>
Pagina 4
IRC Commando's
Naast de basis code heb je ook nog een zooitje IRC Commandos, de complete lijst is:
ban, changeNick, channel, deop, devoice, getList, getTopic, invite, join, kick, message, mode, names, op, part, quit, setTopic, unban, voice, who, whois, whowas
Een klein voorbeeldje (opperator only), verander de topic en ga weg:
<?php
function topicEdit(&$irc, &$data) {
$irc->setTopic($data->channel, '[SoT]' . $irc->getTopic($data->channel) . '[/EoT]');
$irc->quit('Doei!');
}
?>
Hier moet natuurlijk nog een handler bij ;)
ban, changeNick, channel, deop, devoice, getList, getTopic, invite, join, kick, message, mode, names, op, part, quit, setTopic, unban, voice, who, whois, whowas
Een klein voorbeeldje (opperator only), verander de topic en ga weg:
<?php
function topicEdit(&$irc, &$data) {
$irc->setTopic($data->channel, '[SoT]' . $irc->getTopic($data->channel) . '[/EoT]');
$irc->quit('Doei!');
}
?>
Hier moet natuurlijk nog een handler bij ;)
Pagina 5
Windows Batch bestand
Voor XP moet het batch bestand op .cmd eindigen, andere windows op .bat.
@echo off
title MijnIRCBot
echo MijnIRCBot
echo ----------
echo [irc]: IRC server
set /p irc=%1
echo [channel]: IRC channel
set /p channel=%2
echo ----------
c:\php\cli\php.exe -q c:\scripts\ircbots\mybot\mybot.php %irc% %channel%
echo ----------
pause
@echo off
title MijnIRCBot
echo MijnIRCBot
echo ----------
echo [irc]: IRC server
set /p irc=%1
echo [channel]: IRC channel
set /p channel=%2
echo ----------
c:\php\cli\php.exe -q c:\scripts\ircbots\mybot\mybot.php %irc% %channel%
echo ----------
pause
Pagina 6
Referentie
Hier vind je een goede uitleg over IRC: http://www.irchelp.org/irchelp/ircprimer.html
Net_SmartIRC API: http://pear.php.net/package/Net_SmartIRC/docs/latest/
Nota bene: Ik ben niet fantastisch in het maken van tuts enzo, dus, commentaar is welkom ;) =)
Net_SmartIRC API: http://pear.php.net/package/Net_SmartIRC/docs/latest/
Nota bene: Ik ben niet fantastisch in het maken van tuts enzo, dus, commentaar is welkom ;) =)
Reacties
0