summaryrefslogtreecommitdiff
path: root/src/modules/m_spanningtree
diff options
context:
space:
mode:
authorPeter Powell <petpow@saberuk.com>2018-09-29 16:19:26 +0100
committerPeter Powell <petpow@saberuk.com>2018-10-01 12:34:47 +0100
commit75e144b55e761b663958599dc40dc8fd670445db (patch)
treebcee301fb5c4e190596d8deac95cc71a29352f8b /src/modules/m_spanningtree
parent36e701f4abfa6d8fc4f096be023a681a6b7cec2e (diff)
Fix the chanhistory module being inconsistent across servers.
Closes #331.
Diffstat (limited to 'src/modules/m_spanningtree')
-rw-r--r--src/modules/m_spanningtree/utils.cpp17
1 files changed, 16 insertions, 1 deletions
diff --git a/src/modules/m_spanningtree/utils.cpp b/src/modules/m_spanningtree/utils.cpp
index cde627e21..61a6868b3 100644
--- a/src/modules/m_spanningtree/utils.cpp
+++ b/src/modules/m_spanningtree/utils.cpp
@@ -28,6 +28,7 @@
#include "treesocket.h"
#include "resolvers.h"
#include "commandbuilder.h"
+#include "modules/server.h"
SpanningTreeUtilities* Utils = NULL;
@@ -144,6 +145,7 @@ void SpanningTreeUtilities::GetListOfServersForChannel(Channel* c, TreeSocketSet
minrank = mh->GetPrefixRank();
}
+ TreeServer::ChildServers children = TreeRoot->GetChildren();
const Channel::MemberMap& ulist = c->GetUsers();
for (Channel::MemberMap::const_iterator i = ulist.begin(); i != ulist.end(); ++i)
{
@@ -157,9 +159,22 @@ void SpanningTreeUtilities::GetListOfServersForChannel(Channel* c, TreeSocketSet
{
TreeServer* best = TreeServer::Get(i->first);
list.insert(best->GetSocket());
+
+ TreeServer::ChildServers::iterator citer = std::find(children.begin(), children.end(), best);
+ if (citer != children.end())
+ children.erase(citer);
}
}
- return;
+
+ // Check whether the servers which do not have users in the channel might need this message. This
+ // is used to keep the chanhistory module synchronised between servers.
+ for (TreeServer::ChildServers::const_iterator i = children.begin(); i != children.end(); ++i)
+ {
+ ModResult result;
+ FIRST_MOD_RESULT_CUSTOM(Creator->GetEventProvider(), ServerEventListener, OnBroadcastMessage, result, (c, *i));
+ if (result == MOD_RES_ALLOW)
+ list.insert((*i)->GetSocket());
+ }
}
void SpanningTreeUtilities::DoOneToAllButSender(const CmdBuilder& params, TreeServer* omitroute)