forked from viveksantayana/geas-bot
Vivek Santayana
5bb9af12c9
Wrote up documentation. Readme needs finishing. Future development needs to use global listeners for processes.
109 lines
7.0 KiB
Python
109 lines
7.0 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_components import create_select, create_select_option, create_actionrow, wait_for_component, create_button, create_actionrow, 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()
|
|
async def on_message(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 not None: 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='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.```\n'
|
|
admins = '|'.join([discord.utils.get(message.guild.roles, id=x).mention for x in conf[guildStr]['roles']['admin']])
|
|
o = '\n'.join((o,admins))
|
|
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
|
|
)
|
|
]
|
|
)
|
|
while True:
|
|
interaction_ctx = await wait_for_component(self.client, messages=m)
|
|
if not (set(interaction_ctx.author.roles) & set([interaction_ctx.guild.get_role(x) for x in conf[str(interaction_ctx.guild.id)]['roles']['admin']]) or interaction_ctx.author == interaction_ctx.guild.owner):
|
|
await interaction_ctx.send(f'```Error: You are not authorised to assign memberships for guild `{interaction_ctx.guild.name}`. Only administrators may assign memberships using this interface.```', hidden=True)
|
|
else:
|
|
submission = await interaction_ctx.channel.fetch_message(int(interaction_ctx.custom_id.split('_',1)[1]))
|
|
if interaction_ctx.custom_id.startswith('done_'):
|
|
await interaction_ctx.send(f'```Membership verification complete.```', hidden=True)
|
|
break
|
|
elif interaction_ctx.custom_id.startswith('deny_'):
|
|
await interaction_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)
|
|
break
|
|
elif interaction_ctx.custom_id.startswith('alert_'):
|
|
await interaction_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.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 interaction_ctx.custom_id.startswith('student_'):
|
|
await interaction_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 `{interaction_ctx.author.display_name}`.')
|
|
await submission.author.send(f'```You have additionally been assigned the role `Student` in the guild `{submission.guild.name}`.```')
|
|
elif interaction_ctx.custom_id.startswith('membership_'):
|
|
[selected_membership] = interaction_ctx.selected_options
|
|
selected_role = interaction_ctx.guild.get_role(int(selected_membership))
|
|
if selected_role not in submission.author.roles:
|
|
await interaction_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 `{interaction_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 interaction_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 `{interaction_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
|
|
await m.delete()
|
|
|
|
def setup(client):
|
|
client.add_cog(MemberVerification(client)) |