Newer
Older
tuvebridge / main.c
@flameshadow flameshadow on 6 Nov 2009 5 KB sync
/*
  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);
  }