Bot pour l'irc

Soyez le premier à donner votre avis sur cette source.

Snippet vu 9 114 fois - Téléchargée 34 fois

Contenu du snippet

Ce code est simplifié pour simplement se connecter sur un serveur et un channel donné puis répondre à un mot reçu.
Il sera ensuite facile de rajouter des fonctions ou des mots le faisant parler...

Source / Exemple :


#include <stdio.h>    // printf
#include <conio.h>    // getche()
#include <string.h>   // strlen (compter caracteres)
#include <winsock2.h> // socket
#pragma comment(lib, "ws2_32.lib")

int main(int argc, char* argv[])
{

/* on initialise notre winsock */
	WSADATA WSAData;
	WSAStartup(MAKEWORD(2,0), &WSAData);
/* fin d'initialisation */

	
/* on construit notre socket */
	SOCKET sock;
	SOCKADDR_IN sin;
	char buffer[BUFSIZ];
	char *ptr;
	char msg[256];

	sock = socket(AF_INET, SOCK_STREAM, 0);

	sin.sin_addr.s_addr = inet_addr("62.23.9.122");
	sin.sin_family	    = AF_INET;
	sin.sin_port	    = htons(6667);
/* fin de la construction du socket */

/* déclaration variables */

char nickbot[30]="shownbot"; //nick à modifier
char channel[20]="#hackplanet"; //channel à rejoindre
char serveur[30]="62.23.9.122"; //ip du serveur irc
char user[50]="lol lol lol :shownbot";

// nick autorisé a fermer le bot
char *autorize=":Shown!"; // ne pas toucher au ':' et au '!'

/* on connecte le socket sur le serveur et le chan */
	connect(sock, (SOCKADDR *)&sin, sizeof(sin));
	
	sprintf (buffer, "NICK %s\n", nickbot);
	send (sock, buffer, strlen (buffer), 0);
	
	sprintf (buffer, "USER %s\n", user);
	send (sock, buffer, strlen (buffer), 0);
	
	sprintf (buffer, "JOIN %s\n", channel);
	send (sock, buffer, strlen (buffer), 0);
	
	sprintf (buffer, "PRIVMSG %s :yop :-)\n", channel); //message envoyé lors de l'arrivée sur le channel
	send (sock, buffer, strlen (buffer), 0);
	
   
     /* fin de la connexion au socket */
    
/* on commence une boucle infinie */
  while (1) {
   	memset(buffer, '\0', BUFSIZ); //on vide le buffer
	recv(sock, buffer, BUFSIZ-1, 0);
   	printf("%s",buffer);

    /* gestion des pings */
    if (strstr(buffer, "PING :"))
         {
         ptr = strstr(buffer, "PING :") + strlen("PING :");
         snprintf(msg, 256, "PONG :%s\n", ptr);
         send(sock, msg, strlen(msg), 0);
         }
    
    /* fin de gestion des pings */

    /* --------------------animation du channel-------------------- */

      /* boucles pour les reponses auto */
     if (strstr(buffer, "salut"))
          {
          ptr = strstr(buffer, "salut");
          snprintf(msg, 256, "PRIVMSG %s :plop\n", channel);
          send(sock, msg, strlen(msg), 0);
          }
      
     if (strstr(buffer, "merci"))
          {
          ptr = strstr(buffer, "merci");
          snprintf(msg, 256, "PRIVMSG %s :de rien ;-)\n", channel);
          send(sock, msg, strlen(msg), 0);
          }
     
     //on ferme le socket si on envoie "!close" et si c'est le
     //propriétaire qui a lancé la commande.
     if ((strstr(buffer, autorize)) && (strstr(buffer, "!close")))                    		          
          {
          ptr = strstr(buffer, "!close");
                  {
                  WSACleanup();
                  closesocket(sock);
                  }
          }

    /* ---------------------fin de l'animation--------------------- */

} //fin de la boucle infinie

} //fin du programme

Conclusion :


Ce bot fonctionne parfaitement avec Dev-C++, il répond aux PING; vous n'avez qu'à modifier le nick, le channel, et le serveur pour la connexion.
Vous pouvez facilement l'améliorer par exemple pour le faire changer de nick il vous suffit d'ajouter :
if (strstr(buffer, "!nick ")){
ptr = strstr(buffer, "!nick ") + strlen("!nick ");
snprintf(msg, 256, "NICK :%s\n", ptr);
send(sock, msg, strlen(msg), 0);
}
Donc si vous tapez "!nick bob" sur le channel ou en privé le bot prendra le nom "bob".
Si vous avez d'autres propositions mais que vous ne parvenez pas à la coder, dites-le moi je ferai de mon mieux pour vous aider ;-)

A voir également

Ajouter un commentaire

Commentaires

Erreur_418
Messages postés
1
Date d'inscription
mardi 20 décembre 2016
Statut
Membre
Dernière intervention
20 décembre 2016

Merci gars! tu n'imagine même pas à quel point ton travail vas m'aider!
cs_open
Messages postés
16
Date d'inscription
mercredi 16 juillet 2003
Statut
Membre
Dernière intervention
29 octobre 2008

Heu salut, j'ai compilé ta source et j'ai plein d'erreur [Link Error] style : [Linker error] undefined reference to `WSAStartup@8'
[Linker error] undefined reference to `socket@12'
[Linker error] undefined reference to `inet_addr@4' [Linker error] undefined reference to `htons@4' ...

Voilà , c'est du à quoi et que puis-je faire pour résoudre mon problèmes ?
nicerap
Messages postés
13
Date d'inscription
mardi 4 janvier 2005
Statut
Membre
Dernière intervention
23 avril 2006

Quand je compile ton code il me donne plusieurs erreur de type [linker error}...
logant83
Messages postés
90
Date d'inscription
lundi 20 février 2006
Statut
Membre
Dernière intervention
6 mars 2007

Bonsoir, voila alors ton code ma donné une idée enfaite mais quand j'essay a ma facon j'arrive a rien, je mexplique.

J'aimerais pouvoir établir un link (relié un server socket ou dessus on met des robot, genre comme fait anope tu vois ?)

alors j'ai fait ceci:

connect(sock, (sockaddr *)&sin, sizeof(sin));
sprintf(buffer, "PROTOCTL NICKv2 VHP UMODE2 NICKIP SJOIN SJOIN2 SJ3 NOQUIT TKLEXT SJB64");
sprintf(buffer, "PASS :mypass");
sprintf(buffer, "SERVER irc.fock.fr 1 :fock");

mais j'ai simplement sa qui s'affiche:
:irc.chatsl.org NOTICE AUTH :*** Looking up your hostname...
:irc.chatsl.org NOTICE AUTH :*** Couldn't resolve your hostname; using your IP a
ddress instead

et la tous se stop... comme si il recevait pas les infos ou sois je mis prend male...

Peut tu m'aider ?
CriPpLe
Messages postés
78
Date d'inscription
lundi 26 juillet 2004
Statut
Membre
Dernière intervention
26 avril 2005

Re, visiblement c'est un problème de réponse au PING :s

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.