3
0
mirror of https://github.com/jlu5/PyLink.git synced 2024-11-28 05:29:25 +01:00

inspircd: make handle_part return a list of channels, not just one

Some IRCds, like TS6, allow sending multiple channels (as a comma-separated list) in PART.

Update relay accordingly.
This commit is contained in:
James Lu 2015-07-20 19:52:52 -07:00
parent 3494d4f794
commit 72be5ca79c
2 changed files with 22 additions and 20 deletions

View File

@ -258,15 +258,16 @@ def handle_nick(irc, numeric, command, args):
utils.add_hook(handle_nick, 'NICK') utils.add_hook(handle_nick, 'NICK')
def handle_part(irc, numeric, command, args): def handle_part(irc, numeric, command, args):
channel = args['channel'] channels = args['channels']
text = args['text'] text = args['text']
for netname, user in relayusers[(irc.name, numeric)].copy().items(): for channel in channels:
remoteirc = utils.networkobjects[netname] for netname, user in relayusers[(irc.name, numeric)].copy().items():
remotechan = findRemoteChan(irc, remoteirc, channel) remoteirc = utils.networkobjects[netname]
remoteirc.proto.partClient(remoteirc, user, remotechan, text) remotechan = findRemoteChan(irc, remoteirc, channel)
if not remoteirc.users[user].channels: remoteirc.proto.partClient(remoteirc, user, remotechan, text)
remoteirc.proto.quitClient(remoteirc, user, 'Left all shared channels.') if not remoteirc.users[user].channels:
del relayusers[(irc.name, numeric)][remoteirc.name] remoteirc.proto.quitClient(remoteirc, user, 'Left all shared channels.')
del relayusers[(irc.name, numeric)][remoteirc.name]
utils.add_hook(handle_part, 'PART') utils.add_hook(handle_part, 'PART')
def handle_privmsg(irc, numeric, command, args): def handle_privmsg(irc, numeric, command, args):

View File

@ -329,18 +329,19 @@ def handle_kick(irc, source, command, args):
return {'channel': channel, 'target': kicked, 'text': args[2]} return {'channel': channel, 'target': kicked, 'text': args[2]}
def handle_part(irc, source, command, args): def handle_part(irc, source, command, args):
channel = args[0].lower() channels = args[0].lower().split(',')
# We should only get PART commands for channels that exist, right?? for channel in channels:
irc.channels[channel].removeuser(source) # We should only get PART commands for channels that exist, right??
try: irc.channels[channel].removeuser(source)
irc.users[source].channels.discard(channel) try:
except KeyError: irc.users[source].channels.discard(channel)
log.debug("(%s) handle_part: KeyError trying to remove %r from %r's channel list?", irc.name, channel, source) except KeyError:
try: log.debug("(%s) handle_part: KeyError trying to remove %r from %r's channel list?", irc.name, channel, source)
reason = args[1] try:
except IndexError: reason = args[1]
reason = '' except IndexError:
return {'channel': channel, 'text': reason} reason = ''
return {'channels': channels, 'text': reason}
def handle_error(irc, numeric, command, args): def handle_error(irc, numeric, command, args):
irc.connected = False irc.connected = False