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); }
int main(int argc, char **argv) { int socketfd, n; char in[BUF+1], out[BUF+1], c[512]; char *pos, *action; if(argc != 5) { printf("Usage: %s <address> <port> <nick> <owner>\n", argv[0]); exit(1); } else if(atoi(argv[2]) < 1 || atoi(argv[2]) > 50000) { printf("Invalid port specified.\n"); exit(1); } else if(irc_connect(argv[1], atoi(argv[2]), &socketfd) == 0) { printf("Failed to connect to %s.\n", argv[1]); exit(1); } nick = argv[3]; owner = argv[4]; if(strlen(nick)>48) { printf("Error: irc bot nickname too long\n"); exit(1); } if(strlen(owner)>48) { printf("Error: bot owner nickname too long\n"); exit(1); } /* write to buffer */ sprintf(c, "NICK %s\r\n", nick); irc_send(socketfd, c); sprintf(c, "USER %s %s %s :%s\r\n", nick, nick, nick, nick); irc_send(socketfd, c); /* do the service jobs */ if(join_channels(socketfd, "./owners.log") == 2) { return 1; } while(1) { in[0] = 0; n = irc_read(socketfd, in); if (n > 0) { char *str = process_string(in, n); if(strncmp(str, "0", 1)!=0) { irc_send(socketfd, str); } if(strncmp(str, "QUIT", 4)==0) { break; } } // if(n > 0) } // while(1) return 0; }
void irc_init(void) { /***************************************** * Now connected, start sending commands * *****************************************/ irc_write(bformat("PASS %s", bdata(config.password))); /* PASS password */ irc_write(bformat("NICK %s", bdata(config.nickname))); /* NICK nickname */ irc_write(bformat("USER %s %s %s :%s", bdata(config.ident), bdata(config.host), bdata(config.server_address), bdata(config.name))); /* USER ident host server :name */ /********************************** * Read socket and stay connected * **********************************/ irc_read(); }
void irc_loop(void) { char buf[IRC_MSG_LEN]; while(1) { irc_read(buf); if(strbeg(buf, "PING")) { buf[1] = 'O'; irc_cmd(buf); } else mod_handle(buf); } }
/* * irc_loop() * loop to handle all callbacks */ int irc_loop(int s) { char buf[MSG_MAX]; char tbuf[MSG_MAX]; /* tokenizer buffer */ char *tok; char *ln = buf; int chr, cr, i, y; /* get irc msg loop */ for (;;) { bzero(buf, MSG_MAX); /* zero out buffer */ ln = buf; cr = 0; /* keep reading until CR and NL */ for (;;) { chr = irc_read(s); if (chr == '\r') cr = 1; if (cr && chr == '\n') { *--ln = '\0'; break; } *ln++ = (char)chr; } /* loop through callbacks */ y = 0; strncpy(tbuf, buf, MSG_MAX); tok = strtok(tbuf, " "); while (tok != NULL) { for (i=0; i < LEN(cb); i++) { if (!strncmp(tok, cb[i].search, MSG_MAX) && cb[i].n == y) { cb[i].fn(s, buf); } } tok = strtok(NULL, " "); y++; } } }
int main(int argc, char **argv) { init(&argc, &argv, &g_sett); atexit(cleanup); #if HAVE_SIGINFO lsi_b_regsig(SIGINFO, infohnd); #elif HAVE_SIGUSR1 lsi_b_regsig(SIGUSR1, infohnd); #endif bool failure = true; for (;;) { if (!irc_online(g_irc)) { D("connecting..."); if (tryconnect()) { g_nexthb = lsi_b_tstamp_us() + g_sett.heartbeat_us; continue; } W("failed to connect/logon (%s)", g_sett.recon ? "retrying" : "giving up"); if (!g_sett.recon) break; lsi_b_usleep(1000000ul * g_sett.cfwait_s); continue; } tokarr tok; uint64_t to = g_sett.heartbeat_us; int r = irc_read(g_irc, &tok, to ? to : 1000000); if (r < 0) break; if (g_dumpplx) { irc_dump(g_irc); if (irc_tracking_enab(g_irc)) lsi_trk_dump(g_irc, false); g_dumpplx = false; } if (r > 0) g_nexthb = lsi_b_tstamp_us() + g_sett.heartbeat_us; else if (g_sett.heartbeat_us && g_nexthb <= lsi_b_tstamp_us()) { iprintf("PING %s\r\n", irc_myhost(g_irc)); g_nexthb = lsi_b_tstamp_us() + g_sett.heartbeat_us; } if (r == 0) continue; if (strcmp(tok[1], "PING") == 0) iprintf("PONG :%s\r\n", tok[2]); else if (strcmp(tok[1], "PRIVMSG") == 0) { if (strncmp(tok[3], "ECHO ", 5) == 0) { char nick[64]; lsi_ut_ident2nick(nick, sizeof nick, tok[0]); iprintf("PRIVMSG %s :%s\r\n", nick, tok[3]+5); } else if (strncmp(tok[3], "DO ", 3) == 0) { iprintf("%s\r\n", tok[3]+3); } else if (strcmp(tok[3], "DIE") == 0) { failure = false; break; } else if (strcmp(tok[3], "DUMP") == 0) { irc_dump(g_irc); lsi_trk_dump(g_irc, false); } else if (strcmp(tok[3], "FULLDUMP") == 0) { irc_dump(g_irc); lsi_trk_dump(g_irc, true); } } } return failure ? EXIT_FAILURE : EXIT_SUCCESS; }