From c3f74be9f3d9c648daeb95cca2d3e94638fa63de Mon Sep 17 00:00:00 2001 From: unknown Date: Sun, 12 Mar 2023 22:55:57 +0100 Subject: [PATCH] Re-formatted everything --- recruitmentCog/recruitment.py | 100 +++++++++++++++------------------- 1 file changed, 44 insertions(+), 56 deletions(-) diff --git a/recruitmentCog/recruitment.py b/recruitmentCog/recruitment.py index d66b310..1848fda 100644 --- a/recruitmentCog/recruitment.py +++ b/recruitmentCog/recruitment.py @@ -1,41 +1,33 @@ import asyncio -from typing import Union, List -from datetime import timedelta -from copy import copy -import contextlib +from typing import List + import discord - - -from redbot.core import Config, checks, commands +from redbot.core import commands from redbot.core.utils import AsyncIter -from redbot.core.utils.chat_formatting import pagify, box from redbot.core.utils.antispam import AntiSpam +from redbot.core.utils.chat_formatting import box, pagify from redbot.core.bot import Red from redbot.core.utils.predicates import MessagePredicate -application_channel_id = 1023172488143839252 - class Recruitment(commands.Cog): """A cog that lets a user send a membership application. - Users can open an application using `[!]apply`. These are then sent + Users can open an application using `[p]apply`. These are then sent to a channel in the server for staff, and the application creator gets a DM. Both can be used to communicate. """ - def __init__(self, bot): + def __init__(self, bot: Red): self.bot = bot self.message: str = '' self.active = True + self.application_channel_id = 1023172488143839252 + self.ask_questions_timeout = 300.0 - @commands.group(name="application", usage="[text]", invoke_without_command=True) - async def application(self, ctx: commands.Context, *, _application: str = ""): - """Send an application. - - Use without arguments for an interactive application creation flow, or do - `[p]application [text]` to use it non-interactively. - """ + @commands.group(name="apply", invoke_without_command=True) + async def apply(self, ctx: commands.Context): + """Send a membership application.""" author = ctx.author # Check if the command was sent in a direct message to the bot @@ -43,48 +35,44 @@ class Recruitment(commands.Cog): await ctx.send("This command can only be used in a direct message to the bot.") return - # If there is no text argument, use an interactive flow - if not _application: - # Ask the user the questions and get the answers - questions = ["What's your name?", "What's your age?", "Why do you want to join our community?"] - answers = await ask_questions(self.bot, author, questions) + # Ask the user the questions and get the answers with a timeout + questions = ["What's your name?", "What's your age?", "Why do you want to join our community?"] + try: + answers = await asyncio.wait_for(self.ask_questions(author, questions), timeout=self.ask_questions_timeout) + except asyncio.TimeoutError: + await author.send("You took too long to answer. Please try again later.") + return - # Create an embed with the application information - application_embed = await format_application(answers, author) + # Create an embed with the application information + application_embed = await self.format_application(answers, author) - # Send the embed to the application channel - application_channel = self.bot.get_channel(application_channel_id) - await application_channel.send(embed=application_embed) + # Send the embed to the application channel + application_channel = self.bot.get_channel(self.application_channel_id) + await application_channel.send(embed=application_embed) - # Send a confirmation message to the author - await author.send("Thank you for submitting your application!") - else: - # If there is a text argument, use a non-interactive flow - application_channel = self.bot.get_channel(application_channel_id) - await application_channel.send(_application) - await author.send("Thank you for submitting your application!") + # 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: + embed = discord.Embed(title=f"Application from {author.display_name}", color=discord.Color.green()) + embed.add_field(name="Name", value=author.name) + 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 format_application(answers: List[str], author: discord.Member) -> discord.Embed: - embed = discord.Embed(title="Application", color=discord.Color.green()) - embed.add_field(name="Name", value=author.display_name) - embed.add_field(name="Discord ID", value=author.id) - embed.add_field(name="Age", value=answers[1]) - embed.add_field(name="Reason for joining", value=answers[2]) - return embed + async def ask_questions(self, author: discord.Member, questions: List[str]) -> List[str]: + """Ask the user a list of questions and return the answers.""" + answers = [] + # Ask the user the questions + for question in questions: + await author.send(question) -async def ask_questions(bot, author, questions): - """Ask the user a list of questions and return the answers.""" - answers = [] + # Wait for the user to respond + answer = await self.bot.wait_for( + "message", check=lambda m: m.author == author and m.guild is None + ) + answers.append(answer.content) - # Ask the user the questions - for question in questions: - await author.send(question) - # Wait for the user to respond - answer = await bot.wait_for( - "message", check=lambda m: m.author == author and m.guild is None - ) - answers.append(answer.content) - - return answers \ No newline at end of file + return answers \ No newline at end of file