diff options
| author | 2022-05-17 13:02:58 +0100 | |
|---|---|---|
| committer | 2022-05-17 13:02:58 +0100 | |
| commit | ec217059c38f4de854338ccabf669d2a77e6c94d (patch) | |
| tree | 97b65be2fbc696cfd251b0165a29f09c000deae2 /src | |
| parent | Require 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.cpp | 45 | ||||
| -rw-r--r-- | src/coremods/core_channel/cmd_kick.cpp | 5 | ||||
| -rw-r--r-- | src/coremods/core_channel/core_channel.cpp | 7 | ||||
| -rw-r--r-- | src/coremods/core_who.cpp | 2 | ||||
| -rw-r--r-- | src/modules/m_httpd_stats.cpp | 2 | ||||
| -rw-r--r-- | src/modules/m_spanningtree/commands.h | 3 | ||||
| -rw-r--r-- | src/modules/m_spanningtree/main.cpp | 2 |
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(); } |
