Newer
Older
tuvebot / src / main.c
@Charlie Root Charlie Root on 15 Apr 2019 4 KB Working on new build system
/*
  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);
  }