mirror of
https://github.com/jlu5/PyLink.git
synced 2024-11-24 03:29:28 +01:00
relay: migrate most protocol checks to protocol capabilities
Some things I left out include modesync and op status checking on LINK, since these are pretty specific to Clientbot IRC.
This commit is contained in:
parent
bde27b0dde
commit
21670a5d51
@ -648,7 +648,7 @@ def relay_joins(irc, channel, users, ts, burst=True):
|
|||||||
|
|
||||||
# Fetch the known channel TS and all the prefix modes for each user. This ensures
|
# Fetch the known channel TS and all the prefix modes for each user. This ensures
|
||||||
# the different sides of the relay are merged properly.
|
# the different sides of the relay are merged properly.
|
||||||
if irc.protoname == 'clientbot':
|
if not irc.proto.hasCap('has-ts'):
|
||||||
# Special hack for clientbot: just use the remote's modes so mode changes
|
# Special hack for clientbot: just use the remote's modes so mode changes
|
||||||
# take precendence. protocols/clientbot does not track channel TS.
|
# take precendence. protocols/clientbot does not track channel TS.
|
||||||
ts = remoteirc.channels[remotechan].ts
|
ts = remoteirc.channels[remotechan].ts
|
||||||
@ -783,7 +783,7 @@ def get_supported_cmodes(irc, remoteirc, channel, modes):
|
|||||||
"for network %r.",
|
"for network %r.",
|
||||||
irc.name, modechar, arg, remoteirc.name)
|
irc.name, modechar, arg, remoteirc.name)
|
||||||
|
|
||||||
if irc.protoname == 'clientbot' and irc.pseudoclient and arg == irc.pseudoclient.uid:
|
if (not irc.proto.hasCap('can-spawn-clients')) and irc.pseudoclient and arg == irc.pseudoclient.uid:
|
||||||
# Skip modesync on the main PyLink client.
|
# Skip modesync on the main PyLink client.
|
||||||
log.debug("(%s) relay.get_supported_cmodes: filtering prefix change (%r, %r) on Clientbot relayer",
|
log.debug("(%s) relay.get_supported_cmodes: filtering prefix change (%r, %r) on Clientbot relayer",
|
||||||
irc.name, name, arg)
|
irc.name, name, arg)
|
||||||
@ -876,7 +876,7 @@ def handle_relay_whois(irc, source, command, args):
|
|||||||
# Send account information if told to and the target is logged in.
|
# Send account information if told to and the target is logged in.
|
||||||
wreply(330, "%s :is logged in (on %s) as" % (realuser.services_account, netname))
|
wreply(330, "%s :is logged in (on %s) as" % (realuser.services_account, netname))
|
||||||
|
|
||||||
if checkSendKey('whois_show_server') and realirc.protoname != 'clientbot':
|
if checkSendKey('whois_show_server') and realirc.proto.hasCap('can-track-servers'):
|
||||||
wreply(320, ":is actually connected via the following server:")
|
wreply(320, ":is actually connected via the following server:")
|
||||||
realserver = realirc.getServer(uid)
|
realserver = realirc.getServer(uid)
|
||||||
realserver = realirc.servers[realserver]
|
realserver = realirc.servers[realserver]
|
||||||
@ -1017,7 +1017,7 @@ def handle_part(irc, numeric, command, args):
|
|||||||
if numeric == irc.pseudoclient.uid:
|
if numeric == irc.pseudoclient.uid:
|
||||||
# For clientbot: treat forced parts to the bot as clearchan, and attempt to rejoin only
|
# For clientbot: treat forced parts to the bot as clearchan, and attempt to rejoin only
|
||||||
# if it affected a relay.
|
# if it affected a relay.
|
||||||
if irc.protoname == 'clientbot':
|
if not irc.proto.hasCap('can-spawn-clients'):
|
||||||
for channel in [c for c in channels if get_relay((irc.name, c))]:
|
for channel in [c for c in channels if get_relay((irc.name, c))]:
|
||||||
for user in irc.channels[channel].users:
|
for user in irc.channels[channel].users:
|
||||||
if (not irc.isInternalClient(user)) and (not isRelayClient(irc, user)):
|
if (not irc.isInternalClient(user)) and (not isRelayClient(irc, user)):
|
||||||
@ -1148,7 +1148,7 @@ def handle_messages(irc, numeric, command, args):
|
|||||||
return
|
return
|
||||||
remoteirc = world.networkobjects[homenet]
|
remoteirc = world.networkobjects[homenet]
|
||||||
|
|
||||||
if remoteirc.protoname == 'clientbot' and not conf.conf.get('relay', {}).get('allow_clientbot_pms'):
|
if (not remoteirc.proto.hasCap('can-spawn-clients')) and not conf.conf.get('relay', {}).get('allow_clientbot_pms'):
|
||||||
irc.msg(numeric, 'Private messages to users connected via Clientbot have '
|
irc.msg(numeric, 'Private messages to users connected via Clientbot have '
|
||||||
'been administratively disabled.', notice=True)
|
'been administratively disabled.', notice=True)
|
||||||
return
|
return
|
||||||
@ -1179,7 +1179,7 @@ def handle_kick(irc, source, command, args):
|
|||||||
relay = get_relay((irc.name, channel))
|
relay = get_relay((irc.name, channel))
|
||||||
|
|
||||||
# Special case for clientbot: treat kicks to the PyLink service bot as channel clear.
|
# Special case for clientbot: treat kicks to the PyLink service bot as channel clear.
|
||||||
if irc.protoname == 'clientbot' and irc.pseudoclient and target == irc.pseudoclient.uid:
|
if (not irc.proto.hasCap('can-spawn-clients')) and irc.pseudoclient and target == irc.pseudoclient.uid:
|
||||||
for user in irc.channels[channel].users:
|
for user in irc.channels[channel].users:
|
||||||
if (not irc.isInternalClient(user)) and (not isRelayClient(irc, user)):
|
if (not irc.isInternalClient(user)) and (not isRelayClient(irc, user)):
|
||||||
reason = "Clientbot kicked by %s (Reason: %s)" % (irc.getFriendlyName(source), text)
|
reason = "Clientbot kicked by %s (Reason: %s)" % (irc.getFriendlyName(source), text)
|
||||||
@ -1246,7 +1246,7 @@ def handle_kick(irc, source, command, args):
|
|||||||
# common channels with the target relay network.
|
# common channels with the target relay network.
|
||||||
rsid = get_remote_sid(remoteirc, irc)
|
rsid = get_remote_sid(remoteirc, irc)
|
||||||
log.debug('(%s) relay.handle_kick: Kicking %s from channel %s via %s on behalf of %s/%s', irc.name, real_target, remotechan, rsid, kicker, irc.name)
|
log.debug('(%s) relay.handle_kick: Kicking %s from channel %s via %s on behalf of %s/%s', irc.name, real_target, remotechan, rsid, kicker, irc.name)
|
||||||
if irc.protoname == 'clientbot':
|
if not irc.proto.hasCap('can-spawn-clients'):
|
||||||
# Special case for clientbot: no kick prefixes are needed.
|
# Special case for clientbot: no kick prefixes are needed.
|
||||||
text = args['text']
|
text = args['text']
|
||||||
else:
|
else:
|
||||||
@ -1582,7 +1582,7 @@ def create(irc, source, args):
|
|||||||
if not utils.isChannel(channel):
|
if not utils.isChannel(channel):
|
||||||
irc.error('Invalid channel %r.' % channel)
|
irc.error('Invalid channel %r.' % channel)
|
||||||
return
|
return
|
||||||
if irc.protoname == 'clientbot':
|
if not irc.proto.hasCap('can-host-relay'):
|
||||||
irc.error('Clientbot networks cannot be used to host a relay.')
|
irc.error('Clientbot networks cannot be used to host a relay.')
|
||||||
return
|
return
|
||||||
if source not in irc.channels[channel].users:
|
if source not in irc.channels[channel].users:
|
||||||
@ -1780,7 +1780,7 @@ def link(irc, source, args):
|
|||||||
|
|
||||||
our_ts = irc.channels[localchan].ts
|
our_ts = irc.channels[localchan].ts
|
||||||
their_ts = world.networkobjects[remotenet].channels[args.channel].ts
|
their_ts = world.networkobjects[remotenet].channels[args.channel].ts
|
||||||
if (our_ts < their_ts) and irc.protoname != 'clientbot':
|
if (our_ts < their_ts) and irc.proto.hasCap('has-ts'):
|
||||||
log.debug('(%s) relay: Blocking link request %s%s -> %s%s due to bad TS (%s < %s)', irc.name,
|
log.debug('(%s) relay: Blocking link request %s%s -> %s%s due to bad TS (%s < %s)', irc.name,
|
||||||
irc.name, localchan, remotenet, args.channel, our_ts, their_ts)
|
irc.name, localchan, remotenet, args.channel, our_ts, their_ts)
|
||||||
irc.error("The channel creation date (TS) on %s (%s) is lower than the target "
|
irc.error("The channel creation date (TS) on %s (%s) is lower than the target "
|
||||||
|
Loading…
Reference in New Issue
Block a user