#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) */
nick *np;
flag_t oldflags;
char *fakehost;
+ void *args[2];
if (cargc<2) {
Error("nick",ERR_WARNING,"Mode message with too few parameters");
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)) {
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];
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);
}
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);