[c++] bot irc

    Publicités

Users Who Are Viewing This Thread (Total: 0, Members: 0, Guests: 0)

n0way

Membre actif
Nov 21, 2010
311
0
581
Earth
Code:
// DEV-CPP 4.9.9.2 

#include <cstdlib>
#include <iostream>

// Include pour utiliser les sockets

#include <windows.h>
#include <winsock2.h> // Metre -lws2_32 option compilateur 

using namespace std;

DWORD WINAPI Thread(LPVOID lpParameter); // Un Thread pour rester en lecture.
void Send_Line(SOCKET S,char * Texte); // Petite fonction pour envoyer une chaine de caractère.
void Data_Use(char Data); // Fonction pour traiter les données reçus du serveur

SOCKET MySocket; //Notre Socket 
char C; // Caractère buffer

//Pour la fonction Data_Use
int Ping_Detect=0,v=0,Fin_motd=0;
char Pong_Texte[]="PONG :123456789\r\n",Clear_Pong[18];
//

int main(int argc, char *argv[])
{
    // Un Impératif pour Init Winsock
    WSADATA WSAData;
    WSAStartup(MAKEWORD (2,0), &WSAData );
    //

    HOSTENT* HostName; //Pour le Nom de domaine
    char *IpResult;  //Adresse Ip au Format 225.255.255.255

    MySocket = socket(AF_INET,SOCK_STREAM,0); // Init du Socket
  
    char Addr_Serv[]="irc.quakenet.org"; // Adresse du Serveur ou on se connecte OU adresse IP devrait marcher aussi.

    sockaddr_in Sock_in;
    Sock_in.sin_family = AF_INET;   //FAMILLE           
    Sock_in.sin_port = htons(6667); //PORT  
    
    // On cherche ici L'adresse Ip depuis le Nom de domaine
    
    HostName = gethostbyname(Addr_Serv);
    IpResult = inet_ntoa(*((struct in_addr * )HostName->h_addr));
    Sock_in.sin_addr.s_addr = inet_addr(IpResult); //IP
    
    //Rapelle des Infos du serveurs
    
    cout << ";---------------------------------------------" << endl;
    cout << "; Adresse : " << Addr_Serv << endl;
    cout << "; Adresse IP Server :" << IpResult << endl;
    cout << ";---------------------------------------------\n" << endl;

   //Creaction du Lien 
   
    cout << "Connection...\n" << endl;
    connect(MySocket, (sockaddr *) &Sock_in, sizeof(sockaddr));
    
    //Ici On est connecté.
    
    //Envoi d'une requete
    
    //Ligne 1

     Send_Line(MySocket,"NICK TONBOT\r\n");
    
     //Ligne 2
     Send_Line(MySocket,"USER n0way n0way@cheat-gam3 n0way.IRC :by n0way\r\n");

    //Création du Tread de Lecture
    
    DWORD threadID;
    CreateThread(NULL, 0, Thread, NULL, 0, &threadID);
    
    //Creation d'une pause
    
    int pause;
    cin >> pause;
    
    //On ferme le tout
    
    closesocket (MySocket); // Fermeture du socket
    WSACleanup();
    
    system("PAUSE");

    return EXIT_SUCCESS;
}



DWORD WINAPI Thread(LPVOID lpParameter)
{
   while (1) {
         
            //Lecture du caractère  Buffer
            recv(MySocket, &C,1, 0);
            Data_Use(C); 
   }
}

void Send_Line(SOCKET S,char * Texte)
{
     send(S,Texte,strlen(Texte),0);
}

void Data_Use(char Texte)
{

     
     cout << Texte; // Affichage du caractére
     
     //ICI UNE FONCTION FAITE RAPIDEMENT POUR GERER LES REPONSES AU PING.
     
     if (Ping_Detect == 6)
     {
       if (Texte != '\r')
       { 
             Pong_Texte[6+v]=Texte; //Construit la chaine PONG avec les données serveurs           
             v++;        
       }
       else
       {
          cout << "\n" << Pong_Texte << endl; // Affiche la chaîne qu'on envoi forme PONG: ....

          Send_Line(MySocket,Pong_Texte); // Reponse
          
          //RAZ compteur etc..
          Ping_Detect=0;
          v=0;    
          strcpy(Pong_Texte,Clear_Pong);
       }
     }
       
     // Pour detecter les lettres l'une apres l'autre pour PING
     if (Ping_Detect == 5) Ping_Detect=6;
     if (Ping_Detect == 4) Ping_Detect=5;
     if (Ping_Detect == 3 && Texte == 'G') Ping_Detect=4;
     if (Ping_Detect == 2 && Texte == 'N') Ping_Detect=3;
     if (Ping_Detect == 1 && Texte == 'I') Ping_Detect=2;
     if (Texte == 'P') Ping_Detect=1;
     
     // Pour detecter les lettres l'une apres l'autre pour MOTD finit
     if (Fin_motd == 2 && Texte == '6') Fin_motd=3;
     if (Fin_motd == 1 && Texte == '7') Fin_motd=2;
     if (Texte == '3') Fin_motd=1;
     
     if (Fin_motd == 3) 
     {
         Send_Line(MySocket,"JOIN #ESSAY_HEHE\n\r"); // On join un channel
         Fin_motd=0;      
     }
     
      
}

J'ai trouvé cette source, avec pas mal de commentaire, donc assez sympa pour comprendre comment fonctionne les sockets mais aussi ca fait un bot IRC :) c'est plutôt pas mal...

Vous pourriez trouver des usages assez sympathique ... faut y penser :

- par exemple :
pour CS à mon époque on allait chercher sur Quakenet, sur des channels spéciaux des match... vous pourriez intégré à même le jeu, une fenetre qui se connecte a IRC, donc simplifie la recherche de war ... ou même pour surveiller le channel de votre team.

pour WoW pareillement coller sur les graphiques pour avoir un oeil sur le channel irc de votre guilde

etc...