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, ComponentContext # Slash Command Library from discord_slash.utils.manage_components import create_select, create_select_option, create_actionrow, wait_for_component, create_button, create_actionrow from discord_slash.utils.manage_commands import create_choice, create_option from discord_slash.model import ButtonStyle import logging # logger and handler from bot import configFile, yaml_load, categoriesFile, configFile, lookupFile ##### Membership Verification Cog class MemberVerification(commands.Cog, name='Member Verification Cog'): def __init__(self, client): self.client = client @commands.Cog.listener(name='on_message') async def _submission_listener(self, message): conf = yaml_load(configFile) categories = yaml_load(categoriesFile) guildStr = str(message.guild.id) lookup = yaml_load(lookupFile) if conf[guildStr]['channels'].get('signup', None) is None: return if message.author.bot: return if message.channel.id != conf[guildStr]['channels']['signup']: return if not (message.attachments): await message.channel.send(f'```Error: The message you posted in the `{message.channel.name}` channel of the guild `{message.guild.name}` was invalid. Your post must contain a screensot of your proof of purchase for membership.```') await message.delete() return membership = [discord.utils.get(message.guild.roles, id=x) for x in conf[guildStr]['membership']] membership_options = [create_select_option(label=x.name, value=str(x.id), description='Membership type.') for x in membership] admin_buttons = [] if conf[guildStr]['roles'].get('student', None) is not None: admin_buttons.append(create_button(style=ButtonStyle.blurple, label='Student', emoji='📚', custom_id=f'student_{message.id}')) admin_buttons.append(create_button(style=ButtonStyle.grey, label='Alert', emoji='⚠️', custom_id=f'alert_{message.id}')) admin_buttons.append(create_button(style=ButtonStyle.red, label='Deny', emoji='✖️', custom_id=f'deny_{message.id}')) admin_buttons.append(create_button(style=ButtonStyle.green, label='Done', emoji='▶️', custom_id=f'done_{message.id}')) o = f'```For Administrators: Please verify the membership request submitted by `{message.author.display_name}`.```' admins = '|'.join([discord.utils.get(message.guild.roles, id=x).mention for x in conf[guildStr]['roles']['admin']]) o = ''.join((admins,o)) m = await message.reply( content= o, components=[ create_actionrow( create_select( options=membership_options, custom_id=f'membership_{message.id}', placeholder=f'Please select a membership to assign to {message.author.display_name}', min_values=1, max_values=1 ) ), create_actionrow( *admin_buttons ) ] ) if conf[guildStr]['notifications'].get('signup', False): embed = discord.Embed( title = f'Member Verification Request', description = f'User: {message.author.name}\n\n[Jup to Message]({m.jump_url})', colour = discord.Colour.blue(), ) if conf[guildStr]['channels'].get('mod', None) is not None: await message.guild.get_channel(conf[guildStr]['channels']['mod']).send(f'```New membership verification request.```\n{admins}', embed=embed) @commands.Cog.listener(name='on_component') async def _verification_response(self, ctx:ComponentContext): conf = yaml_load(configFile) categories = yaml_load(categoriesFile) guildStr = str(ctx.guild.id) admins = '|'.join([discord.utils.get(ctx.guild.roles, id=x).mention for x in conf[guildStr]['roles']['admin']]) lookup = yaml_load(lookupFile) if ctx.channel.id != conf[guildStr]['channels']['signup']: return if not (set(ctx.author.roles) & set([ctx.guild.get_role(x) for x in conf[str(ctx.guild.id)]['roles']['admin']]) or ctx.author == ctx.guild.owner): await ctx.send(f'```Error: You are not authorised to assign memberships for guild `{ctx.guild.name}`. Only administrators may assign memberships using this interface.```', hidden=True) else: submission = await ctx.channel.fetch_message(int(ctx.custom_id.split('_',1)[1])) if ctx.custom_id.startswith('done_'): await ctx.send(f'```Membership verification complete.```', hidden=True) await ctx.origin_message.delete() elif ctx.custom_id.startswith('deny_'): await ctx.send(f'```Membership verification denied.```', hidden=True) embed = discord.Embed( title = submission.author.name, description = f'[Jup to Message]({submission.jump_url})', colour = discord.Colour.red(), ) await submission.channel.send(f'```Your membership for guild `{submission.guild.name}` could not be verified. Please make sure your name and the kind of membership that you have bought are visible in the screenshot you upload. Please contact a Committee member if you have any difficulties.```') if conf[guildStr]['channels'].get('mod', None) is not None: await submission.guild.get_channel(conf[guildStr]['channels']['mod']).send(f'```Verifying the membership of {submission.author.display_name} failed.```\n{admins}', embed=embed) await ctx.origin_message.delete() elif ctx.custom_id.startswith('alert_'): await ctx.send(f'```Membership verification alert raised.```', hidden=True) embed = discord.Embed( title = submission.author.name, description = f'[Jup to Message]({submission.jump_url})', colour = discord.Colour.orange() ) await submission.channel.send(f'```Your membership for guild `{submission.guild.name}` needs to be reviewed by a Committee member.```') if conf[guildStr]['channels'].get('mod', None) is not None: await submission.guild.get_channel(conf[guildStr]['channels']['mod']).send(f'```There is a problem verifying the membership of {submission.author.display_name}.\nCould someone verify this person\'s membership manually via the EUSA portal?.```\n{admins}', embed=embed) elif ctx.custom_id.startswith('student_'): await ctx.send(f'````Student` role granted.```', hidden=True) student_role = submission.guild.get_role(conf[guildStr]['roles']['student']) await submission.author.add_roles(student_role, reason=f'Membership Verification: Student role assigned by `{ctx.author.display_name}`.') await submission.channel.send(f'```You have additionally been assigned the role `Student` in the guild `{submission.guild.name}`.```') elif ctx.custom_id.startswith('membership_'): [selected_membership] = ctx.selected_options selected_role = ctx.guild.get_role(int(selected_membership)) if selected_role not in submission.author.roles: await ctx.send(f'```Membership `{selected_role.name}` added to member `{submission.author.display_name}`.```', hidden=True) await submission.author.add_roles(selected_role, reason=f'Membership Verification: Membership verified by `{ctx.author.display_name}`.') await submission.channel.send(f'```Your membership for guild `{submission.guild.name}` has been verified and you have been assigned the role `{selected_role.name}`.```') else: await ctx.send(f'```Membership `{selected_role.name}` removed from member `{submission.author.display_name}`.```', hidden=True) await submission.author.remove_roles(selected_role, reason=f'Membership Verification: Membership removed by `{ctx.author.display_name}`.') await submission.channel.send(f'```Your role `{selected_role.name}` has been removed in the guild `{submission.guild.name}`.```') else: pass def setup(client): client.add_cog(MemberVerification(client))