Newer
Older
tuved / tuve.c
@reddawg reddawg on 22 Oct 2007 4 KB Sync
/*
  (c) 2007 Christopher Olsen
  $Id$
*/
#include <sys/types.h>
#include <sys/socket.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <time.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);

  writeLog(3,"Got: [%i][%s]\n",userConnection->recLen,userConnection->data);

  if (userConnection->recLen == 1) {
    writeLog(2,"[%i][%c]\n",userConnection->data[0],userConnection->data[0]);
    while(1);
    }

  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 *tok_last = 0x0;
  char  output[1024];
  char  buffer[1024];

  memset(&output,0x0,1024);
  memset(&buffer,0x0,1024);

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

  if (strstr(userConnection->data," ")) {
    cmd  = strtok_r(userConnection->data," ",&tok_last);
    data = strtok_r(NULL,"\n",&tok_last); 
    writeLog(2,"DATA[%s:%s]\n",cmd,data);
    tok_last = 0x0;
    }
  else {
    writeLog(2,"DATA[%s]\n",cmd);
    }

  if (!strcasecmp(cmd,"ident")) {
    writeLog(2,"(ident)\n");
    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 if (!strcasecmp(cmd,"join")) {
    tuveChanJoin(data,userConnection);
    }
  else if (strcasecmp(cmd,"<policy-file-request/>") == 0x0) {
    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(2,"Send CROSSDOMAIN\n");
    }
  else if (userConnection->userInfo.ident != 0x1) {
    sSendData(userConnection,"Please Auth");
    }
  else if (strcasecmp(cmd,"PONG!") == 0x0) {
    writeLog(2,"(PONG! :NULL)\n");
    userConnection->userInfo.pfailed = 0x0;
    }
  else if (strcasecmp(cmd,"chanmsg") == 0x0) {
    msg = strtok_r(data,":",&tok_last);
    sprintf(output,"CHANMSG:%s:%s:%s\n",userConnection->userInfo.username,msg,strtok_r(NULL,"\n",&tok_last));
    tuveSendAllInChan(msg,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) {
    sprintf(output,"NICK:%s:%s\n",userConnection->userInfo.username,data);
    sprintf(userConnection->userInfo.username,data);
    tuveSendAllInUsersChans(userConnection,output);
    }
  else if (strcasecmp(cmd,"KICK") == 0x0) {
    tok_last = 0x0;
    chan = strtok_r(data,":",&tok_last);
    nick = strtok_r(NULL,":",&tok_last);
    msg  = strtok_r(NULL,"\n",&tok_last);
    sprintf(output,"CHANMSG:TUveD:%s:%s Has Been Kick By %s, Reason: %s\n",chan,nick,userConnection->userInfo.username,msg);
    tuveSendAllInChan(chan,0x0,output);
    }
  else if (strcasecmp(cmd,"GETPOS") == 0x0) {
    sprintf(output,"GETPOS\n");
    if (data != 0x0)
      tuveSendAllInChan(data,userConnection,output);
    }
  else if (strcasecmp(cmd,"CURPOS") == 0x0) {
    tok_last = 0x0;
    chan = strtok_r(data,":",&tok_last);
    msg = strtok_r(NULL,":",&tok_last);
    nick = strtok_r(NULL,"\n",&tok_last);
    if ((nick != 0x0) && (msg != 0x0)) {
      sprintf(output,"CURPOS:%s:%s:%s\n",chan,msg,nick);
      tuveSendAllInChan(chan,userConnection,output);
      writeLog(1,"%s Has Sent CURPOS\n",userConnection->userInfo.username);
      }
    }
  else {
    sSendData(userConnection,"invalid command\n");
    writeLog(1,"Invalid CMD: [%s]\n",cmd);
    }

  return(0x0);
  }