summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAttila Molnar <attilamolnar@hush.com>2014-02-21 15:11:24 +0100
committerAttila Molnar <attilamolnar@hush.com>2014-02-21 15:11:24 +0100
commit7ffef79f97c8dc9f21da35dff9f822be7f62edf3 (patch)
tree075be36de9df1ee6e1a5845343e4bf970824dc00
parent1b6dda7ad54dd0242cd9eac30f167d76f061d2fa (diff)
Index Channel::modes and User::modes with the id of the mode instead of its letter
-rw-r--r--include/channels.h10
-rw-r--r--include/users.h14
-rw-r--r--src/channels.cpp8
-rw-r--r--src/users.cpp11
4 files changed, 18 insertions, 25 deletions
diff --git a/include/channels.h b/include/channels.h
index ba2018e97..628f34f9f 100644
--- a/include/channels.h
+++ b/include/channels.h
@@ -41,12 +41,10 @@ class CoreExport Channel : public Extensible, public InviteBase<Channel>
void SetDefaultModes();
/** Modes for the channel.
- * This is not a null terminated string! It is a bitset where
- * each item in it represents if a mode is set. For example
- * for mode +A, index 0. Use modechar-65 to calculate which
- * field to check.
+ * It is a bitset where each item in it represents if a mode is set.
+ * To see if a mode is set, inspect modes[mh->modeid]
*/
- std::bitset<64> modes;
+ std::bitset<ModeParser::MODEID_MAX> modes;
/** Remove the given membership from the channel's internal map of
* memberships and destroy the Membership object.
@@ -113,7 +111,7 @@ class CoreExport Channel : public Extensible, public InviteBase<Channel>
* @param mode The mode character you wish to query
* @return True if the custom mode is set, false if otherwise
*/
- inline bool IsModeSet(ModeHandler* mode) { return modes[mode->GetModeChar()-'A']; }
+ bool IsModeSet(ModeHandler* mode) { return ((mode->GetId() != ModeParser::MODEID_MAX) && (modes[mode->GetId()])); }
bool IsModeSet(ModeHandler& mode) { return IsModeSet(&mode); }
bool IsModeSet(ChanModeReference& mode);
diff --git a/include/users.h b/include/users.h
index c699ebab7..24783b304 100644
--- a/include/users.h
+++ b/include/users.h
@@ -241,11 +241,11 @@ class CoreExport User : public Extensible
/** The user's mode list.
* Much love to the STL for giving us an easy to use bitset, saving us RAM.
- * if (modes[modeletter-65]) is set, then the mode is
- * set, for example, to work out if mode +s is set, we check the field
- * User::modes['s'-65] != 0.
+ * if (modes[modeid]) is set, then the mode is set.
+ * For example, to work out if mode +i is set, we check the field
+ * User::modes[invisiblemode->modeid] == true.
*/
- std::bitset<64> modes;
+ std::bitset<ModeParser::MODEID_MAX> modes;
public:
@@ -865,8 +865,7 @@ inline FakeUser* IS_SERVER(User* u)
inline bool User::IsModeSet(ModeHandler* mh)
{
- char m = mh->GetModeChar();
- return (modes[m-65]);
+ return (modes[mh->GetId()]);
}
inline bool User::IsModeSet(UserModeReference& moderef)
@@ -878,6 +877,5 @@ inline bool User::IsModeSet(UserModeReference& moderef)
inline void User::SetMode(ModeHandler* mh, bool value)
{
- char m = mh->GetModeChar();
- modes[m-65] = value;
+ modes[mh->GetId()] = value;
}
diff --git a/src/channels.cpp b/src/channels.cpp
index 448764e1c..99c25fbfc 100644
--- a/src/channels.cpp
+++ b/src/channels.cpp
@@ -48,7 +48,7 @@ Channel::Channel(const std::string &cname, time_t ts)
void Channel::SetMode(ModeHandler* mh, bool on)
{
- modes[mh->GetModeChar() - 65] = on;
+ modes[mh->GetId()] = on;
}
void Channel::SetTopic(User* u, const std::string& ntopic)
@@ -598,12 +598,10 @@ const char* Channel::ChanModes(bool showkey)
/* This was still iterating up to 190, Channel::modes is only 64 elements -- Om */
for(int n = 0; n < 64; n++)
{
- if(this->modes[n])
+ ModeHandler* mh = ServerInstance->Modes->FindMode(n + 65, MODETYPE_CHANNEL);
+ if (mh && IsModeSet(mh))
{
scratch.push_back(n + 65);
- ModeHandler* mh = ServerInstance->Modes->FindMode(n+'A', MODETYPE_CHANNEL);
- if (!mh)
- continue;
ParamModeBase* pm = mh->IsParameterMode();
if (!pm)
diff --git a/src/users.cpp b/src/users.cpp
index eb91a9cb5..6545e3b7a 100644
--- a/src/users.cpp
+++ b/src/users.cpp
@@ -40,9 +40,8 @@ bool User::IsNoticeMaskSet(unsigned char sm)
bool User::IsModeSet(unsigned char m)
{
- if (!isalpha(m))
- return false;
- return (modes[m-65]);
+ ModeHandler* mh = ServerInstance->Modes->FindMode(m, MODETYPE_USER);
+ return (mh && modes[mh->GetId()]);
}
const char* User::FormatModes(bool showparameters)
@@ -53,11 +52,11 @@ const char* User::FormatModes(bool showparameters)
for (unsigned char n = 0; n < 64; n++)
{
- if (modes[n])
+ ModeHandler* mh = ServerInstance->Modes->FindMode(n + 65, MODETYPE_USER);
+ if (mh && IsModeSet(mh))
{
data.push_back(n + 65);
- ModeHandler* mh = ServerInstance->Modes->FindMode(n + 65, MODETYPE_USER);
- if (showparameters && mh && mh->GetNumParams(true))
+ if (showparameters && mh->GetNumParams(true))
{
std::string p = mh->GetUserParameter(this);
if (p.length())