3
0
mirror of https://github.com/jlu5/PyLink.git synced 2024-11-27 21:19:31 +01:00

relay: make default nick tagging and separator global options (#116)

This commit is contained in:
James Lu 2016-07-10 23:32:04 -07:00
parent 1b0829f401
commit 5bfba0a411
2 changed files with 42 additions and 16 deletions

View File

@ -104,10 +104,6 @@ servers:
# not set. # not set.
pingfreq: 90 pingfreq: 90
# Separator character (used by relay). Making this include anything other
# than letters, numbers, or /|_`-[]^ will void your support.
separator: "/"
# If enabled, this opts this network out of relay IP sharing. i.e. this network # If enabled, this opts this network out of relay IP sharing. i.e. this network
# will not have its users' IPs sent across the relay, and it will not see any # will not have its users' IPs sent across the relay, and it will not see any
# IPs of other networks' users. # IPs of other networks' users.
@ -400,6 +396,16 @@ relay:
# Defaults to False. # Defaults to False.
show_netsplits: false show_netsplits: false
# Sets the default Relay separator. Defaults to / if not specified. The "separator"
# option in server blocks override this if specified.
separator: "/"
# Determines whether all nicks will be tagged by default, instead of only when a
# nick collision happens. It is HIGHLY RECOMMENDED you enable this, unless you're
# absolutely sure NO ONE will be using the same nick on 2 or more networks in your
# relay. Leaving this off will make their lives very miserable. You have been warned!
tag_nicks: true
games: games:
# Sets the nick of the Games service, if you're using it. # Sets the nick of the Games service, if you're using it.
nick: Games nick: Games

View File

@ -92,10 +92,23 @@ def die(sourceirc):
allowed_chars = string.digits + string.ascii_letters + '/^|\\-_[]`' allowed_chars = string.digits + string.ascii_letters + '/^|\\-_[]`'
fallback_separator = '|' fallback_separator = '|'
def normalizeNick(irc, netname, nick, separator=None, uid=''): def normalizeNick(irc, netname, nick, times_tagged=0, uid=''):
"""Creates a normalized nickname for the given nick suitable for """
introduction to a remote network (as a relay client).""" Creates a normalized nickname for the given nick suitable for introduction to a remote network
separator = separator or irc.serverdata.get('separator') or "/" (as a relay client).
UID is optional for checking regular nick changes, to make sure that the sender doesn't get
marked as nick-colliding with itself.
"""
# Get the nick/net separator
separator = irc.serverdata.get('separator') or \
conf.conf.get('relay', {}).get('separator') or "/"
# Figure out whether we tag nicks by default or not.
if times_tagged == 0 and conf.conf.get('relay', {}).get('tag_nicks'):
times_tagged = 1
log.debug('(%s) relay.normalizeNick: using %r as separator.', irc.name, separator) log.debug('(%s) relay.normalizeNick: using %r as separator.', irc.name, separator)
orig_nick = nick orig_nick = nick
protoname = irc.protoname protoname = irc.protoname
@ -118,15 +131,21 @@ def normalizeNick(irc, netname, nick, separator=None, uid=''):
# Nicks starting with - are likewise not valid. # Nicks starting with - are likewise not valid.
nick = '_' + nick nick = '_' + nick
suffix = separator + netname # Maximum allowed length that relay nicks may have, minus the /network tag if used.
nick = nick[:maxnicklen] allowedlength = maxnicklen
# Maximum allowed length of a nickname, minus the obligatory /network tag.
allowedlength = maxnicklen - len(suffix) # Track how many times the given nick has been tagged. If this is 0, no tag is used.
# If this is 1, a /network tag is added. Otherwise, keep adding one character to the
# separator: GLolol -> GLolol/net1 -> GLolol//net1 -> ...
if times_tagged >= 1:
suffix = "%s%s%s" % (separator[0]*times_tagged, separator[1:], netname)
allowedlength -= len(suffix)
# If a nick is too long, the real nick portion will be cut off, but the # If a nick is too long, the real nick portion will be cut off, but the
# /network suffix MUST remain the same. # /network suffix MUST remain the same.
nick = nick[:allowedlength] nick = nick[:allowedlength]
nick += suffix if times_tagged >= 1:
nick += suffix
# Loop over every character in the nick, making sure that it only contains valid # Loop over every character in the nick, making sure that it only contains valid
# characters. # characters.
@ -146,9 +165,10 @@ def normalizeNick(irc, netname, nick, separator=None, uid=''):
# even though there would be no collision because the old and new nicks are from # even though there would be no collision because the old and new nicks are from
# the same client. # the same client.
while irc.nickToUid(nick) and irc.nickToUid(nick) != uid: while irc.nickToUid(nick) and irc.nickToUid(nick) != uid:
new_sep = separator + separator[-1] times_tagged += 1
log.debug('(%s) relay.normalizeNick: nick %r is in use; using %r as new_sep.', irc.name, nick, new_sep) log.debug('(%s) relay.normalizeNick: nick %r is in use; incrementing times tagged to %s.',
nick = normalizeNick(irc, netname, orig_nick, separator=new_sep) irc.name, nick, times_tagged)
nick = normalizeNick(irc, netname, orig_nick, times_tagged=times_tagged, uid=uid)
finalLength = len(nick) finalLength = len(nick)
assert finalLength <= maxnicklen, "Normalized nick %r went over max " \ assert finalLength <= maxnicklen, "Normalized nick %r went over max " \