/* TUve Bridge Bot (C) 2009 Christopher Olsen $Id$ */ #include <stdio.h> #include <stdarg.h> #include <sys/select.h> #include <time.h> #include "tuvebridge.h" FILE *logFile = 0x0; int logLevel = 1; int highSock = 0x0; time_t startTime; int onIRC = 0; void usage(); int bridgeProcessData(int net,char *data); int main(int argc,char **argv) { int ch; int doFork = 0x1; int readSocks = 0x0; fd_set readSet; char data[1024]; struct timeval timeout = {30,0}; /* Get our start time */ startTime = time(NULL); while ((ch = getopt(argc,argv,"sl:nd:")) != -1) { switch (ch) { case 's': logFile = stdout; break; case 'l': logFile = fopen(optarg,"a"); break; case 'n': doFork = 0; break; case 'd': logLevel = atoi(optarg); if (logLevel < 1) logLevel = 1; break; default: usage(); } } argc -= optind; argv += optind; /* Prepare log file */ if (logFile == 0x0) logFile = fopen(LOG_FILE,"a"); /* Fork into background unless specified not to do so */ if (doFork == 1) if (fork() != 0x0) exit(1); writeLog(0,"TUve Bridge Starting: %i\n",startTime); dbInit(); srandom(time(NULL)); if (sConnect(1,TUVE_SERVER_HOST,TUVE_SERVER_PORT)) writeLog(0,"TUve Bridge Unable To Connect To TUve Network"); if (sConnect(2,IRC_SERVER_HOST,IRC_SERVER_PORT)) writeLog(0,"TUve Bridge Unable To Connect To IRC Network"); while (1) { /* Build our readSet */ sGetConnections(&readSet); readSocks = select(highSock+1,&readSet,0x0,0x0,&timeout); if (readSocks < 0) { perror("select failed"); exit(0x1); } if (FD_ISSET(tuveSocket,&readSet) != 0x0) { memset(&data,0x0,1024); if (sReadSocket(tuveSocket,&data,1024) == -1) { writeLog(0,"TUve Socket Died!\n"); sConnect(1,TUVE_SERVER_HOST,TUVE_SERVER_PORT); } else { bridgeProcessData(1,data); } } if (FD_ISSET(ircSocket,&readSet) != 0x0) { memset(&data,0x0,1024); if (sReadSocket(ircSocket,&data,1024) == -1) { writeLog(0,"IRC Socket Died!\n"); sConnect(2,IRC_SERVER_HOST,IRC_SERVER_PORT); } else { bridgeProcessData(2,data); } } /* Flush the log file */ fflush(logFile); } return(0); } void usage() { printf("%s\n","usage: tuved -n -s [-l logfile] [-d debuglevel]"); exit(1); } int writeLog(int level,char const * __restrict fmt, ...) { int ret; va_list ap; if (level > logLevel) return(0x0); va_start(ap, fmt); ret = vfprintf(logFile, fmt, ap); va_end(ap); return(ret); } int bridgeProcessData(int net,char *dataFresh) { char *data_tok = 0x0; char *cmd = 0x0; char *nick = 0x0; char *chunk = 0x0; char *chunk_tok = 0x0; char IRCnick[32]; int i = 0x0; writeLog(0,"[%s]\n",dataFresh); if (net == 1) { writeLog(0,"TUve Network\n"); if (strstr(dataFresh,"PING ") != 0x0) { sWriteSocket(tuveSocket,"PONG!\n"); } else { cmd = strtok_r(dataFresh,":",&data_tok); if (!strcmp(cmd,"IDENT")) sWriteSocket(tuveSocket,"JOIN %s\n",TUVE_CHANNEL); else if (!strcmp(cmd,"CURPOS")) { strtok_r(NULL,":",&data_tok); strtok_r(NULL,":",&data_tok); strtok_r(NULL,":",&data_tok); nick = strtok_r(NULL,":",&data_tok); strtok_r(NULL,":",&data_tok); chunk = strtok_r(NULL,":",&data_tok); // sWriteSocket(ircSocket,"PRIVMSG %s :Now Playing %s | Watch @ http://www.tuve.tv/watch/%s\n",IRC_CHANNEL,nick,chunk); } else if (!strcmp(cmd,"MSG") && (onIRC == 1)) { nick = strtok_r(NULL,":",&data_tok); strtok_r(NULL,":",&data_tok); if (strcmp(nick,"TUveD")) sWriteSocket(ircSocket,"PRIVMSG %s :<%s> %s\n",IRC_CHANNEL,nick,strtok_r(NULL,"\n",&data_tok)); } } } else { writeLog(0,"IRC Network\n"); for (chunk = strtok_r(dataFresh,"\n",&chunk_tok);chunk;chunk = strtok_r(NULL,"\n",&chunk_tok)) { cmd = strtok_r(chunk," ",&data_tok); if (cmd[0] == ':') { if (strstr(cmd,"!") != 0x0) { memset(&IRCnick,0x0,32); for (i=1;cmd[i] != '!';i++) { IRCnick[i-1] = cmd[i]; } IRCnick[i] = 0x0; writeLog(0,"IRC NICK: [%s]\n",IRCnick); } cmd = strtok_r(NULL," ",&data_tok); } if (cmd == 0x0) writeLog(0,"NULL CMD\n"); else if (!strcmp(cmd,"PING")) sWriteSocket(ircSocket,"PONG %s\n",strtok_r(NULL,"\n",&data_tok)); else if (!strcmp(cmd,"376")) { sWriteSocket(ircSocket,"JOIN %s\n",IRC_CHANNEL); sWriteSocket(ircSocket,"PRIVMSG %s :Bridging to TUve\n",IRC_CHANNEL); onIRC = 1; } else if (!strcmp(cmd,"PRIVMSG")) { strtok_r(NULL," ",&data_tok); nick = strtok_r(NULL,"\n",&data_tok); nick[0] = ' '; sWriteSocket(tuveSocket,"MSG %s:%s:%s\n",TUVE_CHANNEL,IRCnick,nick); } } } return(0x0); }