Re-formatted everything
This commit is contained in:
parent
f9eabcfb19
commit
c3f74be9f3
@ -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,46 +35,42 @@ 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:
|
|
||||||
# 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?"]
|
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)
|
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
|
# 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:
|
||||||
async def format_application(answers: List[str], author: discord.Member) -> discord.Embed:
|
embed = discord.Embed(title=f"Application from {author.display_name}", color=discord.Color.green())
|
||||||
embed = discord.Embed(title="Application", color=discord.Color.green())
|
embed.add_field(name="Name", value=author.name)
|
||||||
embed.add_field(name="Name", value=author.display_name)
|
|
||||||
embed.add_field(name="Discord ID", value=author.id)
|
embed.add_field(name="Discord ID", value=author.id)
|
||||||
embed.add_field(name="Age", value=answers[1])
|
embed.add_field(name="Age", value=answers[1])
|
||||||
embed.add_field(name="Reason for joining", value=answers[2])
|
embed.add_field(name="Reason wishing to become a member:", value=answers[2])
|
||||||
return embed
|
return embed
|
||||||
|
|
||||||
|
async def ask_questions(self, author: discord.Member, questions: List[str]) -> List[str]:
|
||||||
async def ask_questions(bot, author, questions):
|
|
||||||
"""Ask the user a list of questions and return the answers."""
|
"""Ask the user a list of questions and return the answers."""
|
||||||
answers = []
|
answers = []
|
||||||
|
|
||||||
# Ask the user the questions
|
# Ask the user the questions
|
||||||
for question in questions:
|
for question in questions:
|
||||||
await author.send(question)
|
await author.send(question)
|
||||||
|
|
||||||
# Wait for the user to respond
|
# Wait for the user to respond
|
||||||
answer = await bot.wait_for(
|
answer = await self.bot.wait_for(
|
||||||
"message", check=lambda m: m.author == author and m.guild is None
|
"message", check=lambda m: m.author == author and m.guild is None
|
||||||
)
|
)
|
||||||
answers.append(answer.content)
|
answers.append(answer.content)
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user