class-irc-bot

Gesponsorde koppelingen

PHP script bestanden

  1. class-irc-bot

« Lees de omschrijving en reacties

De Class

Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
<?php
    class Ircbot
    {
        private $config = array();
        private $actions = array();
        private $online_owners = array();
        public function __construct($server, $port, $channel)
        {

            $this->config['server'] = $server; //Set $this->config['server'] to the server
            $this->config['port'] = $port; //Set $this->config['port'] to the port
            $this->config['channel'] = $channel;
        }

        public function setIdentity($nickname, $realname, $ident)
        {

            $this->config['identity'] = array('nickname'=>$nickname, 'realname'=>$realname, 'ident'=>$ident); // Set $this->config['identity'] to a array with the identity
        }
        public function setOwners($owners)
        {

            
            foreach($owners as $name=>$password)
            {

                $this->config['owners'][$name] = $password;
            }
        }

        public function addAction($name, $function, $owner = false)
        {

            $this->actions[$name] = array('function'=>$function, 'owner'=>$owner); //$this->actions[$name] to $function
        }
        public function write($data)
        {

            socket_write($this->socket,$data."\r\n");
        }

        public function nickname($str)
        {

            return substr(array_shift(explode('!',$str)),1);
        }

        public function connect()
        {

            if(!$this->socket = socket_create(AF_INET,SOCK_STREAM,SOL_TCP))
            {

                echo 'De socket kan niet worden aangemaakt.';
                exit();
            }

            echo 'Socket is aangamaakt.'."\n";
            if(isset($this->config['hostname'])) { $hostname = $this->config['hostname']; } else { $hostname = 0; }
            if(!socket_bind($this->socket,$hostname))
            {

                echo 'Verbinding kon niet worden gekoppeld aan hostname '.$hostname;
                exit();
            }

            echo 'Verbinding gekoppeld aan hostname'."\n";
            if(!isset($this->config['server']) || !isset($this->config['port']))
            {

                echo 'De gegevens voor de sever of de poort missen.';
                exit();
            }

            if(!socket_connect($this->socket,$this->config['server'],$this->config['port']))
            {

                echo 'Verbinding met server kon niet tot stand worden gebracht.';
                exit();
            }

            echo 'Maken van verbinding...'."\n";
            if(!isset($this->config['identity']['ident']) || !isset($this->config['identity']['realname']) || !isset($this->config['identity']['nickname']))
            {

                echo 'Er missen vereiste gegevens. Weet u zeker dat u setIdentity(nickname, realname, ident) heeft gebruikt?';
                exit();
            }

            $this->write('USER '.$this->config['identity']['ident'].' 0 '.$this->config['server'].' :'.$this->config['identity']['realname']);
            $this->write('NICK '.$this->config['identity']['nickname']);
            $this->inChannel = false;
            
            while($data = socket_read($this->socket,65000,PHP_NORMAL_READ))
            {

                
                if($data == "\n") continue;
                $eData    = explode(" ",$data);
                for($i = 0; isset($eData[$i]); $i++) {
                    $eData[$i]    = trim($eData[$i]);
                }

                echo $data."\n";
                if($this->inChannel == false && strstr($data,'MOTD'))
                {

                    $this->write('JOIN '.$this->config['channel']);
                    $this->inChannel = true;
                }

                if($eData[0] == 'PING') {
                    $this->write('PONG '.$eData[1]);
                }

                if(isset($eData[3]) && preg_match('#:login#', $eData[3], $matches))
                {

                    if($eData[1] == 'PRIVMSG')
                    {


                        if(isset($this->config['owners'][$eData[4]]))
                        {

                            if($eData[5] == $this->config['owners'][$eData[4]])
                            {

                                $this->online_owners[$this->nickname($eData[0])] = $eData[4];
                                $this->write('NOTICE '.$this->nickname($eData[0]).' : Je bent succesvol ingelogd!');
                                print_r($this->online_owners);
                            }

                            else
                            {
                                $this->write('NOTICE '.$this->nickname($eData[0]).' : Je gegevens kloppen niet');
                            }
                        }

                        else
                        {
                            $this->write('NOTICE '.$this->nickname($eData[0]).' : Je gegevens kloppen niet');
                        }
                    }
                }

                if($eData[1] == 'QUIT')
                {

                    $nick = $this->nickname($eData[0]);
                    if(isset($this->online_owners[$nick]))
                    {

                        unset($this->online_owners[$nick]);
                        echo $nick.' is uitgelogd, zijn sessie is verwijderd!';
                    }
                }

                if(isset($eData[3]) && preg_match('#:!(.*)#', $eData[3], $matches))
                {

                    $name = $matches[1];
                    if(isset($this->actions[$name]))
                    {

                        
                        $action = $this->actions[$name];
                        $name = $action['function'];
                        if($action['owner'])
                        {

                            $acces = false;
                            
                                if( isset( $this->online_owners[$this->nickname($eData[0])] ) )
                                {

                                    $acces = true;
                                }

                            
                            if($acces)
                            {

                                $name($this, $eData);
                            }

                            else
                            {
                                $this->write('NOTICE '.$this->nickname($eData[0]).' : Je hebt geen recht om deze actie uit te voeren!');
                            }
                        }

                        else
                        {
                            $name($this, $eData);
                        }
                        
                    }

                }
            }
        }
            
    }

