2021-07-23 15:55:27 +01:00
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
2021-07-24 17:58:23 +01:00
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
2021-07-23 15:55:27 +01:00
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
2021-07-24 17:58:23 +01:00
@commands.Cog.listener ( name = ' on_message ' )
async def _submission_listener ( self , message ) :
2021-07-23 15:55:27 +01:00
conf = yaml_load ( configFile )
categories = yaml_load ( categoriesFile )
guildStr = str ( message . guild . id )
lookup = yaml_load ( lookupFile )
2021-07-24 17:58:23 +01:00
if conf [ guildStr ] [ ' channels ' ] . get ( ' signup ' , None ) is None : return
if message . author . bot : return
2021-07-23 15:55:27 +01:00
if message . channel . id != conf [ guildStr ] [ ' channels ' ] [ ' signup ' ] : return
2021-07-24 17:58:23 +01:00
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.``` ' )
2021-07-23 15:55:27 +01:00
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 } ' ) )
2021-07-24 17:58:23 +01:00
o = f ' ```For Administrators: Please verify the membership request submitted by ` { message . author . display_name } `.``` '
2021-07-23 15:55:27 +01:00
admins = ' | ' . join ( [ discord . utils . get ( message . guild . roles , id = x ) . mention for x in conf [ guildStr ] [ ' roles ' ] [ ' admin ' ] ] )
2021-07-24 17:58:23 +01:00
o = ' ' . join ( ( admins , o ) )
2021-07-23 15:55:27 +01:00
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
)
]
)
2021-07-24 17:58:23 +01:00
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 } . \n Could 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 } `.``` ' )
2021-07-23 15:55:27 +01:00
else :
2021-07-24 17:58:23 +01:00
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
2021-07-23 15:55:27 +01:00
def setup ( client ) :
client . add_cog ( MemberVerification ( client ) )