Newer
Older
tuvebot / bot.c
/*
 bot.c (C) 2007 Christopher Olsen

 $Id$
*/

#include <stdio.h>
#include "tuvebot.h"

botChanList_t *chans = 0x0;

pthread_mutex_t chanMutex = PTHREAD_MUTEX_INITIALIZER;

botChanList_t *botFindChan(char *channel) {
  botChanList_t *tmpChan = 0x0;
  
  pthread_mutex_lock(&chanMutex);
  
  for (tmpChan = chans;tmpChan != 0x0;tmpChan = tmpChan->next) {
	if (!strcasecmp(tmpChan->channel,channel)) {
		pthread_mutex_unlock(&chanMutex);
	  return(tmpChan);
	  }
    }
  
  pthread_mutex_unlock(&chanMutex);
  return(0x0);
  }

botChanList_t *botAddChan(char *channel) {
  botChanList_t *tmpChan = 0x0;
  
  tmpChan = botFindChan(channel);
  
  if (tmpChan != 0x0)
    return(tmpChan);

  writeLog(2,"ADDING CHANNEL: %s\n",channel);
  
  tmpChan = (botChanList_t *)malloc(sizeof(botChanList_t));
  
  strcpy(tmpChan->channel,channel);
  tmpChan->next    = 0x0;
  tmpChan->prev    = 0x0;
  tmpChan->updated = 0x0;
  bzero(tmpChan->modes,CHAN_MODES);
  
  pthread_mutex_lock(&chanMutex);
  
  if (chans == 0x0)
    chans = tmpChan;
  else {
    tmpChan->next = chans;
    chans->prev = tmpChan;
    chans = tmpChan;
    }
  
  pthread_mutex_unlock(&chanMutex);
  return(tmpChan);
  }

int botJoinChans() {
  MYSQL_RES     *res     = 0x0;
  MYSQL_ROW      row;
  unsigned int   i       = 0x0;
  int            tmpVal  = 0;
  botChanList_t *tmpChan = 0x0;

  res = dbQuery("SELECT channel,rating,classification,random,queue,exclusive,time,topic FROM channels",1);
  
  if (mysql_num_rows(res) > 0) {
	for (i = 0;i < mysql_num_rows(res);i++) {
	  row = mysql_fetch_row(res);
	  tmpChan = botAddChan(row[0]);
	  if (tmpChan == 0x0)
	    return(-1);
	  
	  sWriteSocket("JOIN %s",row[0]);
	  sleep(2);
	  
	  /* Op Myself */
	  sWriteSocket("MSG %s:.tv MODE +O TUveBOT",row[0]);
	  
	  /* Set Access Level */
	  tmpVal = atoi(row[1]);
	  if (tmpVal > 0)
	    sWriteSocket("MSG %s:.tv mode +A %i",row[0],tmpVal);
	  else
		sWriteSocket("MSG %s:.tv mode -A",row[0]);
	  tmpChan->modes[CHAN_RATING] = tmpVal;
	  
	  /* Set Classification */
	  tmpVal = atoi(row[2]);
	  if (tmpVal > 0)
	    sWriteSocket("MSG %s:.tv mode +C %i",row[0],tmpVal);
	  else
		sWriteSocket("MSG %s:.tv mode -C",row[0]);
	  tmpChan->modes[CHAN_CLASS] = tmpVal;
	  
	  /* Set Random */
	  tmpVal = atoi(row[3]);
	  if (tmpVal == 1)
	    sWriteSocket("MSG %s:.tv mode +R",row[0]);
	  else
		sWriteSocket("MSG %s:.tv mode -R",row[0]);
	  tmpChan->modes[CHAN_RANDOM] = tmpVal;
	  
	  /* Set Queue */
	  tmpVal = atoi(row[4]);
	  if (tmpVal == 1)
	    sWriteSocket("MSG %s:.tv mode +Q",row[0]);
	  else
		sWriteSocket("MSG %s:.tv mode -Q",row[0]);
	  tmpChan->modes[CHAN_QUEUE] = tmpVal;
	  
	  /* Set Exclusive */
	  tmpVal = atoi(row[5]);
	  if (row[5][0] == 1)
	    sWriteSocket("MSG %s:.tv mode +E",row[0]);
	  else
		sWriteSocket("MSG %s:.tv mode -E",row[0]);
	  tmpChan->modes[CHAN_EXCLUSIVE] = tmpVal;
	  
	  /* Set Time */
	  tmpVal = atoi(row[6]);
	  if (tmpVal > 0)
	    sWriteSocket("MSG %s:.tv mode +T %i",row[0],tmpVal);
	  else
		sWriteSocket("MSG %s:.tv mode -T",row[0]);
	  tmpChan->modes[CHAN_TIME] = tmpVal;
	  
	  sWriteSocket("TOPIC %s:%s",row[0],row[7]);
	  strcpy(tmpChan->topic,row[7]);
	  
	  tmpChan->updated = 1;
	  }
    }
  return(0x0);
  }

