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:
parent
4df027cac4
commit
8ac5436152
@ -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
|
||||||
|
Loading…
Reference in New Issue
Block a user