/*
bot.c (C) 2007 Christopher Olsen
$Id$
*/
#include <stdio.h>
#include "tuvebot.h"
botChanList_t *chans = 0x0;
botChanList_t *botFindChan(char *channel) {
botChanList_t *tmpChan = 0x0;
for (tmpChan = chans;tmpChan != 0x0;tmpChan = tmpChan->next) {
if (!strcasecmp(tmpChan->channel,channel))
return(tmpChan);
}
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);
if (chans == 0x0)
chans = tmpChan;
else {
tmpChan->next = chans;
chans->prev = tmpChan;
chans = tmpChan;
}
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,":"));
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;
writeLog(0,"TESTING");
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);
}