3
0
mirror of https://github.com/jlu5/PyLink.git synced 2025-01-11 12:42:34 +01:00

updateTS: fix handling for outbound modes

Outgoing and incoming modes should be handled the same way - we're only dealing with a "received TS" which could originate from PyLink (sjoin() in protocols) OR the uplink.
This commit is contained in:
James Lu 2016-06-24 13:22:19 -07:00
parent 7f829ba0ec
commit 167963ddc4
5 changed files with 16 additions and 18 deletions

View File

@ -1063,7 +1063,7 @@ class Protocol():
log.debug('Removing client %s from self.irc.servers[%s].users', numeric, sid) log.debug('Removing client %s from self.irc.servers[%s].users', numeric, sid)
self.irc.servers[sid].users.discard(numeric) self.irc.servers[sid].users.discard(numeric)
def updateTS(self, channel, their_ts, modes=[], outbound=True): def updateTS(self, channel, their_ts, modes=[]):
""" """
Merges modes of a channel given the remote TS and a list of modes. Merges modes of a channel given the remote TS and a list of modes.
""" """
@ -1083,10 +1083,11 @@ class Protocol():
our_ts = self.irc.channels[channel].ts our_ts = self.irc.channels[channel].ts
if their_ts < our_ts: if their_ts < our_ts:
# Their TS is older than ours. If we're receiving a mode change, we should # Their TS is older than ours. We should clear our stored modes for the channel and
# clear our stored modes for the channel and apply theirs. Otherwise, if we're # apply the ones in the queue to be set. This is regardless of whether we're sending
# the one setting modes, just drop them. # outgoing modes or receiving some - both are handled the same with a "received" TS,
log.debug("(%s/%s) remote TS of %s is lower than ours %s; outbound mode: %s; setting modes %s", # and comparing it with the one we have.
log.debug("(%s/%s) received TS of %s is lower than ours %s; outbound mode: %s; setting modes %s",
self.irc.name, channel, their_ts, our_ts, outbound, modes) self.irc.name, channel, their_ts, our_ts, outbound, modes)
# Update the channel TS to theirs regardless of whether the mode setting passes. # Update the channel TS to theirs regardless of whether the mode setting passes.
@ -1094,9 +1095,8 @@ class Protocol():
self.irc.name, channel, their_ts, our_ts) self.irc.name, channel, their_ts, our_ts)
self.irc.channels[channel].ts = their_ts self.irc.channels[channel].ts = their_ts
if not outbound: _clear()
_clear() _apply()
_apply()
elif their_ts == our_ts: elif their_ts == our_ts:
log.debug("(%s/%s) remote TS of %s is equal to ours %s; outbound mode: %s; setting modes %s", log.debug("(%s/%s) remote TS of %s is equal to ours %s; outbound mode: %s; setting modes %s",
@ -1107,12 +1107,10 @@ class Protocol():
elif their_ts > our_ts: elif their_ts > our_ts:
log.debug("(%s/%s) remote TS of %s is higher than ours %s; outbound mode: %s; setting modes %s", log.debug("(%s/%s) remote TS of %s is higher than ours %s; outbound mode: %s; setting modes %s",
self.irc.name, channel, their_ts, our_ts, outbound, modes) self.irc.name, channel, their_ts, our_ts, outbound, modes)
# Their TS is younger than ours. If we're setting modes, clear the state # Their TS is younger than ours. Clear the state and replace the modes for the channel
# and replace the modes for the channel with ours. Otherwise, just ignore the # with the ones being set.
# remote's changes. _clear()
if outbound: _apply()
_clear()
_apply()
def _getSid(self, sname): def _getSid(self, sname):
"""Returns the SID of a server with the given name, if present.""" """Returns the SID of a server with the given name, if present."""

View File

@ -528,7 +528,7 @@ class InspIRCdProtocol(TS6BaseProtocol):
# Statekeeping with timestamps # Statekeeping with timestamps
their_ts = int(args[1]) their_ts = int(args[1])
our_ts = self.irc.channels[channel].ts our_ts = self.irc.channels[channel].ts
self.updateTS(channel, their_ts, changedmodes, outbound=False) self.updateTS(channel, their_ts, changedmodes)
return {'channel': channel, 'users': namelist, 'modes': parsedmodes, 'ts': their_ts} return {'channel': channel, 'users': namelist, 'modes': parsedmodes, 'ts': their_ts}

View File

@ -1044,7 +1044,7 @@ class P10Protocol(Protocol):
# Statekeeping with timestamps # Statekeeping with timestamps
their_ts = int(args[1]) their_ts = int(args[1])
our_ts = self.irc.channels[channel].ts our_ts = self.irc.channels[channel].ts
self.updateTS(channel, their_ts, changedmodes, outbound=False) self.updateTS(channel, their_ts, changedmodes)
return {'channel': channel, 'users': namelist, 'modes': parsedmodes, 'ts': their_ts} return {'channel': channel, 'users': namelist, 'modes': parsedmodes, 'ts': their_ts}

View File

@ -477,7 +477,7 @@ class TS6Protocol(TS6BaseProtocol):
# Statekeeping with timestamps # Statekeeping with timestamps
their_ts = int(args[0]) their_ts = int(args[0])
our_ts = self.irc.channels[channel].ts our_ts = self.irc.channels[channel].ts
self.updateTS(channel, their_ts, changedmodes, outbound=False) self.updateTS(channel, their_ts, changedmodes)
return {'channel': channel, 'users': namelist, 'modes': parsedmodes, 'ts': their_ts} return {'channel': channel, 'users': namelist, 'modes': parsedmodes, 'ts': their_ts}

View File

@ -591,7 +591,7 @@ class UnrealProtocol(TS6BaseProtocol):
our_ts = self.irc.channels[channel].ts our_ts = self.irc.channels[channel].ts
their_ts = int(args[0]) their_ts = int(args[0])
self.updateTS(channel, their_ts, changedmodes, outbound=False) self.updateTS(channel, their_ts, changedmodes)
return {'channel': channel, 'users': namelist, 'modes': self.irc.channels[channel].modes, 'ts': their_ts} return {'channel': channel, 'users': namelist, 'modes': self.irc.channels[channel].modes, 'ts': their_ts}