diff --git a/thread.c b/thread.c new file mode 100644 index 0000000..ee6b20b --- /dev/null +++ b/thread.c @@ -0,0 +1,207 @@ +/* + (C) 2007,2008 Christopher Olsen + + $Id$ +*/ + +#include +#include +#include "tuvebot.h" + +void *botSCHD_Thread(void *threadid) { + botChanList_t *tmpChan = 0x0; + int i = 0x0; + int sTime = 0x0; + unsigned int cTime = 0x0; + unsigned int tM = 0x0; + char qryStr[256]; + MYSQL_RES *res = 0x0; + MYSQL_ROW row; + + while (1) { + writeLog(0,"schedule!\n"); + pthread_mutex_lock(&chanMutex); + writeLog(0,"Doing Chans: 0x%X\n",tmpChan); + cTime = time(NULL); + sTime = 30; + for (tmpChan = chans;tmpChan != 0x0;tmpChan = tmpChan->next) { + writeLog(0,"Time: %i:%i [%s]\n",tmpChan->schedule[tmpChan->sCur][0],cTime,tmpChan->channel); + if ((tmpChan->sCount > 0) && (tmpChan->schedule[tmpChan->sCur][0] <= cTime)) { + sTime = 5; + if (tmpChan->sM == 0) { + sWriteSocket("MSG %s:.tv mode +S\n",tmpChan->channel); + tmpChan->sM = 1; + } + sWriteSocket("VIDEO %s:%i\n",tmpChan->channel,tmpChan->schedule[tmpChan->sCur][1]); + tM = tmpChan->schedule[tmpChan->sCur + 1][0] - (tmpChan->schedule[tmpChan->sCur][0] + tmpChan->schedule[tmpChan->sCur][2]); + if (tM < 0 || tM > 30) { + sWriteSocket("MSG %s:.tv mode -S\n",tmpChan->channel); + tmpChan->sM = 0; + } + tmpChan->sCur++; + if (tmpChan->sCur >= tmpChan->sCount - 1) { + sprintf(qryStr,"SELECT s.vid,time,length FROM schedule s INNER JOIN videos v ON s.vid = v.vid WHERE cid = %i AND time > %i ORDER BY time LIMIT 0,9",tmpChan->cid,cTime); + res = dbQuery(qryStr,1); + tmpChan->sCount = mysql_num_rows(res); + tmpChan->sCur = 0; + for (i = 0;i < tmpChan->sCount;i++) { + row = mysql_fetch_row(res); + tmpChan->schedule[i][0] = atoi(row[1]); + tmpChan->schedule[i][1] = atoi(row[0]); + tmpChan->schedule[i][2] = atoi(row[2]); + } + if (res) + mysql_free_result(res); + } + } + } + pthread_mutex_unlock(&chanMutex); + + sleep(sTime); + } + } + +void *botCMD_Thread(void *threadid) { + int tid = 0x0; + unsigned int i = 0; + unsigned int x = 0; + int tmpVal = 0; + short lC = 0x0; + char qryStr[256]; + botChanList_t *tmpChan = 0x0; + MYSQL_RES *res = 0x0; + MYSQL_ROW row; + MYSQL_RES *res2 = 0x0; + + tid = (int)threadid; + writeLog(0,"Starting Bot's CMD Thread: [%d]\n", tid); + + while (1) { + if (connected == 0) { + sleep(5); + if (joinChan != 0) { + connected = 1; + if (joinChan != 2) + botJoinChans(); + } + } + else { + sleep(30); + res = dbQuery("SELECT channel,rating,classification,random,queue,exclusive,time,topic,noads,cid FROM channels WHERE updated = 1",1); + if (mysql_num_rows(res) > 0) { + for (i = 0;i < mysql_num_rows(res);i++) { + row = mysql_fetch_row(res); + + tmpChan = botFindChan(row[0]); + if (tmpChan == 0x0) { + writeLog(3,"Adding Chan: %s\n",row[0]); + tmpChan = botAddChan(row[0]); + } + pthread_mutex_lock(&chanMutex); + /* Set Access Level */ + tmpVal = atoi(row[1]); + if (tmpChan->modes[CHAN_RATING] != tmpVal) { + 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 (tmpChan->modes[CHAN_CLASS] != tmpVal) { + 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 (tmpChan->modes[CHAN_RANDOM] != tmpVal) { + 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 (tmpChan->modes[CHAN_QUEUE] != tmpVal) { + 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 (tmpChan->modes[CHAN_EXCLUSIVE] != tmpVal) { + if (tmpVal == 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 (tmpChan->modes[CHAN_TIME] != tmpVal) { + 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; + } + + tmpVal = atoi(row[8]); + if (tmpChan->modes[CHAN_NOADS] != tmpVal) { + if (tmpVal == 1) + sWriteSocket("MSG %s:.tv mode +X",row[0]); + else + sWriteSocket("MSG %s:.tv mode -X",row[0]); + tmpChan->modes[CHAN_NOADS] = tmpVal; + } + + if (strcmp(tmpChan->topic,row[7])) { + sWriteSocket("TOPIC %s:%s",row[0],row[7]); + strcpy(tmpChan->topic,row[7]); + } + + sprintf(qryStr,"UPDATE channels SET updated = 0 WHERE channel = '%s'",row[0]); + dbQuery(qryStr,0); + + tmpChan->cid = atoi(row[9]); + sprintf(qryStr,"SELECT s.vid,time,length FROM schedule s INNER JOIN videos v ON s.vid = v.vid WHERE cid = %i AND time > %i ORDER BY time LIMIT 0,9",tmpChan->cid,time(NULL)); + writeLog(0,qryStr); + res2 = dbQuery(qryStr,1); + tmpChan->sCount = mysql_num_rows(res2); + tmpChan->sCur = 0; + for (x = 0;x < tmpChan->sCount;x++) { + row = mysql_fetch_row(res2); + tmpChan->schedule[x][0] = atoi(row[1]); + tmpChan->schedule[x][1] = atoi(row[0]); + tmpChan->schedule[x][2] = atoi(row[2]); + } + if (res2) + mysql_free_result(res2); + pthread_mutex_unlock(&chanMutex); + } + } + + if (res != 0x0) + mysql_free_result(res); + + if (lC == 6) { + lC = 0; + sWriteSocket("STATUS"); + } + lC++; + } + } + pthread_exit(NULL); + } /* End tuveCMD_Thread() */