diff --git a/.project b/.project new file mode 100644 index 0000000..2d45e5b --- /dev/null +++ b/.project @@ -0,0 +1,11 @@ + + + tuvebridge + + + + + + + + diff --git a/Makefile b/Makefile index 7f10079..f89bfab 100644 --- a/Makefile +++ b/Makefile @@ -1,5 +1,5 @@ # $Id$ -# Application Makefile (C) 2002-2004 The UbixOS Project +# Application Makefile (C) 2002-2004, 2009 Christopher Olsen #Compiler CC = gcc @@ -15,7 +15,7 @@ REMOVE = rm -f #Objects -OBJS = mysql.o main.o socket.o +OBJS = bridge.o thread.o mysql.o main.o socket.o LIBRARIES = -lthr -L/usr/local/lib/mysql -lmysqlclient CFLAGS = -Wall -W -ggdb diff --git a/bridge.c b/bridge.c index 8e52341..02c20e6 100644 --- a/bridge.c +++ b/bridge.c @@ -1,11 +1,12 @@ /* - bot.c (C) 2007 Christopher Olsen + TUve Bridge Thread Commands + bridge.c (C) 2009 Christopher Olsen $Id$ */ #include -#include "tuvebot.h" +#include "tuvebridge.h" botChanList_t *chans = 0x0; @@ -13,40 +14,40 @@ 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 { @@ -54,9 +55,9 @@ chans->prev = tmpChan; chans = tmpChan; } - + pthread_mutex_unlock(&chanMutex); - + return(tmpChan); } @@ -73,7 +74,7 @@ res = dbQuery("SELECT channel,rating,classification,random,queue,exclusive,time,noads,topic,cid FROM channels",1); joinChan = 2; - + if (mysql_num_rows(res) > 0) { for (i = 0;i < mysql_num_rows(res);i++) { @@ -82,15 +83,15 @@ if (tmpChan == 0x0) return(-1); - + sWriteSocket("JOIN %s",row[0]); sleep(2); - + pthread_mutex_lock(&chanMutex); - + /* Op Myself */ sWriteSocket("MSG %s:.tv MODE +O TUveBOT",row[0]); - + /* Set Access Level */ tmpVal = atoi(row[1]); if (tmpVal > 0) @@ -98,7 +99,7 @@ else sWriteSocket("MSG %s:.tv mode -A",row[0]); tmpChan->modes[CHAN_RATING] = tmpVal; - + /* Set Classification */ tmpVal = atoi(row[2]); if (tmpVal > 0) @@ -106,7 +107,7 @@ else sWriteSocket("MSG %s:.tv mode -C",row[0]); tmpChan->modes[CHAN_CLASS] = tmpVal; - + /* Set Random */ tmpVal = atoi(row[3]); if (tmpVal == 1) @@ -114,7 +115,7 @@ else sWriteSocket("MSG %s:.tv mode -R",row[0]); tmpChan->modes[CHAN_RANDOM] = tmpVal; - + /* Set Queue */ tmpVal = atoi(row[4]); if (tmpVal == 1) @@ -122,7 +123,7 @@ else sWriteSocket("MSG %s:.tv mode -Q",row[0]); tmpChan->modes[CHAN_QUEUE] = tmpVal; - + /* Set Exclusive */ tmpVal = atoi(row[5]); if (tmpVal == 1) @@ -130,7 +131,7 @@ else sWriteSocket("MSG %s:.tv mode -E",row[0]); tmpChan->modes[CHAN_EXCLUSIVE] = tmpVal; - + /* Set Time */ tmpVal = atoi(row[6]); if (tmpVal > 0) @@ -138,7 +139,7 @@ else sWriteSocket("MSG %s:.tv mode -T",row[0]); tmpChan->modes[CHAN_TIME] = tmpVal; - + /* Set NoAds */ tmpVal = atoi(row[7]); if (tmpVal == 1) @@ -147,7 +148,7 @@ sWriteSocket("MSG %s:.tv mode -X",row[0]); tmpChan->modes[CHAN_NOADS] = tmpVal; - if (row[8] != 0x0) { + if (row[8] != 0x0) { sWriteSocket("TOPIC %s:%s",row[0],row[8]); strcpy(tmpChan->topic,row[8]); } @@ -165,7 +166,7 @@ if (res2) mysql_free_result(res2); - + tmpChan->updated = 1; pthread_mutex_unlock(&chanMutex); } @@ -182,19 +183,19 @@ char *md_tok = 0x0; int tmpVal = 0x0; char qryStr[512]; - + chan = strtok_r(data,":",&md_tok); - + tmpChan = botFindChan(chan); - + if (tmpChan == 0x0) return(-1); - + if (tmpChan->updated == 0x0) return(0x0); - + mode = strtok_r(NULL,":",&md_tok); - + switch (mode[0]) { case 'A': tmpVal = atoi(strtok_r(NULL,"\n",&md_tok)); @@ -304,7 +305,7 @@ sprintf(qStr,"UPDATE channels SET topic = \"%s\" WHERE channel = '%s'",topic,chan); dbQuery(qStr,0); - return(0x0); + return(0x0); } int botDoLogin(char *cmdData) { @@ -315,13 +316,13 @@ MYSQL_RES *res = 0x0; MYSQL_ROW row; unsigned int i = 0x0; - + nick = strtok_r(cmdData,":",&str_tok); ident = strtok_r(NULL,"\n",&str_tok); - + sprintf(qryStr,"SELECT channel FROM active a INNER JOIN channels c ON a.uid = c.oid WHERE a.userid = %s",ident); res = dbQuery(qryStr,1); - + for (i = 0x0;i < mysql_num_rows(res);i++) { row = mysql_fetch_row(res); sWriteSocket("MSG %s:.tv mode +O %s",row[0],nick); @@ -340,14 +341,14 @@ char *str_tok = 0x0; char qryStr[256]; MYSQL_RES *res = 0x0; - + if (cmdData == 0x0) return(-1); - + chan = strtok_r(cmdData,":",&str_tok); nick = strtok_r(NULL,":",&str_tok); ident = strtok_r(NULL,":",&str_tok); - + while (ident != 0x0) { sprintf(qryStr,"SELECT cid FROM active a INNER JOIN channels c ON a.uid = c.oid WHERE userid = %s AND channel like '%s'",ident,chan); res = dbQuery(qryStr,1); @@ -362,17 +363,3 @@ return(0x0); } -int botDoEmote(char cmdData) { -/* - char *nick = 0x0; - char *where = 0x0; - char *msg = 0x0; - - if (cmdData != 0x0) { - nick = strtok(cmdData,":"); - where = strtok(NULL,":"); - msg = strtok(NULL,"\n"); - } -*/ - return(0x0); - } diff --git a/main.c b/main.c index 698c775..b5db13a 100644 --- a/main.c +++ b/main.c @@ -67,17 +67,17 @@ exit(1); writeLog(0,"TUve Bridge Starting: %i\n",startTime); - + dbInit(); srandom(time(NULL)); - + pthread_t threads[NUM_THREADS]; - pthread_create(&threads[t], NULL, botCMD_Thread, (void *)t); + pthread_create(&threads[t], NULL, bridgeTUve_Thread, (void *)t); t = 1; - pthread_create(&threads[t], NULL, botSCHD_Thread, (void *)t); - + pthread_create(&threads[t], NULL, bridgeIRC_Thread, (void *)t); + pthread_mutex_init(&chanMutex, NULL); if (sConnect(1,TUVE_SERVER_HOST,TUVE_SERVER_PORT)) @@ -88,10 +88,10 @@ while (1) { - + /* Build our readSet */ sGetConnections(&readSet); - + readSocks = select(highSock+1,&readSet,0x0,0x0,&timeout); if (readSocks < 0) { @@ -99,22 +99,31 @@ exit(0x1); } - if (FD_ISSET(mySocket,&readSet) != 0x0) { + if (FD_ISSET(tuveSocket,&readSet) != 0x0) { memset(&data,0x0,1024); if (sReadSocket(&data,1024) == -1) { - writeLog(0,"Socket Died!\n"); - sConnect(SERVER_HOST,SERVER_PORT); - //exit(1); + writeLog(0,"TUve Socket Died!\n"); + sConnect(1,TUVE_SERVER_HOST,TUVE_SERVER_PORT); } - else { - botProcessData(data); + else { + bridgeProcessData(1,data); } } - + if (FD_ISSET(ircSocket,&readSet) != 0x0) { + memset(&data,0x0,1024); + if (sReadSocket(&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); } @@ -134,7 +143,7 @@ va_start(ap, fmt); ret = vfprintf(logFile, fmt, ap); va_end(ap); - + return(ret); } @@ -153,7 +162,7 @@ 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++) { @@ -163,29 +172,29 @@ return(0x0); } -int botProcessData(char *dataFresh) { +int tuveProcessData(int type,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); + cmdData = strtok_r(NULL,"\n",&str_tok); str_tok = 0x0; writeLog(3,"DATA: (%s)CMD: [%s], Data: [%s]\n",data,cmd,cmdData); } @@ -224,6 +233,6 @@ data = 0x0; goto Head; } - + return(0x0); } diff --git a/socket.c b/socket.c index 0c12599..085ed5d 100644 --- a/socket.c +++ b/socket.c @@ -1,6 +1,6 @@ /* - tuvebot - Socket Code - (C) 2007 Christopher Olsen + TUve Bridge - Socket Code + (C) 2009 Christopher Olsen $Id$ */ @@ -14,21 +14,25 @@ #include #include -#include "tuvebot.h" +#include "tuvebride.h" -int mySocket = 0x0; -int connected = 0x0; +int tuveSocket = 0x0; //Socket for TUve Connection +int ircSocket = 0x0; //Socket for IRC Connection int sConnect(int net,const char *host,int port) { struct sockaddr_in rmAddr; // remote address information struct hostent *hp; int att; - - connected = 0; + int mySocket; + + if (type == 1) + if (tuveSocket != 0) + close(tuveSocket); + else + if (ircSocket != 0) + close(ircSocket); for (att = 1;att < 10;att++) { - if (mySocket != 0x0) - close(mySocket); if ((mySocket = socket(PF_INET, SOCK_STREAM, 0)) == -1) { perror("socket"); @@ -38,10 +42,10 @@ writeLog(0,"Connecting to: %s, port %i, socket %i, attempt: %i\n",host,port,mySocket,att); hp = gethostbyname(host); - + bzero(&rmAddr,sizeof(struct sockaddr_in)); - //memcpy(&(rmAddr.sin_addr.s_addr),*(hp->h_addr_list),sizeof(struct in_addr)); + //memcpy(&(rmAddr.sin_addr.s_addr),*(hp->h_addr_list),sizeof(struct in_addr)); bcopy((char *)hp->h_addr,(char *)&rmAddr.sin_addr.s_addr,hp->h_length); rmAddr.sin_family = AF_INET; // host byte order @@ -55,9 +59,14 @@ sleep(5); } - writeLog(2,"my Socket: [%i]\n",mySocket); - - sWriteSocket("IDENT TUveBOT:1234567\n"); + if (type == 1) { + writeLog(2,"TUve Socket: [%i]\n",mySocket); + tuveSocket = mySocket; + } + else { + writeLog(2,"IRC Socket: [%i]\n",mySocket); + ircSocket = mySocket; + } return(0x0); } @@ -80,7 +89,7 @@ va_start(ap,fmt); len = vsnprintf(data,1023,fmt,ap); va_end(ap); - + data[len++] = '\n'; send(mySocket,data,len,MSG_NOSIGNAL); diff --git a/thread.c b/thread.c deleted file mode 100644 index ee6b20b..0000000 --- a/thread.c +++ /dev/null @@ -1,207 +0,0 @@ -/* - (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() */ diff --git a/tuvebridge.h b/tuvebridge.h index f610934..a4d4615 100644 --- a/tuvebridge.h +++ b/tuvebridge.h @@ -1,5 +1,5 @@ /* - (c) 2007 Christopher Olsen + (c) 2009 Christopher Olsen $Id$ */ @@ -17,7 +17,7 @@ #define TUVE_SERVER_HOST "127.0.0.1" //"Ivorytower.UbixOnline.com" #define TUVE_SERVER_PORT 9999 #define IRC_SERVER_HOST "us.undernet.org" -#define IRC_SERVER_PORT 6667 +#define IRC_SERVER_PORT 6667 #define NUM_THREADS 2 #define MYPORT 9999 // the port users will be connecting to @@ -84,8 +84,12 @@ extern time_t startTime; extern int joinChan; +/* Threads */ +void *bridgeTUve_Thread(void *threadid); //Main Thread For TUve Network +void *bridgeIRC_Thread(void *threadid); //Main Thread For IRC Network + /* Socket Functions */ -int sConnect(const char *host,int port); +int sConnect(int net,const char *host,int port); ssize_t sReadSocket(void *buffer,size_t length); int sGetConnections(fd_set *readset); int sWriteSocket(char const * __restrict fmt, ...); @@ -120,11 +124,10 @@ int dbInit(); MYSQL_RES *dbQuery(const char *query,short type); -/* Bot Functions */ +/* Bridge Functions */ + int botJoinChans(); int botStoreTopic(char *data); -void *botCMD_Thread(void *threadid); -void *botSCHD_Thread(void *threadid); botChanList_t *botFindChan(char *channel); botChanList_t *botAddChan(char *channel); int botDoLogin(char *cmdData);