from discord.ext import commands
from discord.ext.commands import Cog, Context
from .utils.checks import check_command_permission, admin_only
from .utils.context import FakeContext
from .utils.database import is_exist, create, get, add_role, add_user, delete, \
    CommandPermission, delete_role, delete_user
from bot import Aegis
from extracommands import core
from typing import Union
import discord
from pathlib import Path, PurePath


def can_change_permission(command):
    if command.cog_name == "Manage" or command.qualified_name == "help":
        return False
    return True


class Manage(Cog):
    def __init__(self, bot: Aegis):
        self.bot = bot

    def get_command(self, name):
        names = name.split(' ')
        try:
            command = self.bot.get_command(names.pop(0))
            if isinstance(command, commands.Group):
                for name in names:
                    command = command.get_command(name)
        except Exception:
            command = None

        return command

    @core.command()
    async def usage(self, ctx, *command):
        """コマンド名を指定するとコマンドの使い方を表示します。サブコマンドは必要ありません。"""
        p = Path.cwd()/'cogs'/'utils'/'usages'/f'{command[0]}.md'
        if not p.exists():
            await ctx.send('そのコマンドの使い方はまだ書かれていないようです。')
            return
        with p.open('r') as f:
            lines = f.read().split('\n')
        embed = discord.Embed(title=f'コマンド:{command[0]}の使い方一覧')
        while lines:
            line = lines.pop(0)
            if line.startswith('#'):
                name = line[2:]
                value = ''
                while lines and not lines[0].startswith('#'):
                    value += lines.pop(0) + '\n'

                embed.add_field(name=name, value=value, inline=False)

        await ctx.send(embed=embed)

    @core.group(aliases=['cmd'], invoke_without_command=True)
    @commands.guild_only()
    async def command(self, ctx: Context, *, command_name):
        """コマンドの有効化・無効化、表示用のコマンドです。
        引数にコマンド名を入れるとコマンドの詳細を表示します。"""
        command = self.get_command(command_name)

        if command is None:
            await ctx.send('そのようなコマンドはありません.')
            return

        can_use = await check_command_permission(
            FakeContext(command.cog, command, ctx.author, ctx.guild, ctx.author.guild_permissions, ctx.channel, ctx.bot
                        ))

        embed = discord.Embed(title='使用可能' if can_use else '使用不可能',
                              description=f"`{command.qualified_name} {command.signature}`\n{command.short_doc or ''}",
                              color=0x00bfff if can_use else 0xFF0000)
        embed.set_author(name=f'Command: {command.qualified_name}の詳細')

        if isinstance(command, commands.Group):
            embed.add_field(name='サブコマンド', value=f'`{", ".join(cmd.qualified_name for cmd in command.commands)}`',
                            inline=False)

        embed.set_footer(text='権限の変更は"admit"コマンドを使用してください')

        await ctx.send(embed=embed)

    @command.group(aliases=['allow'], invoke_without_command=True)
    @admin_only()
    async def enable(self, ctx: Context, *, command_name):
        """コマンドを有効化します。大文字から始めるとCogの名前とみなされ、そのCogのコマンドが全て有効化されます。（例: `cmd allow Math`）"""
        if not command_name[0].isupper():
            command = self.bot.get_command(command_name)

            if command is None:
                await ctx.send('そのようなコマンドはありません.')
                return

            if not can_change_permission(command):
                await ctx.send('そのコマンドは変更できません.')

            name = self.bot.get_command_full_name(command)
            if await is_exist(ctx.guild.id, name):
                await ctx.send('そのコマンドは有効化されています.')
                return

            await create(ctx.guild.id, name)
            await ctx.send(f'コマンド:{command.name}を有効化しました.')
        else:
            cog = self.bot.get_cog(command_name)

            if cog is None:
                await ctx.send('そのようなCogはありません。')
                return
            changed_commands = []

            for command in cog.get_commands():
                if not can_change_permission(command):
                    continue

                name = self.bot.get_command_full_name(command)
                if await is_exist(ctx.guild.id, name):
                    continue

                await create(ctx.guild.id, name)
                changed_commands.append(command)

            await ctx.send('コマンド:' + ','.join([f'`{_.qualified_name}`' for _ in changed_commands]) + 'を有効化しました。')

    @enable.command(name='all')
    async def enable_all(self, ctx):
        """全てのコマンドを有効化します。"""
        for command in self.bot.walk_commands():
            name = self.bot.get_command_full_name(command)
            if await is_exist(ctx.guild.id, name):
                continue

            await create(ctx.guild.id, name)

        await ctx.send('有効化されていないコマンドを全て有効化しました。')

    @command.group(aliases=['deny'], invoke_without_command=True)
    @admin_only()
    async def disable(self, ctx: Context, *, command_name):
        """コマンドを無効化します。設定した権限は初期化されます。
        大文字から始めるとCogの名前とみなされ、そのCogのコマンドが全て無効化されます（例: `cmd deny Math`）。"""

        if not command_name[0].isupper():

            command = self.bot.get_command(command_name)

            if command is None:
                await ctx.send('そのようなコマンドはありません.')
                return

            if not can_change_permission(command):
                await ctx.send('そのコマンドは変更できません。')

            name = self.bot.get_command_full_name(command)
            if not await is_exist(ctx.guild.id, name):
                await ctx.send('そのコマンドは有効化されていません。')
                return

            await delete(ctx.guild.id, name)
            await ctx.send(f'コマンド:{command.name}を無効化しました.')

        else:
            cog = self.bot.get_cog(command_name)

            if cog is None:
                await ctx.send('そのようなCogはありません。')
                return
            changed_commands = []

            for command in cog.get_commands():
                if not can_change_permission(command):
                    continue

                name = self.bot.get_command_full_name(command)
                if not await is_exist(ctx.guild.id, name):
                    continue

                await delete(ctx.guild.id, name)
                changed_commands.append(command)

            await ctx.send('コマンド:' + ','.join([f'`{_.qualified_name}`' for _ in changed_commands]) + 'を無効化しました。')

    @disable.command(name='all')
    async def disable_all(self, ctx):
        """全てのコマンドを無効化します。"""
        for command in self.bot.walk_commands():
            name = self.bot.get_command_full_name(command)
            if not await is_exist(ctx.guild.id, name):
                continue

            await delete(ctx.guild.id, name)

        await ctx.send('有効化されているコマンドを全て無効化しました。')

    @core.group()
    @commands.guild_only()
    @admin_only()
    async def permit(self, ctx):
        """コマンドの権限を変更します。サブコマンドの指定が可能です。"""

    @permit.command()
    async def role(self, ctx, action, role: discord.Role, *, command_name):
        """役職を設定・解除します。役職のメンションまたはid、名前で指定可能です。
        actionが[set, add, new]で追加、[reset, remove, delete]で削除を行います。
        役職の名前に空白がある場合はクォーテーションで囲ってください。"""
        command = self.get_command(command_name)

        if command is None:
            await ctx.send('そのようなコマンドはありません.')
            return

        if action in ['set', 'add', 'new']:
            r = await add_role(ctx.guild.id, self.bot.get_command_full_name(command), role.id)
            if r is None:
                await ctx.send('コマンドが有効化されていません。')
                return
            elif not r:
                await ctx.send('すでに追加されています。')
                return

            await ctx.send(f'役職:`{role}`が追加されました。')

        elif action in ['reset', 'remove', 'delete', 'del']:
            r = await delete_role(ctx.guild.id, self.bot.get_command_full_name(command), role.id)

            if r is None:
                await ctx.send('コマンドが有効化されていません。')
                return
            elif not r:
                await ctx.send('追加されていません。')
                return

            await ctx.send(f'役職:`{role}`が削除されました。')

        else:
            await ctx.send('不明なactionです。')

    @permit.command()
    async def user(self, ctx, action, user: Union[discord.User, discord.Member], *, command_name):
        """役職を設定・解除します。役職のメンションまたはid、名前で指定可能です。
        actionが[set, add, new]で追加、[reset, remove, delete]で削除を行います。
        役職の名前に空白がある場合はクォーテーションで囲ってください。"""
        command = self.get_command(command_name)

        if command is None:
            await ctx.send('そのようなコマンドはありません.')
            return

        if action in ['set', 'add', 'new']:
            r = await add_user(ctx.guild.id, self.bot.get_command_full_name(command), user.id)
            if r is None:
                await ctx.send('コマンドが有効化されていません。')
                return
            elif not r:
                await ctx.send('すでに追加されています。')
                return

            await ctx.send(f'ユーザー:`{user}`が追加されました。')

        elif action in ['reset', 'remove', 'delete', 'del']:
            r = await delete_user(ctx.guild.id, self.bot.get_command_full_name(command), user.id)

            if r is None:
                await ctx.send('コマンドが有効化されていません。')
                return
            elif not r:
                await ctx.send('追加されていません。')
                return

            await ctx.send(f'ユーザー:`{user}`が削除されました。')

        else:
            await ctx.send('不明なactionです。')


