]> jfr.im git - irc/evilnet/x3.git/blobdiff - src/mod-track.c
Couple of srvx updates.
[irc/evilnet/x3.git] / src / mod-track.c
index 16684910af569fcb3d266691f0861aa9ec235858..d88d143b7e5f50a143bc3c92c348f8bd2cc8963e 100644 (file)
@@ -5,7 +5,7 @@
  *
  * x3 is free software; you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
+ * the Free Software Foundation; either version 3 of the License, or
  * (at your option) any later version.
  *
  * This program is distributed in the hope that it will be useful,
 
 /* set track status */
 #define set_track_nick(x)       ((x).snomask |= TRACK_NICK)
-#define set_track_join(x)       ((x).snomask |= TRACK_JOIN|TRACK_PART)
+#define set_track_join(x)       ((x).snomask |= TRACK_JOIN)
 #define set_track_part(x)       ((x).snomask |= TRACK_PART)
 #define set_track_kick(x)       ((x).snomask |= TRACK_KICK)
-#define set_track_new(x)        ((x).snomask |= TRACK_NEW|TRACK_DEL)
+#define set_track_new(x)        ((x).snomask |= TRACK_NEW)
 #define set_track_del(x)        ((x).snomask |= TRACK_DEL)
 #define set_track_auth(x)       ((x).snomask |= TRACK_AUTH)
 #define set_track_chanmode(x)   ((x).snomask |= TRACK_CHANMODE)
 
 /* clear track status */
 #define clear_track_nick(x)     ((x).snomask &= ~TRACK_NICK)
-#define clear_track_join(x)     ((x).snomask &= ~(TRACK_JOIN|TRACK_PART))
+#define clear_track_join(x)     ((x).snomask &= ~TRACK_JOIN)
 #define clear_track_part(x)     ((x).snomask &= ~TRACK_PART)
 #define clear_track_kick(x)     ((x).snomask &= ~TRACK_KICK)
-#define clear_track_new(x)      ((x).snomask &= ~(TRACK_NEW|TRACK_DEL))
+#define clear_track_new(x)      ((x).snomask &= ~TRACK_NEW)
 #define clear_track_del(x)      ((x).snomask &= ~TRACK_DEL)
 #define clear_track_auth(x)     ((x).snomask &= ~TRACK_AUTH)
 #define clear_track_chanmode(x) ((x).snomask &= ~TRACK_CHANMODE)
@@ -116,13 +116,25 @@ int track_finalize(void);
 #define TRACK(FORMAT, ARGS...) send_channel_message(track_cfg.channel, track_cfg.bot, "%s "FORMAT, timestamp , ## ARGS)
 #define UPDATE_TIMESTAMP() strftime(timestamp, sizeof(timestamp), "[%H:%M:%S]", localtime(&now))
 
-void add_track_user(struct userNode *user) { dict_insert(track_db, (const char *)user->nick, user); }
-static void del_track_user(struct userNode *user) { dict_remove2(track_db, (const char *)user->nick, 1); }
+void 
+add_track_user(struct userNode *user) 
+{ 
+    dict_insert(track_db, strdup(user->nick), user); 
+}
+
+static void 
+del_track_user(const char *nick) 
+{ 
+    dict_remove(track_db, nick); 
+}
+
 static int
-check_track_user(struct userNode *user)
+check_track_user(const char *nick)
 {
        int found;
-       dict_find(track_db, (const char *)user->nick, &found);
+       if(!nick)
+         return 0;
+       dict_find(track_db, nick, &found);
        return found;
 }
 
@@ -178,22 +190,27 @@ parse_track_conf(char *line)
 }
 
 static void
