2023-03-12 12:13:30 +01:00
|
|
|
import asyncio
|
2023-03-12 22:55:57 +01:00
|
|
|
from typing import List
|
|
|
|
|
import discord
|
2023-03-12 22:58:29 +01:00
|
|
|
from redbot.core import Config, checks, commands
|
2023-03-12 12:13:30 +01:00
|
|
|
from redbot.core.utils import AsyncIter
|
2023-03-12 22:58:29 +01:00
|
|
|
from redbot.core.utils.chat_formatting import pagify, box
|
2023-03-12 12:13:30 +01:00
|
|
|
from redbot.core.utils.antispam import AntiSpam
|
|
|
|
|
from redbot.core.bot import Red
|
|
|
|
|
from redbot.core.utils.predicates import MessagePredicate
|
|
|
|
|
|
2023-03-12 22:58:29 +01:00
|
|
|
application_channel_id = 1023172488143839252
|
2023-03-12 21:41:08 +01:00
|
|
|
|
2023-03-12 12:13:30 +01:00
|
|
|
class Recruitment(commands.Cog):
|
2023-03-12 22:58:29 +01:00
|
|
|
"""A cog that lets a user send a membership application."""
|
2023-03-12 21:41:08 +01:00
|
|
|
|
2023-03-12 22:55:57 +01:00
|
|
|
def __init__(self, bot: Red):
|
2023-03-12 12:13:30 +01:00
|
|
|
self.bot = bot
|
2023-03-12 22:58:29 +01:00
|
|
|
|
2023-03-12 23:14:26 +01:00
|
|
|
@commands.group(name="application")
|
2023-03-12 23:05:14 +01:00
|
|
|
async def application(self, ctx: commands.Context):
|
2023-03-12 23:14:26 +01:00
|
|
|
"""Send an application using an interactive flow!
|
2023-03-12 22:58:29 +01:00
|
|
|
"""
|
2023-03-12 12:13:30 +01:00
|
|
|
author = ctx.author
|
|
|
|
|
|
2023-03-12 21:41:08 +01:00
|
|
|
# Check if the command was sent in a direct message to the bot
|
|
|
|
|
if not isinstance(ctx.channel, discord.DMChannel):
|
|
|
|
|
await ctx.send("This command can only be used in a direct message to the bot.")
|
|
|
|
|
return
|
|
|
|
|
|
2023-03-12 23:05:14 +01:00
|
|
|
await self.interactive_application(author)
|
|
|
|
|
|
2023-03-12 22:58:29 +01:00
|
|
|
|
|
|
|
|
async def interactive_application(self, author: discord.Member):
|
|
|
|
|
"""Ask the user several questions to create an application."""
|
2023-03-12 22:55:57 +01:00
|
|
|
questions = ["What's your name?", "What's your age?", "Why do you want to join our community?"]
|
|
|
|
|
try:
|
2023-03-12 22:58:29 +01:00
|
|
|
answers = await self.ask_questions(author, questions)
|
2023-03-12 22:55:57 +01:00
|
|
|
except asyncio.TimeoutError:
|
|
|
|
|
await author.send("You took too long to answer. Please try again later.")
|
|
|
|
|
return
|
|
|
|
|
|
2023-03-12 22:58:29 +01:00
|
|
|
embed = await self.format_application(answers, author)
|
2023-03-12 22:55:57 +01:00
|
|
|
|
|
|
|
|
# Send the embed to the application channel
|
2023-03-12 22:58:29 +01:00
|
|
|
application_channel = self.bot.get_channel(application_channel_id)
|
2023-03-12 23:14:26 +01:00
|
|
|
message = await application_channel.send(embed=embed)
|
|
|
|
|
|
|
|
|
|
# Add reactions to the message
|
|
|
|
|
reactions = ["✅", "❌", "❓"]
|
|
|
|
|
for reaction in reactions:
|
|
|
|
|
await message.add_reaction(reaction)
|
2023-03-12 22:55:57 +01:00
|
|
|
|
|
|
|
|
# Send a confirmation message to the author
|
|
|
|
|
await author.send("Thank you for submitting your application!")
|
|
|
|
|
|
|
|
|
|
async def format_application(self, answers: List[str], author: discord.Member) -> discord.Embed:
|
2023-03-12 22:58:29 +01:00
|
|
|
"""Format the application answers into an embed."""
|
2023-03-12 22:55:57 +01:00
|
|
|
embed = discord.Embed(title=f"Application from {author.display_name}", color=discord.Color.green())
|
2023-03-12 23:05:14 +01:00
|
|
|
embed.add_field(name="Name", value=answers[0])
|
2023-03-12 22:55:57 +01:00
|
|
|
embed.add_field(name="Discord ID", value=author.id)
|
|
|
|
|
embed.add_field(name="Age", value=answers[1])
|
|
|
|
|
embed.add_field(name="Reason wishing to become a member:", value=answers[2])
|
|
|
|
|
return embed
|
|
|
|
|
|
|
|
|
|
async def ask_questions(self, author: discord.Member, questions: List[str]) -> List[str]:
|
2023-03-12 22:58:29 +01:00
|
|
|
"""Ask the user several questions and return the answers."""
|
2023-03-12 22:55:57 +01:00
|
|
|
answers = []
|
|
|
|
|
|
|
|
|
|
for question in questions:
|
|
|
|
|
await author.send(question)
|
2023-03-12 22:58:29 +01:00
|
|
|
answer = await self.get_answer(author)
|
2023-03-12 22:55:57 +01:00
|
|
|
answers.append(answer.content)
|
|
|
|
|
|
2023-03-12 22:58:29 +01:00
|
|
|
return answers
|
|
|
|
|
|
|
|
|
|
async def get_answer(self, author: discord.Member) -> discord.Message:
|
|
|
|
|
"""Wait for the user to send a message."""
|
|
|
|
|
return await self.bot.wait_for(
|
|
|
|
|
"message", check=lambda m: m.author == author and m.guild is None
|
|
|
|
|
)
|