From 049c2a1e448d4135e9fe3c3c30687b6674b973d5 Mon Sep 17 00:00:00 2001 From: CMDR furrycat Date: Wed, 1 Mar 2017 11:55:07 +0000 Subject: [PATCH] Added permissions command. --- plugin/admin/admin.py | 106 +++++++++++++++++++++++++++++++++++++++++++++++++- 1 file changed, 105 insertions(+), 1 deletion(-) diff --git a/plugin/admin/admin.py b/plugin/admin/admin.py index 51a1cd6..4f3fc2d 100644 --- a/plugin/admin/admin.py +++ b/plugin/admin/admin.py @@ -1,5 +1,6 @@ import asyncio import logging +import re import shlex import sys @@ -25,7 +26,7 @@ class Admin(object): self.close_db() def valid_commands(self): - return ['debug', 'dryrun', 'shutdown'] + return ['debug', 'dryrun', 'permissions', 'shutdown'] @asyncio.coroutine def handle_command(self, message, command, raw): @@ -49,6 +50,8 @@ class Admin(object): yield from self.handle_debug(message, args[1:]) elif command == 'dryrun': yield from self.handle_dryrun(message, args[1:]) + elif command == 'permissions': + yield from self.handle_permissions(message, args[1:]) elif command == 'shutdown': yield from self.handle_shutdown(message) @@ -72,6 +75,13 @@ class Admin(object): 'dryrun off', '```' ] + elif command == 'permissions': + lines = [ + 'Manage server permissions.', + '```', + 'permissions allow|deny | []', + '```' + ] elif command == 'shutdown': lines = [ 'Shut the bot down!', @@ -126,6 +136,100 @@ class Admin(object): yield from cat.yelp(message.channel) @asyncio.coroutine + def handle_permissions(self, message, args): + if not bot.is_admin(message.author): + yield from cat.hiss(message.channel) + return + + if len(args) < 4: + yield from cat.yelp(message.channel) + return + + if args[0].lower() == 'help': + yield from self.help_command(message, 'help') + return + + action, where, who, permission = args[0:4] + if len(args) > 4: + text = args[4] + channel = bot.parse_channel(text) + if channel is None: + yield from bot.say(message.channel, '{}?'.format(text)) + return + else: + channel = None + + if action.lower() not in ['allow', 'deny']: + yield from bot.say(message.channel, '{}?'.format(action)) + return + elif action.lower() == 'allow': + allow = True + else: + allow = False + + log.info('{} server={} role={} permission={} channel={}'.format(action, where, who, permission, channel)) + overwrite = bot.permission(permission, allow) + if overwrite is None: + yield from bot.say(message.channel, '{}?'.format(permission)) + return + + server = bot.parse_server(where) + if server is None: + yield from bot.say(message.channel, '{}?'.format(server)) + return + + parsed = bot.parse_mention(who, message.author) + if parsed is None: + yield from bot.say(message.channel, '{}?'.format(who)) + return + if parsed[0] == '#': + # Channel. + yield from bot.say(message.channel, '<{}> is not a role or member!'.format(parsed)) + return + elif re.match(r'^\d+$', parsed): + # User. + member = server.get_member(parsed) + target = member + permissions = member.server_permissions + elif parsed[0] == '&': + # Role. + role_id = parsed[1:] + for role in server.roles: + if role.id == role_id: + target = role + permissions = role.permissions + break + else: + # @everyone + for role in server.roles: + if role.name.lower() == parsed.lower(): + target = role + permissions = role.permissions + break + + if permissions is None and channel is None: + yield from bot.say(message.channel, '{}?'.format(who)) + return + + if channel is not None: + if target is None: + yield from bot.say(message.channel, 'Need target for channel overwrite!') + return + yield from bot.overwrite_permissions(channel, target, overwrite) + return + + args = { permission: allow } + permissions.update(**args) + + if parsed[0] == '&': + yield from client.edit_role(server, target, permissions = permissions) + else: + yield from bot.say('Need channel to update member permissions!') + return + + yield from cat.purr(message.channel) + + @asyncio.coroutine def handle_shutdown(self, message): log.warning('Shutdown initiated!') result = yield from bot.say(message.channel, 'Goodbye!', wake = False) -- 2.7.4