Välkommen till linuxportalen.se!

Linuxportalen.se är Sveriges största och aktivaste webbplats för användare av öppen- och fri programvara.

Du besöker Linuxportalen.se som gäst vilket begränsar din möjlighet att använda webbplatsens alla funktioner. Genom att registera dig som medlem får du inte bara möjlighet att söka bland webbplatsens innehåll, skapa nya och delta i befintliga diskussioner, skapa din egen blogg, kommunicera med andra medlemmar genom privata meddelanden och delta i omröstningar. Du får också tillgång till Veckans Kadavro - en seriestrip unikt skapad för Linuxportalen.se!

Registeringen sker snabbt och är helt kostnadsfri - tveka inte, bli medlem idag!

En ircbot i PHP

Idag skrev jag en liten ircbot i PHP för att kolla hur bra det gick. Och det gick bra. Den är "jätteduktig"

#!/usr/bin/php

<?PHP
    class IRC
    {
        #integers
        private    $chan = "";
        private $nick = "";
        private $user = "lazydrone";
        private $server = "";
        private $port = "";
        private $my_socket;
        private $botmasters = array('larsemil','spektre');   
        private $commandprefix ="@";

        public function send($message)
        {
            echo "Sending  $message\n";
            fputs($this->my_socket, $message."\r\n",512);
        }
        public function connect($server,$port,$nick, $chan)
        {
            $this->server = $server;
            $this->port = $port;
            $this->nick = $nick;
            $this->chan = $chan;
            echo "trying to connect to ".$server. ": ".$port." as ".$nick." and joing chan: ".$chan."\n";
            $this->my_socket = fsockopen($this->server,$this->port);
            if( feof($this->my_socket))
                die("Kunde inte connecta till ".$this->server);
            else
            {   
                $this->send("NICK ".$this->nick);
                $this->send("USER ".$this->user." * 0 :".$this->user);
                $this->send("JOIN ".$this->chan);
            }


            //make a database connection
            try {
                $this->db = new PDO("sqlite:ircbot.sdb");
                echo "connected to database\n";
            }
            catch(PDOException $e)
                {
                    echo $e->getMessage();
                }

        }
        public function server_input($input)
        {

            echo $input;
            if(strpos($input,'PING :') !== FALSE)
                $this->send('PONG '.substr ($input,6));
            else
            {
                $inputArray = explode(" ",$input);
                   
                preg_match("/\:(.*)\!/",array_shift($inputArray),$matches);
                $sender = $matches[1];
               

                $msgtype = array_shift($inputArray);
                $reciever = array_shift($inputArray);

                $msgArray = explode(":", $input);
                $message = $msgArray[2];
                $message = chop($message);
               
                if($msgtype == "PRIVMSG")
                {
                    #first we check if its a command
                    if($message[0] == $this->commandprefix)
                    {
                        $commandArray = explode(" ",$message);
                        $command = array_shift($commandArray);
                       
                        if($command == "@info")
                            $this->privmsg($this->chan,"Ich bin ein eeeevil robot.");

                        elseif($command == "@seen")
                        {
                            $user = array_shift($commandArray);
       
                            foreach ($this->db->query("select * from users;") as $row)
                            {
                                if($user == $row['user'])
                                {
                                    $this->privmsg($this->chan,$user." sågs sist ".$row['seen']." ".$user." sa då: ".$row['said']);
                                }
                            }
                        }
                        elseif($command == "@myinfo")
                        {
                            foreach ($this->db->query("select * from users where user='$sender'") as $row)
                            {
                                $op = "inte op";

                                if($row['op'])
                                    $op = "op";
                               
                                $this->privmsg($this->chan, $sender.": Du är ".$op." och din sista aktivitet var: ".$row['seen']);
                            }
                        }
                        elseif($command == "@op")
                        {
                            $user = array_shift($commandArray);
                            $valid = 0;
                            foreach($this->botmasters as $botmaster)
                            {
                                if ($sender == $botmaster)
                                    $valid = 1;
                            }
                            if($valid)
                            {
                                $this->send("MODE ".$this->chan." +o ".$user);
                                $this->db->exec("UPDATE users SET op=1 where user='".$user."'");
                            }
                        }
                    }//end if its a command
                }
                elseif($msgtype == "JOIN")
                {
                    $unseen = 1;
                    foreach ($this->db->query("select * from users where user='".$sender."';") as $row)
                    {
                        echo "User joined. Looking if he is op";
                        $unseen = 0;
                            if($row['op'])
                            {
                                $this->send("MODE ".$this->chan." +o ".$sender);
                                echo "OP JOINED! Will op him!";
                            }
                        }
                    if($unseen)   
                    {
                        $this->db->exec("INSERT INTO users (user,op) values('".$sender."',0)");
                        $this->privmsg($this->chan,$sender.": Dig har jag inte sett förut. Registerar dig i databasen. För att se vad för info som finns sparad om dig skriv: @myinfo");
                    }
                   
                }
                $this->db->exec("UPDATE users SET seen='".date("Y-m-j H:i:s")."' , said='".$message."' WHERE user='".$sender."'");   

            }   
        }
        public function privmsg($reciever, $message)
        {
            $this->send("PRIVMSG ".$reciever." :".$message);

        }       
        public function loop()
        {
            while(1)
            {
                $return = fgets($this->my_socket,4096);
                $this->server_input($return);
               
            }
        }

    }
    $irc = new IRC();
    $irc->connect("irc.freenode.net","6667","lazydrone","#lazychan");
       
   
    //start the ircloop
    $irc->loop();
   
?>