Ako si vytvoriť IRC bota cez PHP - časť 2

05.03.2006 18:56 | blackhole

IRC bot cez PHP nie je ničím obmedzený. Stačí vaša predstavivosť, a môžete vytvoriť IRC bota so žiadnymi obmedzeniami.

Keďže IRC bota skúšame na kanáli, logovanie by nám iba zababralo terminál. Na vypnutie logovania: $irc->setDebug(SMARTIRC_DEBUG_NONE);
Aby sme mohli listovať užívateľov na kanáloch: $irc->setChannelSyncing(TRUE);
No a teraz môžme vytvárať metódy v triede mojbot. Ako prvá by bola potrebná join, keď sa niekto prihlási, pošle sa mu poznámka (metóda join).
Ďalej keď niekto napíše na kanál !pravidla, treba mu predsa tie pravidlá napísať (metóda odkaz).
Táto metóda samozrejme potrebuje aj kontrolovať odkazy, ktoré nick napísal, a preto musíme vytvoriť variable $zahresil.
Ešte tu je funkcia, ktorá každých 60 sekúnd posiela aktuálny čas. Ak niekto napíše !time, podobne.

<?php
$hresenia=array("piča", "piči", "kurv", "kokot", "chuj"); // hrešenia
$kanaly=array("#kanal1","#kanal2");
include_once("Net/SmartIRC.php");
class mojbot
{
    var $zahresil=array();
    var $last=0;
    function join (&$irc, &$data)
    {
        $irc->message(SMARTIRC_TYPE_NOTICE, $data->nick, "ak nepoznas pravidla, napis !pravidla"); // odosle poznamku nicku, ked sa prihlasi
    }
    function odkaz (&$irc, &$data)
    {
        global $hresenia;
        if ($data->message=="!pravidla") { // ak niekto napíše !pravidla
            $irc->message(SMARTIRC_TYPE_QUERY, $data->nick, "1. Nepoužívaj neslušné výrazy"); // pošle nicku súkromný odkaz
            $irc->message(SMARTIRC_TYPE_QUERY, $data->nick, "2. Nepíš rýchlo za sebou");
            return true; // ukončí funkciu
        } elseif ($data->message=="!time") { // ak niekto napíše !time
            $rozdiel=time()-$this->last;
            if ($this->last==0) {
                $msg=$data->nick.": Je presne ".date("H:i:s, d.m.Y");
            } elseif ($rozdiel>30) {
                $msg=$data->nick.": Nemohol si počkať ".$rozdiel." sekúnd ??? Je presne ".date("H:i:s, d.m.Y");
            } elseif ($rozdiel<=30) {
                $msg=$data->nick.": Pred ".$rozdiel." sekundami som posielal aktuálny čas !!! Je presne ".date("H:i:s, d.m.Y");
            }
            $irc->message(SMARTIRC_TYPE_CHANNEL, $data->channel, $msg);
            return true;
        }
        $str=strtolower($data->message);
        $zahr=0;
        for ($i=0;$i<count($hresenia);$i++) {
            $c=substr_count($str, strtolower($hresenia[$i])); // zisti koľko krát sa použilo vulgárne slovo $hresenia[$i]
            $zahr+=$c;
        }
        if ($zahr>5) { // zahrešil viac ako 5 krát, vykopneme ho
            $irc->kick($data->channel,$data->nick,"Tieto slová nepoužívaj !!!"); // vykopne nick z kanala
        } elseif ($zahr>0) { // zahrešil viac ako 0 krát, ale menej ako 6 krát
            $this->zahresil[$data->nick]+=$zahr; // pripočíta do pamäte koľkokrát užívateľ zahrešil
            if ($this->zahresil[$data->nick]>5) { // ak spolu zahrešil viac ako 5 krát
                $irc->kick($data->channel,$data->nick,"Tieto slová nepoužívaj, varoval som ťa !!!");
                unset($this->zahresil[$data->nick]); // unsetne záznam počtu zahrešení $data->nick
            } else {
                $irc->message(SMARTIRC_TYPE_CHANNEL, $data->channel, $data->nick.": NEHREŠ !!!"); // pošle nicku odkaz na kanál
            }
        }
    }
    function private_odkaz (&$irc, &$data)
    {
        $irc->message(SMARTIRC_TYPE_QUERY,$data->nick,"nepiš mi, som robot!!!");
    }
    function time (&$irc)
    {
        global $kanaly;
        for ($i=0;$i<count($kanaly);$i++) {
            $irc->message(SMARTIRC_TYPE_CHANNEL,$kanaly[$i],"Je presne ".date("H:i:s, d.m.Y"));
        }
        $this->last=time();
    }
}
$bot=&new mojbot();
$irc=&new Net_SmartIRC();
$irc->setDebug(SMARTIRC_DEBUG_NONE); // nastaví logovanie na NONE
$irc->setUseSockets(TRUE); // zapne používanie php prílohy sockets
$irc->setChannelSyncing(TRUE); // zapne ukladanie užívateľov
$irc->registerActionhandler(SMARTIRC_TYPE_CHANNEL, "^", $bot, "odkaz"); // ked niekto posle spravu na kanal, zavola metodu odkaz z triedy $bot, teda mojbot
$irc->registerActionhandler(SMARTIRC_TYPE_QUERY|SMARTIRC_TYPE_NOTICE, "^", $bot, "private_odkaz"); // ked niekto posle spravu botovi, zavola metodu private_odkaz
$irc->registerActionhandler(SMARTIRC_TYPE_JOIN, "^", $bot, "join"); // ked sa niekto joinne, zavola metodu join
$irc->registerTimehandler(60000, $bot, "time"); // každých 60 sekúnd (60000 milisekúnd) volá metódu time
$irc->connect("irc.server.sk",6667); // pripoji sa
$irc->login("bot","skutocne meno bota",0,"username","password"); // prihlasi sa, 0 je mod
$irc->join($kanaly); // joine sa na kanaly $kanaly, moze to byt aj retazec jedneho kanala
$irc->listen();
$irc->disconnect();
?>

Ostatné konštanty, ktoré môžete používať sú v Net/SmartIRC/defines.php . IRC príkazy sú v Net/SmartIRC/irccommands.php .
Na vylistovanie užívateľov je metóda names v irccommands.php . Ak niečomu niekto nebude rozumieť, nech to napíše do komentárov, vysvetlím.
Ale myslím si že už sa nič vysvetľovať nemusí, ja som na všetko musel prísť sám a na začiatku som vedel z príkladov iba toto čo som napísal vám.