Vivek Santayana
94ce0aa31a
Bug fixes for member signup Added live update of game header message during pitches Documentation updates
126 lines
7.6 KiB
Python
126 lines
7.6 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, 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.author.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='Review', emoji='⚠️', custom_id=f'review_{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.author.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('review_'):
|
|
await ctx.send(f'```Membership review requested.```', hidden=True)
|
|
embed = discord.Embed(
|
|
title = submission.author.name,
|
|
description = f'[Jup to Message]({submission.jump_url})',
|
|
colour = discord.Colour.orange()
|
|
)
|
|
await submission.author.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.author.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.author.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.author.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)) |