#include <string.h>
#include <assert.h>
#include <sys/types.h>

#ifdef DMALLOC
#include <dmalloc.h>
#endif

#include "channel.h"
#include "tcltk.h"
#include "messages.h"

void tchan::setmode(char mode, int modetype) {
  if((mode>='a')&&(mode<='z')) modes[mode-97]=modetype;
  if((mode>='A')&&(mode<='Z')) modes[mode-65+26]=modetype;
}

int tchan::getmode(char mode) {
  if((mode>='a')&&(mode<='z')) return modes[mode-97];
  if((mode>='A')&&(mode<='Z')) return modes[mode-65+26];
  return 0;
}

void tchan::clearmodes(void) {
  for(int n=0;n<52;n++) {
    modes[n]=0;
  }
  keyword[0]=0;
  limit=0;
}

int tchan::clearnicklist() {
  nicklist.clear();
  TT_EvalF(TT_ARGS,"%s.nicks delete 0 end",pathname);
  return 0;
}

int tchan::addnicks(char *nicks) {
  tnick *nickp;
  char *position;
  position=strtok(nicks," ");
  while(position) {
    if(!(nickp=new tnick(position))) {
      fprintf(stderr,M_OUT_OF_MEMORY);
      exit(1);
    }
    nicklist.insert_ascending(*nickp);
    delete nickp;
    position=strtok(NULL," ");
  }
  return 0;
}

void tchan::deop(char *nickname) {
  tnick nick(nickname);
  tnick *nickp;
  int n;

  assert(nickp=nicklist.find(nick));

  if(nickp->oped == 0) return;

  tnick newnick(*nickp);
  newnick.setoped(0);

  n=nicklist.deleteitem(nick);
  TT_EvalF(TT_ARGS,"%s.nicks delete %d",pathname,n);
  n=nicklist.insert_ascending(newnick);
  TT_EvalF(TT_ARGS,"%s.nicks insert %d %q",pathname,n,newnick.getentry());
}

void tchan::op(char *nickname) {
  tnick nick(nickname);
  tnick *nickp;
  int n;

  assert(nickp=nicklist.find(nick));

  if(nickp->oped == 1) return;

  tnick newnick(*nickp);
  newnick.setoped(1);

  n=nicklist.deleteitem(nick);
  TT_EvalF(TT_ARGS,"%s.nicks delete %d",pathname,n);
  n=nicklist.insert_ascending(newnick);
  TT_EvalF(TT_ARGS,"%s.nicks insert %d %q",pathname,n,newnick.getentry());
}

void tchan::devoice(char *nickname) {
  tnick nick(nickname);
  tnick *nickp;
  int n;

  assert(nickp=nicklist.find(nick));

  if(nickp->voiced == 0) return;

  tnick newnick(*nickp);
  newnick.setvoiced(0);

  n=nicklist.deleteitem(nick);
  TT_EvalF(TT_ARGS,"%s.nicks delete %d",pathname,n);
  n=nicklist.insert_ascending(newnick);
  TT_EvalF(TT_ARGS,"%s.nicks insert %d %q",pathname,n,newnick.getentry());
}

void tchan::voice(char *nickname) {
  tnick nick(nickname);
  tnick *nickp;
  int n;

  assert(nickp=nicklist.find(nick));

  if(nickp->voiced == 1) return;

  tnick newnick(*nickp);
  newnick.setvoiced(1);

  n=nicklist.deleteitem(nick);
  TT_EvalF(TT_ARGS,"%s.nicks delete %d",pathname,n);
  n=nicklist.insert_ascending(newnick);
  TT_EvalF(TT_ARGS,"%s.nicks insert %d %q",pathname,n,newnick.getentry());
}

int tchan::addnick(char *nickname) {
  tnick nick(nickname);
  int n;
  n=nicklist.insert_ascending(nick);
  TT_EvalF(TT_ARGS,"%s.nicks insert %d %q",pathname,n,nickname);
  return 0;
}

int tchan::changenick(char *nickname, char *newnickname) {
  tnick nick(nickname);
  tnick *nickp;
  int n;

  nickp=nicklist.find(nick);

  tnick newnick(*nickp);
  newnick.changenick(newnickname);

  n=nicklist.deleteitem(nick);
  TT_EvalF(TT_ARGS,"%s.nicks delete %d",pathname,n);
  n=nicklist.insert_ascending(newnick);
  TT_EvalF(TT_ARGS,"%s.nicks insert %d %q",pathname,n,newnick.getentry());
  return 0;
}

int tchan::delnick(char *nickname) {
  int n;
  tnick nick(nickname);
  n=nicklist.deleteitem(nick);
  TT_EvalF(TT_ARGS,"%s.nicks delete %d",pathname,n);
  return 0;
}

int tchan::updatenicklist() {
  tnick *nickp;
  TT_EvalF(TT_ARGS,"%s.nicks delete 0 end",pathname);
  nicklist.init_trav();
  while((nickp=nicklist.trav())) {
    TT_EvalF(TT_ARGS,"%s.nicks insert end %q",pathname,nickp->getentry());
  }
  return 0;
}

int tchan::operator==(tchan &chan) {
  return((strcasecmp(name,chan.name)==0)||(strcasecmp(pathname,chan.pathname)==0));
}

int tchan::operator>=(tchan &chan) {
  return(strcasecmp(name,chan.name)>=0);
}

tchan::tchan(const char *something) {
  int n;
  ison=0;
  numops=0;
  numvoice=0;
  numother=0;
  limit=0;
  topic=0;
  keyword[0]=0;
  for(n=0;n<52;n++) {
    modes[n]=0;
  }
  strcpy(name,something);
}

tchan::tchan() {
  int n;
  ison=0;
  numops=0;
  numvoice=0;
  numother=0;
  limit=0;
  keyword[0]=0;
  topic=0;
  for(n=0;n<52;n++) {
    modes[n]=0;
  }
}

tchan::~tchan() {
  if(topic) free(topic);
}


syntax highlighted by Code2HTML, v. 0.9.1