<?php
 
 
error_reporting(E_ALL);
 
 
/* Please leave this comment in at the top of the script if you use this script
 
 * in it's entirety. That is my only request. Other then that have fun.
 
 *
 
 * Now you too can create irc bots too 8 )
 
 * or if you have any cool optimizations for it
 
 *
 
 * example usage:
 
 * $ircbot = new boboirc($nick, $ident, $realname, $host, $port);
 
 * $ircbot->joinChan('#phphelp'); // usually where u can find great help on undernet. #php is useless
 
 * $ircbot->loop(); // begin loop (so program doesn't die right away)
 
 * 
 
 * to add new commands to your new bobot, scroll down to the following function 
 
 * parse_command($command, $msg)
 
 * and follow the directions. It's easy. I'm easy.
 
 *
 
 * Also if you're looking for help from me directly you can usually find me
 
 * slumming it on #phphelp on the undernet irc network.
 
 * my nick on there is usually _P_H_P_ 
 
 *
 
 * Check out more useful classes:
 
 * http://www.phpclasses.org/browse/author/144301.html
 
 */
 
 
 
 
class boboirc
 
{
 
    private $fp, $readbuffer, $line, $mcommands;
 
    public $nick, $ident, $realname, $host, $port;
 
    
 
    function boboirc($nick, $ident, $realname, $host, $port)
 
    {
 
        $this->nick         = $nick;
 
        $this->ident         = $ident;
 
        $this->realname = $realname;
 
        $this->host         = $host;
 
        $this->port         = $port;
 
 
        $this->fp = fsockopen($host, $port, $erno, $errstr, 30);
 
        if(!$this->fp) die("Could not connect\r\n");
 
        
 
    fwrite($this->fp, "NICK ".$nick."\r\n");
 
    fwrite($this->fp, "USER ".$ident." ".$host." bla :".$realname."\r\n");
 
 
        $this->flush();
 
 
    }
 
    
 
    function loop()
 
    {
 
        // now for program loop //
 
        while (!feof($this->fp)) 
 
        {
 
            $this->line = fgets($this->fp, 256); // wait for a message
 
 
            if($this->is_ping($this->line)) $this->pong();
 
                        
 
            if(strstr($this->line,"PRIVMSG"))
 
            {
 
                echo "PRIVMSG...  \r\n";
 
                // incoming private message //
 
                $msg = $this->msgToArray($this->line);
 
                                
 
                // is this a command?
 
                if($command = $this->get_command($msg['msg']))
 
                {
 
                    echo "processing command ($command)... \r\n";
 
                    // erase command from message array  // array('from, 'chan', 'msg'); //
 
                    $msg['msg'] = trim(str_replace($command,'',$msg['msg']));
 
                    echo "parsing command ($command)... \r\n";
 
                    $this->parse_command($command, $msg);
 
                }
 
            }
 
            
 
            $this->line = "";
 
            $this->flush();
 
            $this->wait(); // time to next cycle
 
        }
 
 
    }
 
    
 
    // outgoing //
 
    function out($msg) // raw message
 
    {
 
        if(@empty($msg)) return false;
 
        if(!strstr($msg, "\n")) $msg .= "\n";
 
 
        fwrite($this->fp, $msg);
 
        return true;
 
    }
 
    
 
    function setNick($nick)                        { $this->out("NICK ".$nick."\r\n"); $this->nick = $nick; }
 
    function joinChan($channel)             { $this->out("JOIN :".$channel."\r\n"); }
 
    function quitChan($channel)             { $this->out("PART :".$channel."\r\n"); }
 
 
    function listChans()                             { $this->out("LIST\r\n"); }
 
    function getTopic($channel)                { $this->out("TOPIC ".$channel."\r\n"); }
 
    
 
    function msg($target, $msg)             { $this->out("PRIVMSG $target :$msg\r\n"); }
 
    function msgChan($channel, $msg)     { $this->msg($channel, $msg); }
 
    function msgUser($user, $msg)         { $this->msg($user, $msg); }
 
    
 
    function pong()                                     { $this->out("PONG :".$this->host."\r\n"); }
 
    function quit($msg="")                        { $this->out("QUIT :$msg\r\n"); }
 
    
 
    // incoming processing //
 
    function is_ping($line)                        { if(strstr($line, 'PING')) return true; }
 
    function is_msg($line)                        { if(strstr($line, 'PRIVMSG')) return true; }
 
 
    function msgToArray($line) // array('from, 'chan', 'msg');
 
    {
 
        $array = explode(":",$line);
 
                
 
        $from = explode("!",$array[1]);
 
        $from = trim($from[0]);
 
        
 
        $fromchan = explode("#",$array[1]);
 
        $fromchan = "#".trim($fromchan[1]);
 
        
 
        $string = $array[2];
 
        $string = trim($string);
 
        
 
        $msg = array('from'=>$from, 'chan'=>$fromchan, 'msg'=>$string);
 
        
 
        return $msg;
 
    }
 
    
 
    // system
 
    function flush()                                    { @ob_flush; @flush(); }
 
    function wait()                                        { usleep(250000); }
 
    function get_command($string)
 
    {
 
        if(!strstr($string,"!")) return false;
 
        if(!strstr($string, " "))
 
            $command = $string;
 
        else
 
        {
 
            $command = explode(" ", $string,2);
 
            $command = $command[0];
 
        }
 
        return $command;
 
    }
 
    
 
    // misc useful functions //
 
    function rem_xs_whitespace($string){ $string = trim(preg_replace('/\s+/', ' ',     $string)); return $string; }
 
 
 
 
    // command parser //
 
    // TELL THE PARSER WHAT COMMANDS ARE AVAILABLE
 
    // add commands in the next section below this function
 
    function parse_command($command, $msg)
 
    {
 
        // $command = "!command"; $msg = array('from, 'chan', 'msg')
 
        switch($command)
 
        {
 
            case '!sayrand': $this->command_sayrand($msg); break;
 
        }
 
    }
 
    
 
    // now for commands //
 
    // ADD YOUR COMMANDS HERE //
 
    function command_sayrand($msg)
 
    {
 
        $number = rand(1,100);
 
        $this->msgChan($msg['chan'], "random number:".$number);
 
        echo "saying magic number...\r\n";
 
    }
 
 
}
 
 
?>
 
 |