3
0
mirror of https://github.com/jlu5/PyLink.git synced 2024-11-24 03:29:28 +01:00

relay: allow admins to destroy channels hosted on other networks

Closes #160.
This commit is contained in:
James Lu 2016-03-05 09:31:59 -08:00
parent 4df027cac4
commit 8ac5436152

View File

@ -428,8 +428,10 @@ def removeChannel(irc, channel):
"""Destroys a relay channel by parting all of its users.""" """Destroys a relay channel by parting all of its users."""
if irc is None: if irc is None:
return return
if channel not in map(str.lower, irc.serverdata['channels']): if channel not in map(str.lower, irc.serverdata['channels']):
irc.proto.part(irc.pseudoclient.uid, channel, 'Channel delinked.') irc.proto.part(irc.pseudoclient.uid, channel, 'Channel delinked.')
relay = getRelay((irc.name, channel)) relay = getRelay((irc.name, channel))
if relay: if relay:
for user in irc.channels[channel].users.copy(): for user in irc.channels[channel].users.copy():
@ -1265,28 +1267,43 @@ def create(irc, source, args):
@utils.add_cmd @utils.add_cmd
def destroy(irc, source, args): def destroy(irc, source, args):
"""<channel> """[<home network>] <channel>
Removes <channel> from the relay, delinking all networks linked to it.""" Removes <channel> from the relay, delinking all networks linked to it. If <home network> is given and you are logged in as admin, this can also remove relay channels from other networks."""
try: try: # Two args were given: first one is network name, second is channel.
channel = utils.toLower(irc, args[0]) channel = utils.toLower(irc, args[1])
network = args[0]
except IndexError: except IndexError:
irc.reply("Error: Not enough arguments. Needs 1: channel.") try: # One argument was given; assume it's just the channel.
return channel = utils.toLower(irc, args[0])
network = irc.name
except IndexError:
irc.reply("Error: Not enough arguments. Needs 1-2: channel, network (optional).")
return
if not utils.isChannel(channel): if not utils.isChannel(channel):
irc.reply('Error: Invalid channel %r.' % channel) irc.reply('Error: Invalid channel %r.' % channel)
return return
utils.checkAuthenticated(irc, source)
entry = (irc.name, channel) if network == irc.name:
# If we're destroying a channel on the current network, only oper is needed.
utils.checkAuthenticated(irc, source)
else:
# Otherwise, we'll need to be logged in as admin.
utils.checkAuthenticated(irc, source, allowOper=False)
entry = (network, channel)
if entry in db: if entry in db:
# Iterate over all the channel links and deinitialize them.
for link in db[entry]['links']: for link in db[entry]['links']:
removeChannel(world.networkobjects.get(link[0]), link[1]) removeChannel(world.networkobjects.get(link[0]), link[1])
removeChannel(irc, channel) removeChannel(world.networkobjects.get(network), channel)
del db[entry] del db[entry]
irc.reply('Done.')
log.info('(%s) relay: Channel %s destroyed by %s.', irc.name, log.info('(%s) relay: Channel %s destroyed by %s.', irc.name,
channel, utils.getHostmask(irc, source)) channel, utils.getHostmask(irc, source))
irc.reply('Done.')
else: else:
irc.reply('Error: No such relay %r exists.' % channel) irc.reply('Error: No such relay %r exists.' % channel)
return return