aboutsummaryrefslogtreecommitdiffstats
path: root/modules
diff options
context:
space:
mode:
authorGravatar Sadie Powell2026-06-24 13:41:06 +0100
committerGravatar Sadie Powell2026-06-24 21:22:25 +0100
commitd1695ff82dd85eecaeb56bd47cc4c2333e1abcf3 (patch)
treeb0c93c1a2cbe4140719ce383525dba034d57f303 /modules
parentDeduplicate mismatch error messages. (diff)
Parse module link data when we receive it.
Diffstat (limited to 'modules')
-rw-r--r--modules/spanningtree/capab.cpp19
-rw-r--r--modules/spanningtree/main.cpp7
-rw-r--r--modules/spanningtree/treesocket.h2
-rw-r--r--modules/spanningtree/utils.cpp8
-rw-r--r--modules/spanningtree/utils.h3
5 files changed, 15 insertions, 24 deletions
diff --git a/modules/spanningtree/capab.cpp b/modules/spanningtree/capab.cpp
index 161565843..86be748ac 100644
--- a/modules/spanningtree/capab.cpp
+++ b/modules/spanningtree/capab.cpp
@@ -123,7 +123,7 @@ namespace
}
// END COMPATIBILITY CODE.
}
- modules[modname] = SpanningTreeUtilities::BuildLinkString(module);
+ module->GetLinkData(modules[modname]);
}
return modules;
}
@@ -208,7 +208,7 @@ namespace
std::ostringstream diffconfig;
std::ostringstream localmissing;
std::ostringstream remotemissing;
- for (const auto& [name, linkdata] : *remote)
+ for (const auto& [name, otherdata] : *remote)
{
auto moditer = local.find(name);
if (moditer == local.end())
@@ -220,7 +220,6 @@ namespace
}
// Parse and compare the link data.
- Module::LinkData otherdata = Percent::DecodeQuery(linkdata);
if (!CompareModuleData(moditer->second, otherdata, diffconfig))
okay = false;
local.erase(moditer);
@@ -262,12 +261,11 @@ namespace
std::string FormatModules(ModuleFlags property, uint16_t protocol)
{
std::ostringstream modules;
- CapabData::ModuleMap mymodules = BuildModuleList(property, protocol);
- for (const auto& [module, linkdata] : mymodules)
+ for (const auto& [module, linkdata] : BuildModuleList(property, protocol))
{
modules << module;
if (!linkdata.empty())
- modules << '=' << linkdata;
+ modules << '=' << Percent::EncodeQuery(linkdata);
modules << ' ';
}
return modules.str();
@@ -339,11 +337,14 @@ namespace
StringSplitter modstream(modlist);
for (std::string mod; modstream.GetToken(mod); )
{
- size_t split = mod.find('=');
+ const auto split = mod.find('=');
if (split == std::string::npos)
- map.emplace(mod, "");
+ map.emplace(mod, Module::LinkData()); // No link data.
else
- map.emplace(mod.substr(0, split), mod.substr(split + 1));
+ {
+ const auto linkdata = Percent::DecodeQuery(mod.substr(split + 1));
+ map.emplace(mod.substr(0, split), linkdata);
+ }
}
}
}
diff --git a/modules/spanningtree/main.cpp b/modules/spanningtree/main.cpp
index 6a3bf5495..bb940fad4 100644
--- a/modules/spanningtree/main.cpp
+++ b/modules/spanningtree/main.cpp
@@ -731,9 +731,10 @@ namespace
if (loading)
{
- const std::string linkstring = SpanningTreeUtilities::BuildLinkString(mod);
- if (!linkstring.empty())
- buffer << '=' << linkstring;
+ Module::LinkData data;
+ mod->GetLinkData(data);
+ if (!data.empty())
+ buffer << '=' << Percent::EncodeQuery(data);
}
CommandMetadata::Builder("modules", buffer.str()).Broadcast();
diff --git a/modules/spanningtree/treesocket.h b/modules/spanningtree/treesocket.h
index 2eb0791ff..5f43c0068 100644
--- a/modules/spanningtree/treesocket.h
+++ b/modules/spanningtree/treesocket.h
@@ -93,7 +93,7 @@ struct CapabData final
using CapabilityMap = insp::casemapped_map<std::string>;
// A map of module names to their link data.
- using ModuleMap = insp::casemapped_map<std::string>;
+ using ModuleMap = insp::casemapped_map<Module::LinkData>;
// The capabilities (settings) configured by the remote server.
CapabilityMap capabilities;
diff --git a/modules/spanningtree/utils.cpp b/modules/spanningtree/utils.cpp
index 5feae89c6..449a33d35 100644
--- a/modules/spanningtree/utils.cpp
+++ b/modules/spanningtree/utils.cpp
@@ -382,14 +382,6 @@ void SpanningTreeUtilities::SendChannelMessage(const User* source, const Channel
}
}
-std::string SpanningTreeUtilities::BuildLinkString(const ModulePtr& mod)
-{
- Module::LinkData data;
- mod->GetLinkData(data);
-
- return Percent::EncodeQuery(data);
-}
-
void SpanningTreeUtilities::SendListLimits(Channel* chan, TreeSocket* sock)
{
std::stringstream buffer;
diff --git a/modules/spanningtree/utils.h b/modules/spanningtree/utils.h
index bc9a26fe8..3ea58957f 100644
--- a/modules/spanningtree/utils.h
+++ b/modules/spanningtree/utils.h
@@ -170,9 +170,6 @@ public:
*/
void SendChannelMessage(const User* source, const Channel* target, const std::string& text, char status, const ClientProtocol::TagMap& tags, const User::List& exempt_list, const char* message_type, const TreeSocket* omit = nullptr) const;
- // Builds link data to be sent to another server.
- static std::string BuildLinkString(const ModulePtr& mod);
-
/** Send the channel list mode limits to either the specified server or all servers if nullptr. */
static void SendListLimits(Channel* chan, TreeSocket* sock = nullptr);
};