aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorGravatar Sadie Powell2022-05-17 13:02:58 +0100
committerGravatar Sadie Powell2022-05-17 13:02:58 +0100
commitec217059c38f4de854338ccabf669d2a77e6c94d (patch)
tree97b65be2fbc696cfd251b0165a29f09c000deae2 /src
parentRequire specifying the repeat argument of the Timer class. (diff)
Store a set of list mode pointers in Membership instead of characters.
Diffstat (limited to 'src')
-rw-r--r--src/channels.cpp45
-rw-r--r--src/coremods/core_channel/cmd_kick.cpp5
-rw-r--r--src/coremods/core_channel/core_channel.cpp7
-rw-r--r--src/coremods/core_who.cpp2
-rw-r--r--src/modules/m_httpd_stats.cpp2
-rw-r--r--src/modules/m_spanningtree/commands.h3
-rw-r--r--src/modules/m_spanningtree/main.cpp2
7 files changed, 24 insertions, 42 deletions
diff --git a/src/channels.cpp b/src/channels.cpp
index 78fab90f2..0e75bdee6 100644
--- a/src/channels.cpp
+++ b/src/channels.cpp
@@ -443,10 +443,9 @@ char Membership::GetPrefixChar() const
char pf = 0;
unsigned int bestrank = 0;
- for (const auto& modechr : modes)
+ for (const auto& mh : modes)
{
- PrefixMode* mh = ServerInstance->Modes.FindPrefixMode(modechr);
- if (mh && mh->GetPrefixRank() > bestrank && mh->GetPrefix())
+ if (mh->GetPrefixRank() > bestrank && mh->GetPrefix())
{
bestrank = mh->GetPrefixRank();
pf = mh->GetPrefix();
@@ -455,25 +454,25 @@ char Membership::GetPrefixChar() const
return pf;
}
-unsigned int Membership::GetRank()
+std::string Membership::GetAllPrefixChars() const
{
- if (!modes.empty())
+ std::string ret;
+ for (const auto& mh : modes)
{
- PrefixMode* mh = ServerInstance->Modes.FindPrefixMode(modes[0]);
- if (mh)
- return mh->GetPrefixRank();
+ if (mh->GetPrefix())
+ ret.push_back(mh->GetPrefix());
}
- return 0;
+
+ return ret;
}
-std::string Membership::GetAllPrefixChars() const
+std::string Membership::GetAllPrefixModes() const
{
std::string ret;
- for (const auto& modechr : modes)
+ for (const auto& mh : modes)
{
- PrefixMode* mh = ServerInstance->Modes.FindPrefixMode(modechr);
- if (mh && mh->GetPrefix())
- ret.push_back(mh->GetPrefix());
+ if (mh->GetModeChar())
+ ret.push_back(mh->GetModeChar());
}
return ret;
@@ -489,22 +488,10 @@ unsigned int Channel::GetPrefixValue(User* user)
bool Membership::SetPrefix(PrefixMode* delta_mh, bool adding)
{
- char prefix = delta_mh->GetModeChar();
- for (unsigned int i = 0; i < modes.length(); i++)
- {
- char mchar = modes[i];
- PrefixMode* mh = ServerInstance->Modes.FindPrefixMode(mchar);
- if (mh && mh->GetPrefixRank() <= delta_mh->GetPrefixRank())
- {
- modes = modes.substr(0,i) +
- (adding ? std::string(1, prefix) : "") +
- modes.substr(mchar == prefix ? i+1 : i);
- return adding != (mchar == prefix);
- }
- }
if (adding)
- modes.push_back(prefix);
- return adding;
+ return modes.insert(delta_mh).second;
+ else
+ return modes.erase(delta_mh);
}
void Membership::WriteNotice(const std::string& text) const
diff --git a/src/coremods/core_channel/cmd_kick.cpp b/src/coremods/core_channel/cmd_kick.cpp
index 2e19b726b..2ed726809 100644
--- a/src/coremods/core_channel/cmd_kick.cpp
+++ b/src/coremods/core_channel/cmd_kick.cpp
@@ -106,10 +106,9 @@ CmdResult CommandKick::Handle(User* user, const Params& parameters)
{
unsigned int them = srcmemb->GetRank();
unsigned int req = HALFOP_VALUE;
- for (std::string::size_type i = 0; i < memb->modes.length(); i++)
+ for (const auto& mh : memb->modes)
{
- ModeHandler* mh = ServerInstance->Modes.FindMode(memb->modes[i], MODETYPE_CHANNEL);
- if (mh && mh->GetLevelRequired(true) > req)
+ if (mh->GetLevelRequired(true) > req)
req = mh->GetLevelRequired(true);
}
diff --git a/src/coremods/core_channel/core_channel.cpp b/src/coremods/core_channel/core_channel.cpp
index e0c501677..f5a0d4734 100644
--- a/src/coremods/core_channel/core_channel.cpp
+++ b/src/coremods/core_channel/core_channel.cpp
@@ -57,12 +57,7 @@ public:
modechangelist.clear();
for (const auto& mode : memb.modes)
- {
- PrefixMode* const pm = ServerInstance->Modes.FindPrefixMode(mode);
- if (!pm)
- continue; // Shouldn't happen
- modechangelist.push_add(pm, memb.user->nick);
- }
+ modechangelist.push_add(mode, memb.user->nick);
if (modechangelist.empty())
{
diff --git a/src/coremods/core_who.cpp b/src/coremods/core_who.cpp
index 9b5935cd1..ae55d0a7d 100644
--- a/src/coremods/core_who.cpp
+++ b/src/coremods/core_who.cpp
@@ -535,7 +535,7 @@ void CommandWho::SendWhoLine(LocalUser* source, const std::vector<std::string>&
if (oplevels.empty())
BuildOpLevels();
- wholine.push(memb && !memb->modes.empty() ? oplevels[memb->modes.front()] : "n/a");
+ wholine.push(memb && memb->GetModeChar() ? oplevels[memb->GetModeChar()] : "n/a");
}
// Include the user's real name.
diff --git a/src/modules/m_httpd_stats.cpp b/src/modules/m_httpd_stats.cpp
index 91bfba6ca..923f82b0a 100644
--- a/src/modules/m_httpd_stats.cpp
+++ b/src/modules/m_httpd_stats.cpp
@@ -183,7 +183,7 @@ namespace Stats
{
data << "<channelmember><uid>" << memb->user->uuid << "</uid><privs>"
<< Sanitize(memb->GetAllPrefixChars()) << "</privs><modes>"
- << memb->modes << "</modes>";
+ << memb->GetAllPrefixModes() << "</modes>";
DumpMeta(data, memb);
data << "</channelmember>";
}
diff --git a/src/modules/m_spanningtree/commands.h b/src/modules/m_spanningtree/commands.h
index 6f3260d35..cf3e1590d 100644
--- a/src/modules/m_spanningtree/commands.h
+++ b/src/modules/m_spanningtree/commands.h
@@ -185,7 +185,8 @@ public:
void add(Membership* memb)
{
- add(memb, memb->modes.begin(), memb->modes.end());
+ const std::string modes = memb->GetAllPrefixModes();
+ add(memb, modes.begin(), modes.end());
}
void clear();
diff --git a/src/modules/m_spanningtree/main.cpp b/src/modules/m_spanningtree/main.cpp
index 2dfd52695..fd130c787 100644
--- a/src/modules/m_spanningtree/main.cpp
+++ b/src/modules/m_spanningtree/main.cpp
@@ -538,7 +538,7 @@ void ModuleSpanningTree::OnUserJoin(Membership* memb, bool sync, bool created_by
if (!memb->modes.empty())
{
params.push(ConvToStr(memb->chan->age));
- params.push(memb->modes);
+ params.push(memb->GetAllPrefixModes());
}
params.Broadcast();
}