mirror of
https://github.com/jlu5/PyLink.git
synced 2025-02-03 16:14:10 +01:00
relay: reuse get_relay_server_sid output when bursting groups of users
This commit is contained in:
parent
a085aed924
commit
bbb36cd956
@ -294,7 +294,7 @@ def get_relay_server_sid(irc, remoteirc, spawn_if_missing=True):
|
|||||||
spawnlocks_servers[irc.name].release()
|
spawnlocks_servers[irc.name].release()
|
||||||
return sid
|
return sid
|
||||||
|
|
||||||
def spawn_relay_user(irc, remoteirc, user, times_tagged=0):
|
def spawn_relay_user(irc, remoteirc, user, times_tagged=0, reuse_sid=None):
|
||||||
"""
|
"""
|
||||||
Spawns a relay user representing "user" from "irc" (the local network) on remoteirc (the target network).
|
Spawns a relay user representing "user" from "irc" (the local network) on remoteirc (the target network).
|
||||||
"""
|
"""
|
||||||
@ -303,6 +303,7 @@ def spawn_relay_user(irc, remoteirc, user, times_tagged=0):
|
|||||||
# The query wasn't actually a valid user, or the network hasn't
|
# The query wasn't actually a valid user, or the network hasn't
|
||||||
# been connected yet... Oh well!
|
# been connected yet... Oh well!
|
||||||
return
|
return
|
||||||
|
|
||||||
nick = normalize_nick(remoteirc, irc.name, userobj.nick, times_tagged=times_tagged)
|
nick = normalize_nick(remoteirc, irc.name, userobj.nick, times_tagged=times_tagged)
|
||||||
# Truncate idents at 10 characters, because TS6 won't like them otherwise!
|
# Truncate idents at 10 characters, because TS6 won't like them otherwise!
|
||||||
ident = userobj.ident[:10]
|
ident = userobj.ident[:10]
|
||||||
@ -311,8 +312,8 @@ def spawn_relay_user(irc, remoteirc, user, times_tagged=0):
|
|||||||
realname = userobj.realname
|
realname = userobj.realname
|
||||||
modes = set(get_supported_umodes(irc, remoteirc, userobj.modes))
|
modes = set(get_supported_umodes(irc, remoteirc, userobj.modes))
|
||||||
opertype = ''
|
opertype = ''
|
||||||
if ('o', None) in userobj.modes:
|
|
||||||
|
|
||||||
|
if ('o', None) in userobj.modes:
|
||||||
# Try to get the oper type, adding an "(on <networkname>)" suffix similar to what
|
# Try to get the oper type, adding an "(on <networkname>)" suffix similar to what
|
||||||
# Janus does.
|
# Janus does.
|
||||||
if hasattr(userobj, 'opertype'):
|
if hasattr(userobj, 'opertype'):
|
||||||
@ -334,11 +335,15 @@ def spawn_relay_user(irc, remoteirc, user, times_tagged=0):
|
|||||||
if hideoper_mode and use_hideoper:
|
if hideoper_mode and use_hideoper:
|
||||||
modes.add((hideoper_mode, None))
|
modes.add((hideoper_mode, None))
|
||||||
|
|
||||||
rsid = get_relay_server_sid(remoteirc, irc)
|
if reuse_sid:
|
||||||
if not rsid:
|
rsid = reuse_sid
|
||||||
log.debug('(%s) spawn_relay_user: aborting user spawn for %s/%s @ %s (failed to retrieve a '
|
else:
|
||||||
'working SID).', irc.name, user, nick, remoteirc.name)
|
rsid = get_relay_server_sid(remoteirc, irc)
|
||||||
return
|
if not rsid:
|
||||||
|
log.debug('(%s) spawn_relay_user: aborting user spawn for %s/%s @ %s (failed to retrieve a '
|
||||||
|
'working SID).', irc.name, user, nick, remoteirc.name)
|
||||||
|
return
|
||||||
|
|
||||||
try:
|
try:
|
||||||
showRealIP = conf.conf['relay']['show_ips'] and not \
|
showRealIP = conf.conf['relay']['show_ips'] and not \
|
||||||
irc.serverdata.get('relay_no_ips') and not \
|
irc.serverdata.get('relay_no_ips') and not \
|
||||||
@ -369,7 +374,7 @@ def spawn_relay_user(irc, remoteirc, user, times_tagged=0):
|
|||||||
relayusers[(irc.name, user)][remoteirc.name] = u
|
relayusers[(irc.name, user)][remoteirc.name] = u
|
||||||
return u
|
return u
|
||||||
|
|
||||||
def get_remote_user(irc, remoteirc, user, spawn_if_missing=True, times_tagged=0):
|
def get_remote_user(irc, remoteirc, user, spawn_if_missing=True, times_tagged=0, reuse_sid=None):
|
||||||
"""
|
"""
|
||||||
Fetches and returns the relay client UID representing "user" on the remote network "remoteirc",
|
Fetches and returns the relay client UID representing "user" on the remote network "remoteirc",
|
||||||
spawning a new user if one doesn't exist and spawn_if_missing is True.
|
spawning a new user if one doesn't exist and spawn_if_missing is True.
|
||||||
@ -394,7 +399,7 @@ def get_remote_user(irc, remoteirc, user, spawn_if_missing=True, times_tagged=0)
|
|||||||
except KeyError:
|
except KeyError:
|
||||||
# User doesn't exist. Spawn a new one if requested.
|
# User doesn't exist. Spawn a new one if requested.
|
||||||
if spawn_if_missing:
|
if spawn_if_missing:
|
||||||
u = spawn_relay_user(irc, remoteirc, user, times_tagged=times_tagged)
|
u = spawn_relay_user(irc, remoteirc, user, times_tagged=times_tagged, reuse_sid=reuse_sid)
|
||||||
|
|
||||||
# This is a sanity check to make sure netsplits and other state resets
|
# This is a sanity check to make sure netsplits and other state resets
|
||||||
# don't break the relayer. If it turns out there was a client in our relayusers
|
# don't break the relayer. If it turns out there was a client in our relayusers
|
||||||
@ -708,13 +713,16 @@ def relay_joins(irc, channel, users, ts, targetirc=None, **kwargs):
|
|||||||
# just skip it.
|
# just skip it.
|
||||||
return
|
return
|
||||||
|
|
||||||
|
# This is a batch-like event, so try to reuse a relay server SID as much as possible.
|
||||||
|
rsid = get_relay_server_sid(remoteirc, irc)
|
||||||
|
|
||||||
for user in users.copy():
|
for user in users.copy():
|
||||||
if is_relay_client(irc, user):
|
if is_relay_client(irc, user):
|
||||||
# Don't clone relay clients; that'll cause bad infinite loops.
|
# Don't clone relay clients; that'll cause bad infinite loops.
|
||||||
continue
|
continue
|
||||||
|
|
||||||
assert user in irc.users, "(%s) relay.relay_joins: How is this possible? %r isn't in our user database." % (irc.name, user)
|
assert user in irc.users, "(%s) relay.relay_joins: How is this possible? %r isn't in our user database." % (irc.name, user)
|
||||||
u = get_remote_user(irc, remoteirc, user)
|
u = get_remote_user(irc, remoteirc, user, reuse_sid=rsid)
|
||||||
|
|
||||||
if not u:
|
if not u:
|
||||||
continue
|
continue
|
||||||
@ -744,7 +752,6 @@ def relay_joins(irc, channel, users, ts, targetirc=None, **kwargs):
|
|||||||
# Look at whether we should relay this join as a regular JOIN, or a SJOIN.
|
# Look at whether we should relay this join as a regular JOIN, or a SJOIN.
|
||||||
# SJOIN will be used if either the amount of users to join is > 1, or there are modes
|
# SJOIN will be used if either the amount of users to join is > 1, or there are modes
|
||||||
# to be set on the joining user.
|
# to be set on the joining user.
|
||||||
rsid = get_relay_server_sid(remoteirc, irc)
|
|
||||||
if burst or len(queued_users) > 1 or queued_users[0][0]:
|
if burst or len(queued_users) > 1 or queued_users[0][0]:
|
||||||
modes = get_supported_cmodes(irc, remoteirc, channel, irc.channels[channel].modes)
|
modes = get_supported_cmodes(irc, remoteirc, channel, irc.channels[channel].modes)
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user