3
0
mirror of https://github.com/jlu5/PyLink.git synced 2024-12-24 19:52:53 +01:00

relay: block until irc.maxnicklen is set, and remove check for "nick already in use" for internal clients

Closes #48. This fixes the edge case where, if a person with a long, cut-off nick changes to another long nick, and the resulting normalized nick is the same,
normalizeNick will start incrementing the separator anyway. The correct behavior is to NOT send any nick changes if the old (normalized) nick and the new nick
match.
This commit is contained in:
James Lu 2015-07-15 13:53:14 -07:00
parent 6e37e1c05d
commit cd244ee89b

View File

@ -16,6 +16,10 @@ dbname = "pylinkrelay.db"
relayusers = defaultdict(dict)
def normalizeNick(irc, netname, nick, separator="/"):
# Block until we know the IRC network's nick length (after capabilities
# are sent)
irc.connected.wait()
orig_nick = nick
protoname = irc.proto.__name__
maxnicklen = irc.maxnicklen
@ -40,8 +44,10 @@ def normalizeNick(irc, netname, nick, separator="/"):
nick = nick[:allowedlength]
nick += suffix
while utils.nickToUid(irc, nick):
# The nick we want exists? Darn, create another one then.
# TODO: factorize
while utils.nickToUid(irc, nick) and not utils.isInternalClient(irc, utils.nickToUid(irc, nick)):
# The nick we want exists? Darn, create another one then, but only if
# the target isn't an internal client!
# Increase the separator length by 1 if the user was already tagged,
# but couldn't be created due to a nick conflict.
# This can happen when someone steals a relay user's nick.