/* Tuved Server (C) 2007 Christopher Olsen $Id: main.c,v 1.22 2008/05/28 12:03:41 reddawg Exp $ */ #include <stdio.h> #include <stdarg.h> #include <sys/select.h> #include <time.h> #include "tuvebot.h" FILE *logFile = 0x0; int logLevel = 1; int highSock = 0x0; int joinChan = 0x0; time_t startTime; void usage(); int botProcessData(char *data); int main(int argc,char **argv) { int ch; int doFork = 0x1; int readSocks = 0x0; int t = 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,"TUveBOT Starting: %i\n",startTime); dbInit(); srandom(time(NULL)); pthread_t threads[NUM_THREADS]; pthread_create(&threads[t], NULL, botCMD_Thread, (void *)t); t = 1; pthread_create(&threads[t], NULL, botSCHD_Thread, (void *)t); pthread_mutex_init(&chanMutex, NULL); sConnect(SERVER_HOST,SERVER_PORT); 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(mySocket,&readSet) != 0x0) { memset(&data,0x0,1024); if (sReadSocket(&data,1024) == -1) { writeLog(0,"Socket Died!\n"); sConnect(SERVER_HOST,SERVER_PORT); //exit(1); } else { botProcessData(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 botProcessMsg(char *data) { char *nick; char *chan; char *cmdData; char *str_tok = 0x0; botChanList_t *tmpChan; int i; nick = strtok_r(data,":",&str_tok); chan = strtok_r(NULL,":",&str_tok); cmdData = strtok_r(NULL,"\n",&str_tok); if ((!strcasecmp(nick,"MrOlsen")) && (!strcasecmp(chan,"PRIVMSG"))) { printf("cmdData: [%s]\n",cmdData); sWriteSocket("%s\n",cmdData); } else if (!strcasecmp(nick,"MrOlsen") && !strcasecmp(cmdData,".ss")) { tmpChan = botFindChan(chan); for (i = tmpChan->sCur;i < tmpChan->sCount;i++) { sWriteSocket("MSG %s:Time: %i,VID: %i\n",chan,tmpChan->schedule[i][0],tmpChan->schedule[i][1]); } } return(0x0); } int botProcessData(char *dataFresh) { char *cmd = 0x0; char *cmdData = 0x0; char *str_tok = 0x0; char *data = 0x0; char *data2 = 0x0; char *data_tok = 0x0; data = strtok_r(dataFresh,"\n",&data_tok); data2 = strtok_r(NULL,"\n",&data_tok); Head: if (data == 0x0) { data = data2; data2 = strtok_r(NULL,"\n",&data_tok); } cmd = data; if (strstr(cmd,":")) { cmd = strtok_r(data,":",&str_tok); cmdData = strtok_r(NULL,"\n",&str_tok); str_tok = 0x0; writeLog(3,"DATA: (%s)CMD: [%s], Data: [%s]\n",data,cmd,cmdData); } else writeLog(3,"DATA: (%s)CMD: [%s]\n",data,cmd); if (cmd == 0x0) return(0x0); if (strstr(cmd,"PING")) { sWriteSocket("PONG!\n"); } else if (!strcmp(cmd,"IDENT")) { sWriteSocket("MSG TUveD:.tv login tuvebot 5558585\n"); joinChan = 1; } else if (!strcmp(cmd,"MSG")) botProcessMsg(cmdData); else if (!strcmp(cmd,"TOPIC")) botStoreTopic(cmdData); else if (!strcmp(cmd,"CURPOS")) botSetCurSong(cmdData); else if (!strcmp(cmd,"MODE")) botSetMode(cmdData); else if (!strcmp(cmd,"JOIN")) botDoJoin(cmdData); else if (!strcmp(cmd,"EMOTE")) botDoEmote(cmdData); else if (!strcmp(cmd,"LOGIN")) botDoLogin(cmdData); else { writeLog(0,"Unknown Command: [%s]\n",cmd); } if (data2 != 0x0) { data = 0x0; goto Head; } return(0x0); }