def setup(bot):
    return bot.add_cog(Manage(bot))

6acb298e81ce237a91a7e43df1e482ca10b7b44c
<mask token>


class Manage(Cog):
    <mask token>

    def get_command(self, name):
        names = name.split(' ')
        try:
            command = self.bot.get_command(names.pop(0))
            if isinstance(command, commands.Group):
                for name in names:
                    command = command.get_command(name)
        except Exception:
            command = None
        return command

    @core.command()
    async def usage(self, ctx, *command):
        """コマンド名を指定するとコマンドの使い方を表示します。サブコマンドは必要ありません。"""
        p = Path.cwd() / 'cogs' / 'utils' / 'usages' / f'{command[0]}.md'
        if not p.exists():
            await ctx.send('そのコマンドの使い方はまだ書かれていないようです。')
            return
        with p.open('r') as f:
            lines = f.read().split('\n')
        embed = discord.Embed(title=f'コマンド:{command[0]}の使い方一覧')
        while lines:
            line = lines.pop(0)
            if line.startswith('#'):
                name = line[2:]
                value = ''
                while lines and not lines[0].startswith('#'):
                    value += lines.pop(0) + '\n'
                embed.add_field(name=name, value=value, inline=False)
        await ctx.send(embed=embed)

    @core.group(aliases=['cmd'], invoke_without_command=True)
    @commands.guild_only()
    async def command(self, ctx: Context, *, command_name):
        """コマンドの有効化・無効化、表示用のコマンドです。
        引数にコマンド名を入れるとコマンドの詳細を表示します。"""
        command = self.get_command(command_name)
        if command is None:
            await ctx.send('そのようなコマンドはありません.')
            return
        can_use = await check_command_permission(FakeContext(command.cog,
            command, ctx.author, ctx.guild, ctx.author.guild_permissions,
            ctx.channel, ctx.bot))
        embed = discord.Embed(title='使用可能' if can_use else '使用不可能',
            description=
            f"""`{command.qualified_name} {command.signature}`
{command.short_doc or ''}"""
            , color=49151 if can_use else 16711680)
        embed.set_author(name=f'Command: {command.qualified_name}の詳細')
        if isinstance(command, commands.Group):
            embed.add_field(name='サブコマンド', value=
                f"`{', '.join(cmd.qualified_name for cmd in command.commands)}`"
                , inline=False)
        embed.set_footer(text='権限の変更は"admit"コマンドを使用してください')
        await ctx.send(embed=embed)

    @command.group(aliases=['allow'], invoke_without_command=True)
    @admin_only()
    async def enable(self, ctx: Context, *, command_name):
        """コマンドを有効化します。大文字から始めるとCogの名前とみなされ、そのCogのコマンドが全て有効化されます。（例: `cmd allow Math`）"""
        if not command_name[0].isupper():
            command = self.bot.get_command(command_name)
            if command is None:
                await ctx.send('そのようなコマンドはありません.')
                return
            if not can_change_permission(command):
                await ctx.send('そのコマンドは変更できません.')
            name = self.bot.get_command_full_name(command)
            if await is_exist(ctx.guild.id, name):
                await ctx.send('そのコマンドは有効化されています.')
                return
            await create(ctx.guild.id, name)
            await ctx.send(f'コマンド:{command.name}を有効化しました.')
        else:
            cog = self.bot.get_cog(command_name)
            if cog is None:
                await ctx.send('そのようなCogはありません。')
                return
            changed_commands = []
            for command in cog.get_commands():
                if not can_change_permission(command):
                    continue
                name = self.bot.get_command_full_name(command)
                if await is_exist(ctx.guild.id, name):
                    continue
                await create(ctx.guild.id, name)
                changed_commands.append(command)
            await ctx.send('コマンド:' + ','.join([f'`{_.qualified_name}`' for
                _ in changed_commands]) + 'を有効化しました。')

    @enable.command(name='all')
    async def enable_all(self, ctx):
        """全てのコマンドを有効化します。"""
        for command in self.bot.walk_commands():
            name = self.bot.get_command_full_name(command)
            if await is_exist(ctx.guild.id, name):
                continue
            await create(ctx.guild.id, name)
        await ctx.send('有効化されていないコマンドを全て有効化しました。')

    @command.group(aliases=['deny'], invoke_without_command=True)
    @admin_only()
    async def disable(self, ctx: Context, *, command_name):
        """コマンドを無効化します。設定した権限は初期化されます。
        大文字から始めるとCogの名前とみなされ、そのCogのコマンドが全て無効化されます（例: `cmd deny Math`）。"""
        if not command_name[0].isupper():
            command = self.bot.get_command(command_name)
            if command is None:
                await ctx.send('そのようなコマンドはありません.')
                return
            if not can_change_permission(command):
                await ctx.send('そのコマンドは変更できません。')
            name = self.bot.get_command_full_name(command)
            if not await is_exist(ctx.guild.id, name):
                await ctx.send('そのコマンドは有効化されていません。')
                return
            await delete(ctx.guild.id, name)
            await ctx.send(f'コマンド:{command.name}を無効化しました.')
        else:
            cog = self.bot.get_cog(command_name)
            if cog is None:
                await ctx.send('そのようなCogはありません。')
                return
            changed_commands = []
            for command in cog.get_commands():
                if not can_change_permission(command):
                    continue
                name = self.bot.get_command_full_name(command)
                if not await is_exist(ctx.guild.id, name):
                    continue
                await delete(ctx.guild.id, name)
                changed_commands.append(command)
            await ctx.send('コマンド:' + ','.join([f'`{_.qualified_name}`' for
                _ in changed_commands]) + 'を無効化しました。')

    @disable.command(name='all')
    async def disable_all(self, ctx):
        """全てのコマンドを無効化します。"""
        for command in self.bot.walk_commands():
            name = self.bot.get_command_full_name(command)
            if not await is_exist(ctx.guild.id, name):
                continue
            await delete(ctx.guild.id, name)
        await ctx.send('有効化されているコマンドを全て無効化しました。')

    @core.group()
    @commands.guild_only()
    @admin_only()
    async def permit(self, ctx):
        """コマンドの権限を変更します。サブコマンドの指定が可能です。"""

    @permit.command()
    async def role(self, ctx, action, role: discord.Role, *, command_name):
        """役職を設定・解除します。役職のメンションまたはid、名前で指定可能です。
        actionが[set, add, new]で追加、[reset, remove, delete]で削除を行います。
        役職の名前に空白がある場合はクォーテーションで囲ってください。"""
        command = self.get_command(command_name)
        if command is None:
            await ctx.send('そのようなコマンドはありません.')
            return
        if action in ['set', 'add', 'new']:
            r = await add_role(ctx.guild.id, self.bot.get_command_full_name
                (command), role.id)
            if r is None:
                await ctx.send('コマンドが有効化されていません。')
                return
            elif not r:
                await ctx.send('すでに追加されています。')
                return
            await ctx.send(f'役職:`{role}`が追加されました。')
        elif action in ['reset', 'remove', 'delete', 'del']:
            r = await delete_role(ctx.guild.id, self.bot.
                get_command_full_name(command), role.id)
            if r is None:
                await ctx.send('コマンドが有効化されていません。')
                return
            elif not r:
                await ctx.send('追加されていません。')
                return
            await ctx.send(f'役職:`{role}`が削除されました。')
        else:
            await ctx.send('不明なactionです。')

    @permit.command()
    async def user(self, ctx, action, user: Union[discord.User, discord.
        Member], *, command_name):
        """役職を設定・解除します。役職のメンションまたはid、名前で指定可能です。
        actionが[set, add, new]で追加、[reset, remove, delete]で削除を行います。
        役職の名前に空白がある場合はクォーテーションで囲ってください。"""
        command = self.get_command(command_name)
        if command is None:
            await ctx.send('そのようなコマンドはありません.')
            return
        if action in ['set', 'add', 'new']:
            r = await add_user(ctx.guild.id, self.bot.get_command_full_name
                (command), user.id)
            if r is None:
                await ctx.send('コマンドが有効化されていません。')
                return
            elif not r:
                await ctx.send('すでに追加されています。')
                return
            await ctx.send(f'ユーザー:`{user}`が追加されました。')
        elif action in ['reset', 'remove', 'delete', 'del']:
            r = await delete_user(ctx.guild.id, self.bot.
                get_command_full_name(command), user.id)
            if r is None:
                await ctx.send('コマンドが有効化されていません。')
                return
            elif not r:
                await ctx.send('追加されていません。')
                return
            await ctx.send(f'ユーザー:`{user}`が削除されました。')
        else:
            await ctx.send('不明なactionです。')


