import os # OS Locations import yaml # YAML parser for Bot config files import asyncio # Discord Py Dependency import discord # Main Lib from discord.ext import commands # Commands module from discord_slash import SlashCommand, SlashContext, cog_ext, utils # Slash Command Library from discord_slash.utils.manage_commands import create_choice, create_option, create_permission # Slash Command features from discord_slash.model import SlashCommandPermissionType from bot import configFile, yaml_load, yaml_dump ##### Configuration Cog class Configuration(commands.Cog): def __init__(self, client): self.client = client guild_ids=[int(guildKey) for guildKey in yaml_load(configFile)] permissions = {} conf = yaml_load(configFile) for guildStr in conf: permissions[int(guildStr)] = [] permissions[int(guildStr)].append(create_permission(id=conf[guildStr]['owner'],id_type=SlashCommandPermissionType.USER,permission=True)) for admin in conf[guildStr]['roles']['admin']: permissions[int(guildStr)].append(create_permission(id=admin,id_type=SlashCommandPermissionType.ROLE,permission=True)) @cog_ext.cog_subcommand( base='config', # subcommand_group='role', name='roles', description='Designates the various key roles referenced by the Bot.', base_description='Commands for configuring the various parameters of the Guild.', base_default_permission=False, base_permissions=permissions, # subcommand_group_description='Designates the various key command roles for the guild.', guild_ids=guild_ids, options=[ create_option( name='key', description='The name of the role parameter being assigned.', option_type=3, required=True, choices=[ create_choice( name='`Bot` role', value='bot' ), create_choice( name='`Committee` role', value='committee' ), create_choice( name='`Newcomer` role', value='newcomer' ), create_choice( name='`Returning Player` role', value='returning_player' ), create_choice( name='`Student` role', value='student' ) ] ), create_option( name='role', description='The role assigned to the parameter.', option_type=8, required=True ) ] ) async def _config_roles(self, ctx:SlashContext, key:str, role:discord.Role): conf = yaml_load(configFile) if 'roles' not in conf[str(ctx.guild.id)]: conf[str(ctx.guild.id)]['roles'] = {} conf[str(ctx.guild.id)]['roles'][key] = int(role.id) yaml_dump(conf, configFile) await ctx.send(f'```The `{key}` role for the guild `{ctx.guild.name}` has been set to `{role.name}`.```') @cog_ext.cog_subcommand( base='config', # subcommand_group='channel', name='channels', description='Designate the various key channels for the Bot to interact with.', # base_description='Commands for configuring the various parameters of the Guild', # base_default_permission=False, # base_permissions=permissions, # subcommand_group_description='Designates the various key Bot channels for the guild.', guild_ids=guild_ids, options=[ create_option( name='key', description='The name of the channel parameter being assigned.', option_type=3, required=True, choices=[ create_choice( name='Help Channel', value='help' ), create_choice( name='Mod Channel', value='mod' ), create_choice( name='SIgnup Channel', value='signup' ) ] ), create_option( name='channel', description='The channel assigned to the parameter.', option_type=7, required=True ) ] ) async def _config_channels(self, ctx:SlashContext, key:str, channel:discord.TextChannel): conf = yaml_load(configFile) if 'channels' not in conf[str(ctx.guild.id)]: conf[str(ctx.guild.id)]['channels'] = {} conf[str(ctx.guild.id)]['channels'][key] = int(channel.id) yaml_dump(conf, configFile) await ctx.send(f'```The `{key}` channel for the guild `{ctx.guild.name}` has been set to `{channel.name}`.```') @cog_ext.cog_subcommand( base='config', # subcommand_group='notifications', name='notifications', description='Configure monitoring and notifications to Committee for member query channels.', # base_description='Commands for configuring the various parameters of the Guild', # base_default_permission=False, # base_permissions=permissions, # subcommand_group_description='Configures whether the bot monitors and responds to posts in key channels.', guild_ids=guild_ids, options=[ create_option( name='channel', description='Select which channel to change notifications for.', option_type=3, required=True, choices=[ create_choice( name='Help Channel', value='help' ), create_choice( name='Signup Channel', value='signup' ) ] ), create_option( name='notifications', description='Whether or not the bot monitors the channel for posts.', option_type=5, required=True ) ] ) async def _config_notifications(self, ctx:SlashContext, channel:str, notifications:bool): conf = yaml_load(configFile) if 'notifications' not in conf[str(ctx.guild.id)]: conf[str(ctx.guild.id)]['notifications'] = {} conf[str(ctx.guild.id)]['notifications'][channel] = notifications yaml_dump(conf, configFile) await ctx.send(f'```Notifications for posts in the `{channel}` channel for the guild `{ctx.guild.name}` have been set to `{notifications}`.```') def setup(client): client.add_cog(Configuration(client))