From abcbe86dc597a7c3e3ea18dcb3339b8e8400257b Mon Sep 17 00:00:00 2001 From: Sadie Powell Date: Wed, 17 Jun 2026 14:49:38 +0100 Subject: Add a WriteNumeric overload that takes a vector of numerics. --- include/users.h | 2 ++ src/coremods/core_info/cmd_commands.cpp | 4 +--- src/coremods/core_info/isupport.cpp | 13 ++++--------- src/coremods/core_who.cpp | 3 +-- src/modules/m_spanningtree/remoteuser.cpp | 6 ++++++ src/modules/m_spanningtree/remoteuser.h | 1 + src/users.cpp | 32 +++++++++++++++++++++++++++++-- 7 files changed, 45 insertions(+), 16 deletions(-) diff --git a/include/users.h b/include/users.h index 6721a6bb4..c5f07154f 100644 --- a/include/users.h +++ b/include/users.h @@ -694,6 +694,7 @@ public: * @param numeric The numeric to send. */ void WriteNumeric(const Numeric::Numeric& numeric); + void WriteNumeric(const std::vector& numeric); /** Sends a notice to this user. * @param numeric The numeric code to send. @@ -711,6 +712,7 @@ public: * @param numeric The numeric to send. */ virtual void WriteRemoteNumeric(const Numeric::Numeric& numeric); + virtual void WriteRemoteNumeric(const std::vector& numeric); /** Sends a notice from the local server to this user. * @param numeric The numeric code to send. diff --git a/src/coremods/core_info/cmd_commands.cpp b/src/coremods/core_info/cmd_commands.cpp index 4ce437391..af85ecca4 100644 --- a/src/coremods/core_info/cmd_commands.cpp +++ b/src/coremods/core_info/cmd_commands.cpp @@ -70,9 +70,7 @@ CmdResult CommandCommands::HandleLocal(LocalUser* user, const Params& parameters return lhs.GetParams()[0] < rhs.GetParams()[0]; }); - for (const auto& numeric : numerics) - user->WriteNumeric(numeric); - + user->WriteNumeric(numerics); user->WriteNumeric(RPL_COMMANDSEND, "End of COMMANDS list"); return CmdResult::SUCCESS; } diff --git a/src/coremods/core_info/isupport.cpp b/src/coremods/core_info/isupport.cpp index 1ad2e0f93..846fe67f0 100644 --- a/src/coremods/core_info/isupport.cpp +++ b/src/coremods/core_info/isupport.cpp @@ -146,8 +146,7 @@ void ISupportManager::Build() if (numerics == diffnumerics.end()) continue; // Should never happen. - for (const auto& numeric : numerics->second) - user->WriteNumeric(numeric); + user->WriteNumeric(numerics->second); } } @@ -189,16 +188,12 @@ void ISupportManager::ChangeClass(LocalUser* user, const std::shared_ptr diffnumerics; BuildNumerics(difftokens, diffnumerics); - for (const auto& numeric : diffnumerics) - user->WriteNumeric(numeric); + user->WriteNumeric(diffnumerics); } void ISupportManager::SendTo(LocalUser* user) const { auto numerics = cachednumerics.find(user->GetClass()); - if (numerics == cachednumerics.end()) - return; // Should never happen. - - for (const auto& numeric : numerics->second) - user->WriteNumeric(numeric); + if (numerics != cachednumerics.end()) + user->WriteNumeric(numerics->second); } diff --git a/src/coremods/core_who.cpp b/src/coremods/core_who.cpp index 0880310d6..6a614567d 100644 --- a/src/coremods/core_who.cpp +++ b/src/coremods/core_who.cpp @@ -626,8 +626,7 @@ CmdResult CommandWho::HandleLocal(LocalUser* user, const Params& parameters) WhoUsers(user, parameters, ServerInstance->Users.GetUsers(), data); // Send the results to the source. - for (const auto& numeric : data.results) - user->WriteNumeric(numeric); + user->WriteNumeric(data.results); user->WriteNumeric(RPL_ENDOFWHO, (data.matchtext.empty() ? "*" : data.matchtext.c_str()), "End of /WHO list."); // Penalize the source a bit for large queries with one unit of penalty per 200 results. diff --git a/src/modules/m_spanningtree/remoteuser.cpp b/src/modules/m_spanningtree/remoteuser.cpp index 717a6fd9f..28e1a22f7 100644 --- a/src/modules/m_spanningtree/remoteuser.cpp +++ b/src/modules/m_spanningtree/remoteuser.cpp @@ -31,3 +31,9 @@ void SpanningTree::RemoteUser::WriteRemoteNumeric(const Numeric::Numeric& numeri { CommandNum::Builder(this, numeric).Unicast(this); } + +void SpanningTree::RemoteUser::WriteRemoteNumeric(const std::vector& numerics) +{ + for (const auto& numeric : numerics) + CommandNum::Builder(this, numeric).Unicast(this); +} diff --git a/src/modules/m_spanningtree/remoteuser.h b/src/modules/m_spanningtree/remoteuser.h index c503eb0bb..7affa129a 100644 --- a/src/modules/m_spanningtree/remoteuser.h +++ b/src/modules/m_spanningtree/remoteuser.h @@ -31,4 +31,5 @@ class SpanningTree::RemoteUser final public: RemoteUser(const std::string& uid, Server* srv); void WriteRemoteNumeric(const Numeric::Numeric& numeric) override; + void WriteRemoteNumeric(const std::vector& numeric) override; }; diff --git a/src/users.cpp b/src/users.cpp index dbbbc8c13..b366ed951 100644 --- a/src/users.cpp +++ b/src/users.cpp @@ -773,9 +773,7 @@ void User::WriteNumeric(const Numeric::Numeric& numeric) return; ModResult modres; - FIRST_MOD_RESULT(OnNumeric, modres, (this, numeric)); - if (modres == MOD_RES_DENY) return; @@ -783,6 +781,31 @@ void User::WriteNumeric(const Numeric::Numeric& numeric) localuser->Send(ServerInstance->GetRFCEvents().numeric, numericmsg); } +void User::WriteNumeric(const std::vector& numerics) +{ + auto* const lthis = IS_LOCAL(this); + if (!lthis) + return; + + ClientProtocol::MessageList messages; + for (const auto& numeric : numerics) + { + ModResult modres; + FIRST_MOD_RESULT(OnNumeric, modres, (this, numeric)); + if (modres != MOD_RES_DENY) + messages.push_back(new ClientProtocol::Messages::Numeric(numeric, this)); + } + + if (!messages.empty()) + { + ClientProtocol::Event numericev(ServerInstance->GetRFCEvents().numeric); + numericev.SetMessageList(messages); + lthis->Send(numericev); + stdalgo::delete_all(messages); + } +} + + void User::WriteRemoteNotice(const std::string& text) { ServerInstance->PI->SendMessage(this, text, MessageType::NOTICE); @@ -877,6 +900,11 @@ void User::WriteRemoteNumeric(const Numeric::Numeric& numeric) WriteNumeric(numeric); } +void User::WriteRemoteNumeric(const std::vector& numerics) +{ + WriteNumeric(numerics); +} + /* return 0 or 1 depending if users u and u2 share one or more common channels * (used by QUIT, NICK etc which arent channel specific notices) * -- cgit v1.3.1-10-gc9f91