#python #discord #discord.py-rewrite
#python #Discord #discord.py-переписать
Вопрос:
Я пытаюсь сделать так, чтобы, когда пользователь запускал команду $createprofile, бот отправлял пользователю вопросы, указанные в списке, один за другим, а затем отправлял ответы в виде вставки в указанный канал. Теперь я уже создал список, но я не уверен, как строить, задавая каждый вопрос один за другим, я, возможно, подумываю об использовании asyncio wait_for
import discord
from discord.ext import commands
import platform
import cogs._json
class Profile(commands.Cog):
def __init__(self, bot):
self.bot = bot
@commands.Cog.listener()
async def on_ready(self):
print("Profile Cog has been loadedn-----")
# @commands.command(aliases=['pm'])
# async def dm(self, ctx, user: discord.User, *, message=None):
# message = message or "This message is sent via dm"
# await user.send(message)
# await ctx.message.delete()
@commands.command()
async def createprofile(ctx, member: discord.Member = None):
userName = ""
userAge = ""
questions = [
"Please input your name/nickname:",
"Please input your age:"
]
dmChannel = await ctx.author.send(
"You will be receiving two questions. One involving your name and the other your age.")
def check(message):
return message.author == ctx.author and message.channel == dmChannel.channel
async def askQuestion(question):
await ctx.author.send(question)
print("Waiting for reply...")
userReply = await client.wait_for('message', check=check)
print("User replied")
return userReply.content
userName = await askQuestion(questions[0])
userAge = await askQuestion(questions[1])
e = discord.Embed(title=str(userName) "'s Profile", description=f"""
Age: `{str(userAge)}`
""")
await ctx.send(embed=e)
def setup(bot):
bot.add_cog(Profile(bot))
Ответ №1:
@client.command()
async def createprofile(self, ctx, member: discord.Member = None):
userName = ""
userAge = ""
questions = [
"Please input your name/nickname:",
"Please input your age:"
]
dmChannel = await ctx.author.send(
"Yo will be receiving two questions. One involving your name and the other your age.")
def check(message):
return message.author == ctx.author and message.channel == dmChannel.channel
async def askQuestion(question):
await ctx.author.send(question)
print("Waiting for reply...")
userReply = await client.wait_for('message', check=check)
print("User replied")
return userReply.content
userName = await askQuestion(questions[0])
userAge = await askQuestion(questions[1])
e = discord.Embed(title=str(userName) "'s Profile", description=f"""
Age: `{str(userAge)}`
""")
await ctx.send(embed=e)
Во-первых, вам нужно отправить пользователю вопрос, поэтому, как вы это сделаете, await ctx.author.send("this is a question")
вы узнаете. Затем вы сохраняете это сообщение в переменной. Затем вы создаете функцию проверки, которая проверяет, что ответивший пользователь на самом деле является пользователем, отправившим $createprofile
сообщение в первую очередь. Вам также нужно будет проверить, является ли канал сообщения каналом dm. Так вот где сообщение, которое вы сохранили ранее, вступает в действие. Это гарантирует, что канал сообщения совпадает с каналом сообщения dm, которое вы отправили пользователю ранее. После этого вы создаете асинхронную функцию, чтобы задать вопрос. С этого момента все довольно просто. Не стесняйтесь оптимизировать свой код с помощью for loops
. Надеюсь, это поможет.
Комментарии:
1. да, но разве вам не нужно было бы определять канал в разделе channel = dm.channel или я ошибаюсь в этом, и каждый раздел на самом деле будет сформулирован как вопрос, например, как вас зовут?, сколько вам лет? итак, я пытаюсь сделать так, чтобы сначала он задавал вопрос «Как вас зовут», а затем, как только пользователь ответит, он задаст следующий
2. @JangoDarkWind не стесняйтесь задавать любые вопросы
3. но если я правильно понимаю, то канал dm и канал сообщений разделены, потому что основная проблема сейчас заключается в том, что он отправляет сообщение «Вы получите два вопроса. Один с вашим именем, а другой с вашим возрастом «. и я отвечаю, что больше ничего не происходит. Также исходный код, когда я его запускал, выдавал ошибку ctx не имеет атрибута author, поэтому я изменил dmChannel = await ctx.author . отправить в dmChannel = message.author. отправьте, и он отправил dm, иначе это приведет к ошибке
4. Ах, вы, должно быть, используете событие on_message. Виноват. Это работает сейчас? Потому что для меня это работает нормально.
5. @JangoDarkWind В предоставленном вами примере кода невозможно найти объект или класс с именем «Profile», что означает, что никто не может помочь вам с этой ошибкой, поскольку соответствующий код не предоставлен. Пожалуйста, подумайте о том, чтобы переписать свой вопрос, чтобы он содержал весь соответствующий код.