]> jfr.im git - irc/quakenet/newserv.git/blobdiff - nick/nick.c
Merge pull request #1 from meeb/meeb
[irc/quakenet/newserv.git] / nick / nick.c
index 8faeae86b280dea009979930dfb3837fbdab7c93..f04f1df1a2597487bd3f5e1508b3f8b5330965ee 100644 (file)
@@ -12,6 +12,7 @@
 #include "../server/server.h"
 #include "../parser/parser.h"
 #include "../lib/version.h"
+#include "../lib/ccassert.h"
 #include "../core/nsmalloc.h"
 
 #include <stdlib.h>
@@ -20,6 +21,8 @@
 
 MODULE_VERSION("");
 
+CCASSERT(sizeof(host) == sizeof(realname));
+
 const flag umodeflags[] = {
    { 'i', UMODE_INV },
    { 'w', UMODE_WALLOPS },
@@ -35,6 +38,8 @@ const flag umodeflags[] = {
    { 'R', UMODE_REGPRIV },
    { 'I', UMODE_HIDEIDLE },
    { 'P', UMODE_PARANOID },
+   { 'q', UMODE_COMCHANS },
+   { 'Q', UMODE_COMCHANSRESTR },
    { 'C', UMODE_CLOAKED },
    { '\0', 0 } };
 
@@ -46,7 +51,7 @@ const flag accountflags[] = {
    { 'd', AFLAG_DEVELOPER },
    { '\0', 0 } };
 
-#define nickhash(x)       ((crc32i(x))%NICKHASHSIZE)
+#define nickhash(x)       ((irc_crc32i(x))%NICKHASHSIZE)
 
 nick *nicktable[NICKHASHSIZE];
 nick **servernicks[MAXSERVERS];
@@ -66,7 +71,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));
@@ -75,7 +79,7 @@ void _init() {
    * 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();
+    irc_send("%s SQ %s 0 :Resync [adding nick support]",mynumeric->content,myserver->content); irc_disconnected(0);
   }
   
   /* Register our hooks */
@@ -171,6 +175,9 @@ void handleserverchange(int hooknum, void *arg) {
 void deletenick(nick *np) {
   nick **nh;
 
+  /* Fire a pre-lostnick trigger to allow hooks to check the channels etc. of a lost nick */
+  triggerhook(HOOK_NICK_PRE_LOSTNICK, np);
+
   /* Fire the hook.  This will deal with removal from channels etc. */
   triggerhook(HOOK_NICK_LOSTNICK, np);
   
@@ -214,6 +221,7 @@ void deletenick(nick *np) {
   freesstring(np->shident); /* freesstring(NULL) is OK */
   freesstring(np->sethost); 
   freesstring(np->opername); 
+  freesstring(np->message);
 
   node_decrement_usercount(np->ipnode);
   derefnode(iptree, np->ipnode);
@@ -463,6 +471,9 @@ void clearcloaktargets(nick *cloaked)
   nick *tnp;
   int j;
 
+  if (cloaked->cloak_count == 0)
+    return;
+
   for(j=0;j<NICKHASHSIZE;j++)
     for(tnp=nicktable[j];tnp;tnp=tnp->next)
       if (tnp->cloak_extra == cloaked)