/*
Tuved Server
(C) 2007 Christopher Olsen
$Id$
*/
#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);
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 {
//writeLog(0,"Got Data [%s]\n",data);
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;
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);
}
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 {
writeLog(0,"Unknown Command: [%s]\n",cmd);
}
if (data2 != 0x0) {
data = 0x0;
goto Head;
}
return(0x0);
}