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("sala: %s\n",sala);
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);
memset(direc.sin_zero,0,8);
conex=connect(sock,(sockaddr *)&direc, sizeof(sockaddr));
if(conex==-1)
{
printf("error\n");
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)
{
fflush(stdout);
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'))
{
memcpy(ping,Buffer+ewe+6,10);
memcpy(pong+6,ping,10);
memcpy(pong+16,"\r\n",strlen("\r\n"));
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
star=strtok(NULL," ");
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?
es un servidor irc(precisamente donde esta el chat de este foro si quieres abajo en mi firma esta el enlace al chat) que se encarga de pasar la conexion a el servidor mas cercano o mas disponible de esta red de servidores llamada freenode
saludos ;D