?>


Hoe moet ik de bot gebruiken??

Het gebruik van deze bot is niet al te moeilijk. Het belangrijkste is om de class file bovenaan te includen. Hierna dient te bot class te worden gestart. Hierna moeten nog een aantal dingen gedaan worden zoals het setten van de owners. Dit komt er uiteindelijk zo uit te zien:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
<?php
require_once('ircbot.inc.php');
$bot = new Ircbot('server', 6667, '#kanaal');
$bot->setOwners(array('gebruiker1'=>'wachtwoord', 'gebruiker2'=>'anderwachtwoord'));
$bot->setIdentity('Nickname', 'realname', 'ident');
$bot->connect(); //Start de bot
?>


Als je de bot nu zal starten in bijvoorbeeld CMD, zal hij na een aantal seconden verschijnen in het irc kanaal.

Misschien zoals je nu ziet heeft de bot nog geen functies, de functies kunnen we toevoegen door gebruik te maken van closures:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
8
9
10
<?php
$function
= function($class, $data)
{

    $string    = trim(array_pop(explode('!google',$data[4])));  
    $url             = 'http://www.google.nl/search?hl=nl&q='.urlencode($string);
    $class->write('PRIVMSG #devhouse : Google Zoeken: '.$url);
};


$bot->addAction('google', $function);
?>


Deze bovenstaande code zorgt ervoor dat als de gebruiker !google zoekwoord hij een google link terug krijgt.
Door de code hierboven de gebruiken, kun je vele handige of onnozele functies maken. Maar je wilt natuurlijk ook een paar functies die zo beveiligd zijn dat alleen de eigenaren(owners) ze kunnen gebruiken. Dit kun je doen door een derde parameter met als waarde true mee te geven aan addAction(). Dit zal er dan ongeveer zo uitzien:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
$bot->addAction('google', $function, true);


Om owner te worden van de bot dien je eerst 2 dingen te doen, een account aanmaken door setOwners() en inloggen door login gebruikersnaam wachtwoord tegen de bot te zeggen. Dit dien je zo in een irc client te doen:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
/msg NaamVanBot login gebruikersnaam wachtwoord


Ik hoop dat ik zo duidelijk genoeg ben geweest, vragen kunnen altijd gesteld worden.

Edit:

Even een voorbeeldje van hoe mijn bot er nu uitziet:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
<?php
require_once('ircbot.inc.php');
$bot = new Ircbot('irc.chatfactory.net', 6667, '#devhouse');
$bot->setOwners(array('gbnaam'=>'wwoord'));
$bot->setIdentity('Nickname, 'Realname', 'ident');
$function = function($class, $data)
{
    $string    = trim(array_pop(explode('
!google',$data[4])));  
    $url             = '
http://www.google.nl/search?hl=nl&q='.urlencode($string);
    $class->write('PRIVMSG #devhouse : Google Zoeken: '.$url);
};


$bot->addAction('google', $function);

$function = function($class, $data)
{

    $class->write('QUIT : Ik ga slapie doen!:P');
    exit();
};


$bot->addAction('quit', $function, true);
$bot->connect();
[
/code]

 
 

Om de gebruiksvriendelijkheid van onze website en diensten te optimaliseren maken wij gebruik van cookies. Deze cookies gebruiken wij voor functionaliteiten, analytische gegevens en marketing doeleinden. U vindt meer informatie in onze privacy statement.