void irc_connect(void) { struct sockaddr_in addr; struct hostent *serv; char buf[IRC_MSG_LEN]; fd = socket(AF_INET, SOCK_STREAM/*|SOCK_NONBLOCK*/, 0); printf("Connecting to %s...\n", conf.host); serv = gethostbyname(conf.host); addr.sin_family = AF_INET; memcpy(&addr.sin_addr.s_addr, serv->h_addr, serv->h_length); addr.sin_port = htons(conf.port); if(connect(fd, (struct sockaddr *) &addr, sizeof(addr))<0) { puts("Connection error"); exit(EXIT_FAILURE); } irc_read(buf); irc_read(buf); strcpy(buf, "USER "); strcat(buf, conf.name); strcat(buf, " "); strcat(buf, conf.name); strcat(buf, " "); strcat(buf, conf.name); strcat(buf, " "); strcat(buf, conf.name); strcat(buf, "\r\n"); irc_cmd(buf); strcpy(buf, "NICK "); strcat(buf, conf.name); strcat(buf, "\r\n"); irc_cmd(buf); irc_read(buf); buf[1] = 'O'; irc_cmd(buf); while(irc_read(buf)) { buf[strlen(conf.name)+1] = '\0'; if(!strcmp(buf+1, conf.name)) break; } strcpy(buf, "JOIN "); strcat(buf, conf.chan); strcat(buf, "\r\n"); irc_cmd(buf); puts("Connected!"); sprintf(buf, "Hello, I'm %s!", conf.name); irc_say(buf); while(irc_read(buf) && irc_get_type(buf)!=T_JOIN); }
void mod_handle(char *msg) { Module *m; int nargs; char nick[IRC_NICK_LEN], txt[IRC_MSG_LEN], *args[MAX_NARGS], *spaces[MAX_NARGS-2]; enum irc_type type; type = irc_get_type(msg); if(type==T_OTHER) return; irc_get_nick(nick, msg); if(!strcmp(nick, conf.name)) return; if(type & (T_MODE|T_KICK)) irc_get_params(txt, msg); else irc_get_text(txt, msg); /* mark message as copied, maybe useful if the bot is made multithreaded */ msg[0] = '\0'; args[0] = nick; nargs = 1 + words(txt, args+1, spaces, nargsrec-1); m = &mod; do { unwords(spaces, nargs-1, m->nargs-1); if((m->on & type) && ( (!m->invoker) || (type==T_CHAN && args[1][0]==conf.cmd && !strcmp(args[1]+1, m->invoker)) || (type!=T_CHAN && !strcmp(args[1], m->invoker)) ) ) m->f(args, type); m = m->next; } while(m); }