int botSetMode(char *data) {
  botChanList_t *tmpChan = 0x0;
  char *chan   = 0x0;
  char *mode   = 0x0;
  int   tmpVal = 0x0;
  char  qryStr[512];
  
  chan = strtok(data,":");
  
  tmpChan = botFindChan(chan);
  
  if (tmpChan == 0x0)
    return(-1);
  
  if (tmpChan->updated == 0x0)
    return(0x0);
  
  mode = strtok(NULL,":");
  switch (mode[0]) {
    case 'A':
      tmpVal = atoi(strtok(NULL,"\n"));
      if (tmpChan->modes[CHAN_RATING] != tmpVal) {
        tmpChan->modes[CHAN_RATING] = tmpVal;
        sprintf(qryStr,"UPDATE channels SET rating = %i WHERE channel = '%s'",tmpVal,tmpChan->channel);
        dbQuery(qryStr,0);
        }
      break;
    case 'C':
      tmpVal = atoi(strtok(NULL,"\n"));
      if (tmpChan->modes[CHAN_CLASS] != tmpVal) {
        tmpChan->modes[CHAN_CLASS] = tmpVal;
        sprintf(qryStr,"UPDATE channels SET classification = %i WHERE channel = '%s'",tmpVal,tmpChan->channel);
        dbQuery(qryStr,0);
        }
      break;
    case 'R':
      tmpVal = atoi(strtok(NULL,"\n"));
      if (tmpChan->modes[CHAN_RANDOM] != tmpVal) {
        tmpChan->modes[CHAN_RANDOM] = tmpVal;
        sprintf(qryStr,"UPDATE channels SET random = %i WHERE channel = '%s'",tmpVal,tmpChan->channel);
        dbQuery(qryStr,0);
        }
      break;
    case 'Q':
      tmpVal = atoi(strtok(NULL,"\n"));
      if (tmpChan->modes[CHAN_QUEUE] != tmpVal) {
        tmpChan->modes[CHAN_QUEUE] = tmpVal;
        sprintf(qryStr,"UPDATE channels SET queue = %i WHERE channel = '%s'",tmpVal,tmpChan->channel);
        dbQuery(qryStr,0);
        }
      break;
    case 'E':
      tmpVal = atoi(strtok(NULL,"\n"));
      if (tmpChan->modes[CHAN_EXCLUSIVE] != tmpVal) {
        tmpChan->modes[CHAN_EXCLUSIVE] = tmpVal;
        sprintf(qryStr,"UPDATE channels SET exclusive = %i WHERE channel = '%s'",tmpVal,tmpChan->channel);
        dbQuery(qryStr,0);
        }
      break;
    case 'T':
      tmpVal = atoi(strtok(NULL,":"));
      if (tmpVal != 0x0)
        tmpVal = atoi(strtok(NULL,"\n"));
      if (tmpChan->modes[CHAN_TIME] != tmpVal) {
        tmpChan->modes[CHAN_TIME] = tmpVal;
        sprintf(qryStr,"UPDATE channels SET time = %i WHERE channel = '%s'",tmpVal,tmpChan->channel);
        dbQuery(qryStr,0);
        }
      break;
    default:
      writeLog(0,"Invalid Mode: %c\n",mode[0]);
    }
  return(0x0);
  }

int botSetCurSong(char *data) {
  char output[128];
  char *chan = 0x0;
  char *song = 0x0;

  if (data == 0x0)
    return(-1);

  chan = strtok(data,":");
  strtok(NULL,":");
  strtok(NULL,":");
  strtok(NULL,":");
  strtok(NULL,":");
  song = strtok(NULL,":");

  if (song == 0x0)
    return(-1);

  sprintf(output,"UPDATE channels SET nowplaying = %s WHERE channel = '%s'",song,chan);
  dbQuery(output,0);

  writeLog(0,"Test: %s %s\n",chan,song);
  return(0x0);
  }

int botStoreTopic(char *data) {
  char *chan  = 0x0;
  char *topic = 0x0;
  char  qStr[512];

  if (data == 0x0)
    return(0x1);

  chan = strtok(data,":");
  topic = strtok(NULL,"\n");

  if (chan == 0x0)
    return(0x1);

  sprintf(qStr,"UPDATE channels SET topic = \"%s\" WHERE channel = '%s'",topic,chan);
  dbQuery(qStr,0);

  return(0x0); 
  }