#include "../server/server.h"
#include "../parser/parser.h"
#include "../lib/version.h"
+#include "../lib/ccassert.h"
#include "../core/nsmalloc.h"
#include <stdlib.h>
MODULE_VERSION("");
+CCASSERT(sizeof(host) == sizeof(realname));
+
const flag umodeflags[] = {
{ 'i', UMODE_INV },
{ 'w', UMODE_WALLOPS },
{ 'R', UMODE_REGPRIV },
{ 'I', UMODE_HIDEIDLE },
{ 'P', UMODE_PARANOID },
+ { 'q', UMODE_COMCHANS },
+ { 'Q', UMODE_COMCHANSRESTR },
+ { 'C', UMODE_CLOAKED },
{ '\0', 0 } };
const flag accountflags[] = {
for (anp=authnametable[i];anp;anp=anp->next)
anp->nicks=NULL;
- initnickalloc();
initnickhelpers();
memset(nicktable,0,sizeof(nicktable));
memset(servernicks,0,sizeof(servernicks));
registerserverhandler("AC",&handleaccountmsg,4);
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));
deregisterserverhandler("AC",&handleaccountmsg);
deregisterserverhandler("P",&handleprivmsg);
deregisterserverhandler("A",&handleawaymsg);
+ deregisterserverhandler("CA",&handleaddcloak);
+ deregisterserverhandler("CU",&handleclearcloak);
}
/*
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);
/* 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;
return buf;
}
-/*
- * setipnodebits:
- * Moves the nick to a different ipnode.
- */
-void setipnodebits(nick *np, int bits) {
- struct irc_in_addr ipaddress;
- patricia_node_t *oldnode;
- void *harg[2];
-
- if(np->ipnode->prefix->bitlen == bits)
- return;
-
- memcpy(&ipaddress, &np->p_nodeaddr, sizeof(ipaddress));
- node_decrement_usercount(np->ipnode);
- oldnode = np->ipnode;
- np->ipnode = refnode(iptree, &ipaddress, bits);
- node_increment_usercount(np->ipnode);
-
- harg[0] = np;
- harg[1] = oldnode;
- triggerhook(HOOK_NICK_MOVENODE, harg);
-
- derefnode(iptree, oldnode);
-}
-
#if 0
/*
#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;
+
+ 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)
+ tnp->cloak_extra = NULL;
+
+ cloaked->cloak_count = 0;
+}
+