diff options
| -rw-r--r-- | include/membership.h | 15 | ||||
| -rw-r--r-- | include/mode.h | 9 | ||||
| -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 |
9 files changed, 45 insertions, 45 deletions
diff --git a/include/membership.h b/include/membership.h index 4a2ddd936..0ec31d3ac 100644 --- a/include/membership.h +++ b/include/membership.h @@ -52,7 +52,7 @@ public: /** List of prefix mode letters this member has, * sorted by prefix rank, highest first */ - std::string modes; + std::set<PrefixMode*, PrefixMode::Sorter> modes; /** Id of this Membership, set by the protocol module, other components should never read or * write this field. @@ -86,15 +86,18 @@ public: */ bool HasMode(const PrefixMode* pm) const { - return (modes.find(pm->GetModeChar()) != std::string::npos); + return std::find(modes.begin(), modes.end(), pm) != modes.end(); } + /** Returns the highest prefix mode for this membership or nullptr if no prefix mode is set. */ + PrefixMode* GetMode() const { return modes.empty() ? nullptr : *modes.begin(); } + /** Returns the rank of this member. * The rank of a member is defined as the rank given by the 'strongest' prefix mode a * member has. See the PrefixMode class description for more info. * @return The rank of the member */ - unsigned int GetRank(); + unsigned int GetRank() { return modes.empty() ? 0 : (*modes.begin())->GetPrefixRank(); } /** Add a prefix character to a user. * Only the core should call this method, usually from @@ -115,6 +118,9 @@ public: */ char GetPrefixChar() const; + /** Get the mode character of the highest prefix mode this user has on the channel or 0 if no prefix modes are set. */ + char GetModeChar() const { return modes.empty() ? 0 : (*modes.begin())->GetModeChar(); } + /** Return all prefix chars this member has. * @return A list of all prefix characters. The prefixes will always * be in rank order, greatest first, as certain IRC clients require @@ -122,6 +128,9 @@ public: */ std::string GetAllPrefixChars() const; + /** Returns all prefix modes this member has ordered descending by rank. */ + std::string GetAllPrefixModes() const; + /** Sends a server notice to this user in the context of this channel. * @param text The contents of the message to send. */ diff --git a/include/mode.h b/include/mode.h index 7bf989757..7a298e222 100644 --- a/include/mode.h +++ b/include/mode.h @@ -377,6 +377,15 @@ protected: bool selfremove = true; public: + /** Sorts a container of PrefixMode* objects descending by their rank. */ + struct Sorter + { + bool operator()(const PrefixMode* lhs, const PrefixMode* rhs) const + { + return lhs->GetPrefixRank() > rhs->GetPrefixRank(); + } + }; + /** * Constructor * @param Creator The module creating this mode 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(); } |