<mask token>

<mask token>


class Manage(Cog):

    def __init__(self, bot: Aegis):
        self.bot = bot

    def get_command(self, name):
        names = name.split(' ')
        try:
            command = self.bot.get_command(names.pop(0))
            if isinstance(command, commands.Group):
                for name in names:
                    command = command.get_command(name)
        except Exception:
            command = None
        return command

    @core.command()
    async def usage(self, ctx, *command):
        """コマンド名を指定するとコマンドの使い方を表示します。サブコマンドは必要ありません。"""
        p = Path.cwd() / 'cogs' / 'utils' / 'usages' / f'{command[0]}.md'
        if not p.exists():
            await ctx.send('そのコマンドの使い方はまだ書かれていないようです。')
            return
        with p.open('r') as f:
            lines = f.read().split('\n')
        embed = discord.Embed(title=f'コマンド:{command[0]}の使い方一覧')
        while lines:
            line = lines.pop(0)
            if line.startswith('#'):
                name = line[2:]
                value = ''
                while lines and not lines[0].startswith('#'):
                    value += lines.pop(0) + '\n'
                embed.add_field(name=name, value=value, inline=False)
        await ctx.send(embed=embed)

    @core.group(aliases=['cmd'], invoke_without_command=True)
    @commands.guild_only()
    async def command(self, ctx: Context, *, command_name):
        """コマンドの有効化・無効化、表示用のコマンドです。
        引数にコマンド名を入れるとコマンドの詳細を表示します。"""
        command = self.get_command(command_name)
        if command is None:
            await ctx.send('そのようなコマンドはありません.')
            return
        can_use = await check_command_permission(FakeContext(command.cog,
            command, ctx.author, ctx.guild, ctx.author.guild_permissions,
            ctx.channel, ctx.bot))
        embed = discord.Embed(title='使用可能' if can_use else '使用不可能',
            description=
            f"""`{command.qualified_name} {command.signature}`
{command.short_doc or ''}"""
            , color=49151 if can_use else 16711680)
        embed.set_author(name=f'Command: {command.qualified_name}の詳細')
        if isinstance(command, commands.Group):
            embed.add_field(name='サブコマンド', value=
                f"`{', '.join(cmd.qualified_name for cmd in command.commands)}`"
                , inline=False)
        embed.set_footer(text='権限の変更は"admit"コマンドを使用してください')
        await ctx.send(embed=embed)

    @command.group(aliases=['allow'], invoke_without_command=True)
    @admin_only()
    async def enable(self, ctx: Context, *, command_name):
        """コマンドを有効化します。大文字から始めるとCogの名前とみなされ、そのCogのコマンドが全て有効化されます。（例: `cmd allow Math`）"""
        if not command_name[0].isupper():
            command = self.bot.get_command(command_name)
            if command is None:
                await ctx.send('そのようなコマンドはありません.')
                return
            if not can_change_permission(command):
                await ctx.send('そのコマンドは変更できません.')
            name = self.bot.get_command_full_name(command)
            if await is_exist(ctx.guild.id, name):
                await ctx.send('そのコマンドは有効化されています.')
                return
            await create(ctx.guild.id, name)
            await ctx.send(f'コマンド:{command.name}を有効化しました.')
        else:
            cog = self.bot.get_cog(command_name)
            if cog is None:
                await ctx.send('そのようなCogはありません。')
                return
            changed_commands = []
            for command in cog.get_commands():
                if not can_change_permission(command):
                    continue
                name = self.bot.get_command_full_name(command)
                if await is_exist(ctx.guild.id, name):
                    continue
                await create(ctx.guild.id, name)
                changed_commands.append(command)
            await ctx.send('コマンド:' + ','.join([f'`{_.qualified_name}`' for
                _ in changed_commands]) + 'を有効化しました。')

    @enable.command(name='all')
    async def enable_all(self, ctx):
        """全てのコマンドを有効化します。"""
        for command in self.bot.walk_commands():
            name = self.bot.get_command_full_name(command)
            if await is_exist(ctx.guild.id, name):
                continue
            await create(ctx.guild.id, name)
        await ctx.send('有効化されていないコマンドを全て有効化しました。')

    @command.group(aliases=['deny'], invoke_without_command=True)
    @admin_only()
    async def disable(self, ctx: Context, *, command_name):
        """コマンドを無効化します。設定した権限は初期化されます。
        大文字から始めるとCogの名前とみなされ、そのCogのコマンドが全て無効化されます（例: `cmd deny Math`）。"""
        if not command_name[0].isupper():
            command = self.bot.get_command(command_name)
            if command is None:
                await ctx.send('そのようなコマンドはありません.')
                return
            if not can_change_permission(command):
                await ctx.send('そのコマンドは変更できません。')
            name = self.bot.get_command_full_name(command)
            if not await is_exist(ctx.guild.id, name):
                await ctx.send('そのコマンドは有効化されていません。')
                return
            await delete(ctx.guild.id, name)
            await ctx.send(f'コマンド:{command.name}を無効化しました.')
        else:
            cog = self.bot.get_cog(command_name)
            if cog is None:
                await ctx.send('そのようなCogはありません。')
                return
            changed_commands = []
            for command in cog.get_commands():
                if not can_change_permission(command):
                    continue
                name = self.bot.get_command_full_name(command)
                if not await is_exist(ctx.guild.id, name):
                    continue
                await delete(ctx.guild.id, name)
                changed_commands.append(command)
            await ctx.send('コマンド:' + ','.join([f'`{_.qualified_name}`' for
                _ in changed_commands]) + 'を無効化しました。')

    @disable.command(name='all')
    async def disable_all(self, ctx):
        """全てのコマンドを無効化します。"""
        for command in self.bot.walk_commands():
            name = self.bot.get_command_full_name(command)
            if not await is_exist(ctx.guild.id, name):
                continue
            await delete(ctx.guild.id, name)
        await ctx.send('有効化されているコマンドを全て無効化しました。')

    @core.group()
    @commands.guild_only()
    @admin_only()
    async def permit(self, ctx):
        """コマンドの権限を変更します。サブコマンドの指定が可能です。"""

    @permit.command()
    async def role(self, ctx, action, role: discord.Role, *, command_name):
        """役職を設定・解除します。役職のメンションまたはid、名前で指定可能です。
        actionが[set, add, new]で追加、[reset, remove, delete]で削除を行います。
        役職の名前に空白がある場合はクォーテーションで囲ってください。"""
        command = self.get_command(command_name)
        if command is None:
            await ctx.send('そのようなコマンドはありません.')
            return
        if action in ['set', 'add', 'new']:
            r = await add_role(ctx.guild.id, self.bot.get_command_full_name
                (command), role.id)
            if r is None:
                await ctx.send('コマンドが有効化されていません。')
                return
            elif not r:
                await ctx.send('すでに追加されています。')
                return
            await ctx.send(f'役職:`{role}`が追加されました。')
        elif action in ['reset', 'remove', 'delete', 'del']:
            r = await delete_role(ctx.guild.id, self.bot.
                get_command_full_name(command), role.id)
            if r is None:
                await ctx.send('コマンドが有効化されていません。')
                return
            elif not r:
                await ctx.send('追加されていません。')
                return
            await ctx.send(f'役職:`{role}`が削除されました。')
        else:
            await ctx.send('不明なactionです。')

    @permit.command()
    async def user(self, ctx, action, user: Union[discord.User, discord.
        Member], *, command_name):
        """役職を設定・解除します。役職のメンションまたはid、名前で指定可能です。
        actionが[set, add, new]で追加、[reset, remove, delete]で削除を行います。
        役職の名前に空白がある場合はクォーテーションで囲ってください。"""
        command = self.get_command(command_name)
        if command is None:
            await ctx.send('そのようなコマンドはありません.')
            return
        if action in ['set', 'add', 'new']:
            r = await add_user(ctx.guild.id, self.bot.get_command_full_name
                (command), user.id)
            if r is None:
                await ctx.send('コマンドが有効化されていません。')
                return
            elif not r:
                await ctx.send('すでに追加されています。')
                return
            await ctx.send(f'ユーザー:`{user}`が追加されました。')
        elif action in ['reset', 'remove', 'delete', 'del']:
            r = await delete_user(ctx.guild.id, self.bot.
                get_command_full_name(command), user.id)
            if r is None:
                await ctx.send('コマンドが有効化されていません。')
                return
            elif not r:
                await ctx.send('追加されていません。')
                return
            await ctx.send(f'ユーザー:`{user}`が削除されました。')
        else:
            await ctx.send('不明なactionです。')


