Re-formatted everything

This commit is contained in:
unknown 2023-03-12 22:55:57 +01:00
parent f9eabcfb19
commit c3f74be9f3

View File

@ -1,41 +1,33 @@
import asyncio import asyncio
from typing import Union, List from typing import List
from datetime import timedelta
from copy import copy
import contextlib
import discord import discord
from redbot.core import commands
from redbot.core import Config, checks, commands
from redbot.core.utils import AsyncIter 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.antispam import AntiSpam
from redbot.core.utils.chat_formatting import box, pagify
from redbot.core.bot import Red from redbot.core.bot import Red
from redbot.core.utils.predicates import MessagePredicate from redbot.core.utils.predicates import MessagePredicate
application_channel_id = 1023172488143839252
class Recruitment(commands.Cog): class Recruitment(commands.Cog):
"""A cog that lets a user send a membership application. """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 to a channel in the server for staff, and the application creator
gets a DM. Both can be used to communicate. gets a DM. Both can be used to communicate.
""" """
def __init__(self, bot): def __init__(self, bot: Red):
self.bot = bot self.bot = bot
self.message: str = '' self.message: str = ''
self.active = True self.active = True
self.application_channel_id = 1023172488143839252
self.ask_questions_timeout = 300.0
@commands.group(name="application", usage="[text]", invoke_without_command=True) @commands.group(name="apply", invoke_without_command=True)
async def application(self, ctx: commands.Context, *, _application: str = ""): async def apply(self, ctx: commands.Context):
"""Send an application. """Send a membership application."""
Use without arguments for an interactive application creation flow, or do
`[p]application [text]` to use it non-interactively.
"""
author = ctx.author author = ctx.author
# Check if the command was sent in a direct message to the bot # 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.") await ctx.send("This command can only be used in a direct message to the bot.")
return return
# If there is no text argument, use an interactive flow # Ask the user the questions and get the answers with a timeout
if not _application: questions = ["What's your name?", "What's your age?", "Why do you want to join our community?"]
# Ask the user the questions and get the answers try:
questions = ["What's your name?", "What's your age?", "Why do you want to join our community?"] answers = await asyncio.wait_for(self.ask_questions(author, questions), timeout=self.ask_questions_timeout)
answers = await ask_questions(self.bot, author, questions) except asyncio.TimeoutError:
await author.send("You took too long to answer. Please try again later.")
return
# Create an embed with the application information # Create an embed with the application information
application_embed = await format_application(answers, author) application_embed = await self.format_application(answers, author)
# Send the embed to the application channel # Send the embed to the application channel
application_channel = self.bot.get_channel(application_channel_id) application_channel = self.bot.get_channel(self.application_channel_id)
await application_channel.send(embed=application_embed) await application_channel.send(embed=application_embed)
# Send a confirmation message to the author # Send a confirmation message to the author
await author.send("Thank you for submitting your application!") 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!")
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: async def ask_questions(self, author: discord.Member, questions: List[str]) -> List[str]:
embed = discord.Embed(title="Application", color=discord.Color.green()) """Ask the user a list of questions and return the answers."""
embed.add_field(name="Name", value=author.display_name) answers = []
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
# Ask the user the questions
for question in questions:
await author.send(question)
async def ask_questions(bot, author, questions): # Wait for the user to respond
"""Ask the user a list of questions and return the answers.""" answer = await self.bot.wait_for(
answers = [] "message", check=lambda m: m.author == author and m.guild is None
)
answers.append(answer.content)
# Ask the user the questions return answers
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