[c][aporte]esqueleto bot irc

Iniciado por daryo, 21 Junio 2013, 23:30 PM

0 Miembros y 1 Visitante están viendo este tema.

daryo

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;
}
buenas

amchacon

Muy interesante, tengo que verme la programación de sockets que me queda por mirar  :silbar:

Por cierto:

Código (cpp) [Seleccionar]
host=gethostbyname("chat.freenode.net");

¿Que es chat.freenode.net?
Por favor, no me manden MP con dudas. Usen el foro, gracias.

¡Visita mi programa estrella!

Rar File Missing: Esteganografía en un Rar

daryo


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
buenas