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...