如何在Discord中更新每条新消息的message.content?

时间:2019-04-08 03:38:07

标签: python discord.py

这个问题的措词不好,但是对于我制造的一个不和谐的机器人,它在message.content中查找“ s!rps”,如果在聊天中发送了“ s!rps”,则要求提供Rock,Paper或剪刀。我希望它更新每条新消息的消息内容,但message.content保持为s!rps并创建一个无限循环。如何在每条新消息中更新message.content?

if "s!rps" in message.content:
        MAI = message.author.id
        msg = "Do you pick Rock, Paper, or Scissors?".format(message)
        await client.send_message(message.channel, msg)
        while True:
            cr = random.randint(1,3)
            if message.content.startswith("Rock"):
                if message.author.id == MAI:
                    choice = 1
                    break
            elif message.content.startswith("Paper"):
                if message.author.id == MAI:
                    choice = 2
                    break
            elif message.content.startswith("Scissors"):
                if message.author.id == MAI:
                    choice = 3
                    break
            elif message.content.startswith("rock"):
                if message.author.id == MAI:
                    choice = 1
                    break
            elif message.content.startswith("paper"):
                if message.author.id == MAI:
                    choice = 2
                    break
            elif message.content.startswith("scissors"):
                if message.author.id == MAI:
                    choice = 3
                    break
            else:
                if message.author.id == MAI:
                    if message.content != "s!rps":
                        msg = ("\"%s\" isn't a valid input." % message.content).format(message)
                        await client.send_message(message.channel,msg)    
        if choice == "Rock":
            choiceNum = 1
        if choice == "Paper":
            choiceNum = "2"
        if choice == 3:
            choiceWord = ""
        if cr == 1:
            crWord = "Rock"
        if cr == 2:
            crWord = "Paper"
        if cr == 3:
            crWord = "Scissors"
        if (cr-choice+5)%3 == 1:
            msg = ("You picked %s, I picked %s, you win!" % (choiceWord, crWord)).format(message)
            await client.send_message(message.channel, msg)
        if (cr-choice+5)%3 == 2:
            msg = ("You picked %s, I picked %s, I win!" % (choiceWord, crWord)).format(message)
            await client.send_message(message.channel, msg)
        if cr == choice:
            msg = ("We both picked %s, it's a tie." % choiceWord).format(message)
            await client.send_message(message.channel, msg)

1 个答案:

答案 0 :(得分:2)

您的消息内容在整个方法中都是固定的,您永远不会更新或等待新消息。同样,该循环可能会完全阻塞您的工作流程!放下while循环,而改为使用Client.wait_for_message(如果重写,则使用Client.wait_for)。

我将执行以下操作,在事件内部定义一个内部函数,该函数可以在等待特定消息时用作检查:

def check(m):
    answers = ["rock", "paper", "scissors"]
    if any(answer == m.content.lower() for answer in answers):
        return True
    else:
        client.send_message(m.channel, "{0.content} is not a viable option".format(m))
        return False

然后,摆脱while循环,即将您的代码修改为:

    MAI = message.author.id
    msg = "Do you pick Rock, Paper, or Scissors?".format(message)
    await client.send_message(message.channel, msg)
    answer_msg = await client.wait_for_message(author = MAI, check = check)
    answer = answer_msg.content.lower()

    if answer == "rock":
        choice = 1
    elif answer == "scissors": 
    .....

请注意,wait_for_message具有author参数,以确保消息作者确实是您想要的消息作者,这意味着您的if message.author.id == MAI将得到考虑。现在它也不区分大小写。