mirror of
https://github.com/osmarks/ngircd.git
synced 2025-01-19 12:02:52 +00:00
a9cbb375b7
Filenames have been too long and couldn't be stored in all tar archive formats ...
94 lines
3.5 KiB
Diff
94 lines
3.5 KiB
Diff
From 88b2b14a76b8ee053b1f6ea64139350260590043 Mon Sep 17 00:00:00 2001
|
|
From: DukePyrolator <DukePyrolator@anope.org>
|
|
Date: Mon, 22 Aug 2011 14:55:07 +0200
|
|
Subject: [PATCH 04/16] ngircd: Do PING-PONG on server burst to "sync servers"
|
|
|
|
Imagine we had three servers, A, B & C linked like so: A<->B<->C:
|
|
|
|
If Anope is linked to A and B splits from A and then reconnects B
|
|
introduces itself, introduces C, sends EOS for C, introduces B's clients
|
|
introduces C's clients, sends EOS for B. This causes all of C's clients
|
|
to be introduced with their server "not syncing".
|
|
|
|
We now send a PING immediately when receiving a new server and then
|
|
finish sync once we get a pong back from that server.
|
|
---
|
|
modules/protocol/ngircd.cpp | 28 ++++++++++++++++++++++++++--
|
|
1 files changed, 26 insertions(+), 2 deletions(-)
|
|
|
|
diff --git a/modules/protocol/ngircd.cpp b/modules/protocol/ngircd.cpp
|
|
index 790b8f4..89aecfd 100644
|
|
--- a/modules/protocol/ngircd.cpp
|
|
+++ b/modules/protocol/ngircd.cpp
|
|
@@ -108,11 +108,13 @@ class ngIRCdProto : public IRCDProto
|
|
|
|
void SendModeInternal(const BotInfo *bi, const Channel *dest, const Anope::string &buf)
|
|
{
|
|
+Log(LOG_DEBUG) << "SendModeInternal 1";
|
|
send_cmd(bi ? bi->nick : Config->ServerName, "MODE %s %s", dest->name.c_str(), buf.c_str());
|
|
}
|
|
|
|
void SendModeInternal(const BotInfo *bi, const User *u, const Anope::string &buf)
|
|
{
|
|
+Log(LOG_DEBUG) << "SendModeInternal 2";
|
|
send_cmd(bi ? bi->nick : Config->ServerName, "MODE %s %s", u->nick.c_str(), buf.c_str());
|
|
}
|
|
|
|
@@ -212,6 +214,8 @@ class ngIRCdIRCdMessage : public IRCdMessage
|
|
do_server("", params[0], 0, params[2], params[1]);
|
|
else
|
|
do_server(source, params[0], params[1].is_pos_number_only() ? convertTo<unsigned>(params[1]) : 0, params[3], params[2]);
|
|
+
|
|
+ ircdproto->SendPing(Config->ServerName, params[0]);
|
|
return true;
|
|
}
|
|
|
|
@@ -253,6 +257,25 @@ class ngIRCdIRCdMessage : public IRCdMessage
|
|
}
|
|
};
|
|
|
|
+/** This is here because:
|
|
+ *
|
|
+ * If we had three servers, A, B & C linked like so: A<->B<->C
|
|
+ * If Anope is linked to A and B splits from A and then reconnects
|
|
+ * B introduces itself, introduces C, sends EOS for C, introduces Bs clients
|
|
+ * introduces Cs clients, sends EOS for B. This causes all of Cs clients to be introduced
|
|
+ * with their server "not syncing". We now send a PING immediately when receiving a new server
|
|
+ * and then finish sync once we get a pong back from that server.
|
|
+ */
|
|
+bool event_pong(const Anope::string &source, const std::vector<Anope::string> ¶ms)
|
|
+{
|
|
+ Server *s = Server::Find(source);
|
|
+ if (s && !s->IsSynced())
|
|
+ s->Sync(false);
|
|
+ return true;
|
|
+}
|
|
+
|
|
+
|
|
+
|
|
/*
|
|
* CHANINFO <chan> +<modes>
|
|
* CHANINFO <chan> +<modes> :<topic>
|
|
@@ -416,7 +439,7 @@ bool event_376(const Anope::string &source, const std::vector<Anope::string> &pa
|
|
class ProtongIRCd : public Module
|
|
{
|
|
Message message_kick, message_pass, message_njoin, message_chaninfo, message_005,
|
|
- message_442, message_376;
|
|
+ message_442, message_376, message_pong;
|
|
|
|
ngIRCdProto ircd_proto;
|
|
ngIRCdIRCdMessage ircd_message;
|
|
@@ -457,7 +480,8 @@ class ProtongIRCd : public Module
|
|
ProtongIRCd(const Anope::string &modname, const Anope::string &creator) : Module(modname, creator, PROTOCOL),
|
|
message_kick("KICK", event_kick), message_pass("PASS", event_pass),
|
|
message_njoin("NJOIN", event_njoin), message_chaninfo("CHANINFO", event_chaninfo),
|
|
- message_005("005", event_005), message_442("442", event_442), message_376("376", event_376)
|
|
+ message_005("005", event_005), message_442("442", event_442), message_376("376", event_376),
|
|
+ message_pong("PONG", event_pong)
|
|
{
|
|
this->SetAuthor("Anope");
|
|
|
|
--
|
|
1.7.8.3
|
|
|