aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorGravatar Sadie Powell2026-06-17 14:49:38 +0100
committerGravatar Sadie Powell2026-06-17 15:01:26 +0100
commitabcbe86dc597a7c3e3ea18dcb3339b8e8400257b (patch)
tree860642444a756aba7017260f1742bbf178be1822
parentAllow modules to send the ISupport list to clients. (diff)
Add a WriteNumeric overload that takes a vector of numerics.
-rw-r--r--include/users.h2
-rw-r--r--src/coremods/core_info/cmd_commands.cpp4
-rw-r--r--src/coremods/core_info/isupport.cpp13
-rw-r--r--src/coremods/core_who.cpp3
-rw-r--r--src/modules/m_spanningtree/remoteuser.cpp6
-rw-r--r--src/modules/m_spanningtree/remoteuser.h1
-rw-r--r--src/users.cpp32
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::Numeric>& 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::Numeric>& 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<Connect
std::vector<Numeric::Numeric> 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<Numeric::Numeric>& 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::Numeric>& 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<Numeric::Numeric>& 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<Numeric::Numeric>& 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)
*