172 lines
5.5 KiB
Python
172 lines
5.5 KiB
Python
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)) |