X-Git-Url: https://jfr.im/git/irc/evilnet/x3.git/blobdiff_plain/0779bbcf5d967eb285df6af23f7e7199caa6fc7b..3e06ac80fc4ebc46916da348f8056840461f352d:/src/mod-track.c diff --git a/src/mod-track.c b/src/mod-track.c index 5abe392..d88d143 100644 --- a/src/mod-track.c +++ b/src/mod-track.c @@ -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, @@ -73,10 +73,10 @@ /* 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) @@ -85,10 +85,10 @@ /* 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,15 +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; - if(!user) - return NULL; - dict_find(track_db, (const char *)user->nick, &found); + if(!nick) + return 0; + dict_find(track_db, nick, &found); return found; } @@ -180,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) { @@ -208,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 : ""); @@ -219,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); @@ -241,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) { @@ -251,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); @@ -267,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); @@ -279,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(); @@ -287,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; @@ -436,9 +458,9 @@ 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) @@ -463,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); @@ -582,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); @@ -602,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) @@ -665,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);