Bot irc tout simple, fait a l'aide de la classe prosock

4/5 (19 avis)

Vue 8 187 fois - Téléchargée 729 fois

Description

le code d'un bot irc tout bete, fait à l'aide de la classe ProSock.
j'ai remis prosock.cpp dans le projet meme s'il ne sert pas (tout est mis entre /* */ d'ailleurs...) : prosock.h se sert de la libraire prosock.lib.
Le bot se connecte sur un serveur irc, et join un channel. il s'identifie sur le port 113 (ircid). cf la source !
le seul truc ke le bot fait est de répondre au PING du serveur (sinon il se fait déconnecter pour ping timeout)

Source / Exemple :


#include "prosock.h"
#include <stdio.h>
#include "token.h"
#include <time.h>

void IrcProc(ProSock* s, int message);
void proc_ircid(ProSock* s, int message);

ProSock s_accept = CreateProSocket(proc_ircid);
ProSock s_listen = CreateProSocket(proc_ircid);

ProSock botirc = CreateProSocket(IrcProc);

void main()
{
   s_listen.SockListen(113);
   botirc.SockOpen("mesra.dal.net",6669);

   while (true)
   {
      Sleep(INFINITE);
   }
}

void IrcProc(ProSock* s, int message)
{
   switch(message)
   {
      case ON_SOCKOPEN:
      {
         // Géneration d'un nick 'aléatoire'/////
         srand(time(0));
         char c1 = (rand() % 10) + '0';
         char c2 = (rand() % 10) + '0';
         char c3 = (rand() % 10) + '0';
         char c4 = (rand() % 10) + '0';
         char nick[20];
         sprintf(nick,"cosmo%c%c%c%c",c1,c2,c3,c4);
         //////////////////////////////////////////

         printf("connection reussie sur %s (port %d) !\n",s->Ip(),s->Port());
         s->SockWrite("NICK ");
         s->SockWriteln(nick);
         s->SockWriteln(" USER pouet . . pouit");
         s->SockWriteln("JOIN #CosmoBob");
         break;
      }
      case SOCKOPEN_ERROR:
      {
         printf("impossible de se connecter sur %s (port %d)\n",s->Ip(),s->Port());
         // Le socket va être automatiquement fermé. 
         break;
      }

      case SOCKWRITE_ERROR:
      {
         printf("Erreur de send\n");
         s->SockClose();
         break;
      }
      case SOCKREAD_ERROR:
      {
         printf("erreur de recv, le socket est automatiquement fermé\n");
         
         break;
      }

      case ON_SOCKREADLN:
      {
         char buffer[512];
         s->SockReadln(buffer,sizeof(buffer));

         printf("%s\n",buffer);
         
         char param1[50];
         token(buffer,param1,sizeof(param1),1,1,32);
         if (!strcmp(param1,"PING"))
         {
            s->SockWrite("PONG ");
            s->SockWriteln(buffer);
         }
         
         break;
      }
   }
}

void proc_ircid(ProSock* s, int message)
{
   switch(message)
   {

      case ON_SOCKLISTEN:
      {
         printf("listen ok !\n");
         s->SockAccept(&s_accept);
         s->SockClose();
         break;
      }

      case SOCKLISTEN_ERROR:
      {
         printf("listen error (le socket va etre fermé automatiquement)!\n");
         break;
      }

      case ON_SOCKACCEPT:
      {
         printf("accept ok Ip : %s (port %d)\n",s->Ip(),s->Port());
         break;
      }

      case SOCKACCEPT_ERROR:
      {
         printf("accept error\n");
         break;
      }

      case ON_SOCKREADLN:
      {
         char buffer[200];
         s->SockReadln(buffer,sizeof(buffer));
         printf("%s\n",buffer);

         char param1[50];
         char param2[50];
         token(buffer,param1,sizeof(param1),1,1,32);
         token(buffer,param2,sizeof(param2),3,3,32);
         char string2send[150];
         strncpy(string2send,param2,sizeof(string2send));
         strncat(string2send," , ",sizeof(string2send));
         strncat(string2send,param1,sizeof(string2send));
         strncat(string2send," : USERID : UNIX : pouet",sizeof(string2send));
         s->SockWriteln(string2send);

         break;
      }
   }
}

Codes Sources

A voir également

Ajouter un commentaire Commentaires
AiSpirit
Messages postés
11
Date d'inscription
vendredi 4 juin 2004
Statut
Membre
Dernière intervention
10 novembre 2006

21 août 2006 à 14:09
Je n'ai pas essayé, mais tu pourrais regarder de ce coté :
dans IrcProc,
case SOCKREAD_ERROR:
{
printf("erreur de recv, le socket est automatiquement fermé\n");
break;
}

Tu pourrais tout simplement gérée ici l'erreur de close du à la deconnection Internet pour faire une relance du programme ?

j'espère que cette piste te servira ..
tagboys
Messages postés
42
Date d'inscription
lundi 28 avril 2003
Statut
Membre
Dernière intervention
28 mars 2014

20 août 2006 à 04:17
humm j'ai chercher a trouver l'evenement qui fait qui start le bot mais bon j'ai pas rien trouver.
mon problemme est que je suis en 56k puis ma connection deconnect a tout les 15-20 min donc je doit tjs restarter le bot mais je suis pas tjs devant mon ordi allors aurait t'il une facon de le remettre auto reconnect svp merci d'avance :)
TrueCluster
Messages postés
1
Date d'inscription
dimanche 5 mars 2006
Statut
Membre
Dernière intervention
5 mars 2006

5 mars 2006 à 00:25
En tout cas c'est une superbe base pour develloper dessus, je vais m'y atteller :)
cosmobob
Messages postés
700
Date d'inscription
mardi 30 décembre 2003
Statut
Membre
Dernière intervention
27 janvier 2009
4
7 oct. 2005 à 12:27
une fois que t'as fait un sockclose, c'est sur que le port sur lequel ca ecoutait est libéré .. ca ferme le thread qui ecoutait egalement, donc il reste plus rien du socket du tout en background.
AiSpirit
Messages postés
11
Date d'inscription
vendredi 4 juin 2004
Statut
Membre
Dernière intervention
10 novembre 2006

4 oct. 2005 à 23:06
j'entendais bien sûr de le rendre inactif (par exemple par s_accept.SockClose(); et s_listen.SockClose(); ...
mais bon, c'est juste pour libérer le port 113 au cas où...
De toute façon, ce n'est pas ce socket qui va consommer la maj. partie des ressources, donc pas important.
Afficher les 19 commentaires

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.