}
cmd = dict_find(service->commands, argv[cmd_arg], NULL);
if (!cmd) {
- send_message(user, service->bot, "MSG_COMMAND_UNKNOWN", argv[cmd_arg]);
+ if (!channel)
+ send_message(user, service->bot, "MSG_COMMAND_UNKNOWN", argv[cmd_arg]);
return 0;
}
flags = cmd->effective_flags;
unsigned long flags_on, flags_off;
time_t min_registered, max_registered;
time_t lastseen;
- enum { SUBSET, EXACT, SUPERSET } hostmask_type;
+ enum { SUBSET, EXACT, SUPERSET, LASTQUIT } hostmask_type;
const char *nickmask;
const char *hostmask;
const char *handlemask;
goto fail;
}
discrim->hostmask_type = SUPERSET;
+ } else if (!irccasecmp(argv[i], "lastquit") || !irccasecmp(argv[i], "lastauth")) {
+ if (i == argc - 1) {
+ send_message(user, nickserv, "MSG_MISSING_PARAMS", argv[i]);
+ goto fail;
+ }
+ discrim->hostmask_type = LASTQUIT;
} else {
i--;
discrim->hostmask_type = SUPERSET;
&& !irccasecmp(discrim->hostmask, mask)) break;
else if ((discrim->hostmask_type == SUPERSET)
&& (match_ircglobs(mask, discrim->hostmask))) break;
+ else if ((discrim->hostmask_type == LASTQUIT)
+ && (match_ircglobs(discrim->hostmask, hi->last_quit_host))) break;
}
if (i==hi->masks->used) return 0;
}
" HOSTMASK SUPERSET - Account matches if someone with this hostmask can auth to the account",
" HOSTMASK EXACT - Account matches if this exact hostmask is in list",
" HOSTMASK SUBSET - Account matches if this mask \"covers\" one in their userlist",
+ " HOSTMASK LASTQUIT - Account matches if this mask \"covers\" user was last seen using",
" HOSTMASK - A glob that must match a hostmask for the account (equivalent to HOSTMASK SUPERSET)",
" ACCESS - An $O access constraint (<nnn, <=nnn, =nnn, >=nnn or >nnn)",
"$uSee Also:$u search, search action"
" HOSTMASK SUPERSET - Account matches if someone with this hostmask can auth to the account",
" HOSTMASK EXACT - Account matches if this exact hostmask is in list",
" HOSTMASK SUBSET - Account matches if this mask \"covers\" one in their userlist",
+ " HOSTMASK LASTQUIT - Account matches if this mask \"covers\" user was last seen using",
" HOSTMASK - A glob that must match a hostmask for the account (equivalent to HOSTMASK SUPERSET)",
" ACCESS - An $O access constraint (<nnn, <=nnn, =nnn, >=nnn or >nnn)",
"$uSee Also:$u search, search action"
{ "OSMSG_CHANINFO_TOPIC_UNKNOWN", "Topic: (none / not gathered)" },
{ "OSMSG_CHANINFO_BAN_COUNT", "Bans (%d):" },
{ "OSMSG_CHANINFO_BAN", "%%s by %%s (%a %b %d %H:%M:%S %Y)" },
- { "OSMSG_CHANINFO_MANY_USERS", "%d users (\"/msg $s %s %s users\" for the list)" },
+ { "OSMSG_CHANINFO_MANY_USERS", "%d users (\"/msg $S %s %s users\" for the list)" },
{ "OSMSG_CHANINFO_USER_COUNT", "Users (%d):" },
{ "OSMSG_CSEARCH_CHANNEL_INFO", "%s [%d users] %s %s" },
{ NULL, NULL }
for (n = 0; n < channel->banlist.used; n++) {
ban = channel->banlist.list[n];
strftime(buffer, sizeof(buffer), fmt, localtime(&ban->set));
- reply(buffer, ban->ban, ban->who);
+ send_message_type(4, user, cmd->parent->bot, buffer, ban->ban, ban->who);
}
}
if ((argc < 2) && (channel->members.used >= 50)) {
change.modes_set |= MODE_MODERATED;
if (change.modes_set || change.argc)
mod_chanmode_announce(opserv, channel, &change);
- send_target_message(0, channel->name, opserv, "OSMSG_FLOOD_MODERATE");
+ send_channel_notice(channel, opserv, user_find_message(user, "OSMSG_FLOOD_MODERATE"));
opserv_alert("Warning: Possible join flood in %s (currently %d users; channel moderated).", channel->name, channel->members.used);
} else {
opserv_alert("Warning: Possible join flood in %s (currently %d users).", channel->name, channel->members.used);