# 5.7. Robots(?)

Il est possible de créer des robots dans un script sirc, exactement comme si vous le feriez dans ircII. Ce n'est sûrement pas une mauvaise idée, puique vous avez à votre disposition un langage de programmation (perl), débarrassé de toutes les tâches de programmation réseau ennuyeuses et de l'analyse des problèmes de réseau.

Toutefois, sirc n'a jamais été considéré comme un client robot, et je n'ai pas l'intention de le remplir de cloches et de sifflements pour les supports robots, j'ai donc fourni uniquement un support minimum pour cela, avec les options -l et -q.

L'idée est que vous programmez votre robot comme un ensemble de fonctions internes, de points d'insertion et d'appels à `&addhook` et à `& docommand`, et ensuite charger sirc de cette façon (évidemment sans ssfe) :

`nohup sirc -d -q -l <botfile> -i <bot's ircname> <nick> <server> >/dev/null &`

Tour ceci sans `<>'s`, bien sûr. `>/dev/null` supprime le résultat, puisque de toute façon vous ne le lirez pas sur l'écran..

Dans le robot, assurez-vous de saisir (avec un point d'insertion numérique) les lignes qui indiquent `"nick in use"` or `"invalid nick"`, (pseudonyme en cours) (pseudonyme incorrect) et envoyez les lignes au serveur avec un pseudnyme aléatoire, et omettez-les, sinon le robot s'arrêtera en tentant de demander un pseudonyme à l'utilisateur. Vous définirez également un point d'insertion sur `"disconnect"`, et lui ferez faire un `&docommand("server 0")` or `"server some.server"`.

Rappelez-vous aussi que le fichier est chargé avant même que la connexion au serveur soit effectuée, les appels à `&sl` and most `&docommand's` à ce moment échoueront..

Voici un exemple de robot qui effectue une connexion, joint un canal, refait une nouvelle connexion s'il est déconnecté, répond à quelques commandes, effectue ses opérations propres, et enregistre dans un fichier tout ce qu'il voit sauf l'encombrement général (du réseau); vous devriez charger ce fichier, en supposant que vous l'ayez sauvegardé dans un fichier appelé "mybot" (mon robot) et que vous vouliez l'appeler BubbleBot, avec :

`nohup sirc -d -q -l mybot -i "bot in sirc" BubbleBot some.server.edu >/dev/null`

     $botowner="espel\@clipper.ens.fr";	# change it to your address (le modifie à votre adresse)

     $logfile=$ENV{'HOME'}."/.botlog";
     &docommand("log on");

     sub hook_publicstuff {		# don't print the public chatter (so it       (n'édite pas la
                                                                        la discussion publique,( donc il

                            		# doesn't fill the logfile   (ne remplit pas le journal de bord)
     }
     &addhook("public", "publicstuff");

     sub hook_connected {
       &sl("JOIN #BotTub");
     }
     &addhook("376", "connected");   # join on the "end of MOTD" numeric (jonction à la "fin du
                                                                               MOTD" numérique)
     srand;				# init random number generator (nombre générateur d'init aléatoire)

     sub hook_badnick {
       local($n);
       $n="B".(int(rand(1000000))+4587454);  # send a garbage nick... (envoie un pseudonyme incorrect...)
       &sl("NICK $n");
       $skip=1;
     }
     &addhook("432", "badnick");             # if told that ours is taken (s'il est indiqué que le nôtre est pris)
     &addhook("433", "badnick");

     sub hook_disc {         # if we got disconnectedj (si nous sommes déconnectés)
       sleep(30);		# wait 30 seconds (so we don't bring the machine (attendez 30 secondes (donc
                                                                      nous ne malmenons pas la machine si
     			# down to a crawl if the server is down) le serveur est figé)
       &docommand("server 1"); # reconnect to the same server (réeffectue une connexion au même serveur)
     }
     &addhook("disconnect", "disc");

     sub hook_joined {	# whenever someone joins (au cas où un interlocuteur ())
       local($ch)=($_[0]);
       $ch =˜ tr/A-Z/a-z/;	# put channel in lowercase (place le canal dans la case inférieure)
       if (&eq($botowner, "$user\@$host") && $haveops{$ch}) {
         &sl("MODE $ch +o $who");	# op if that's the owner and we have ops (opération si c'est celle
       }                                                     du propriétaire et que nous avons des opérations)
     }
     &addhook("join", "joined");

     sub hook_message {
       if (&eq($botowner, "$user\@$host")) {  # if it's a msg from the owner
         if ($_[0] =˜ /^die$/i) {             # die -> die
           &docommand("quit");
         } elsif ($_[0] =˜ /^say /i) {        # say <something> -> say it
           &say($');
         } elsif ($_[0] =˜ /^nick /i) {       # nick <nick> -> change nicks
           &sl("NICK $'");
         }
     # add more commands here
       }
     }
     &addhook("msg", "message");