<mask token>

<mask token>


def can_change_permission(command):
    if command.cog_name == 'Manage' or command.qualified_name == 'help':
        return False
    return True


class Manage(Cog):

    def __init__(self, bot: Aegis):
        self.bot = bot

    def get_command(self, name):
        names = name.split(' ')
        try:
            command = self.bot.get_command(names.pop(0))
            if isinstance(command, commands.Group):
                for name in names:
                    command = command.get_command(name)
        except Exception:
            command = None
        return command

    @core.command()
    async def usage(self, ctx, *command):
        """コマンド名を指定するとコマンドの使い方を表示します。サブコマンドは必要ありません。"""
        p = Path.cwd() / 'cogs' / 'utils' / 'usages' / f'{command[0]}.md'
        if not p.exists():
            await ctx.send('そのコマンドの使い方はまだ書かれていないようです。')
            return
        with p.open('r') as f:
            lines = f.read().split('\n')
        embed = discord.Embed(title=f'コマンド:{command[0]}の使い方一覧')
        while lines:
            line = lines.pop(0)
            if line.startswith('#'):
                name = line[2:]
                value = ''
                while lines and not lines[0].startswith('#'):
                    value += lines.pop(0) + '\n'
                embed.add_field(name=name, value=value, inline=False)
        await ctx.send(embed=embed)

    @core.group(aliases=['cmd'], invoke_without_command=True)
    @commands.guild_only()
    async def command(self, ctx: Context, *, command_name):
        """コマンドの有効化・無効化、表示用のコマンドです。
        引数にコマンド名を入れるとコマンドの詳細を表示します。"""
        command = self.get_command(command_name)
        if command is None:
            await ctx.send('そのようなコマンドはありません.')
            return
        can_use = await check_command_permission(FakeContext(command.cog,
            command, ctx.author, ctx.guild, ctx.author.guild_permissions,
            ctx.channel, ctx.bot))
        embed = discord.Embed(title='使用可能' if can_use else '使用不可能',
            description=
            f"""`{command.qualified_name} {command.signature}`
{command.short_doc or ''}"""
            , color=49151 if can_use else 16711680)
        embed.set_author(name=f'Command: {command.qualified_name}の詳細')
        if isinstance(command, commands.Group):
            embed.add_field(name='サブコマンド', value=
                f"`{', '.join(cmd.qualified_name for cmd in command.commands)}`"
                , inline=False)
        embed.set_footer(text='権限の変更は"admit"コマンドを使用してください')
        await ctx.send(embed=embed)

    @command.group(aliases=['allow'], invoke_without_command=True)
    @admin_only()
    async def enable(self, ctx: Context, *, command_name):
        """コマンドを有効化します。大文字から始めるとCogの名前とみなされ、そのCogのコマンドが全て有効化されます。（例: `cmd allow Math`）"""
        if not command_name[0].isupper():
            command = self.bot.get_command(command_name)
            if command is None:
                await ctx.send('そのようなコマンドはありません.')
                return
            if not can_change_permission(command):
                await ctx.send('そのコマンドは変更できません.')
            name = self.bot.get_command_full_name(command)
            if await is_exist(ctx.guild.id, name):
                await ctx.send('そのコマンドは有効化されています.')
                return
            await create(ctx.guild.id, name)
            await ctx.send(f'コマンド:{command.name}を有効化しました.')
        else:
            cog = self.bot.get_cog(command_name)
            if cog is None:
                await ctx.send('そのようなCogはありません。')
                return
            changed_commands = []
            for command in cog.get_commands():
                if not can_change_permission(command):
                    continue
                name = self.bot.get_command_full_name(command)
                if await is_exist(ctx.guild.id, name):
                    continue
                await create(ctx.guild.id, name)
                changed_commands.append(command)
            await ctx.send('コマンド:' + ','.join([f'`{_.qualified_name}`' for
                _ in changed_commands]) + 'を有効化しました。')

    @enable.command(name='all')
    async def enable_all(self, ctx):
        """全てのコマンドを有効化します。"""
        for command in self.bot.walk_commands():
            name = self.bot.get_command_full_name(command)
            if await is_exist(ctx.guild.id, name):
                continue
            await create(ctx.guild.id, name)
        await ctx.send('有効化されていないコマンドを全て有効化しました。')

    @command.group(aliases=['deny'], invoke_without_command=True)
    @admin_only()
    async def disable(self, ctx: Context, *, command_name):
        """コマンドを無効化します。設定した権限は初期化されます。
        大文字から始めるとCogの名前とみなされ、そのCogのコマンドが全て無効化されます（例: `cmd deny Math`）。"""
        if not command_name[0].isupper():
            command = self.bot.get_command(command_name)
            if command is None:
                await ctx.send('そのようなコマンドはありません.')
                return
            if not can_change_permission(command):
                await ctx.send('そのコマンドは変更できません。')
            name = self.bot.get_command_full_name(command)
            if not await is_exist(ctx.guild.id, name):
                await ctx.send('そのコマンドは有効化されていません。')
                return
            await delete(ctx.guild.id, name)
            await ctx.send(f'コマンド:{command.name}を無効化しました.')
        else:
            cog = self.bot.get_cog(command_name)
            if cog is None:
                await ctx.send('そのようなCogはありません。')
                return
            changed_commands = []
            for command in cog.get_commands():
                if not can_change_permission(command):
                    continue
                name = self.bot.get_command_full_name(command)
                if not await is_exist(ctx.guild.id, name):
                    continue
                await delete(ctx.guild.id, name)
                changed_commands.append(command)
            await ctx.send('コマンド:' + ','.join([f'`{_.qualified_name}`' for
                _ in changed_commands]) + 'を無効化しました。')

    @disable.command(name='all')
    async def disable_all(self, ctx):
        """全てのコマンドを無効化します。"""
        for command in self.bot.walk_commands():
            name = self.bot.get_command_full_name(command)
            if not await is_exist(ctx.guild.id, name):
                continue
            await delete(ctx.guild.id, name)
        await ctx.send('有効化されているコマンドを全て無効化しました。')

    @core.group()
    @commands.guild_only()
    @admin_only()
    async def permit(self, ctx):
        """コマンドの権限を変更します。サブコマンドの指定が可能です。"""

    @permit.command()
    async def role(self, ctx, action, role: discord.Role, *, command_name):
        """役職を設定・解除します。役職のメンションまたはid、名前で指定可能です。
        actionが[set, add, new]で追加、[reset, remove, delete]で削除を行います。
        役職の名前に空白がある場合はクォーテーションで囲ってください。"""
        command = self.get_command(command_name)
        if command is None:
            await ctx.send('そのようなコマンドはありません.')
            return
        if action in ['set', 'add', 'new']:
            r = await add_role(ctx.guild.id, self.bot.get_command_full_name
                (command), role.id)
            if r is None:
                await ctx.send('コマンドが有効化されていません。')
                return
            elif not r:
                await ctx.send('すでに追加されています。')
                return
            await ctx.send(f'役職:`{role}`が追加されました。')
        elif action in ['reset', 'remove', 'delete', 'del']:
            r = await delete_role(ctx.guild.id, self.bot.
                get_command_full_name(command), role.id)
            if r is None:
                await ctx.send('コマンドが有効化されていません。')
                return
            elif not r:
                await ctx.send('追加されていません。')
                return
            await ctx.send(f'役職:`{role}`が削除されました。')
        else:
            await ctx.send('不明なactionです。')

    @permit.command()
    async def user(self, ctx, action, user: Union[discord.User, discord.
        Member], *, command_name):
        """役職を設定・解除します。役職のメンションまたはid、名前で指定可能です。
        actionが[set, add, new]で追加、[reset, remove, delete]で削除を行います。
        役職の名前に空白がある場合はクォーテーションで囲ってください。"""
        command = self.get_command(command_name)
        if command is None:
            await ctx.send('そのようなコマンドはありません.')
            return
        if action in ['set', 'add', 'new']:
            r = await add_user(ctx.guild.id, self.bot.get_command_full_name
                (command), user.id)
            if r is None:
                await ctx.send('コマンドが有効化されていません。')
                return
            elif not r:
                await ctx.send('すでに追加されています。')
                return
            await ctx.send(f'ユーザー:`{user}`が追加されました。')
        elif action in ['reset', 'remove', 'delete', 'del']:
            r = await delete_user(ctx.guild.id, self.bot.
                get_command_full_name(command), user.id)
            if r is None:
                await ctx.send('コマンドが有効化されていません。')
                return
            elif not r:
                await ctx.send('追加されていません。')
                return
            await ctx.send(f'ユーザー:`{user}`が削除されました。')
        else:
            await ctx.send('不明なactionです。')


