Discord.py:有没有办法使用 on_message() 函数获取命令的参数?

Posted

技术标签:

【中文标题】Discord.py:有没有办法使用 on_message() 函数获取命令的参数?【英文标题】:Discord.py: Is there a way to get arguments for a command using the on_message() function? 【发布时间】:2021-04-14 11:48:24 【问题描述】:

我只是在用 python 编写我自己的 discord 机器人,我有一个 kill 命令。它所做的只是当你输入*kill 并提及某人(*kill @goose.mp4)时,它会给你一个随机场景,告诉你如何杀死他们,类似于 Dank Memer 机器人。我正在尝试获取提到的用户 ID,这将是函数的第二个参数。但我被困住了。在通读 API 并多次搜索后,我只知道如何获取作者的 ID 并使用机器人 ping 他们,而不是作者提到的人。

这是我目前正在使用的代码。为其中一个变量赋值仅用于测试目的。

if message.content.startswith('*kill'):
    print("kill command recieved")
    kill_mention_killer = message.author.mention
    kill_mention_victm = 'some guy'
    print(kill_mention_killer)

    kill_responses = [kill_mention_killer + ' kills ' + kill_mention_victim]
    kill_message = kill_responses[random.randint(-1, len(kill_responses) -1)]
    await message.channel.send(kill_message)

【问题讨论】:

你为什么不直接使用commands? 最后,你想完成什么?你想把什么发回聊天室? 基本上,每个相关人员的两个变量都已分配,因此它会从列表中挑选一些东西 ei "User 1 kills User 2" 随机分配它作为变量,然后将该变量发送到聊天。 这必须通过命令来完成。我会在上面发一个帖子。 【参考方案1】:

您当前执行此命令的方式不允许您获取参数。如果您尝试发出这样的命令:*kill @user,那么您将需要能够获取提到的用户(这是您的问题)。以下是你的做法:

第一步

import discord, random
from discord.ext import commands

这些导入非常重要。他们将是需要的。

第二步

client = commands.Bot(command_prefix='*')

这将初始化整个代码中使用的client。现在到您将实际发出命令的部分。

@client.command()
async def kill(ctx, member: discord.Member):  # This command will be named kill and will take two arguments: ctx (which is always needed) and the user that was mentioned
    kill_messages = [
        f'ctx.message.author.mention killed member.mention with a baseball bat', 
        f'ctx.message.author.mention killed member.mention with a frying pan'
    ]  # This is where you will have your kill messages. Make sure to add the mentioning of the author (ctx.message.author.mention) and the member mentioning (member.mention) to it
    await ctx.send(random.choice(kill_messages))

就是这样!这就是你如何制作一个标准的 kill 命令。只需确保将 kill_messages 数组更改为您想要的任何消息即可。

【讨论】:

它在标记我一个错误。 “客户端”对象没有属性“命令” 您确定使用我在顶部声明的imports 吗? 是的,我可以在另一条评论中发送整个代码。可能是我在里面的东西。我删除了我以前的代码并将其保存在记事本上,所以我认为没有任何东西会导致它标记错误。 那么,在剩下这段代码之后,它仍然会引发那个错误吗? 好吧,我刚刚删除了 所有内容,但是您发送的内容,如果不放入令牌,它将无法工作,当我放入令牌时,它会标记错误。【参考方案2】:
if message.content.startswith('*kill'):

    #Mentioned or not
    if len(message.mentions) == 0:
        #no one is mentioned
        return

    pinged_user = message.mentions[0]
    killer_user = message.author
    kill_messages = [
        ...
    ]
    await ctx.send(random.choice(kill_messages))

在这里,我只是使用message.mentions 来查找消息中是否提到了任何有效用户以及是否被提及!所有提及都将在message.mentions list 中,所以我首先提到了message.mentions[0] 的消息。那么你可以对提到的用户对象做任何事情。

【讨论】:

以上是关于Discord.py:有没有办法使用 on_message() 函数获取命令的参数?的主要内容,如果未能解决你的问题,请参考以下文章

Discord.py:有没有办法使用 on_message() 函数获取命令的参数?

有没有办法阻止 discord.py 机器人提及角色?

有没有办法在 Discord.py 中流式传输视频?

有没有办法寻找角色ping? (discord.py)

有没有办法踢/禁止 discord.py 中的每个人?

Meme 命令 discord.py