-track_nick_change(struct userNode *user, const char *old_nick) {
+track_nick_change(struct userNode *user, const char *old_nick, UNUSED_ARG(void *extra)) {
     if (!track_cfg.enabled) return;
-    if (check_track_nick(track_cfg) && check_track_user(user))
-    {
-           UPDATE_TIMESTAMP();
-           TRACK("$bNICK$b change %s -> %s", old_nick, user->nick);
+
+    if(check_track_user(old_nick)) {
+        del_track_user(old_nick);
+        add_track_user(user);
+        if (check_track_nick(track_cfg))
+        {
+               UPDATE_TIMESTAMP();
+               TRACK("$bNICK$b change %s -> %s", old_nick, user->nick);
+        }
     }
 }
 
 static int
-track_join(struct modeNode *mNode) {
+track_join(struct modeNode *mNode, UNUSED_ARG(void *extra)) {
     struct userNode *user = mNode->user;
     struct chanNode *chan = mNode->channel;
     if (!track_cfg.enabled) return 0;
     if (user->uplink->burst && !track_cfg.show_bursts) return 0;
-    if (check_track_join(track_cfg) && check_track_user(user))
+    if (check_track_join(track_cfg) && check_track_user(user->nick))
     {
            UPDATE_TIMESTAMP();
            if (chan->members.used == 1) {
@@ -206,10 +223,10 @@ track_join(struct modeNode *mNode) {
 }
 
 static void
-track_part(struct modeNode *mn, const char *reason) {
+track_part(struct modeNode *mn, const char *reason, UNUSED_ARG(void *extra)) {
     if (!track_cfg.enabled) return;
     if (mn->user->dead) return;
-    if (check_track_part(track_cfg) && check_track_user(mn->user))
+    if (check_track_part(track_cfg) && check_track_user(mn->user->nick))
     {
            UPDATE_TIMESTAMP();
            TRACK("$bPART$b %s by %s (%s)", mn->channel->name, mn->user->nick, reason ? reason : "");
@@ -217,20 +234,27 @@ track_part(struct modeNode *mn, const char *reason) {
 }
 
 static void
-track_kick(struct userNode *kicker, struct userNode *victim, struct chanNode *chan) {
+track_kick(struct userNode *kicker, struct userNode *victim, struct chanNode *chan, UNUSED_ARG(void *extra)) {
     if (!track_cfg.enabled) return;
-    if (check_track_kick(track_cfg) && ((check_track_user(kicker) || check_track_user(victim))))
+    if (check_track_kick(track_cfg) && check_track_user(victim->nick))
     {
+           if (kicker) /* net rider kicks dont have a kicker set */
+           {
+               if (!check_track_user(kicker->nick))
+                   return;
+           }
+
            UPDATE_TIMESTAMP();
            TRACK("$bKICK$b %s from %s by %s", victim->nick, chan->name, (kicker ? kicker->nick : "some server"));
     }
 }
 
 static int
-track_new_user(struct userNode *user) {
+track_new_user(struct userNode *user, UNUSED_ARG(void *extra)) {
+
     if (!track_cfg.enabled) return 0;
     if (user->uplink->burst && !track_cfg.show_bursts) return 0;
-    if (check_track_new(track_cfg) && check_track_user(user))
+    if (check_track_new(track_cfg) && check_track_user(user->nick))
     {
            UPDATE_TIMESTAMP();
            TRACK("$bNICK$b %s %s@%s [%s] on %s", user->nick, user->ident, user->hostname, irc_ntoa(&user->ip), user->uplink->name);
@@ -239,9 +263,9 @@ track_new_user(struct userNode *user) {
 }
 
 static void
-track_del_user(struct userNode *user, struct userNode *killer, const char *why) {
+track_del_user(struct userNode *user, struct userNode *killer, const char *why, UNUSED_ARG(void *extra)) {
     if (!track_cfg.enabled) return;
-    if (check_track_del(track_cfg) && (check_track_user(user) || (killer && check_track_user(killer))))
+    if (check_track_del(track_cfg) && (check_track_user(user->nick) || (killer && check_track_user(killer->nick))))
     {
            UPDATE_TIMESTAMP();
            if (killer) {
@@ -249,15 +273,15 @@ track_del_user(struct userNode *user, struct userNode *killer, const char *why)
            } else {
                    TRACK("$bQUIT$b %s (%s@%s, on %s) (%s)", user->nick, user->ident, user->hostname, user->uplink->name, why);
            }
-           del_track_user(user);
+           del_track_user(user->nick);
     }
 }
 
 static void
-track_auth(struct userNode *user, UNUSED_ARG(struct handle_info *old_handle)) {
+track_auth(struct userNode *user, UNUSED_ARG(struct handle_info *old_handle), UNUSED_ARG(void *extra)) {
     if (!track_cfg.enabled) return;
     if (user->uplink->burst && !track_cfg.show_bursts) return;
-    if (user->handle_info && (check_track_auth(track_cfg) && check_track_user(user))) {
+    if (user->handle_info && (check_track_auth(track_cfg) && check_track_user(user->nick))) {
         UPDATE_TIMESTAMP();
         TRACK("$bAUTH$b %s!%s@%s [%s] on %s as %s", user->nick, user->ident, user->hostname,
                        irc_ntoa(&user->ip), user->uplink->name, user->handle_info->handle);
@@ -265,11 +289,11 @@ track_auth(struct userNode *user, UNUSED_ARG(struct handle_info *old_handle)) {
 }
 
 static void
-track_user_mode(struct userNode *user, const char *mode_change) {
+track_user_mode(struct userNode *user, const char *mode_change, UNUSED_ARG(void *extra)) {
        if (!track_cfg.enabled) return;
        if (user->uplink->burst && !track_cfg.show_bursts) return;
        if (!mode_change[1]) return; /* warning there has to be atleast one char in the buffer */
-       if(check_track_umode(track_cfg) && check_track_user(user))
+       if(check_track_umode(track_cfg) && check_track_user(user->nick))
        {
                UPDATE_TIMESTAMP();
                TRACK("$bUMODE$b %s %s", user->nick, mode_change);
@@ -277,7 +301,7 @@ track_user_mode(struct userNode *user, const char *mode_change) {
 }
 
 static void
-track_oper(struct userNode *user) {
+track_oper(struct userNode *user, UNUSED_ARG(void *extra)) {
        if (!track_cfg.enabled) return;
        if (user->uplink->burst && !track_cfg.show_bursts) return;
        UPDATE_TIMESTAMP();
@@ -285,13 +309,13 @@ track_oper(struct userNode *user) {
 }
 
 static void
-track_channel_mode(struct userNode *who, struct chanNode *channel, char **modes, unsigned int argc)
+track_channel_mode(struct userNode *who, struct chanNode *channel, char **modes, unsigned int argc, UNUSED_ARG(void *extra))
 {
        if (!track_cfg.enabled) return;
        if(who)
        {
                if (who->uplink->burst && !track_cfg.show_bursts) return;
-               if (!check_track_chanmode(track_cfg) || !check_track_user(who)) return;
+               if (!check_track_chanmode(track_cfg) || !check_track_user(who->nick)) return;
        } else
                return;
 
@@ -434,20 +458,20 @@ MODCMD_FUNC(cmd_track)
                add = 2;
                changed = true;
 
-               if(data[0] == '+')
+               if(*data == '+')
                        add = 1;
-               if(data[0] == '-')
+               if(*data == '-')
                        add = 0;
 
                if(add == 2)
                {
-                       if ((!strcasecmp(&data[i], "all")))
+                       if ((!strcasecmp(data, "all")))
                        {
                                set_track_all(track_cfg);
                                check_track_state(user);
                                TRACK("$bALERT$b TRACK fully enabled by %s", user->nick);
                        }
-                       else if (!strcasecmp(&data[i], "none"))
+                       else if (!strcasecmp(data, "none"))
                        {
                                clear_track_all(track_cfg);
                                check_track_state(user);
@@ -461,92 +485,55 @@ MODCMD_FUNC(cmd_track)
                        return 0;
                }
 
-               *data++;
-
-               switch(tolower(data[0]))
-               {
-                       case 'a':
-                               if(!strcasecmp(data, "auth"))
-                               {
-                                       if (add)
-                                               set_track_auth(track_cfg);
-                                       else
-                                               clear_track_auth(track_cfg);
-                               }
-                               break;
-                       case 'c':
-                               if(!strcasecmp(data, "chanmode"))
-                               {
-                                       if (add)
-                                               set_track_chanmode(track_cfg);
-                                       else
-                                               clear_track_chanmode(track_cfg);
-                               }
-                               break;
-                       case 'd':
-                               if(!strcasecmp(data, "del"))
-                               {
-                                       if (add)
-                                               set_track_del(track_cfg);
-                                       else
-                                               clear_track_del(track_cfg);
-                               }
-                               break;
-                       case 'j':
-                               if(!strcasecmp(data, "join"))
-                               {
-                                       if(add)
-                                               set_track_join(track_cfg);
-                                       else
-                                               clear_track_join(track_cfg);
-                               }
-                               break;
-                       case 'k':
-                               if(!strcasecmp(data, "kick"))
-                               {
-                                       if(add)
-                                               set_track_kick(track_cfg);
-                                       else
-                                               clear_track_kick(track_cfg);
-                               }
-                               break;
-                       case 'n':
-                               if(!strcasecmp(data, "new"))
-                               {
-                                       if(add)
-                                               set_track_new(track_cfg);
-                                       else
-                                               clear_track_new(track_cfg);
-                               }
-                               if(!strcasecmp(data, "nick"))
-                               {
-                                       if(add)
-                                               set_track_nick(track_cfg);
-                                       else
-                                               clear_track_nick(track_cfg);
-                               }
-                               break;
-                       case 'p':
-                               if(!strcasecmp(data, "part"))
-                               {
-                                       if(add)
-                                               set_track_part(track_cfg);
-                                       else
-                                               clear_track_part(track_cfg);
-                               }
-                               break;
-                       case 'u':
-                               if(!strcasecmp(data, "umode"))
-                               {
-                                       if(add)
-                                               set_track_umode(track_cfg);
-                                       else
-                                               clear_track_umode(track_cfg);
-                               }
-                               break;
-                       default:
-                               TRACK("Error, Unknown value %s", data);
-                               break;
+               data++;
+
+                if(!strcasecmp(data, "auth")) {
+                        if (add)
+                                set_track_auth(track_cfg);
+                        else
+                                clear_track_auth(track_cfg);
+                } else if(!strcasecmp(data, "chanmode")) {
+                        if (add)
+                                set_track_chanmode(track_cfg);
+                        else
+                                clear_track_chanmode(track_cfg);
+                } else if(!strcasecmp(data, "del")) {
+                        if (add)
+                                set_track_del(track_cfg);
+                        else
+                                clear_track_del(track_cfg);
+                } else if(!strcasecmp(data, "join")) {
+                        if(add)
+                                set_track_join(track_cfg);
+                        else
+                                clear_track_join(track_cfg);
+                } else if(!strcasecmp(data, "kick")) {
+                        if(add)
+                                set_track_kick(track_cfg);
+                        else
+                                clear_track_kick(track_cfg);
+                } else if(!strcasecmp(data, "new")) {
+                        if(add)
+                                set_track_new(track_cfg);
+                        else
+                                clear_track_new(track_cfg);
+                } else if(!strcasecmp(data, "nick")) {
+                        if(add)
+                                set_track_nick(track_cfg);
+                        else
+                                clear_track_nick(track_cfg);
+                } else if(!strcasecmp(data, "part")) {
+                        if(add)
+                                set_track_part(track_cfg);
+                        else
+                                clear_track_part(track_cfg);
+                } else if(!strcasecmp(data, "umode")) {
+                        if(add)
+                                set_track_umode(track_cfg);
+                        else
+                                clear_track_umode(track_cfg);
+                } else {
+                    TRACK("Error, Unknown value %s", data);
                }
        }
        check_track_state(user);
@@ -580,9 +567,9 @@ MODCMD_FUNC(cmd_deltrack)
 
        if((argc > 1) && (un = dict_find(clients, argv[1], NULL)))
        {
-               if(check_track_user(un))
+               if(check_track_user(un->nick))
                {
-                       del_track_user(un);
+                       del_track_user(un->nick);
                        UPDATE_TIMESTAMP();
                        TRACK("$bALERT$b No longer monitoring %s!%s@%s on %s requested by %s",
                                        un->nick, un->ident, un->hostname, un->uplink->name, user->nick);
@@ -600,22 +587,22 @@ MODCMD_FUNC(cmd_deltrack)
 
 MODCMD_FUNC(cmd_addtrack)
 {
-       struct userNode *un = NULL;
+    struct userNode *un = NULL;
 
-       if((argc > 1) && (un = dict_find(clients, argv[1], NULL)))
-       {
-               add_track_user(un);
-               UPDATE_TIMESTAMP();
-               TRACK("$bALERT$b Manually enabled monitoring of %s!%s@%s on %s requested by %s",
-                               un->nick, un->ident, un->hostname, un->uplink->name, user->nick);
+    if((argc > 1) && (un = dict_find(clients, argv[1], NULL)))
+    {
+       add_track_user(un);
+       UPDATE_TIMESTAMP();
+       TRACK("$bALERT$b Manually enabled monitoring of %s!%s@%s on %s requested by %s",
+                       un->nick, un->ident, un->hostname, un->uplink->name, user->nick);
         send_message_type(4, user, track_cfg.bot, "Now tracking %s!%s@%s on %s", un->nick,un->ident,un->hostname, un->uplink->name);
-       }
-       else
+    }
+    else
     {
-               send_message_type(4, user, track_cfg.bot, "No nick or invalid nick specified.");
+       send_message_type(4, user, track_cfg.bot, "No nick or invalid nick specified.");
         svccmd_send_help_brief(user, track_cfg.bot, cmd);
     }
-       return 0;
+    return 0;
 }
 
 MODCMD_FUNC(cmd_listtrack)
@@ -663,27 +650,29 @@ track_conf_read(void) {
 }
 
 void
-track_cleanup(void) {
+track_cleanup(UNUSED_ARG(void *extra)) {
     track_cfg.enabled = 0;
-    unreg_del_user_func(track_del_user);
+    unreg_del_user_func(track_del_user, NULL);
+    dict_delete(track_db);
 }
 
 int
 track_init(void) {
     track_db = dict_new();
+    dict_set_free_keys(track_db, free);
 
-    reg_exit_func(track_cleanup);
+    reg_exit_func(track_cleanup, NULL);
     conf_register_reload(track_conf_read);
-    reg_nick_change_func(track_nick_change);
-    reg_join_func(track_join);
-    reg_part_func(track_part);
-    reg_kick_func(track_kick);
-    reg_new_user_func(track_new_user);
-    reg_del_user_func(track_del_user);
-    reg_auth_func(track_auth);
-    reg_channel_mode_func(track_channel_mode);
-    reg_user_mode_func(track_user_mode);
-    reg_oper_func(track_oper);
+    reg_nick_change_func(track_nick_change, NULL);
+    reg_join_func(track_join, NULL);
+    reg_part_func(track_part, NULL);
+    reg_kick_func(track_kick, NULL);
+    reg_new_user_func(track_new_user, NULL);
+    reg_del_user_func(track_del_user, NULL);
+    reg_auth_func(track_auth, NULL);
+    reg_channel_mode_func(track_channel_mode, NULL);
+    reg_user_mode_func(track_user_mode, NULL);
+    reg_oper_func(track_oper, NULL);
     opserv_define_func("TRACK", cmd_track, 800, 0, 0);
     opserv_define_func("DELTRACK", cmd_deltrack, 800, 0, 0);
     opserv_define_func("ADDTRACK", cmd_addtrack, 800, 0, 0);