def setup(bot):
    return bot.add_cog(Manage(bot))

from discord.ext import commands
from discord.ext.commands import Cog, Context
from .utils.checks import check_command_permission, admin_only
from .utils.context import FakeContext
from .utils.database import is_exist, create, get, add_role, add_user, delete, CommandPermission, delete_role, delete_user
from bot import Aegis
from extracommands import core
from typing import Union
import discord
from pathlib import Path, PurePath


def can_change_permission(command):
    if command.cog_name == 'Manage' or command.qualified_name == 'help':
        return False
    return True


class Manage(Cog):

    def __init__(self, bot: Aegis):
        self.bot = bot

    def get_command(self, name):
        names = name.split(' ')
        try:
            command = self.bot.get_command(names.pop(0))
            if isinstance(command, commands.Group):
                for name in names:
                    command = command.get_command(name)
        except Exception:
            command = None
        return command

    @core.command()
    async def usage(self, ctx, *command):
        """コマンド名を指定するとコマンドの使い方を表示します。サブコマンドは必要ありません。"""
        p = Path.cwd() / 'cogs' / 'utils' / 'usages' / f'{command[0]}.md'
        if not p.exists():
            await ctx.send('そのコマンドの使い方はまだ書かれていないようです。')
            return
        with p.open('r') as f:
            lines = f.read().split('\n')
        embed = discord.Embed(title=f'コマンド:{command[0]}の使い方一覧')
        while lines:
            line = lines.pop(0)
            if line.startswith('#'):
                name = line[2:]
                value = ''
                while lines and not lines[0].startswith('#'):
                    value += lines.pop(0) + '\n'
                embed.add_field(name=name, value=value, inline=False)
        await ctx.send(embed=embed)

    @core.group(aliases=['cmd'], invoke_without_command=True)
    @commands.guild_only()
    async def command(self, ctx: Context, *, command_name):
        """コマンドの有効化・無効化、表示用のコマンドです。
        引数にコマンド名を入れるとコマンドの詳細を表示します。"""
        command = self.get_command(command_name)
        if command is None:
            await ctx.send('そのようなコマンドはありません.')
            return
        can_use = await check_command_permission(FakeContext(command.cog,
            command, ctx.author, ctx.guild, ctx.author.guild_permissions,
            ctx.channel, ctx.bot))
        embed = discord.Embed(title='使用可能' if can_use else '使用不可能',
            description=
            f"""`{command.qualified_name} {command.signature}`
{command.short_doc or ''}"""
            , color=49151 if can_use else 16711680)
        embed.set_author(name=f'Command: {command.qualified_name}の詳細')
        if isinstance(command, commands.Group):
            embed.add_field(name='サブコマンド', value=
                f"`{', '.join(cmd.qualified_name for cmd in command.commands)}`"
                , inline=False)
        embed.set_footer(text='権限の変更は"admit"コマンドを使用してください')
        await ctx.send(embed=embed)

    @command.group(aliases=['allow'], invoke_without_command=True)
    @admin_only()
    async def enable(self, ctx: Context, *, command_name):
        """コマンドを有効化します。大文字から始めるとCogの名前とみなされ、そのCogのコマンドが全て有効化されます。（例: `cmd allow Math`）"""
        if not command_name[0].isupper():
            command = self.bot.get_command(command_name)
            if command is None:
                await ctx.send('そのようなコマンドはありません.')
                return
            if not can_change_permission(command):
                await ctx.send('そのコマンドは変更できません.')
            name = self.bot.get_command_full_name(command)
            if await is_exist(ctx.guild.id, name):
                await ctx.send('そのコマンドは有効化されています.')
                return
            await create(ctx.guild.id, name)
            await ctx.send(f'コマンド:{command.name}を有効化しました.')
        else:
            cog = self.bot.get_cog(command_name)
            if cog is None:
                await ctx.send('そのようなCogはありません。')
                return
            changed_commands = []
            for command in cog.get_commands():
                if not can_change_permission(command):
                    continue
                name = self.bot.get_command_full_name(command)
                if await is_exist(ctx.guild.id, name):
                    continue
                await create(ctx.guild.id, name)
                changed_commands.append(command)
            await ctx.send('コマンド:' + ','.join([f'`{_.qualified_name}`' for
                _ in changed_commands]) + 'を有効化しました。')

    @enable.command(name='all')
    async def enable_all(self, ctx):
        """全てのコマンドを有効化します。"""
        for command in self.bot.walk_commands():
            name = self.bot.get_command_full_name(command)
            if await is_exist(ctx.guild.id, name):
                continue
            await create(ctx.guild.id, name)
        await ctx.send('有効化されていないコマンドを全て有効化しました。')

    @command.group(aliases=['deny'], invoke_without_command=True)
    @admin_only()
    async def disable(self, ctx: Context, *, command_name):
        """コマンドを無効化します。設定した権限は初期化されます。
        大文字から始めるとCogの名前とみなされ、そのCogのコマンドが全て無効化されます（例: `cmd deny Math`）。"""
        if not command_name[0].isupper():
            command = self.bot.get_command(command_name)
            if command is None:
                await ctx.send('そのようなコマンドはありません.')
                return
            if not can_change_permission(command):
                await ctx.send('そのコマンドは変更できません。')
            name = self.bot.get_command_full_name(command)
            if not await is_exist(ctx.guild.id, name):
                await ctx.send('そのコマンドは有効化されていません。')
                return
            await delete(ctx.guild.id, name)
            await ctx.send(f'コマンド:{command.name}を無効化しました.')
        else:
            cog = self.bot.get_cog(command_name)
            if cog is None:
                await ctx.send('そのようなCogはありません。')
                return
            changed_commands = []
            for command in cog.get_commands():
                if not can_change_permission(command):
                    continue
                name = self.bot.get_command_full_name(command)
                if not await is_exist(ctx.guild.id, name):
                    continue
                await delete(ctx.guild.id, name)
                changed_commands.append(command)
            await ctx.send('コマンド:' + ','.join([f'`{_.qualified_name}`' for
                _ in changed_commands]) + 'を無効化しました。')

    @disable.command(name='all')
    async def disable_all(self, ctx):
        """全てのコマンドを無効化します。"""
        for command in self.bot.walk_commands():
            name = self.bot.get_command_full_name(command)
            if not await is_exist(ctx.guild.id, name):
                continue
            await delete(ctx.guild.id, name)
        await ctx.send('有効化されているコマンドを全て無効化しました。')

    @core.group()
    @commands.guild_only()
    @admin_only()
    async def permit(self, ctx):
        """コマンドの権限を変更します。サブコマンドの指定が可能です。"""

    @permit.command()
    async def role(self, ctx, action, role: discord.Role, *, command_name):
        """役職を設定・解除します。役職のメンションまたはid、名前で指定可能です。
        actionが[set, add, new]で追加、[reset, remove, delete]で削除を行います。
        役職の名前に空白がある場合はクォーテーションで囲ってください。"""
        command = self.get_command(command_name)
        if command is None:
            await ctx.send('そのようなコマンドはありません.')
            return
        if action in ['set', 'add', 'new']:
            r = await add_role(ctx.guild.id, self.bot.get_command_full_name
                (command), role.id)
            if r is None:
                await ctx.send('コマンドが有効化されていません。')
                return
            elif not r:
                await ctx.send('すでに追加されています。')
                return
            await ctx.send(f'役職:`{role}`が追加されました。')
        elif action in ['reset', 'remove', 'delete', 'del']:
            r = await delete_role(ctx.guild.id, self.bot.
                get_command_full_name(command), role.id)
            if r is None:
                await ctx.send('コマンドが有効化されていません。')
                return
            elif not r:
                await ctx.send('追加されていません。')
                return
            await ctx.send(f'役職:`{role}`が削除されました。')
        else:
            await ctx.send('不明なactionです。')

    @permit.command()
    async def user(self, ctx, action, user: Union[discord.User, discord.
        Member], *, command_name):
        """役職を設定・解除します。役職のメンションまたはid、名前で指定可能です。
        actionが[set, add, new]で追加、[reset, remove, delete]で削除を行います。
        役職の名前に空白がある場合はクォーテーションで囲ってください。"""
        command = self.get_command(command_name)
        if command is None:
            await ctx.send('そのようなコマンドはありません.')
            return
        if action in ['set', 'add', 'new']:
            r = await add_user(ctx.guild.id, self.bot.get_command_full_name
                (command), user.id)
            if r is None:
                await ctx.send('コマンドが有効化されていません。')
                return
            elif not r:
                await ctx.send('すでに追加されています。')
                return
            await ctx.send(f'ユーザー:`{user}`が追加されました。')
        elif action in ['reset', 'remove', 'delete', 'del']:
            r = await delete_user(ctx.guild.id, self.bot.
                get_command_full_name(command), user.id)
            if r is None:
                await ctx.send('コマンドが有効化されていません。')
                return
            elif not r:
                await ctx.send('追加されていません。')
                return
            await ctx.send(f'ユーザー:`{user}`が削除されました。')
        else:
            await ctx.send('不明なactionです。')


