/*
(c) 2007 Christopher Olsen
$Id$
*/
#include <sys/types.h>
#include <sys/socket.h>
#include <stdio.h>
#include <time.h>
#include <assert.h>
#include "tuved.h"
int podzGetData(myConnections_t *userConnection) {
writeLog(2,"Getting Data\n");
memset(&userConnection->data,0x0,1024);
userConnection->recLen = sReadSocket(userConnection->fd,&userConnection->data,1024);
if (userConnection->recLen == 0)
return(-1);
userConnection->userInfo.pong = time(NULL);
podzProcessData(userConnection);
return(0x0);
}
int podzSendAll(char *output,int fd) {
myConnections_t *tmpConnection = 0x0;
for (tmpConnection = connections;tmpConnection != 0x0;tmpConnection = tmpConnection->next) {
if (tmpConnection->fd != fd)
sSendData(tmpConnection,output);
}
return(0x0);
}
int podzProcessData(myConnections_t *userConnection) {
char *chan = 0x0;
char *nick = 0x0;
char *cmd = 0x0;
char *msg = 0x0;
char *data = 0x0;
char *title = 0x0;
char *tok_last = 0x0;
char output[1024];
char buffer[1024];
memset(&output,0x0,1024);
memset(&buffer,0x0,1024);
assert(userConnection);
cmd = userConnection->data;
if (cmd[userConnection->recLen - 1] == '\n')
cmd[userConnection->recLen - 1] = '\0';
if (cmd[userConnection->recLen - 2] == 13)
cmd[userConnection->recLen - 2] = '\0';
writeLog(3,"DATA: (%s)[%s]\n",userConnection->userInfo.username,cmd);
if (strstr(userConnection->data," ")) {
cmd = strtok_r(userConnection->data," ",&tok_last);
data = strtok_r(NULL,"\n",&tok_last);
tok_last = 0x0;
}
if (!strcasecmp(cmd,"IDENT")) {
writeLog(2,"(ident)\n");
if (data != 0x0) {
if (tuveVerifyNick(data) == 0) {
sprintf(userConnection->userInfo.username,data); //strtok_r(data,":",&tok_last));
userConnection->userInfo.uid = time(NULL); //atoi(strtok_r(NULL,"\n",&tok_last));
userConnection->userInfo.ident = 0x1;
}
else
sSendData(userConnection,"IDENT:Nick In Use.\n");
}
else {
sSendData(userConnection,"IDENT:Invalid Ident.\n");
}
}
else if (!strcasecmp(cmd,"JOIN")) {
/* Function Checked Tested And Approved */
if (data == 0x0) {
sSendData(userConnection,"JOIN:ERROR:Invalid Channel Information\n");
}
else if (!strstr(data,"#"))
sSendData(userConnection,"JOIN:ERROR:Invalid channel.\n");
else
tuveChanJoin(data,userConnection);
}
else if (strcasecmp(cmd,"<policy-file-request/>") == 0x0) {
/* Command Checked Tested And Approved */
sprintf(output,"<?xml version=\"1.0\"?>\n<cross-domain-policy>\n<allow-access-from domain=\"*\" to-ports=\"*\" />\n</cross-domain-policy>\n");
send(userConnection->fd,output,strlen(output)+1,MSG_NOSIGNAL);
writeLog(1,"Sent CROSSDOMAIN\n");
}
else if (userConnection->userInfo.ident != 0x1) {
/* Command Checked Tested And Approved */
sSendData(userConnection,"Please Auth");
}
else if (strcasecmp(cmd,"PONG!") == 0x0) {
/* Command Checked Test And Approved */
userConnection->userInfo.pfailed = 0x0;
}
else if (strcasecmp(cmd,"chanmsg") == 0x0) {
chan = strtok_r(data,":",&tok_last);
msg = strtok_r(NULL,"\n",&tok_last);
if (msg[0] == '.' && msg[1] == 't' && msg[2] == 'v')
tuveBotCMD(userConnection,chan,msg+3);
else
sprintf(output,"CHANMSG:%s:%s:%s\n",userConnection->userInfo.username,chan,msg);
tuveSendAllInChan(chan,userConnection,output);
}
else if (strcasecmp(cmd,"topic") == 0x0) {
msg = strtok_r(data,":",&tok_last);
tuveSetTopic(userConnection,msg,strtok_r(NULL,"\n",&tok_last));
}
else if (strcasecmp(cmd,"NICK") == 0x0) {
if (data != 0x0) {
if (tuveVerifyNick(data) == 0x0) {
sprintf(output,"NICK:%s:%s\n",userConnection->userInfo.username,data);
sprintf(userConnection->userInfo.username,data);
tuveSendAllInUsersChans(userConnection,output);
}
else
sSendData(userConnection,"Nick In Use\n");
}
else {
sSendData(userConnection,"Invalid Nick\n");
}
}
else if (strcasecmp(cmd,"KICK") == 0x0) {
tok_last = 0x0;
if (data == 0x0)
sSendData(userConnection,"KICK:Invalid Information\n");
else {
chan = strtok_r(data,":",&tok_last);
nick = strtok_r(NULL,":",&tok_last);
msg = strtok_r(NULL,"\n",&tok_last);
if ((chan != 0x0) && (nick != 0x0) && (msg != 0x0))
if (msg[0] != '\n')
tuveKick(userConnection->userInfo.username,chan,nick,msg);
else
tuveKick(userConnection->userInfo.username,chan,nick,"I'm Too Lame To Give A Good Reason!");
else
sSendData(userConnection,"KICK:Invalid Information.\n");
}
}
else if (strcasecmp(cmd,"GETPOS") == 0x0) {
sprintf(output,"GETPOS\n");
if (data != 0x0)
tuveSendAllInChan(data,userConnection,output);
}
else if (strcasecmp(cmd,"NEXTSONG") == 0x0) {
tok_last = 0x0;
chan = strtok_r(data,":",&tok_last);
msg = strtok_r(NULL,":",&tok_last);
nick = strtok_r(NULL,":",&tok_last);
title = strtok_r(NULL,"\n",&tok_last);
tuveBotSetSong(chan,msg,nick,title);
}
else if (strcasecmp(cmd,"NOSONG") == 0x0) {
tuveBotNoSong(data);
}
else if (strcasecmp(cmd,"PART") == 0x0) {
if (tuveChanPart(data,userConnection) == 0x1) {
writeLog(0,"ERROR: Unable to remove user from channel: %s list\n",data);
sSendData(userConnection,"PART:Not In Chan\n");
}
}
else {
sSendData(userConnection,"invalid command\n");
writeLog(1,"Invalid CMD: [%s]\n",cmd);
}
return(0x0);
}