From 2e80659dec32fe340e1a298109b349a7fde8efa0 Mon Sep 17 00:00:00 2001 From: ThiefMaster Date: Fri, 22 Jun 2007 21:36:07 +0200 Subject: [PATCH] Added forcekick command to opserv to allow kicking of +k opers. --- src/opserv.c | 30 ++++++++++++++++++++++++++++++ src/opserv.help | 7 ++++++- 2 files changed, 36 insertions(+), 1 deletion(-) diff --git a/src/opserv.c b/src/opserv.c index 55640af..8a5f2a5 100644 --- a/src/opserv.c +++ b/src/opserv.c @@ -252,6 +252,7 @@ static const struct message_entry msgtab[] = { { "OSMSG_CHANINFO_USER_COUNT", "Users (%d):" }, { "OSMSG_CSEARCH_CHANNEL_INFO", "%s [%d users] %s %s" }, { "OSMSG_TRACE_MAX_CHANNELS", "You may not use the 'channel' criterion more than %d times." }, + { "OSMSG_FORCEKICK_LOCAL", "You cannot kick $b%s$b forcefully." }, { NULL, NULL } }; @@ -1006,6 +1007,34 @@ static MODCMD_FUNC(cmd_kick) return 1; } +static MODCMD_FUNC(cmd_forcekick) +{ + struct userNode *target; + char *reason; + + if (argc < 3) { + reason = alloca(strlen(OSMSG_KICK_REQUESTED)+strlen(user->nick)+1); + sprintf(reason, OSMSG_KICK_REQUESTED, user->nick); + } else { + reason = unsplit_string(argv+2, argc-2, NULL); + } + target = GetUserH(argv[1]); + if (!target) { + reply("MSG_NICK_UNKNOWN", argv[1]); + return 0; + } + if (!GetUserMode(channel, target)) { + reply("OSMSG_NOT_ON_CHANNEL", target->nick, channel->name); + return 0; + } + if (IsLocal(target)) { + reply("OSMSG_FORCEKICK_LOCAL", target->nick); + return 0; + } + irc_kick(cmd->parent->bot, target, channel, reason); + return 1; +} + static MODCMD_FUNC(cmd_kickall) { unsigned int limit, n, inchan; @@ -4267,6 +4296,7 @@ init_opserv(const char *nick) opserv_define_func("JUMP", cmd_jump, 900, 0, 2); opserv_define_func("JUPE", cmd_jupe, 900, 0, 4); opserv_define_func("KICK", cmd_kick, 100, 2, 2); + opserv_define_func("FORCEKICK", cmd_forcekick, 800, 2, 2); opserv_define_func("KICKALL", cmd_kickall, 400, 2, 0); opserv_define_func("KICKBAN", cmd_kickban, 100, 2, 2); opserv_define_func("KICKBANALL", cmd_kickbanall, 450, 2, 0); diff --git a/src/opserv.help b/src/opserv.help index 508c9fb..b9aa128 100644 --- a/src/opserv.help +++ b/src/opserv.help @@ -164,6 +164,7 @@ " DEOP [${level/deop}]", " DEOPALL [${level/deopall}]", " DEVOICEALL [${level/devoiceall}]", + " FORCEKICK [${level/forcekick}]", " KICK [${level/kick}]", " KICKALL [${level/kickall}]", " KICKBAN [${level/kickban}]", @@ -205,7 +206,11 @@ "KICK" ("/msg $O KICK <#channel> [reason]", "Kicks the specified user from the specified channel.", "If the channel is omitted, then $bkick$b will be done in the channel where the command was given.", - "$uSee Also:$u ban, kickall, kickban, kickbanall"); + "$uSee Also:$u ban, kickall, kickban, kickbanall, forcekick"); +"FORCEKICK" ("/msg $O FORCEKICK <#channel> [reason]", + "Kicks the specified user from the specified channel even if he is a channel service (+k).", + "If the channel is omitted, then $bforcekick$b will be done in the channel where the command was given.", + "$uSee Also:$u ban, kick, kickall, kickban, kickbanall"); "KICKALL" ("/msg $O KICKALL <#channel> [reason]", "Kicks all users in the specified channel except for the user issuing the command.", "If the channel is omitted, then $bkickall$b will be done in the channel where the command was given.", -- 2.20.1