summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--include/modules/server.h8
-rw-r--r--src/modules/m_chanhistory.cpp13
-rw-r--r--src/modules/m_spanningtree/utils.cpp17
3 files changed, 35 insertions, 3 deletions
diff --git a/include/modules/server.h b/include/modules/server.h
index 99bd2ee1d..54ea5d58c 100644
--- a/include/modules/server.h
+++ b/include/modules/server.h
@@ -29,6 +29,14 @@ class ServerEventListener : public Events::ModuleEventListener
{
}
+ /** Fired when a channel message is being broadcast across the network.
+ * @param channel The channel which is having a message sent to it.
+ * @param server The server which might have a message broadcast to it.
+ * @return Either MOD_RES_ALLOW to always send the message to the server, MOD_RES_DENY to never
+ * send the message to the server or MOD_RES_PASSTHRU if no module handled the event.
+ */
+ virtual ModResult OnBroadcastMessage(Channel* channel, const Server* server) { return MOD_RES_PASSTHRU; }
+
/** Fired when a server finishes burst
* @param server Server that recently linked and finished burst
*/
diff --git a/src/modules/m_chanhistory.cpp b/src/modules/m_chanhistory.cpp
index fe4bd9477..06840744b 100644
--- a/src/modules/m_chanhistory.cpp
+++ b/src/modules/m_chanhistory.cpp
@@ -20,6 +20,7 @@
#include "inspircd.h"
#include "modules/ircv3_servertime.h"
#include "modules/ircv3_batch.h"
+#include "modules/server.h"
struct HistoryItem
{
@@ -118,7 +119,9 @@ class HistoryMode : public ParamMode<HistoryMode, SimpleExtItem<HistoryList> >
}
};
-class ModuleChanHistory : public Module
+class ModuleChanHistory
+ : public Module
+ , public ServerEventListener
{
HistoryMode m;
bool sendnotice;
@@ -131,7 +134,8 @@ class ModuleChanHistory : public Module
public:
ModuleChanHistory()
- : m(this)
+ : ServerEventListener(this)
+ , m(this)
, botmode(this, "bot")
, batchcap(this)
, batchmanager(this)
@@ -148,6 +152,11 @@ class ModuleChanHistory : public Module
dobots = tag->getBool("bots", true);
}
+ ModResult OnBroadcastMessage(Channel* channel, const Server* server) CXX11_OVERRIDE
+ {
+ return channel->IsModeSet(m) ? MOD_RES_ALLOW : MOD_RES_PASSTHRU;
+ }
+
void OnUserPostMessage(User* user, const MessageTarget& target, const MessageDetails& details) CXX11_OVERRIDE
{
if ((target.type == MessageTarget::TYPE_CHANNEL) && (target.status == 0) && (details.type == MSG_PRIVMSG))
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)