summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--include/channels.h20
-rw-r--r--include/mode.h6
-rw-r--r--src/channels.cpp49
-rw-r--r--src/mode.cpp5
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 "";