Bot pour l'irc

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

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.