gpt4 book ai didi

python - 如何让机器人休眠并停止响应命令(或 on_messages)

转载 作者:太空狗 更新时间:2023-10-30 01:31:06 24 4
gpt4 key购买 nike

我正在尝试使机器人基本上处于 sleep 模式的命令,这意味着让机器人停止响应命令(如果可能的话,或 on_messages)尝试使用 client.pause (Boolean) 但它没有给出错误我不知道它到底做了什么但是没有任何反应下面是我到目前为止的位置。

@client.command(pass_context=True)
async def sleep(ctx):
client.pause = True

@client.command(pass_context=True)
async def awake(ctx):
client.pause = False

最佳答案

您可以使用 on_message 来覆盖机器人自动调用命令,然后构建一些逻辑让您决定它不想再接受任何命令(又名 sleep )。但请确保您作为机器人所有者可以选择唤醒它,否则您是 SOL 并且需要重新启动。

像下面这样的东西应该可以工作。

我的代码中的假设是您正在使用返工和 f 字符串是可以接受的,但逻辑就在这里,几乎不需要更改,我认为它与 异步版本。

基本控制流程:

bot.py

from discord.ext import commands

class MyBot(commands.bot):
def __init__(self, command_prefix = '!', description=None):
super().__init__(command_prefix, description)
#you could just say False here but if you
#want to start the bot asleep here's a decent way to do it.
self.asleep = kwargs.get('asleep', False)

async def is_owner(obj):
owner = self.application_info().owner
return obj.author == owner


async def on_message(self, message):
ctx = await self.get_context(message)
is_owner = client.is_owner(ctx):

if is_owner or not self.asleep:
self.invoke(ctx)

...

owner.py - 或您保存“仅限机器人所有者”命令的任何位置。

from discord.ext import commands

...

@commands.command()
async def sleep(self, ctx):
self.bot.asleep = True
await ctx.say(f"I am now asleep, I will only respond to {ctx.author}")


@commands.command()
async def awaken(self, ctx):
self.bot.asleep = False
await ctx.say("Ahhh, just woke up! Ready to take commands!")

...

启动器.py

import MyBot

...

bot = MyBot(...)
bot.load_extension("path/to/owner_py_file")

...

我是根据 RDanny 想出来的在调用命令之前,bot 将它的数据库分配给每个上下文。这是一个写得很好的机器人,所有者出于教育目的公开了源代码。


编辑

适应您当前的构建

对于你的情况,我假设你只是使用类似 client = commands.bot(...) 的东西创建一个机器人,这又是一个漂亮的千篇一律,不允许你利用任何您可以从子类化 bot 中获得强大的功能,但您可以只实现以下内容并获得与上述相同的功能:

client = commands.bot(...)
client.asleep = False

然后对于您在问题中显示的命令:

@client.command(pass_context=True)
async def sleep(ctx):
client.sleep = True

@client.command(pass_context=True)
async def awake(ctx):
client.asleep = False

然后为 on_message 覆盖。 请引用: this answer帮助解释为什么这有效。 甚至是 docs .提示提示

async def _is_owner(obj):
owner = self.application_info().owner
return obj.author == owner


@client.event()
async def on_message(message):
ctx = await self.get_context(message)
is_owner = _is_owner(ctx):

if is_owner or not self.asleep:
client.invoke(ctx)

如果上述实现对您不起作用,那么您可以提供我在上面链接的答案中描述的方法:

@client.event
async def on_message(message):
is_owner = _is_owner(ctx):

if is_owner or not client.asleep:
await bot.process_commands(message)

请注意 我不知道你的模块是如何构建的,但如果这是在一个类中完成的,并且你定义了 _is_owner(...) 在该类中,您将需要使用 is_owner = self._is_owner(...) 尽管这可以在其他地方定义。

关于python - 如何让机器人休眠并停止响应命令(或 on_messages),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54832569/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com