def setup(bot):
    return bot.add_cog(Manage(bot))

from discord.ext import commands
from discord.ext.commands import Cog, Context
from .utils.checks import check_command_permission, admin_only
from .utils.context import FakeContext
from .utils.database import is_exist, create, get, add_role, add_user, delete, \
    CommandPermission, delete_role, delete_user
from bot import Aegis
from extracommands import core
from typing import Union
import discord
from pathlib import Path, PurePath


def can_change_permission(command):
    if command.cog_name == "Manage" or command.qualified_name == "help":
        return False
    return True


class Manage(Cog):
    def __init__(self, bot: Aegis):
        self.bot = bot

    def get_command(self, name):
        names = name.split(' ')
        try:
            command = self.bot.get_command(names.pop(0))
            if isinstance(command, commands.Group):
                for name in names:
                    command = command.get_command(name)
        except Exception:
            command = None

        return command

    @core.command()
    async def usage(self, ctx, *command):
        """コマンド名を指定するとコマンドの使い方を表示します。サブコマンドは必要ありません。"""
        p = Path.cwd()/'cogs'/'utils'/'usages'/f'{command[0]}.md'
        if not p.exists():
            await ctx.send('そのコマンドの使い方はまだ書かれていないようです。')
            return
        with p.open('r') as f:
            lines = f.read().split('\n')
        embed = discord.Embed(title=f'コマンド:{command[0]}の使い方一覧')
        while lines:
            line = lines.pop(0)
            if line.startswith('#'):
                name = line[2:]
                value = ''
                while lines and not lines[0].startswith('#'):
                    value += lines.pop(0) + '\n'

                embed.add_field(name=name, value=value, inline=False)

        await ctx.send(embed=embed)

    @core.group(aliases=['cmd'], invoke_without_command=True)
    @commands.guild_only()
    async def command(self, ctx: Context, *, command_name):
        """コマンドの有効化・無効化、表示用のコマンドです。
        引数にコマンド名を入れるとコマンドの詳細を表示します。"""
        command = self.get_command(command_name)

        if command is None:
            await ctx.send('そのようなコマンドはありません.')
            return

        can_use = await check_command_permission(
            FakeContext(command.cog, command, ctx.author, ctx.guild, ctx.author.guild_permissions, ctx.channel, ctx.bot
                        ))

        embed = discord.Embed(title='使用可能' if can_use else '使用不可能',
                              description=f"`{command.qualified_name} {command.signature}`\n{command.short_doc or ''}",
                              color=0x00bfff if can_use else 0xFF0000)
        embed.set_author(name=f'Command: {command.qualified_name}の詳細')

        if isinstance(command, commands.Group):
            embed.add_field(name='サブコマンド', value=f'`{", ".join(cmd.qualified_name for cmd in command.commands)}`',
                            inline=False)

        embed.set_footer(text='権限の変更は"admit"コマンドを使用してください')

        await ctx.send(embed=embed)

    @command.group(aliases=['allow'], invoke_without_command=True)
    @admin_only()
    async def enable(self, ctx: Context, *, command_name):
        """コマンドを有効化します。大文字から始めるとCogの名前とみなされ、そのCogのコマンドが全て有効化されます。（例: `cmd allow Math`）"""
        if not command_name[0].isupper():
            command = self.bot.get_command(command_name)

            if command is None:
                await ctx.send('そのようなコマンドはありません.')
                return

            if not can_change_permission(command):
                await ctx.send('そのコマンドは変更できません.')

            name = self.bot.get_command_full_name(command)
            if await is_exist(ctx.guild.id, name):
                await ctx.send('そのコマンドは有効化されています.')
                return

            await create(ctx.guild.id, name)
            await ctx.send(f'コマンド:{command.name}を有効化しました.')
        else:
            cog = self.bot.get_cog(command_name)

            if cog is None:
                await ctx.send('そのようなCogはありません。')
                return
            changed_commands = []

            for command in cog.get_commands():
                if not can_change_permission(command):
                    continue

                name = self.bot.get_command_full_name(command)
                if await is_exist(ctx.guild.id, name):
                    continue

                await create(ctx.guild.id, name)
                changed_commands.append(command)

            await ctx.send('コマンド:' + ','.join([f'`{_.qualified_name}`' for _ in changed_commands]) + 'を有効化しました。')

    @enable.command(name='all')
    async def enable_all(self, ctx):
        """全てのコマンドを有効化します。"""
        for command in self.bot.walk_commands():
            name = self.bot.get_command_full_name(command)
            if await is_exist(ctx.guild.id, name):
                continue

            await create(ctx.guild.id, name)

        await ctx.send('有効化されていないコマンドを全て有効化しました。')

    @command.group(aliases=['deny'], invoke_without_command=True)
    @admin_only()
    async def disable(self, ctx: Context, *, command_name):
        """コマンドを無効化します。設定した権限は初期化されます。
        大文字から始めるとCogの名前とみなされ、そのCogのコマンドが全て無効化されます（例: `cmd deny Math`）。"""

        if not command_name[0].isupper():

            command = self.bot.get_command(command_name)

            if command is None:
                await ctx.send('そのようなコマンドはありません.')
                return

            if not can_change_permission(command):
                await ctx.send('そのコマンドは変更できません。')

            name = self.bot.get_command_full_name(command)
            if not await is_exist(ctx.guild.id, name):
                await ctx.send('そのコマンドは有効化されていません。')
                return

            await delete(ctx.guild.id, name)
            await ctx.send(f'コマンド:{command.name}を無効化しました.')

        else:
            cog = self.bot.get_cog(command_name)

            if cog is None:
                await ctx.send('そのようなCogはありません。')
                return
            changed_commands = []

            for command in cog.get_commands():
                if not can_change_permission(command):
                    continue

                name = self.bot.get_command_full_name(command)
                if not await is_exist(ctx.guild.id, name):
                    continue

                await delete(ctx.guild.id, name)
                changed_commands.append(command)

            await ctx.send('コマンド:' + ','.join([f'`{_.qualified_name}`' for _ in changed_commands]) + 'を無効化しました。')

    @disable.command(name='all')
    async def disable_all(self, ctx):
        """全てのコマンドを無効化します。"""
        for command in self.bot.walk_commands():
            name = self.bot.get_command_full_name(command)
            if not await is_exist(ctx.guild.id, name):
                continue

            await delete(ctx.guild.id, name)

        await ctx.send('有効化されているコマンドを全て無効化しました。')

    @core.group()
    @commands.guild_only()
    @admin_only()
    async def permit(self, ctx):
        """コマンドの権限を変更します。サブコマンドの指定が可能です。"""

    @permit.command()
    async def role(self, ctx, action, role: discord.Role, *, command_name):
        """役職を設定・解除します。役職のメンションまたはid、名前で指定可能です。
        actionが[set, add, new]で追加、[reset, remove, delete]で削除を行います。
        役職の名前に空白がある場合はクォーテーションで囲ってください。"""
        command = self.get_command(command_name)

        if command is None:
            await ctx.send('そのようなコマンドはありません.')
            return

        if action in ['set', 'add', 'new']:
            r = await add_role(ctx.guild.id, self.bot.get_command_full_name(command), role.id)
            if r is None:
                await ctx.send('コマンドが有効化されていません。')
                return
            elif not r:
                await ctx.send('すでに追加されています。')
                return

            await ctx.send(f'役職:`{role}`が追加されました。')

        elif action in ['reset', 'remove', 'delete', 'del']:
            r = await delete_role(ctx.guild.id, self.bot.get_command_full_name(command), role.id)

            if r is None:
                await ctx.send('コマンドが有効化されていません。')
                return
            elif not r:
                await ctx.send('追加されていません。')
                return

            await ctx.send(f'役職:`{role}`が削除されました。')

        else:
            await ctx.send('不明なactionです。')

    @permit.command()
    async def user(self, ctx, action, user: Union[discord.User, discord.Member], *, command_name):
        """役職を設定・解除します。役職のメンションまたはid、名前で指定可能です。
        actionが[set, add, new]で追加、[reset, remove, delete]で削除を行います。
        役職の名前に空白がある場合はクォーテーションで囲ってください。"""
        command = self.get_command(command_name)

        if command is None:
            await ctx.send('そのようなコマンドはありません.')
            return

        if action in ['set', 'add', 'new']:
            r = await add_user(ctx.guild.id, self.bot.get_command_full_name(command), user.id)
            if r is None:
                await ctx.send('コマンドが有効化されていません。')
                return
            elif not r:
                await ctx.send('すでに追加されています。')
                return

            await ctx.send(f'ユーザー:`{user}`が追加されました。')

        elif action in ['reset', 'remove', 'delete', 'del']:
            r = await delete_user(ctx.guild.id, self.bot.get_command_full_name(command), user.id)

            if r is None:
                await ctx.send('コマンドが有効化されていません。')
                return
            elif not r:
                await ctx.send('追加されていません。')
                return

            await ctx.send(f'ユーザー:`{user}`が削除されました。')

        else:
            await ctx.send('不明なactionです。')


def setup(bot):
    return bot.add_cog(Manage(bot))
