3
0
mirror of https://github.com/jlu5/PyLink.git synced 2025-01-23 10:44:09 +01:00

relay, inspircd: move endburst delay code to a private API

This is a very specific hack that shouldn't be extended across the protocol module spec. So far, all other protocol modules ignore the endburst_delay option anyways.
This commit is contained in:
James Lu 2018-02-10 15:31:12 -08:00
parent ccbd79a95c
commit a425f873b5
2 changed files with 23 additions and 7 deletions

View File

@ -221,15 +221,25 @@ def spawn_relay_server(irc, remoteirc):
"""
if irc.connected.is_set():
try:
# ENDBURST is delayed by 3 secs on supported IRCds to prevent
# triggering join-flood protection and the like.
suffix = irc.serverdata.get('server_suffix', conf.conf.get('relay', {}).get('server_suffix', 'relay'))
# Strip any leading or trailing .'s
suffix = suffix.strip('.')
# On some IRCds (e.g. InspIRCd), we have to delay endburst to prevent triggering
# join flood protections that are counted locally.
needs_delayed_eob = hasattr(irc, '_endburst_delay')
if needs_delayed_eob:
old_eob_delay = irc._endburst_delay
irc._endburst_delay = 3
sid = irc.spawn_server('%s.%s' % (remoteirc.name, suffix),
desc="PyLink Relay network - %s" %
(remoteirc.get_full_network_name()), endburst_delay=3)
desc="PyLink Relay network - %s" %
(remoteirc.get_full_network_name()))
# Set _endburst_delay back to its last value.
if needs_delayed_eob:
irc._endburst_delay = old_eob_delay
except (RuntimeError, ValueError): # Network not initialized yet, or a server name conflict.
log.exception('(%s) Failed to spawn server for %r (possible jupe?):',
irc.name, remoteirc.name)

View File

@ -37,6 +37,10 @@ class InspIRCdProtocol(TS6BaseProtocol):
# Track the modules supported by the uplink.
self._modsupport = set()
# Settable by plugins (e.g. relay) as needed, used to work around +j being triggered
# by bursting users.
self._endburst_delay = 0
### Outgoing commands
def spawn_client(self, nick, ident='null', host='null', realhost=None, modes=set(),
@ -360,15 +364,17 @@ class InspIRCdProtocol(TS6BaseProtocol):
self.servers[sid] = Server(self, uplink, name, internal=True, desc=desc)
self._send_with_prefix(uplink, 'SERVER %s * %s %s :%s' % (name, self.servers[sid].hopcount, sid, desc))
# Endburst delay clutter
def endburstf():
# Delay ENDBURST by X seconds if requested.
if self._aborted.wait(endburst_delay):
if self._aborted.wait(self._endburst_delay):
# We managed to catch the abort flag before sending ENDBURST, so break
log.debug('(%s) stopping endburstf() for %s as aborted was set', self.name, sid)
return
self._send_with_prefix(sid, 'ENDBURST')
if endburst_delay:
if self._endburst_delay:
t = threading.Thread(target=endburstf, name="protocols/inspircd delayed ENDBURST thread for %s@%s" % (sid, self.name))
t.daemon = True
t.start()