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);