summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAdam <Adam@anope.org>2010-12-10 14:29:11 -0500
committerAdam <Adam@anope.org>2010-12-12 19:37:04 -0500
commit9f7a2e4da2c9917ae7a0fb2729609ef03093a312 (patch)
tree39df5d77ec4df5b569ad052288fe7ba0d2f80722
parent25e995b0f53db4f71ee4cf11faa215f380f0654a (diff)
Bug #1177 - Readded in support for cs_mode to act on every channel
-rw-r--r--docs/Changes1
-rw-r--r--modules/core/cs_modes.cpp171
-rw-r--r--modules/protocol/plexus.cpp15
-rw-r--r--src/language.cpp70
4 files changed, 149 insertions, 108 deletions
diff --git a/docs/Changes b/docs/Changes
index eaa22312f..5e08d5f6a 100644
--- a/docs/Changes
+++ b/docs/Changes
@@ -5,6 +5,7 @@ A /chanserv clone command to copy settings from one channel to another.
A Ability for users to delete their own access in channels
A Ability for users with registrations pending to drop their registrations with /nickserv drop
A Added support for Plexus 3
+A Readded in support for /cs op/deop/etc to op/deop you in all channels
F Changed the GHOST command to not allow ghosting unidentified users if the RECOVER command exists
Anope Version 1.9.3
diff --git a/modules/core/cs_modes.cpp b/modules/core/cs_modes.cpp
index 885b4d81e..2615769ff 100644
--- a/modules/core/cs_modes.cpp
+++ b/modules/core/cs_modes.cpp
@@ -13,61 +13,82 @@
#include "module.h"
-/** do_util: not a command, but does the job of others
- * @param source The source of the command
- * @param com The command calling this function
- * @param cm A channel mode class
- * @param chan The channel its being set on
- * @param nick The nick the modes being set on
- * @param set Is the mode being set or removed
- * @param level The acecss level required to set this mode on someone else
- * @param levelself The access level required to set this mode on yourself
- * @param name The name, eg "OP" or "HALFOP"
- * @param notice Flag required on a channel to send a notice
- */
-static CommandReturn do_util(CommandSource &source, Command *com, ChannelMode *cm, const Anope::string &chan, const Anope::string &nick, bool set, int level, int levelself, const Anope::string &name, ChannelInfoFlag notice)
+
+class CommandModeBase : public Command
{
- User *u = source.u;
- Channel *c = findchan(chan);
- ChannelInfo *ci = c ? c->ci : NULL;
- Anope::string realnick = (!nick.empty() ? nick : u->nick);
- bool is_same = u->nick.equals_ci(realnick);
- User *u2 = is_same ? u : finduser(realnick);
-
- ChanAccess *u_access = ci->GetAccess(u), *u2_access = ci->GetAccess(u2);
- uint16 u_level = u_access ? u_access->level : 0, u2_level = u2_access ? u2_access->level : 0;
-
- if (!c)
- source.Reply(CHAN_X_NOT_IN_USE, chan.c_str());
- else if (!u2)
- source.Reply(NICK_X_NOT_IN_USE, realnick.c_str());
- else if (is_same ? !check_access(u, ci, levelself) : !check_access(u, ci, level))
- source.Reply(ACCESS_DENIED);
- else if (!set && !is_same && ci->HasFlag(CI_PEACE) && u2_level >= u_level)
- source.Reply(ACCESS_DENIED);
- else if (!set && u2->IsProtected() && !is_same)
- source.Reply(ACCESS_DENIED);
- else if (!c->FindUser(u2))
- source.Reply(NICK_X_NOT_ON_CHAN, u2->nick.c_str(), c->name.c_str());
- else
- {
- if (set)
- c->SetMode(NULL, cm, u2->nick);
+ protected:
+ /** do_util: not a command, but does the job of others
+ * @param source The source of the command
+ * @param com The command calling this function
+ * @param cm A channel mode class
+ * @param chan The channel its being set on
+ * @param nick The nick the modes being set on
+ * @param set Is the mode being set or removed
+ * @param level The acecss level required to set this mode on someone else
+ * @param levelself The access level required to set this mode on yourself
+ * @param notice Flag required on a channel to send a notice
+ */
+ CommandReturn do_util(CommandSource &source, Command *com, ChannelMode *cm, const Anope::string &chan, const Anope::string &nick, bool set, int level, int levelself, ChannelInfoFlag notice)
+ {
+ User *u = source.u;
+
+ if (chan.empty())
+ for (UChannelList::iterator it = u->chans.begin(); it != u->chans.end(); ++it)
+ do_mode(source, com, cm, (*it)->chan->name, u->nick, set, level, levelself, notice);
else
- c->RemoveMode(NULL, cm, u2->nick);
+ do_mode(source, com, cm, chan, !nick.empty() ? nick : u->nick, set, level, levelself, notice);
+
+ return MOD_CONT;
+ }
+
+ void do_mode(CommandSource &source, Command *com, ChannelMode *cm, const Anope::string &chan, const Anope::string &nick, bool set, int level, int levelself, ChannelInfoFlag notice)
+ {
+ User *u = source.u;
+ User *u2 = finduser(nick);
+ Channel *c = findchan(chan);
+ ChannelInfo *ci = c ? c->ci : NULL;
+
+ bool is_same = u == u2;
- Log(LOG_COMMAND, u, com, ci) << "for " << u2->nick;
- if (notice && ci->HasFlag(notice))
- ircdproto->SendMessage(whosends(ci), c->name, "%s command used for %s by %s", name.c_str(), u2->nick.c_str(), u->nick.c_str());
+ ChanAccess *u_access = ci ? ci->GetAccess(u) : NULL, *u2_access = ci && u2 ? ci->GetAccess(u2) : NULL;
+ uint16 u_level = u_access ? u_access->level : 0, u2_level = u2_access ? u2_access->level : 0;
+
+ if (!c)
+ source.Reply(CHAN_X_NOT_IN_USE, chan.c_str());
+ else if (!ci)
+ source.Reply(CHAN_X_NOT_REGISTERED, chan.c_str());
+ else if (!u2)
+ source.Reply(NICK_X_NOT_IN_USE, nick.c_str());
+ else if (is_same ? !check_access(u, ci, levelself) : !check_access(u, ci, level))
+ source.Reply(ACCESS_DENIED);
+ else if (!set && !is_same && ci->HasFlag(CI_PEACE) && u2_level >= u_level)
+ source.Reply(ACCESS_DENIED);
+ else if (!set && u2->IsProtected() && !is_same)
+ source.Reply(ACCESS_DENIED);
+ else if (!c->FindUser(u2))
+ source.Reply(NICK_X_NOT_ON_CHAN, u2->nick.c_str(), c->name.c_str());
+ else
+ {
+ if (set)
+ c->SetMode(NULL, cm, u2->nick);
+ else
+ c->RemoveMode(NULL, cm, u2->nick);
+
+ Log(LOG_COMMAND, u, com, ci) << "for " << u2->nick;
+ if (notice && ci->HasFlag(notice))
+ ircdproto->SendMessage(whosends(ci), c->name, "%s command used for %s by %s", com->name.c_str(), u2->nick.c_str(), u->nick.c_str());
+ }
}
- return MOD_CONT;
-}
-class CommandCSOp : public Command
+ public:
+ CommandModeBase(const Anope::string &cname) : Command(cname, 0, 2) { }
+};
+
+class CommandCSOp : public CommandModeBase
{
public:
- CommandCSOp() : Command("OP", 1, 2)
+ CommandCSOp() : CommandModeBase("OP")
{
}
@@ -75,7 +96,7 @@ class CommandCSOp : public Command
{
ChannelMode *cm = ModeManager::FindChannelModeByName(CMODE_OP);
- return do_util(source, this, cm, params[0], params.size() > 1 ? params[1] : "", true, CA_OPDEOP, CA_OPDEOPME, "OP", CI_OPNOTICE);
+ return do_util(source, this, cm, !params.empty() ? params[0] : "", params.size() > 1 ? params[1] : "", true, CA_OPDEOP, CA_OPDEOPME, CI_OPNOTICE);
}
bool OnHelp(CommandSource &source, const Anope::string &subcommand)
@@ -95,10 +116,10 @@ class CommandCSOp : public Command
}
};
-class CommandCSDeOp : public Command
+class CommandCSDeOp : public CommandModeBase
{
public:
- CommandCSDeOp() : Command("DEOP", 1, 2)
+ CommandCSDeOp() : CommandModeBase("DEOP")
{
}
@@ -106,7 +127,7 @@ class CommandCSDeOp : public Command
{
ChannelMode *cm = ModeManager::FindChannelModeByName(CMODE_OP);
- return do_util(source, this, cm, params[0], params.size() > 1 ? params[1] : "", false, CA_OPDEOP, CA_OPDEOPME, "DEOP", CI_OPNOTICE);
+ return do_util(source, this, cm, !params.empty() ? params[0] : "", params.size() > 1 ? params[1] : "", false, CA_OPDEOP, CA_OPDEOPME, CI_OPNOTICE);
}
bool OnHelp(CommandSource &source, const Anope::string &subcommand)
@@ -126,10 +147,10 @@ class CommandCSDeOp : public Command
}
};
-class CommandCSVoice : public Command
+class CommandCSVoice : public CommandModeBase
{
public:
- CommandCSVoice() : Command("VOICE", 1, 2)
+ CommandCSVoice() : CommandModeBase("VOICE")
{
}
@@ -137,7 +158,7 @@ class CommandCSVoice : public Command
{
ChannelMode *cm = ModeManager::FindChannelModeByName(CMODE_VOICE);
- return do_util(source, this, cm, params[0], params.size() > 1 ? params[1] : "", true, CA_VOICE, CA_VOICEME, "VOICE", CI_BEGIN);
+ return do_util(source, this, cm, !params.empty() ? params[0] : "", params.size() > 1 ? params[1] : "", true, CA_VOICE, CA_VOICEME, CI_BEGIN);
}
bool OnHelp(CommandSource &source, const Anope::string &subcommand)
@@ -157,10 +178,10 @@ class CommandCSVoice : public Command
}
};
-class CommandCSDeVoice : public Command
+class CommandCSDeVoice : public CommandModeBase
{
public:
- CommandCSDeVoice() : Command("DEVOICE", 1, 2)
+ CommandCSDeVoice() : CommandModeBase("DEVOICE")
{
}
@@ -168,7 +189,7 @@ class CommandCSDeVoice : public Command
{
ChannelMode *cm = ModeManager::FindChannelModeByName(CMODE_VOICE);
- return do_util(source, this, cm, params[0], params.size() > 1 ? params[1] : "", false, CA_VOICE, CA_VOICEME, "DEVOICE", CI_BEGIN);
+ return do_util(source, this, cm, !params.empty() ? params[0] : "", params.size() > 1 ? params[1] : "", false, CA_VOICE, CA_VOICEME, CI_BEGIN);
}
bool OnHelp(CommandSource &source, const Anope::string &subcommand)
@@ -188,10 +209,10 @@ class CommandCSDeVoice : public Command
}
};
-class CommandCSHalfOp : public Command
+class CommandCSHalfOp : public CommandModeBase
{
public:
- CommandCSHalfOp() : Command("HALFOP", 1, 2)
+ CommandCSHalfOp() : CommandModeBase("HALFOP")
{
}
@@ -202,7 +223,7 @@ class CommandCSHalfOp : public Command
if (!cm)
return MOD_CONT;
- return do_util(source, this, cm, params[0], params.size() > 1 ? params[1] : "", true, CA_HALFOP, CA_HALFOPME, "HALFOP", CI_BEGIN);
+ return do_util(source, this, cm, !params.empty() ? params[0] : "", params.size() > 1 ? params[1] : "", true, CA_HALFOP, CA_HALFOPME, CI_BEGIN);
}
bool OnHelp(CommandSource &source, const Anope::string &subcommand)
@@ -222,10 +243,10 @@ class CommandCSHalfOp : public Command
}
};
-class CommandCSDeHalfOp : public Command
+class CommandCSDeHalfOp : public CommandModeBase
{
public:
- CommandCSDeHalfOp() : Command("DEHALFOP", 1, 2)
+ CommandCSDeHalfOp() : CommandModeBase("DEHALFOP")
{
}
@@ -236,7 +257,7 @@ class CommandCSDeHalfOp : public Command
if (!cm)
return MOD_CONT;
- return do_util(source, this, cm, params[0], params.size() > 1 ? params[1] : "", false, CA_HALFOP, CA_HALFOPME, "DEHALFOP", CI_BEGIN);
+ return do_util(source, this, cm, !params.empty() ? params[0] : "", params.size() > 1 ? params[1] : "", false, CA_HALFOP, CA_HALFOPME, CI_BEGIN);
}
bool OnHelp(CommandSource &source, const Anope::string &subcommand)
@@ -256,10 +277,10 @@ class CommandCSDeHalfOp : public Command
}
};
-class CommandCSProtect : public Command
+class CommandCSProtect : public CommandModeBase
{
public:
- CommandCSProtect() : Command("PROTECT", 1, 2)
+ CommandCSProtect() : CommandModeBase("PROTECT")
{
}
@@ -270,7 +291,7 @@ class CommandCSProtect : public Command
if (!cm)
return MOD_CONT;
- return do_util(source, this, cm, params[0], params.size() > 1 ? params[1] : "", true, CA_PROTECT, CA_PROTECTME, "PROTECT", CI_BEGIN);
+ return do_util(source, this, cm, !params.empty() ? params[0] : "", params.size() > 1 ? params[1] : "", true, CA_PROTECT, CA_PROTECTME, CI_BEGIN);
}
bool OnHelp(CommandSource &source, const Anope::string &subcommand)
@@ -290,10 +311,10 @@ class CommandCSProtect : public Command
}
};
-class CommandCSDeProtect : public Command
+class CommandCSDeProtect : public CommandModeBase
{
public:
- CommandCSDeProtect() : Command("DEPROTECT", 1, 2)
+ CommandCSDeProtect() : CommandModeBase("DEPROTECT")
{
}
@@ -304,7 +325,7 @@ class CommandCSDeProtect : public Command
if (!cm)
return MOD_CONT;
- return do_util(source, this, cm, params[0], params.size() > 1 ? params[1] : "", false, CA_PROTECT, CA_PROTECTME, "DEPROTECT", CI_BEGIN);
+ return do_util(source, this, cm, !params.empty() ? params[0] : "", params.size() > 1 ? params[1] : "", false, CA_PROTECT, CA_PROTECTME, CI_BEGIN);
}
bool OnHelp(CommandSource &source, const Anope::string &subcommand)
@@ -324,10 +345,10 @@ class CommandCSDeProtect : public Command
}
};
-class CommandCSOwner : public Command
+class CommandCSOwner : public CommandModeBase
{
public:
- CommandCSOwner() : Command("OWNER", 1, 2)
+ CommandCSOwner() : CommandModeBase("OWNER")
{
}
@@ -338,7 +359,7 @@ class CommandCSOwner : public Command
if (!cm)
return MOD_CONT;
- return do_util(source, this, cm, params[0], params.size() > 1 ? params[1] : "", true, CA_OWNER, CA_OWNERME, "OWNER", CI_BEGIN);
+ return do_util(source, this, cm, !params.empty() ? params[0] : "", params.size() > 1 ? params[1] : "", true, CA_OWNER, CA_OWNERME, CI_BEGIN);
}
bool OnHelp(CommandSource &source, const Anope::string &subcommand)
@@ -358,10 +379,10 @@ class CommandCSOwner : public Command
}
};
-class CommandCSDeOwner : public Command
+class CommandCSDeOwner : public CommandModeBase
{
public:
- CommandCSDeOwner() : Command("DEOWNER", 1, 2)
+ CommandCSDeOwner() : CommandModeBase("DEOWNER")
{
}
@@ -372,7 +393,7 @@ class CommandCSDeOwner : public Command
if (!cm)
return MOD_CONT;
- return do_util(source, this, cm, params[0], params.size() > 1 ? params[1] : "", false, CA_OWNER, CA_OWNERME, "DEOWNER", CI_BEGIN);
+ return do_util(source, this, cm, !params.empty() ? params[0] : "", params.size() > 1 ? params[1] : "", false, CA_OWNER, CA_OWNERME, CI_BEGIN);
}
bool OnHelp(CommandSource &source, const Anope::string &subcommand)
diff --git a/modules/protocol/plexus.cpp b/modules/protocol/plexus.cpp
index fc5e48e7b..6bceadf64 100644
--- a/modules/protocol/plexus.cpp
+++ b/modules/protocol/plexus.cpp
@@ -557,7 +557,7 @@ bool event_bmask(const Anope::string &source, const std::vector<Anope::string> &
return true;
}
-bool event_encap(const Anope::string &sourcd, const std::vector<Anope::string> &params)
+bool event_encap(const Anope::string &source, const std::vector<Anope::string> &params)
{
if (params.size() < 4)
return true;
@@ -596,6 +596,13 @@ bool event_encap(const Anope::string &sourcd, const std::vector<Anope::string> &
return true;
}
+bool event_eob(const Anope::string &source, const std::vector<Anope::string> &params)
+{
+ Server *s = Server::Find(source);
+ if (s)
+ s->Sync(true);
+ return true;
+}
static void AddModes()
{
@@ -652,7 +659,8 @@ static void AddModes()
class ProtoPlexus : public Module
{
Message message_tmode, message_bmask, message_pass,
- message_tb, message_sid, message_encap;
+ message_tb, message_sid, message_encap,
+ message_eob;
PlexusProto ircd_proto;
PlexusIRCdMessage ircd_message;
@@ -660,7 +668,8 @@ class ProtoPlexus : public Module
ProtoPlexus(const Anope::string &modname, const Anope::string &creator) : Module(modname, creator),
message_tmode("TMODE", event_tmode), message_bmask("BMASK", event_bmask),
message_pass("PASS", event_pass), message_tb("TB", event_tburst),
- message_sid("SID", event_sid), message_encap("ENCAP", event_encap)
+ message_sid("SID", event_sid), message_encap("ENCAP", event_encap),
+ message_eob("EOB", event_eob)
{
this->SetAuthor("Anope");
this->SetType(PROTOCOL);
diff --git a/src/language.cpp b/src/language.cpp
index 479e0e2f0..3e7a3e2f7 100644
--- a/src/language.cpp
+++ b/src/language.cpp
@@ -1322,25 +1322,25 @@ const char *const language_strings[LANG_STRING_COUNT] = {
/* CHAN_EXCEPTED */
_("%s matches an except on %s and cannot be banned until the except have been removed."),
/* CHAN_OP_SYNTAX */
- _("OP #channel [nick]"),
+ _("OP [#channel] [nick]"),
/* CHAN_HALFOP_SYNTAX */
- _("HALFOP #channel [nick]"),
+ _("HALFOP [#channel] [nick]"),
/* CHAN_VOICE_SYNTAX */
- _("VOICE #channel [nick]"),
+ _("VOICE [#channel] [nick]"),
/* CHAN_PROTECT_SYNTAX */
- _("PROTECT #channel [nick]"),
+ _("PROTECT [#channel] [nick]"),
/* CHAN_OWNER_SYNTAX */
- _("OWNER #channel [\037nick\037]"),
+ _("OWNER [#channel] [\037nick\037]\002"),
/* CHAN_DEOP_SYNTAX */
- _("DEOP #channel [nick]"),
+ _("DEOP [#channel] [nick]"),
/* CHAN_DEHALFOP_SYNTAX */
- _("DEHALFOP #channel [nick]"),
+ _("DEHALFOP [#channel] [nick]"),
/* CHAN_DEVOICE_SYNTAX */
- _("DEVOICE #channel [nick]"),
+ _("DEVOICE [#channel] [nick]"),
/* CHAN_DEPROTECT_SYNTAX */
- _("DEROTECT #channel [nick]"),
+ _("DEROTECT [#channel] [nick]"),
/* CHAN_DEOWNER_SYNTAX */
- _("DEOWNER #channel [\037nick\037]"),
+ _("DEOWNER [#channel] [\037nick\037]"),
/* CHAN_KICK_SYNTAX */
_("KICK #channel nick [reason]"),
/* CHAN_BAN_SYNTAX */
@@ -3952,85 +3952,95 @@ const char *const language_strings[LANG_STRING_COUNT] = {
"Note that a preceding '#' specifies a range, channel names\n"
"are to be written without '#'."),
/* CHAN_HELP_OP */
- _("Syntax: OP #channel [nick]\n"
+ _("Syntax: OP [#channel] [nick]\n"
" \n"
"Ops a selected nick on a channel. If nick is not given,\n"
- "it will op you.\n"
+ "it will op you. If channel is not given, it will op you\n"
+ "on every channel.\n"
" \n"
"By default, limited to AOPs or those with level 5 access \n"
"and above on the channel."),
/* CHAN_HELP_DEOP */
- _("Syntax: DEOP #channel [nick]\n"
+ _("Syntax: DEOP [#channel] [nick]\n"
" \n"
"Deops a selected nick on a channel. If nick is not given,\n"
- "it will deop you.\n"
+ "it will deop you. If channel is not given, it will deop\n"
+ "you on every channel.\n"
" \n"
"By default, limited to AOPs or those with level 5 access \n"
"and above on the channel."),
/* CHAN_HELP_VOICE */
- _("Syntax: VOICE #channel [nick]\n"
+ _("Syntax: VOICE [#channel] [nick]\n"
" \n"
"Voices a selected nick on a channel. If nick is not given,\n"
- "it will voice you.\n"
+ "it will voice you. If channel is not given, it will voice you\n"
+ "on every channel.\n"
" \n"
"By default, limited to AOPs or those with level 5 access \n"
"and above on the channel, or to VOPs or those with level 3 \n"
"and above for self voicing."),
/* CHAN_HELP_DEVOICE */
- _("Syntax: DEVOICE #channel [nick]\n"
+ _("Syntax: DEVOICE [#channel] [nick]\n"
" \n"
"Devoices a selected nick on a channel. If nick is not given,\n"
- "it will devoice you.\n"
+ "it will devoice you. If channel is not given, it will devoice\n"
+ "you on every channel.\n"
" \n"
"By default, limited to AOPs or those with level 5 access \n"
"and above on the channel, or to VOPs or those with level 3 \n"
"and above for self devoicing."),
/* CHAN_HELP_HALFOP */
- _("Syntax: HALFOP #channel [nick]\n"
+ _("Syntax: HALFOP [#channel] [nick]\n"
" \n"
"Halfops a selected nick on a channel. If nick is not given,\n"
- "it will halfop you.\n"
+ "it will halfop you. If channel is not given, it will halfop\n"
+ "you on every channel.\n"
" \n"
"By default, limited to AOPs and those with level 5 access \n"
"and above on the channel, or to HOPs or those with level 4 \n"
"and above for self halfopping."),
/* CHAN_HELP_DEHALFOP */
- _("Syntax: DEHALFOP #channel [nick]\n"
+ _("Syntax: DEHALFOP [#channel] [nick]\n"
" \n"
"Dehalfops a selected nick on a channel. If nick is not given,\n"
- "it will dehalfop you.\n"
+ "it will dehalfop you. If channel is not given, it will dehalfop\n"
+ "you on every channel.\n"
" \n"
"By default, limited to AOPs and those with level 5 access \n"
"and above on the channel, or to HOPs or those with level 4 \n"
"and above for self dehalfopping."),
/* CHAN_HELP_PROTECT */
- _("Syntax: PROTECT #channel [nick]\n"
+ _("Syntax: PROTECT [#channel] [nick]\n"
" \n"
"Protects a selected nick on a channel. If nick is not given,\n"
- "it will protect you.\n"
+ "it will protect you. If channel is not given, it will protect\n"
+ "you on every channel.\n"
" \n"
"By default, limited to the founder, or to SOPs or those with \n"
"level 10 and above on the channel for self protecting."),
/* CHAN_HELP_DEPROTECT */
- _("Syntax: DEPROTECT #channel [nick]\n"
+ _("Syntax: DEPROTECT [#channel] [nick]\n"
" \n"
"Deprotects a selected nick on a channel. If nick is not given,\n"
- "it will deprotect you.\n"
+ "it will deprotect you. If channel is not given, it will deprotect\n"
+ "you on every channel.\n"
" \n"
"By default, limited to the founder, or to SOPs or those with \n"
"level 10 and above on the channel for self deprotecting."),
/* CHAN_HELP_OWNER */
- _("Syntax: OWNER #channel [\037nick\037]\n"
+ _("Syntax: OWNER [#channel] [\037nick\037]\n"
" \n"
"Gives the selected nick owner status on channel. If nick is not\n"
- "given, it will give you owner.\n"
+ "given, it will give you owner. If channel is not given, it will\n"
+ "give you owner on every channel.\n"
" \n"
"Limited to those with founder access on the channel."),
/* CHAN_HELP_DEOWNER */
- _("Syntax: DEOWNER #channel [\037nick\037]\n"
+ _("Syntax: DEOWNER [#channel] [\037nick\037]\n"
" \n"
"Removes owner status from the selected nick on channel. If nick\n"
- "is not given, it will deowner you.\n"
+ "is not given, it will deowner you. If channel is not given, it will\n"
+ "deowner you on every channel.\n"
" \n"
"Limited to those with founder access on the channel."),
/* CHAN_HELP_INVITE */