#include #include #include #include #include #include #include #include #define MAX_DATA_SIZE 4096 #define IRC_SERVER "mikeux.dyndns.org" #define IRC_CHANNEL "#mikeux" #define IRC_NICKNAME "boTc" #define IRC_PORT 6667 int fd_socket; // descriptor de fichero del socket struct hostent *hostent; // estructura que recibira información sobre el nodo remoto struct sockaddr_in servidor; // informacion sobre la direccion del servidor char buffer_from_server[MAX_DATA_SIZE]; // buffer de lectura de los datos que llegan del servidor char buffer_to_server[MAX_DATA_SIZE]; // buffer de escritura de los datos que se envian al servidor int buffer_from_server_count; // contador del buffer de lectura int tipo_de_peticion; // tipo: 0 - notice // 1 - ping del servidor // 2 - mensaje del canal // 3 - peticion del canal al bot /*----------------------------- funciones ------------------------------------------*/ int resuelve_dns() { if ((hostent=gethostbyname(IRC_SERVER))==NULL) { //printf("---x-x--- ERROR: resuelve_dns() - gethostbyname()\n"); return 0; } //printf("---x-x--- resuelve_dns(): %s - %s\n",hostent->h_name,inet_ntoa(*((struct in_addr *)hostent->h_addr))); return 1; } int crea_socket() { if ((fd_socket=socket(AF_INET, SOCK_STREAM, 0))==-1) { //printf("---x-x--- ERROR: crea_socket() - socket()\n"); return 0; } //printf("---x-x--- crea_socket()\n"); return 1; } int cierra_socket() { if ((close(fd_socket))==-1) { //printf("---x-x--- ERROR: cierra_socket() - close()\n"); return 0; } //printf("---x-x--- cierra_socket()\n"); return 1; } int inicializa_sockaddr() { servidor.sin_family = AF_INET; servidor.sin_port = htons(IRC_PORT); servidor.sin_addr = *((struct in_addr *)hostent->h_addr); bzero(&(servidor.sin_zero), 8); //printf("---x-x--- inicializa_sockaddr()\n"); return 1; } int conecta_con_servidor() { if ((connect(fd_socket, (struct sockaddr *)&servidor, sizeof(struct sockaddr)))==-1) { //printf("---x-x--- ERROR: conecta_con_servidor() - connect()\n"); return 0; } //printf("---x-x--- conecta_con_servidor()\n"); return 1; } int registra_en_servidor(){ strcpy(buffer_to_server,"NICK "); strcat(buffer_to_server,IRC_NICKNAME); strcat(buffer_to_server,"\r\n"); send(fd_socket,buffer_to_server,strlen(buffer_to_server),0); strcpy(buffer_to_server,"USER "); strcat(buffer_to_server,IRC_NICKNAME); strcat(buffer_to_server," 0 0 :BOTC\r\n"); send(fd_socket,buffer_to_server,strlen(buffer_to_server),0); sleep(1); //printf("---x-x--- registra_en_servidor()\n"); return 1; } int recibe_del_servidor() { if (((buffer_from_server_count=recv(fd_socket,buffer_from_server,MAX_DATA_SIZE,0)))==-1) { //printf("---x-x--- ERROR recibe_del_servidor() - recv() \n"); return 0; } buffer_from_server[buffer_from_server_count]='\0'; //printf("---x-x--- recibe_del_servidor() \n\n%s\n", buffer_from_server); return 1; } int unirse_a_canal() { strcpy(buffer_to_server,"JOIN "); strcat(buffer_to_server,IRC_CHANNEL); strcat(buffer_to_server,"\r\n"); send(fd_socket,buffer_to_server,strlen(buffer_to_server),0); //printf("---x-x--- unirse_a_canal()\n"); return 1; } int descifra_el_tipo_de_peticion() { char tmp[100]; strcpy(tmp, "PING :"); if (strstr(buffer_from_server, tmp)!=NULL) tipo_de_peticion=1; strcpy(tmp, "PRIVMSG "); strcat(tmp, IRC_CHANNEL); if (strstr(buffer_from_server, tmp)!=NULL) tipo_de_peticion=2; strcat(tmp, " :"); strcat(tmp, IRC_NICKNAME); strcat(tmp, ", "); if (strstr(buffer_from_server, tmp)!=NULL) tipo_de_peticion=3; } char *leer_porcion(int porcion) { int i=2; char *porcion_leida; porcion_leida=strtok(buffer_from_server, " "); while (i<=porcion) { porcion_leida=strtok(NULL, " "); i++; } if (porcion_leida!=NULL) printf("---x-x--- leer_porcion(%d): %s\n", porcion, porcion_leida); return porcion_leida; } int responder_a_ping() { strcpy(buffer_to_server, "PONG :"); strcat(buffer_to_server, IRC_SERVER); strcat(buffer_to_server,"\r\n"); send(fd_socket,buffer_to_server,strlen(buffer_to_server),0); printf("---x-x--- responder_a_ping(): %s\n", buffer_to_server); return 1; } int responder_a_mensaje_del_canal() { } int responder_a_peticion_del_canal() { strcpy(buffer_to_server, "PRIVMSG "); strcat(buffer_to_server, IRC_CHANNEL); strcat(buffer_to_server, " :respuesta -> "); strcat(buffer_to_server, leer_porcion(5)); strcat(buffer_to_server,"\r\n"); send(fd_socket,buffer_to_server,strlen(buffer_to_server),0); printf("---x-x--- responder_a_peticion_del_canal(): %s\n", buffer_to_server); return 1; } int responde_al_tipo_de_peticion() { switch (tipo_de_peticion) { case 1: printf("tipo 1: %s", buffer_from_server); responder_a_ping(); break; case 2: printf("tipo 2: %s", buffer_from_server); responder_a_mensaje_del_canal(); break; case 3: printf("tipo 3: %s", buffer_from_server); responder_a_peticion_del_canal(); break; default : printf("%s", buffer_from_server); } } /*----------------------------- programa principal ---------------------------------*/ int main() { if ((resuelve_dns())==0) return -1; if ((crea_socket())==0) return -1; if ((inicializa_sockaddr())==0) return -1; if ((conecta_con_servidor())==0) return -1; if ((registra_en_servidor())==0) return -1; if ((recibe_del_servidor())==0) return -1; if ((unirse_a_canal())==0) return -1; if ((recibe_del_servidor())==0) return -1; while (1) { if ((recibe_del_servidor())!=0) { descifra_el_tipo_de_peticion(); responde_al_tipo_de_peticion(); } } if ((cerrar_socket())==0) return -1; }