Closes #331.
{
}
+ /** 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
*/
#include "inspircd.h"
#include "modules/ircv3_servertime.h"
#include "modules/ircv3_batch.h"
+#include "modules/server.h"
struct HistoryItem
{
}
};
-class ModuleChanHistory : public Module
+class ModuleChanHistory
+ : public Module
+ , public ServerEventListener
{
HistoryMode m;
bool sendnotice;
public:
ModuleChanHistory()
- : m(this)
+ : ServerEventListener(this)
+ , m(this)
, botmode(this, "bot")
, batchcap(this)
, batchmanager(this)
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))
#include "treesocket.h"
#include "resolvers.h"
#include "commandbuilder.h"
+#include "modules/server.h"
SpanningTreeUtilities* Utils = NULL;
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)
{
{
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)