/*
TUve Bridge Bot
(C) 2009 Christopher Olsen
$Id$
*/
#include <stdio.h>
#include <stdarg.h>
#include <sys/select.h>
#include <time.h>
#include "tuvebridge.h"
FILE *logFile = 0x0;
int logLevel = 1;
int highSock = 0x0;
int joinChan = 0x0;
time_t startTime;
int onIRC = 0;
void usage();
int bridgeProcessData(int net,char *data);
int main(int argc,char **argv) {
int ch;
int doFork = 0x1;
int readSocks = 0x0;
fd_set readSet;
char data[1024];
struct timeval timeout = {30,0};
/* Get our start time */
startTime = time(NULL);
while ((ch = getopt(argc,argv,"sl:nd:")) != -1) {
switch (ch) {
case 's':
logFile = stdout;
break;
case 'l':
logFile = fopen(optarg,"a");
break;
case 'n':
doFork = 0;
break;
case 'd':
logLevel = atoi(optarg);
if (logLevel < 1)
logLevel = 1;
break;
default:
usage();
}
}
argc -= optind;
argv += optind;
/* Prepare log file */
if (logFile == 0x0)
logFile = fopen(LOG_FILE,"a");
/* Fork into background unless specified not to do so */
if (doFork == 1)
if (fork() != 0x0)
exit(1);
writeLog(0,"TUve Bridge Starting: %i\n",startTime);
dbInit();
srandom(time(NULL));
if (sConnect(1,TUVE_SERVER_HOST,TUVE_SERVER_PORT))
writeLog(0,"TUve Bridge Unable To Connect To TUve Network");
if (sConnect(2,IRC_SERVER_HOST,IRC_SERVER_PORT))
writeLog(0,"TUve Bridge Unable To Connect To IRC Network");
while (1) {
/* Build our readSet */
sGetConnections(&readSet);
readSocks = select(highSock+1,&readSet,0x0,0x0,&timeout);
if (readSocks < 0) {
perror("select failed");
exit(0x1);
}
if (FD_ISSET(tuveSocket,&readSet) != 0x0) {
memset(&data,0x0,1024);
if (sReadSocket(tuveSocket,&data,1024) == -1) {
writeLog(0,"TUve Socket Died!\n");
sConnect(1,TUVE_SERVER_HOST,TUVE_SERVER_PORT);
}
else {
bridgeProcessData(1,data);
}
}
if (FD_ISSET(ircSocket,&readSet) != 0x0) {
memset(&data,0x0,1024);
if (sReadSocket(ircSocket,&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);
}
void usage() {
printf("%s\n","usage: tuved -n -s [-l logfile] [-d debuglevel]");
exit(1);
}
int writeLog(int level,char const * __restrict fmt, ...) {
int ret;
va_list ap;
if (level > logLevel)
return(0x0);
va_start(ap, fmt);
ret = vfprintf(logFile, fmt, ap);
va_end(ap);
return(ret);
}
int bridgeProcessData(int net,char *dataFresh) {
char *data_tok = 0x0;
char *cmd = 0x0;
char *nick = 0x0;
char *chunk = 0x0;
char *chunk_tok = 0x0;
char IRCnick[32];
int i = 0x0;
printf("[%s]\n",dataFresh);
if (net == 1) {
writeLog(0,"TUve Network\n");
if (strstr(dataFresh,"PING "))
sWriteSocket(tuveSocket,"PONG 1234\n");
cmd = strtok_r(dataFresh,":",&data_tok);
if (!strcmp(cmd,"IDENT"))
sWriteSocket(tuveSocket,"JOIN #TUvé\n");
if (!strcmp(cmd,"MSG") && (onIRC == 1)) {
nick = strtok_r(NULL,":",&data_tok);
strtok_r(NULL,":",&data_tok);
if (strcmp(nick,"TUveD"))
sWriteSocket(ircSocket,"PRIVMSG #UbixOS :<%s> %s\n",nick,strtok_r(NULL,"\n",&data_tok));
}
}
else {
writeLog(0,"IRC Network\n");
for (chunk = strtok_r(dataFresh,"\n",&chunk_tok);chunk;chunk = strtok_r(NULL,"\n",&chunk_tok)) {
cmd = strtok_r(chunk," ",&data_tok);
printf("CMD1: [%s]\n",cmd);
if (cmd[0] == ':') {
if (strstr(cmd,"!")) {
for (i=1;cmd[i] != '!';i++)
IRCnick[i-1] = cmd[i];
IRCnick[i] = '\0';
}
printf("IRC NICK: [%s]\n",IRCnick);
cmd = strtok_r(NULL," ",&data_tok);
}
printf("CMD2: [%s]\n",cmd);
if (!strcmp(cmd,"PING"))
sWriteSocket(ircSocket,"PONG %s\n",strtok_r(NULL,"\n",&data_tok));
else if (!strcmp(cmd,"376")) {
sWriteSocket(ircSocket,"JOIN #UbixOS\n");
sWriteSocket(ircSocket,"PRIVMSG #UbixOS :Welcome\n");
onIRC = 1;
}
else if (!strcmp(cmd,"PRIVMSG")) {
strtok_r(NULL," ",&data_tok);
nick = strtok_r(NULL,"\n",&data_tok);
nick[0] = ' ';
sWriteSocket(tuveSocket,"MSG #TUvé:%s>%s\n",IRCnick,nick);
}
}
}
return(0x0);
}