/* 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)
#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;
}
static void
track_nick_change(struct userNode *user, const char *old_nick) {
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);
+ }
}
}
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) {
track_part(struct modeNode *mn, const char *reason) {
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 : "");
static void
track_kick(struct userNode *kicker, struct userNode *victim, struct chanNode *chan) {
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(kicker->nick) || check_track_user(victim->nick))))
{
UPDATE_TIMESTAMP();
TRACK("$bKICK$b %s from %s by %s", victim->nick, chan->name, (kicker ? kicker->nick : "some server"));
track_new_user(struct userNode *user) {
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);
static void
track_del_user(struct userNode *user, struct userNode *killer, const char *why) {
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) {
} 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);
}
}
track_auth(struct userNode *user, UNUSED_ARG(struct handle_info *old_handle)) {
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);
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);
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;
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);
TRACK("$bALERT$b TRACK disabled by %s", user->nick);
}
else
- TRACK("Unrecognised parameter: %s", data);
+ {
+ send_message_type(4, user, track_cfg.bot, "Unrecognised parameter: %s", data);
+ svccmd_send_help_brief(user, track_cfg.bot, cmd);
+ }
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);
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);
send_message_type(4, user, track_cfg.bot, "This nick isn't monitored.");
}
else
+ {
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;
}
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);
- }
- else
- send_message_type(4, user, track_cfg.bot, "No nick or invalid nick specified.");
+ 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
+ {
+ 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)
str = database_get_data(node, "channel", RECDB_QSTRING);
if (!str)
return;
- track_cfg.channel = AddChannel(str, now, "+sntim", NULL, NULL);
+ // XXX - dont do addchannel if the channel is being shared with
+ // another module:
+ track_cfg.channel = AddChannel(str, now, "+sntOm", NULL, NULL);
if (!track_cfg.channel)
return;
str = database_get_data(node, "show_bursts", RECDB_QSTRING);
track_cleanup(void) {
track_cfg.enabled = 0;
unreg_del_user_func(track_del_user);
+ dict_delete(track_db);
}
int
track_init(void) {
track_db = dict_new();
+ dict_set_free_keys(track_db, free);
reg_exit_func(track_cleanup);
conf_register_reload(track_conf_read);