forked from viveksantayana/geas-bot
Finished the bot. Requires testing.
Wrote up documentation. Readme needs finishing. Future development needs to use global listeners for processes.
This commit is contained in:
@ -28,20 +28,19 @@ class on_message(commands.Cog, name='On Message Events'):
|
||||
guild = message.guild
|
||||
guildStr = str(guild.id)
|
||||
if 'notifications' in conf[guildStr]:
|
||||
if 'help' in conf[guildStr]['notifications']:
|
||||
if conf[guildStr]['notifications']['help']:
|
||||
if 'help' in conf[guildStr]['channels'] and 'committee' in conf[guildStr]['roles']:
|
||||
if message.channel.id == conf[guildStr]['channels']['help'] and isinstance(guild.get_role(conf[guildStr]['roles']['committee']), discord.Role):
|
||||
modChannel = self.client.get_channel(conf[guildStr]['channels']['mod'])
|
||||
committeeRole = guild.get_role(conf[guildStr]['roles']['committee'])
|
||||
embed = discord.Embed(
|
||||
title = f'[New Query in Help]({message.jump_url})',
|
||||
description = message.content,
|
||||
colour = discord.Colour.orange()
|
||||
)
|
||||
embed.set_footer(text=datetime.now().strftime('%a %-d %b %y, %-I:%M %p'))
|
||||
embed.set_author(name=message.author.display_name, icon_url=message.author.avatar_url)
|
||||
await modChannel.send(f'{committeeRole.mention}\n```There has been a new help query posted.```\n{message.author.mention}` posted in `{message.channel.mention}`.`', embed = embed)
|
||||
if conf[guildStr]['notifications'].get('help', False):
|
||||
if 'help' in conf[guildStr]['channels'] and 'committee' in conf[guildStr]['roles']:
|
||||
if message.channel.id == conf[guildStr]['channels']['help'] and isinstance(guild.get_role(conf[guildStr]['roles']['committee']), discord.Role):
|
||||
modChannel = self.client.get_channel(conf[guildStr]['channels']['mod'])
|
||||
committeeRole = guild.get_role(conf[guildStr]['roles']['committee'])
|
||||
embed = discord.Embed(
|
||||
title = f'[New Query in Help]({message.jump_url})',
|
||||
description = message.content,
|
||||
colour = discord.Colour.orange()
|
||||
)
|
||||
embed.set_footer(text=datetime.now().strftime('%a %-d %b %y, %-I:%M %p'))
|
||||
embed.set_author(name=message.author.display_name, icon_url=message.author.avatar_url)
|
||||
await modChannel.send(f'{committeeRole.mention}\n```There has been a new help query posted.```\n{message.author.mention}` posted in `{message.channel.mention}`.`', embed = embed)
|
||||
|
||||
def setup(client):
|
||||
client.add_cog(on_message(client))
|
109
app/cogs/membership/member_verification.py
Normal file
109
app/cogs/membership/member_verification.py
Normal file
@ -0,0 +1,109 @@
|
||||
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))
|
50
app/cogs/membership/restriction_listener.py
Normal file
50
app/cogs/membership/restriction_listener.py
Normal file
@ -0,0 +1,50 @@
|
||||
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 # Slash Command features
|
||||
import logging
|
||||
# logger and handler
|
||||
from bot import configFile, yaml_load, categoriesFile, configFile, lookupFile
|
||||
|
||||
##### Membership Restriction Message Listener Cog
|
||||
class RestrictionListener(commands.Cog, name='Membership Restriction Listener'):
|
||||
def __init__(self, client):
|
||||
self.client = client
|
||||
|
||||
# Block non-verified user from posting messages.
|
||||
@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].get('restrict',False): return
|
||||
if message.author.bot: return
|
||||
if str(message.channel.category) not in categories[guildStr]: return
|
||||
if (set(message.author.roles) & set([message.guild.get_role(x) for x in conf[guildStr]['roles']['admin']]) or message.author == message.guild.owner): return
|
||||
if set(message.author.roles) & set([message.guild.get_role(x) for x in conf[guildStr]['membership']]): return
|
||||
if message.channel.overwrites_for(message.author).manage_channels: return
|
||||
signupChannel = discord.utils.find(lambda x: x.id == conf[guildStr]['channels']['signup'], message.guild.channels)
|
||||
await message.channel.send(f'```{message.author.display_name} does not have a verified membership of `{message.guild.name}`. Please submit your membership confirmation for verification in the {signupChannel.name} to ensure you have access to your game.```\n{message.author.mention} | {signupChannel.mention}')
|
||||
await message.channel.category.set_permissions(message.author, send_messages = False, connect = False, reason=f'Membership Restriction: {message.author.display_name} is not a verified member.')
|
||||
await message.delete()
|
||||
|
||||
# Reinstate on verification
|
||||
@commands.Cog.listener()
|
||||
async def on_member_update(self, before, after):
|
||||
if before.roles == after.roles: return
|
||||
conf = yaml_load(configFile)
|
||||
categories = yaml_load(categoriesFile)
|
||||
guildStr = str(after.guild.id)
|
||||
lookup = yaml_load(lookupFile)
|
||||
if not set(after.author.roles) & set([after.guild.get_role(x) for x in conf[guildStr]['membership']]): return
|
||||
for game in list(set(after.author.roles) & set([after.guild.get_role(int(x)) for x in lookup[guildStr]])):
|
||||
c = discord.utils.get(lambda x: x.id == lookup[guildStr][str(game.id)]['category'])
|
||||
if c is not None:
|
||||
if c.overwrites_for(after).send_messages is False: await c.set_permissions(after, overwrite = False, reason= f'Membership Restriction: {after.display_name} has been verified and reinstated.')
|
||||
|
||||
def setup(client):
|
||||
client.add_cog(RestrictionListener(client))
|
@ -1,23 +0,0 @@
|
||||
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 # Slash Command features
|
||||
import logging
|
||||
# logger and handler
|
||||
from bot import configFile, yaml_load
|
||||
|
||||
##### Membership Restriction Message Listener Cog
|
||||
class RestrictionMessageListener(commands.Cog, name='Membership Restriction Message Listener'):
|
||||
def __init__(self, client):
|
||||
self.client = client
|
||||
|
||||
@commands.Cog.listener()
|
||||
async def on_message(self,message):
|
||||
if message.author.bot:
|
||||
return
|
||||
|
||||
def setup(client):
|
||||
client.add_cog(RestrictionMessageListener(client))
|
@ -373,39 +373,34 @@ class Configuration(commands.Cog, name='Configuration Commands'):
|
||||
loadCog(f'./{cogsDir}/slashcommands/secondary/edit_membership.py')
|
||||
await self.client.slash.sync_all_commands()
|
||||
|
||||
@cog_ext.cog_slash(
|
||||
name='test',
|
||||
description='testing options',
|
||||
@cog_ext.cog_subcommand(
|
||||
base='config',
|
||||
# subcommand_group='notifications',
|
||||
name='restrict',
|
||||
description='Toggle membership estriction for the guild.',
|
||||
# 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='required',
|
||||
description='This option is mandatory',
|
||||
option_type=3,
|
||||
name='value',
|
||||
description='Enable membership restrictions for the guild?',
|
||||
option_type=5,
|
||||
required=True
|
||||
),
|
||||
create_option(
|
||||
name='not_required',
|
||||
description='This option is not mandatory',
|
||||
option_type=3,
|
||||
required=False
|
||||
),
|
||||
create_option(
|
||||
name='optional',
|
||||
description='This option is optional',
|
||||
option_type=3,
|
||||
required=False
|
||||
)
|
||||
]
|
||||
)
|
||||
async def _test(
|
||||
async def _restrict(
|
||||
self,
|
||||
ctx:SlashContext,
|
||||
required:str,
|
||||
not_required:str=None,
|
||||
optional:str=None
|
||||
value:bool
|
||||
):
|
||||
await ctx.send(f'```You entered: name = {required}, not_required = {not_required}, and optional = {optional}```',hidden=True)
|
||||
conf = yaml_load(configFile)
|
||||
conf[str(ctx.guild.id)]['restrict'] = value
|
||||
yaml_dump(conf, configFile)
|
||||
await ctx.send(f'```Membership restrictions for the guild `{ctx.guild.name}` have been set to `{value}`.```',hidden=True)
|
||||
|
||||
def setup(client):
|
||||
client.add_cog(Configuration(client))
|
Reference in New Issue
Block a user