/*
  Tuved Server
  $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;
time_t startTime;
void usage();
int botProcessData(char *data);
int main(int argc,char **argv) {
  int ch;
  int doFork    = 0x1;
  int readSocks = 0x0;
  fd_set readset;
  fd_set faultset;
  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));
  sConnect(SERVER_HOST,SERVER_PORT);
  while (1) {
    sGetConnections(&readset);
    sGetConnections(&faultset);
    readSocks = select(highSock+1,&readset,0x0,&faultset,&timeout);
    if (readSocks < 0) {
      perror("select failed");
      exit(0x1);
      }
    if (FD_ISSET(mySocket,&faultset) != 0x0) {
        writeLog(0,"Socket Died!\n");
        sConnect(SERVER_HOST,SERVER_PORT);
      }
    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);
        }
      writeLog(0,"Got Data [%s]\n",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 *data) {
  char *cmd = 0x0;
  char *cmdData = 0x0;
  char *str_tok = 0x0;
  cmd = strtok_r(data,":",&str_tok);
  cmdData = strtok_r(NULL,"\n",&str_tok);
  if (cmd == 0x0)
    return(0x0);
  if (strstr(cmd,"PING")) {
    sWriteSocket("PONG!\n");
    }
  else if (!strcmp(cmd,"IDENT")) {
    sWriteSocket("MSG TUveD:.tv login reddawg temp123\n");
    botJoinChans();
    }
  else if (!strcmp(cmd,"MSG")) {
    botProcessMsg(cmdData);
    }
  else if (!strcmp(cmd,"TOPIC")) {
    botStoreTopic(cmdData);
    }
  else if (!strcmp(cmd,"CURPOS")) {
    botSetCurSong(cmdData);
    }
  else {
    writeLog(0,"Unknown Command: [%s]\n",cmd);
    }
  return(0x0);
  }