]> jfr.im git - irc/quakenet/newserv.git/commitdiff
nickwatch: Implement hook for user mode changes.
authorGunnar Beutner <redacted>
Tue, 13 Aug 2013 01:02:46 +0000 (03:02 +0200)
committerGunnar Beutner <redacted>
Tue, 13 Aug 2013 01:02:46 +0000 (03:02 +0200)
core/hooks.h
nick/nickhandlers.c
nickwatch/nickwatch.c

index d6bfe68fbe22d7c0c11f1fa8bcb17776c61ed502..de800e3537fba4a559239b094116e2080f5edd46 100644 (file)
@@ -41,6 +41,7 @@
 #define HOOK_NICK_MODEOPER         307  /* Argument is void*[2] (nick, modes) */
 #define HOOK_NICK_KILL             308  /* Argument is void*[2] (nick, reason) */
 #define HOOK_NICK_MASKPRIVMSG      309  /* Argument is void*[3] (nick, target, message) ** NICK COULD BE NULL ** */
+#define HOOK_NICK_MODECHANGE       310  /* Argument is void*[2] (nick *, oldmodes) */
 
 #define HOOK_CHANNEL_BURST         400  /* Argument is channel pointer */
 #define HOOK_CHANNEL_CREATE        401  /* Argument is void*[2] (channel, nick) */
index b704f31ab27b417764be1c9a1ed0cf7ee1e29926..f8835816240111157a55fec7a908bef8ebf855d1 100644 (file)
@@ -283,6 +283,7 @@ int handleusermodemsg(void *source, int cargc, char **cargv) {
   nick *np;
   flag_t oldflags;
   char *fakehost;
+  void *args[2];
   
   if (cargc<2) {
     Error("nick",ERR_WARNING,"Mode message with too few parameters");
@@ -305,6 +306,10 @@ int handleusermodemsg(void *source, int cargc, char **cargv) {
     oldflags=np->umodes;
     setflags(&(np->umodes),UMODE_ALL,cargv[1],umodeflags,REJECT_NONE);
 
+    args[0] = np;
+    args[1] = (void *)oldflags;
+    triggerhook(HOOK_NICK_MODECHANGE, args);
+
     if (strchr(cargv[1],'o')) { /* o always comes on its own when being set */
       if(serverlist[myhub].flags & SMODE_OPERNAME) {
         if((np->umodes & UMODE_OPER)) {
index 0015d0209d9aae9fd98da3e5bf29ea61c5f4ef61..beb9167ab1f7eedd9344ef11703e821921f5b8ea 100644 (file)
@@ -94,6 +94,16 @@ static void nw_hook_rename(int hooknum, void *arg) {
   scheduleoneshot(0, nw_sched_processevent, nwe);
 }
 
+static void nw_hook_umodechange(int hooknum, void *arg) {
+  void **args = arg;
+  nick *np = args[0];
+  flag_t oldmodes = (uintptr_t)args[1];
+  char buf[64];
+  strncpy(buf, printflags(np->umodes, umodeflags), sizeof(buf));
+  nickwatchevent *nwe = nwe_new(np, "umodes %s -> %s", printflags(oldmodes, umodeflags), buf);
+  scheduleoneshot(0, nw_sched_processevent, nwe);
+}
+
 static void nw_hook_joinchannel(int hooknum, void *arg) {
   void **args = arg;
   channel *cp = args[0];
@@ -179,6 +189,7 @@ void _init(void) {
 
   registerhook(HOOK_NICK_NEWNICK, &nw_hook_newnick);
   registerhook(HOOK_NICK_RENAME, &nw_hook_rename);
+  registerhook(HOOK_NICK_MODECHANGE, &nw_hook_umodechange);
   registerhook(HOOK_CHANNEL_CREATE, &nw_hook_joinchannel);
   registerhook(HOOK_CHANNEL_JOIN, &nw_hook_joinchannel);
 }
@@ -192,6 +203,7 @@ void _fini(void) {
 
   deregisterhook(HOOK_NICK_NEWNICK, &nw_hook_newnick);
   deregisterhook(HOOK_NICK_RENAME, &nw_hook_rename);
+  deregisterhook(HOOK_NICK_MODECHANGE, &nw_hook_umodechange);
   deregisterhook(HOOK_CHANNEL_CREATE, &nw_hook_joinchannel);
   deregisterhook(HOOK_CHANNEL_JOIN, &nw_hook_joinchannel);