X-Git-Url: https://jfr.im/git/irc/quakenet/newserv.git/blobdiff_plain/94dc99103bf36c2bc71b6e40d8d58e6f7ba1f489..80e32fcd996025093c28b304d91d376b72c1496e:/localuser/localuser.c diff --git a/localuser/localuser.c b/localuser/localuser.c index e46f09a6..9e056b95 100644 --- a/localuser/localuser.c +++ b/localuser/localuser.c @@ -108,12 +108,15 @@ nick *registerlocaluserflags(char *nickname, char *ident, char *host, char *real ((unsigned char *)(ipaddress.in6_16))[14] = 1; ((unsigned char *)(ipaddress.in6_16))[15] = (currentlocalunum%253)+1; + memcpy(&newuser->ipaddress, &ipaddress, sizeof(ipaddress)); + newuser->ipnode = refnode(iptree, &ipaddress, PATRICIA_MAXBITS); node_increment_usercount(newuser->ipnode); newuser->timestamp=getnettime(); newuser->shident=NULL; newuser->sethost=NULL; + newuser->away=NULL; newuser->marker=0; memset(newuser->exts, 0, MAXNICKEXTS * sizeof(void *)); @@ -147,6 +150,9 @@ nick *registerlocaluserflags(char *nickname, char *ident, char *host, char *real } } + newuser->cloak_count = 0; + newuser->cloak_extra = NULL; + if (connected) { /* Check for nick collision */ if ((np=getnickbynick(nickname))!=NULL) { @@ -177,7 +183,9 @@ int renamelocaluser(nick *np, char *newnick) { nick *np2; char ipbuf[25]; time_t timestamp=getnettime(); - + void *harg[2]; + char oldnick[NICKLEN+1]; + if (!np) return -1; @@ -187,13 +195,18 @@ int renamelocaluser(nick *np, char *newnick) { if (homeserver(np->numeric)!=mylongnum) return -1; + strncpy(oldnick,np->nick,NICKLEN); + oldnick[NICKLEN]='\0'; + harg[0]=(void *)np; + harg[1]=(void *)oldnick; + if ((np2=getnickbynick(newnick))) { if (np2==np) { /* Case only name change */ strncpy(np->nick,newnick,NICKLEN); np->nick[NICKLEN]='\0'; - irc_send("%s N %s %jd",iptobase64(ipbuf, &(np->p_ipaddr), sizeof(ipbuf), 1),np->nick,(intmax_t)np->timestamp); - triggerhook(HOOK_NICK_RENAME,np); + irc_send("%s N %s %jd",iptobase64(ipbuf, &(np->ipaddress), sizeof(ipbuf), 1),np->nick,(intmax_t)np->timestamp); + triggerhook(HOOK_NICK_RENAME,harg); return 0; } else { /* Kill other user and drop through */ @@ -208,7 +221,7 @@ int renamelocaluser(nick *np, char *newnick) { np->nick[NICKLEN]='\0'; addnicktohash(np); irc_send("%s N %s %jd",longtonumeric(np->numeric,5),np->nick,(intmax_t)np->timestamp); - triggerhook(HOOK_NICK_RENAME,np); + triggerhook(HOOK_NICK_RENAME,harg); return 0; } @@ -299,7 +312,7 @@ void sendnickmsg(nick *np) { irc_send("%s N %s 1 %ld %s %s %s%s%s %s %s :%s", mynumeric->content,np->nick,np->timestamp,np->ident,np->host->name->content, - printflags(np->umodes,umodeflags),operbuf,accountbuf,iptobase64(ipbuf,&(np->p_ipaddr), + printflags(np->umodes,umodeflags),operbuf,accountbuf,iptobase64(ipbuf,&(np->ipaddress), sizeof(ipbuf),1),numericbuf,np->realname->name->content); } @@ -351,7 +364,7 @@ int handlemessageornotice(void *source, int cargc, char **cargv, int isnotice) { char *ch; char targetnick[NICKLEN+1]; int foundat; - void *nargs[2]; + void *nargs[3]; int i; /* Should have target and message */ @@ -359,15 +372,23 @@ int handlemessageornotice(void *source, int cargc, char **cargv, int isnotice) { return CMD_OK; } - if (cargv[0][0]=='#' || cargv[0][0]=='+') { - /* Channel message/notice */ - return CMD_OK; - } - if ((sender=getnickbynumericstr((char *)source))==NULL) { Error("localuser",ERR_WARNING,"PRIVMSG from non existant user %s",(char *)source); return CMD_OK; } + + freesstring(sender->message); + sender->message = getsstring(cargv[1], 512); + + nargs[0] = sender; + nargs[1] = cargv[1]; + nargs[2] = (void *)(uintptr_t)isnotice; + triggerhook(HOOK_NICK_MESSAGE, nargs); + + if (cargv[0][0]=='#' || cargv[0][0]=='+') { + /* Channel message/notice */ + return CMD_OK; + } /* Check for a "secure" message (foo@bar) */ foundat=0; @@ -513,6 +534,8 @@ void sethostuser(nick *target, char *ident, char *host) { void _killuser(nick *source, nick *target, char *reason) { char senderstr[6]; char sourcestring[HOSTLEN+NICKLEN+3]; + char reasonstr[512]; + void *args[2]; if (!source) { /* If we have a null nick, use the server.. */ @@ -523,7 +546,15 @@ void _killuser(nick *source, nick *target, char *reason) { sprintf(sourcestring,"%s!%s",source->host->name->content, source->nick); } - irc_send("%s D %s :%s (%s)",senderstr,longtonumeric(target->numeric,5),sourcestring,reason); + snprintf(reasonstr,512,"%s (%s)",sourcestring,reason); + reasonstr[511]='\0'; + + irc_send("%s D %s :%s",senderstr,longtonumeric(target->numeric,5),reasonstr); + + args[0]=target; + args[1]=reasonstr; + triggerhook(HOOK_NICK_KILL, args); + deletenick(target); } @@ -625,3 +656,20 @@ void localusersetaccountflags(authname *anp, u_int64_t accountflags) { triggerhook(HOOK_AUTH_FLAGSUPDATED, arg); } + +void localuseraddcloaktarget(nick *np, nick *target) { + char snumeric[10], tnumeric[10]; + + strcpy(snumeric, longtonumeric(np->numeric,5)); + strcpy(tnumeric, longtonumeric(target->numeric,5)); + + irc_send("%s CA %s", snumeric, tnumeric); + + addcloaktarget(np, target); +} + +void localuserclearcloaktargets(nick *np) { + irc_send("%s CU", longtonumeric(np->numeric,5)); + clearcloaktargets(np); +} +