事件可以执行命令吗?如果是这样,我该怎么做?

时间:2020-09-16 18:57:36

标签: python discord.py

所以我正在尝试一个事件,一旦用户键入一个特定的单词(不是命令,实际上是一个单词/字符串),该事件将触发一个现有命令。是的,您可能想知道“为什么用户不键入命令本身?”好吧,为什么不是这种情况,很难解释。检查一下:

仅当此人键入“ nothing”(字面上为nothing)时,我的活动才有效。最终,这个人不会指望该机器人实际上将其作为命令,因此他/她将不会将其作为命令(带有前缀和所有内容)键入。这是我的代码:

@client.command()
async def menu(ctx)
#here, well, goes what I want the command to do but it's not the issue

@client.event
async def on_message(message):
    if message.content.startswith("nothing"):
        #here idk how to execute the command up there. That's my question

我希望我对我的问题很清楚。不必担心命令执行什么,也不必担心事件消息“什么都没有”。我只是真的想知道如何使这项工作。

一些朋友建议我调用该命令,但是我真的不知道该怎么做,并且每次尝试都行不通。其他人建议调用该函数,但是我也尝试过该方法,但它不起作用。我不知道我是否输入正确或者它根本无法正常工作。我希望有人在这里帮助我。 预先感谢。

2 个答案:

答案 0 :(得分:0)

如果您的客户端是Bot实例,则可以使用Bot.get_context()创建自己的上下文并从那里调用命令:

import discord
from discord.ext import commands

bot = commands.Bot(command_prefix='!')

@bot.command()
async def menu(ctx):
    await ctx.send('bar')

@bot.event
async def on_message(message):
    if message.content.startswith('foo'):
        ctx = await bot.get_context(message, cls=commands.Context)
        ctx.command = bot.get_command('menu')
        await bot.invoke(ctx)

    await bot.process_commands(message)

答案 1 :(得分:0)

get_context,这需要一个消息对象。然后invoke。请记住,使用此方法有3个缺点。

  1. 转换器(类型提示)不会被触发。您需要将正确的类型传递给参数。
  2. 支票将被绕过。您可以使用非所有者调用仅所有者命令,该命令仍然有效。 如果仍然要运行所有检查,请参见can_run,它将运行所有检查并在任何检查失败的情况下引发错误。
  3. 如果ctx.invoke是在命令(例如eval)之外调用的,则错误处理程序将不会触发。
@client.command()
async def menu(ctx):
    await ctx.send("Hello")


@client.event
async def on_message(message):
    if message.content.startswith("nothing"):
        ctx = await client.get_context(message)
        await ctx.invoke(menu)
    await client.process_commands(message)