]> jfr.im git - irc/quakenet/newserv.git/blobdiff - nick/nick.c
NICK: Add "away" functionality.
[irc/quakenet/newserv.git] / nick / nick.c
index e7ecf4e19ed02ba742876e53c2d8a5b9792f5ece..3b9dead2bb69ae4e3cae2bd34edc4588792a2ac7 100644 (file)
@@ -38,7 +38,10 @@ const flag umodeflags[] = {
    { '\0', 0 } };
 
 const flag accountflags[] = {
-   { 's', AFLAG_STAFF },
+   { 'q', AFLAG_STAFF },
+   { 'h', AFLAG_SUPPORT },
+   { 'o', AFLAG_OPER },
+   { 'a', AFLAG_ADMIN },
    { 'd', AFLAG_DEVELOPER },
    { '\0', 0 } };
 
@@ -51,6 +54,8 @@ sstring *nickextnames[MAXNICKEXTS];
 
 void nickstats(int hooknum, void *arg);
 
+char *NULLAUTHNAME = "";
+
 void _init() {
   unsigned int i;
   authname *anp;
@@ -64,6 +69,13 @@ void _init() {
   initnickhelpers();
   memset(nicktable,0,sizeof(nicktable));
   memset(servernicks,0,sizeof(servernicks));
+
+  /* If we're connected to IRC, force a disconnect.  This needs to be done
+   * before we register all our hooks which would otherwise get called
+   * during the disconnect. */
+  if (connected) {
+    irc_send("%s SQ %s 0 :Resync [adding nick support]",mynumeric->content,myserver->content); irc_disconnected();
+  }
   
   /* Register our hooks */
   registerhook(HOOK_SERVER_NEWSERVER,&handleserverchange);
@@ -78,6 +90,8 @@ void _init() {
   registerserverhandler("W",&handlewhoismsg,2);
   registerserverhandler("AC",&handleaccountmsg,4);
   registerserverhandler("R",&handlestatsmsg,2);
+  registerserverhandler("P",&handleprivmsg,2);
+  registerserverhandler("A",&handleawaymsg,1);
   
   /* Fake the addition of our own server */
   handleserverchange(HOOK_SERVER_NEWSERVER,(void *)numerictolong(mynumeric->content,2));
@@ -93,6 +107,9 @@ void _fini() {
     for (np=nicktable[i];np;np=np->next) {
       freesstring(np->shident);
       freesstring(np->sethost);
+      freesstring(np->opername);
+      if(!np->auth && np->authname && (np->authname != NULLAUTHNAME))
+        free(np->authname);
     }
   }
 
@@ -111,6 +128,8 @@ void _fini() {
   deregisterserverhandler("W",&handlewhoismsg);
   deregisterserverhandler("AC",&handleaccountmsg);
   deregisterserverhandler("R",&handlestatsmsg);  
+  deregisterserverhandler("P",&handleprivmsg);
+  deregisterserverhandler("A",&handleawaymsg);
 }
 
 /*
@@ -173,22 +192,27 @@ void deletenick(nick *np) {
   releaserealname(np->realname);
   releasehost(np->host);
   
-  if(IsAccount(np) && np->auth)
-  {
-    np->auth->usercount--;
+  if(IsAccount(np)) {
+    if(!np->auth) {
+      if(np->authname && (np->authname != NULLAUTHNAME))
+        free(np->authname);
+    } else {
+      np->auth->usercount--;
     
-    for (nh=&(np->auth->nicks);*nh;nh=&((*nh)->nextbyauthname)) {
-      if (*nh==np) {
-        *nh=np->nextbyauthname;
-        break;
+      for (nh=&(np->auth->nicks);*nh;nh=&((*nh)->nextbyauthname)) {
+        if (*nh==np) {
+          *nh=np->nextbyauthname;
+          break;
+        }
       }
-    }
     
-    releaseauthname(np->auth);
+      releaseauthname(np->auth);
+    }
   }
   
   freesstring(np->shident); /* freesstring(NULL) is OK */
   freesstring(np->sethost); 
+  freesstring(np->opername); 
 
   node_decrement_usercount(np->ipnode);
   derefnode(iptree, np->ipnode);