3
0
mirror of https://github.com/jlu5/PyLink.git synced 2024-12-18 08:02:51 +01:00

relay: make handle_quit error-tolerant if the target is missing

In cases where multiple networks disconnect simultaneously, the relay user for a quitting client from the first dying network might have also disappeared while handle_disconnect was processing the disconnection of a second dying network. This should take into account those situations.
This commit is contained in:
James Lu 2016-05-01 14:21:50 -07:00
parent 54987fde4e
commit bb8a548e74

View File

@ -811,10 +811,15 @@ def handle_join(irc, numeric, command, args):
utils.add_hook(handle_join, 'JOIN') utils.add_hook(handle_join, 'JOIN')
def handle_quit(irc, numeric, command, args): def handle_quit(irc, numeric, command, args):
# Lock the user spawning mechanism before proceeding, since we're going to be
# deleting client from the relayusers cache.
with spawnlocks[irc.name]: with spawnlocks[irc.name]:
for netname, user in relayusers[(irc.name, numeric)].copy().items(): for netname, user in relayusers[(irc.name, numeric)].copy().items():
remoteirc = world.networkobjects[netname] remoteirc = world.networkobjects[netname]
try: # Try to quit the client. If this fails because they're missing, bail.
remoteirc.proto.quit(user, args['text']) remoteirc.proto.quit(user, args['text'])
except LookupError:
pass
del relayusers[(irc.name, numeric)] del relayusers[(irc.name, numeric)]
utils.add_hook(handle_quit, 'QUIT') utils.add_hook(handle_quit, 'QUIT')