]> jfr.im git - irc/quakenet/newserv.git/blobdiff - nick/nick.c
Remove custom allocators from nick/patricia.
[irc/quakenet/newserv.git] / nick / nick.c
index 3b9dead2bb69ae4e3cae2bd34edc4588792a2ac7..e4bb3345f39881aaf904e83ed640578ca2643097 100644 (file)
@@ -35,6 +35,7 @@ const flag umodeflags[] = {
    { 'R', UMODE_REGPRIV },
    { 'I', UMODE_HIDEIDLE },
    { 'P', UMODE_PARANOID },
+   { 'C', UMODE_CLOAKED },
    { '\0', 0 } };
 
 const flag accountflags[] = {
@@ -65,7 +66,6 @@ void _init() {
     for (anp=authnametable[i];anp;anp=anp->next)
       anp->nicks=NULL;  
 
-  initnickalloc();
   initnickhelpers();
   memset(nicktable,0,sizeof(nicktable));
   memset(servernicks,0,sizeof(servernicks));
@@ -87,11 +87,11 @@ void _init() {
   registerserverhandler("D",&handlekillmsg,2);
   registerserverhandler("Q",&handlequitmsg,1);
   registerserverhandler("M",&handleusermodemsg,3);
-  registerserverhandler("W",&handlewhoismsg,2);
   registerserverhandler("AC",&handleaccountmsg,4);
-  registerserverhandler("R",&handlestatsmsg,2);
   registerserverhandler("P",&handleprivmsg,2);
   registerserverhandler("A",&handleawaymsg,1);
+  registerserverhandler("CA",&handleaddcloak,1);
+  registerserverhandler("CU",&handleclearcloak,0);
   
   /* Fake the addition of our own server */
   handleserverchange(HOOK_SERVER_NEWSERVER,(void *)numerictolong(mynumeric->content,2));
@@ -125,11 +125,11 @@ void _fini() {
   deregisterserverhandler("D",&handlekillmsg);
   deregisterserverhandler("Q",&handlequitmsg);
   deregisterserverhandler("M",&handleusermodemsg);
-  deregisterserverhandler("W",&handlewhoismsg);
-  deregisterserverhandler("AC",&handleaccountmsg);
-  deregisterserverhandler("R",&handlestatsmsg);  
+  deregisterserverhandler("AC",&handleaccountmsg); 
   deregisterserverhandler("P",&handleprivmsg);
   deregisterserverhandler("A",&handleawaymsg);
+  deregisterserverhandler("CA",&handleaddcloak);
+  deregisterserverhandler("CU",&handleclearcloak);
 }
 
 /*
@@ -219,6 +219,10 @@ void deletenick(nick *np) {
   
   /* TODO: figure out how to cleanly remove nodes without affecting other modules */
 
+  /* Remove cloak entries for the user */
+  removecloaktarget(np);
+  clearcloaktargets(np);
+
   /* Delete the nick from the servernick table */  
   *(gethandlebynumericunsafe(np->numeric))=NULL;
   
@@ -429,3 +433,39 @@ nick *getnickbynumericstr(char *numericstr) {
 
 #endif
 
+int canseeuser(nick *np, nick *cloaked)
+{
+  return (np == cloaked ||
+          !IsCloaked(cloaked) ||
+          np->cloak_extra == cloaked);
+}
+
+void addcloaktarget(nick *cloaked, nick *target)
+{
+  removecloaktarget(target);
+
+  target->cloak_extra = cloaked;
+  cloaked->cloak_count++;
+}
+
+void removecloaktarget(nick *target)
+{
+  if (target->cloak_extra) {
+    target->cloak_extra->cloak_count--;
+    target->cloak_extra = NULL;
+  }
+}
+
+void clearcloaktargets(nick *cloaked)
+{
+  nick *tnp;
+  int j;
+
+  for(j=0;j<NICKHASHSIZE;j++)
+    for(tnp=nicktable[j];tnp;tnp=tnp->next)
+      if (tnp->cloak_extra == cloaked)
+        tnp->cloak_extra = NULL;
+
+  cloaked->cloak_count = 0;
+}
+