a pesar de lo simple del programa me costo bastante hacerlo estaba muy acostumbrado a las expresiones regulares de lenguajes como python no hace nada como dije un esqueleto donde es muy facil usar los datos y hacer que el bot haga lo que uno quiera
seguramente se pueden mejorar muchas cosas pero de esta forma funciona :)
#include <winsock2.h>
#include <windows.h>
#include <cstring>
#include <cstdio>
void comandos(char *usuario,char *cmand, char *sala,char *mensaje)
{
printf("Usuario: %s\n",usuario
); printf("Comando irc: %s\n",cmand
); printf("mensaje: %s\n",mensaje
); //char comando[130]="PRIVMSG #botslols :Soy un inutil bot en c :(\r\n";
//send(sock,comando,strlen(comandos),0);
}
int main()
{
SetConsoleTitle("irc bot");
WSADATA wsa;
SOCKET sock;
int conex;
int len;
char Buffer[1024];
//
char peticion1[]="NICK BOTpurakerdal\r\n"; // nombre del bot
char peticion2[]="USER BOTpurakerdal 1 1 1\r\n"; //nombre completo
char peticion3[]="JOIN #botslols\r\n"; //sala
int enviado=0;
char pong[130]="PONG :";
char ping[130]={0};
struct hostent *host;
struct sockaddr_in direc;
WSAStartup(MAKEWORD(2,0),&wsa);
host=gethostbyname("chat.freenode.net");
sock=socket(AF_INET,SOCK_STREAM,IPPROTO_TCP);
if (sock==-1)
{
printf("Error al crear el socket"); return -1;
}
direc.sin_family=AF_INET;
direc.sin_port=htons(6667);
direc.sin_addr = *((struct in_addr *)host->h_addr);
conex=connect(sock,(sockaddr *)&direc, sizeof(sockaddr));
if(conex==-1)
{
return -1;
}
printf("[+]conexion establecida\n"); enviado
=send
(sock
, peticion1
,strlen(peticion1
), 0); printf("[+]nick registrado\n"); enviado
=send
(sock
, peticion2
,strlen(peticion2
), 0); enviado
=send
(sock
, peticion3
,strlen(peticion3
), 0); printf("[+]entrando a la sala\n-\n"); int final3;
int ciclo2;
//-------------------------------
char cadenita[500];
char cadenita2[500];
char usuario[500];
char sala[500];
char cmand[500];
char mensaje[500];
//--------------------------
char *star;
//------------------
int ciclo;
while (len
!=-1 && strcmp(Buffer
,"salir")!=0) {
len = recv(sock, Buffer, sizeof(Buffer), 0);
//enviar el pong que es la respuesta al ping de irc
for(int ewe=0;ewe != len;ewe++)
{
if((Buffer[ewe]=='P')&&(Buffer[ewe+1]=='I')&&(Buffer[ewe+2]=='N')&&(Buffer[ewe+3]=='G'))
{
send
(sock
,pong
,strlen(pong
),0);
}
}
//---------------------------------------
if(Buffer[0]==':') // si comienza en : es un comando
{
for(ciclo=0;(ciclo<500)&&(Buffer[ciclo]!='\r');ciclo++)
{
cadenita[ciclo]=Buffer[ciclo];
}
//le quitamos la basura al buffer
strcpy(cadenita2
,cadenita
); //necesito la cadena completa strtok la parte star
=strtok(cadenita
," "); // parto la cadena la primera palabra es el user strcpy(usuario
,star
); // pongo el user en la variable usuario star
=strtok(NULL
," "); // tomo la siguente palabra strcpy(cmand
,star
); // tomo el comando de irc strcpy(sala
,star
); // esta es la sala memcpy(mensaje
,(cadenita2
+strlen(usuario
)+strlen(cmand
)+strlen(sala
)+4),500); // es decir todo lo anterior a el mensaje no se copia eso mas 3 espacios mas este caracter : es decir 4 comandos(usuario,cmand,sala,mensaje);
}
}
return 0;
}
Muy interesante, tengo que verme la programación de sockets que me queda por mirar :silbar:
Por cierto:
host=gethostbyname("chat.freenode.net");
¿Que es chat.freenode.net?