#ifndef HEADER_NICK
#define HEADER_NICK

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

#include "support.h"
#include "defines.h"

class tglobalnick {
 private:
    char *name;
  public:
    char *ip;
    char *mask;
    char *ident;
    char *host;
    int o;
    int h;
    int operator==(tglobalnick &nick) {
      return(strcasecmp(name,nick.name)==0);
    }
    int operator>=(tglobalnick &nick) {
      return(strcasecmp(name,nick.name)>=0);
    }

    tglobalnick(tglobalnick &tgn) {
      name = mystrdup(tgn.name);
      ip = tgn.ip;
      mask = tgn.mask;
      ident = tgn.ident;
      host = tgn.host;
      o = tgn.o;
      h = tgn.h;
    }

    tglobalnick(char *nick) {
      name = mystrdup(nick);
    }

    ~tglobalnick() {
      free(name);
    }
};

class tnick {
 private:
    char *name;
    char *entry;

    void updateentry(void) {
      free(entry);
      if(oped || voiced) {
	entry = (char *)mymalloc(strlen(name) + 2);
	strcpy(entry+1, name);
	if(voiced) entry[0] = '+';
	if(oped) entry[0] = '@';
      } else {
	entry = strdup(name);
      }
    }

  public:
    int time;
    int index;
    int voiced;
    int oped;
    tglobalnick *global;

    int operator==(tnick &nick) {
      return(strcasecmp(name,nick.name)==0);
    }

    int operator>=(tnick &nick) {
      int retval;
      if(entry[0]=='@') entry[0]=1;
      if(nick.entry[0]=='@') nick.entry[0]=1;
      if(entry[0]=='+') entry[0]=2;
      if(nick.entry[0]=='+') nick.entry[0]=2;
      retval=(strcasecmp(entry,nick.entry)>=0);
      if(entry[0]==1) entry[0]='@';
      if(nick.entry[0]==1) nick.entry[0]='@';
      if(entry[0]==2) entry[0]='+';
      if(nick.entry[0]==2) nick.entry[0]='+';
      return retval;
    }

    const char *getname(void) {
      return name;
    }

    const char *getentry(void) {
      return entry;
    }

    void changenick(char *newnick) {
      free(name);
      name = strdup(newnick);

      updateentry();
    }

    void setvoiced(int v) {
      if(voiced == v) return;
      voiced = v;
      
      updateentry();
    }

    void setoped(int o) {
      if(oped == o) return;
      oped = o;

      updateentry();
    }

    // Copy constructor
    tnick(const tnick& tn) {
      name = mystrdup(tn.name);
      entry = mystrdup(tn.entry);

      time = tn.time;
      index = tn.index;
      voiced = tn.voiced;
      oped = tn.oped;

      global = tn.global;
    }

    tnick(const char *nick) {
      entry = strdup(nick);
      if(entry[0]=='@') {
        oped=1;
        voiced=0;
        name = mystrdup(entry+1);
      } else if(entry[0]=='+') {
        oped=0;
        voiced=1;
        name = mystrdup(entry+1);
      } else {
        oped=0;
        voiced=0;
        name = mystrdup(entry);
      }
    }

    ~tnick() {
      free(name);
      free(entry);
    }
};

#endif



syntax highlighted by Code2HTML, v. 0.9.1