diff options
-rw-r--r-- | include/channels.h | 20 | ||||
-rw-r--r-- | include/mode.h | 6 | ||||
-rw-r--r-- | src/channels.cpp | 49 | ||||
-rw-r--r-- | src/mode.cpp | 5 |
4 files changed, 32 insertions, 48 deletions
diff --git a/include/channels.h b/include/channels.h index 3ad26ceda..59f4d1cf3 100644 --- a/include/channels.h +++ b/include/channels.h @@ -15,19 +15,7 @@ #define __CHANNELS_H__ #include "membership.h" - -/** RFC1459 channel modes - */ -enum ChannelModes { - CM_TOPICLOCK = 't'-65, /* +t: Only operators can change topic */ - CM_NOEXTERNAL = 'n'-65, /* +n: Only users in the channel can message it */ - CM_INVITEONLY = 'i'-65, /* +i: Invite only */ - CM_MODERATED = 'm'-65, /* +m: Only voices and above can talk */ - CM_SECRET = 's'-65, /* +s: Secret channel */ - CM_PRIVATE = 'p'-65, /* +p: Private channel */ - CM_KEY = 'k'-65, /* +k: Keyed channel */ - CM_LIMIT = 'l'-65 /* +l: Maximum user limit */ -}; +#include "mode.h" /** Holds an entry for a ban list, exemption list, or invite list. * This class contains a single element in a channel list, such as a banlist. @@ -127,6 +115,7 @@ class CoreExport Channel : public Extensible * @param mode The mode character to set or unset * @param mode_on True if you want to set the mode or false if you want to remove it */ + void SetMode(ModeHandler* mode, bool value); void SetMode(char mode,bool mode_on); /** Sets or unsets a custom mode in the channels info @@ -134,13 +123,15 @@ class CoreExport Channel : public Extensible * @param parameter The parameter string to associate with this mode character. * If it is empty, the mode is unset; if it is nonempty, the mode is set. */ - void SetModeParam(char mode, std::string parameter); + void SetModeParam(ModeHandler* mode, const std::string& parameter); + void SetModeParam(char mode, const std::string& parameter); /** Returns true if a mode is set on a channel * @param mode The mode character you wish to query * @return True if the custom mode is set, false if otherwise */ inline bool IsModeSet(char mode) { return modes[mode-'A']; } + inline bool IsModeSet(ModeHandler* mode) { return modes[mode->GetModeChar()-'A']; } /** Returns the parameter for a custom mode on a channel. @@ -154,6 +145,7 @@ class CoreExport Channel : public Extensible * @return The parameter for this mode is returned, or an empty string */ std::string GetModeParameter(char mode); + std::string GetModeParameter(ModeHandler* mode); /** Sets the channel topic. * @param u The user setting the topic diff --git a/include/mode.h b/include/mode.h index f4e5e8a60..f1768f559 100644 --- a/include/mode.h +++ b/include/mode.h @@ -14,11 +14,7 @@ #ifndef __MODE_H #define __MODE_H -/* Forward declarations. */ -class User; - #include "ctables.h" -#include "channels.h" /** * Holds the values for different type of modes @@ -214,7 +210,7 @@ class CoreExport ModeHandler : public classbase * Returns the mode character this handler handles. * @return The mode character */ - char GetModeChar(); + inline char GetModeChar() { return mode; } /** For user modes, return the current parameter, if any */ diff --git a/src/channels.cpp b/src/channels.cpp index 3f0fc4a36..31038484e 100644 --- a/src/channels.cpp +++ b/src/channels.cpp @@ -36,7 +36,12 @@ void Channel::SetMode(char mode,bool mode_on) modes[mode-65] = mode_on; } -void Channel::SetModeParam(char mode, std::string parameter) +void Channel::SetMode(ModeHandler* mh, bool on) +{ + modes[mh->GetModeChar() - 65] = on; +} + +void Channel::SetModeParam(char mode, const std::string& parameter) { CustomModeList::iterator n = custom_mode_params.find(mode); // always erase, even if changing, so that the map gets the new value @@ -53,6 +58,11 @@ void Channel::SetModeParam(char mode, std::string parameter) } } +void Channel::SetModeParam(ModeHandler* mode, const std::string& parameter) +{ + SetModeParam(mode->GetModeChar(), parameter); +} + std::string Channel::GetModeParameter(char mode) { CustomModeList::iterator n = custom_mode_params.find(mode); @@ -61,6 +71,14 @@ std::string Channel::GetModeParameter(char mode) return ""; } +std::string Channel::GetModeParameter(ModeHandler* mode) +{ + CustomModeList::iterator n = custom_mode_params.find(mode->GetModeChar()); + if (n != custom_mode_params.end()) + return n->second; + return ""; +} + int Channel::SetTopic(User *u, std::string &ntopic, bool forceset) { if (u) @@ -706,30 +724,13 @@ char* Channel::ChanModes(bool showkey) { *offset++ = n + 65; extparam.clear(); - switch (n) + if (n == 'k' - 65 && !showkey) { - case CM_KEY: - // Unfortunately this must be special-cased, as we definitely don't want to always display key. - if (showkey) - { - extparam = this->GetModeParameter('k'); - } - else - { - extparam = "<key>"; - } - break; - case CM_NOEXTERNAL: - case CM_TOPICLOCK: - case CM_INVITEONLY: - case CM_MODERATED: - case CM_SECRET: - case CM_PRIVATE: - /* We know these have no parameters */ - break; - default: - extparam = this->GetModeParameter(n + 65); - break; + extparam = "<key>"; + } + else + { + extparam = this->GetModeParameter(n + 65); } if (!extparam.empty()) { diff --git a/src/mode.cpp b/src/mode.cpp index 9c3b75101..fb154d5e2 100644 --- a/src/mode.cpp +++ b/src/mode.cpp @@ -99,11 +99,6 @@ int ModeHandler::GetNumParams(bool adding) return 0; } -char ModeHandler::GetModeChar() -{ - return mode; -} - std::string ModeHandler::GetUserParameter(User* user) { return ""; |