3
0
mirror of https://github.com/jlu5/PyLink.git synced 2025-01-23 18:54:05 +01:00

relay: implement optional network disconnect announcements

Closes #421.
This commit is contained in:
James Lu 2017-02-24 21:15:40 -08:00
parent 0ebb52e64f
commit cd3d795296
2 changed files with 29 additions and 0 deletions

View File

@ -584,6 +584,18 @@ relay:
# silently dropped. This defaults to True for consistency with older releases.
#accept_weird_senders: false
# Optionally defines a message that should be sent to all leaf channels that a network owns, when
# it disconnects. This uses a template string as documented at
# https://docs.python.org/3/library/string.html#template-strings, with the following substitutions:
# $network: the name of the network that this message is being announced to
# $channel: the channel that this message is being announced to
# $homenetwork: the name of the network that disconnected
# $homechannel: the original name of the channel this message is being announced to
# If this option is empty or not set, no announcement is made.
#disconnect_announcement: >-
# Network $homenetwork has disconnected: $channel will remain open as the link is
# re-established, but new links will be disabled.
#servprotect:
# This block configures the servprotect plugin; you don't need this if you aren't using it.

View File

@ -1472,6 +1472,7 @@ utils.add_hook(handle_services_login, 'CLIENT_SERVICES_LOGIN')
def handle_disconnect(irc, numeric, command, args):
"""Handles IRC network disconnections (internal hook)."""
# Quit all of our users' representations on other nets, and remove
# them from our relay clients index.
log.debug('(%s) Grabbing spawnlocks[%s]', irc.name, irc.name)
@ -1506,6 +1507,22 @@ def handle_disconnect(irc, numeric, command, args):
spawnlocks_servers[irc.name].release()
# Announce the disconnects to every leaf channel where the disconnected network is the owner
announcement = conf.conf.get('relay', {}).get('disconnect_announcement')
if announcement:
with db_lock:
for chanpair, entrydata in db.items():
if chanpair[0] == irc.name:
for leaf in entrydata['links']:
log.debug('(%s) relay: Announcing disconnect to %s%s', irc.name,
leaf[0], leaf[1])
remoteirc = world.networkobjects.get(leaf[0])
if remoteirc and remoteirc.connected.is_set():
text = string.Template(announcement).safe_substitute(
{'homenetwork': irc.name, 'homechannel': chanpair[1],
'network': remoteirc.name, 'channel': leaf[1]})
remoteirc.msg(leaf[1], text, loopback=False)
utils.add_hook(handle_disconnect, "PYLINK_DISCONNECT")
def nick_collide(irc, target):