From d21344342d7c69a2f7ca578692d27c8907219920 Mon Sep 17 00:00:00 2001 From: James Lu Date: Wed, 30 Mar 2016 18:33:44 -0700 Subject: [PATCH] relay: experimental fix for #183 --- plugins/relay.py | 45 +++++++++++++++++++++++---------------------- 1 file changed, 23 insertions(+), 22 deletions(-) diff --git a/plugins/relay.py b/plugins/relay.py index 5805f8d..aaeaed2 100644 --- a/plugins/relay.py +++ b/plugins/relay.py @@ -237,7 +237,6 @@ def getRemoteSid(irc, remoteirc): except ValueError: # Network not initialized yet. log.exception('(%s) Failed to spawn server for %r:', irc.name, remoteirc.name) - irc.disconnect() return else: irc.servers[sid].remote = remoteirc.name @@ -1178,36 +1177,38 @@ 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. - for k, v in relayusers.copy().items(): - if irc.name in v: - del relayusers[k][irc.name] - if k[0] == irc.name: - try: - handle_quit(irc, k[1], 'PYLINK_DISCONNECT', {'text': 'Relay network lost connection.'}) - del relayusers[k] - except KeyError: - pass + with spawnlocks[irc.name]: + for k, v in relayusers.copy().items(): + if irc.name in v: + del relayusers[k][irc.name] + if k[0] == irc.name: + try: + handle_quit(irc, k[1], 'PYLINK_DISCONNECT', {'text': 'Relay network lost connection.'}) + del relayusers[k] + except KeyError: + pass # SQUIT all relay pseudoservers spawned for us, and remove them # from our relay subservers index. - for name, ircobj in world.networkobjects.copy().items(): - if name != irc.name and ircobj.connected.is_set(): + with spawnlocks_servers[irc.name]: + for name, ircobj in world.networkobjects.copy().items(): + if name != irc.name and ircobj.connected.is_set(): + try: + rsid = relayservers[name][irc.name] + except KeyError: + continue + else: + ircobj.proto.squit(ircobj.sid, rsid, text='Relay network lost connection.') + try: - rsid = relayservers[name][irc.name] + del relayservers[name][irc.name] except KeyError: - continue - else: - ircobj.proto.squit(ircobj.sid, rsid, text='Relay network lost connection.') + pass try: - del relayservers[name][irc.name] + del relayservers[irc.name] except KeyError: pass - try: - del relayservers[irc.name] - except KeyError: - pass - utils.add_hook(handle_disconnect, "PYLINK_DISCONNECT") def handle_save(irc, numeric, command, args):