отправляйте вопросы в dm и отправляйте ответы в виде вставки в канал discord.py

#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», что означает, что никто не может помочь вам с этой ошибкой, поскольку соответствующий код не предоставлен. Пожалуйста, подумайте о том, чтобы переписать свой вопрос, чтобы он содержал весь соответствующий код.