如何使机器人进入睡眠状态并停止响应命令(或on_messages)

时间:2019-02-22 17:50:00

标签: python python-3.x discord discord.py

我正在尝试发出一条使机器人基本上处于睡眠模式的命令,这意味着使该机器人停止响应命令(或在可能的情况下启用on_messages) 尝试使用import { Component } from '@angular/core'; import { trigger, state, style, animate, transition, // ... } from '@angular/animations'; @Component({ selector: 'my-app', animations:[ trigger('show',[ state('in',style({ backgroundColor: 'red' })), transition('void=>*',[ style({ backgroundColor: 'red', transform: 'scale(0)' }), animate(1000,style({ backgroundColor: 'green', transform: 'scale(1.5)' })), animate(500) ]), transition('*=>void',[ animate(1000,style({ backgroundColor: 'green', transform: 'scale(0)' })) ]) ]), ], templateUrl: './app.component.html', styleUrls: [ './app.component.css' ] }) export class AppComponent { name = 'Angular'; circles:(boolean)[] = []; ngOnInit() { for(let i =0;i<16;i++){ this.circles.push(false); }; } OnShow(index){ this.circles[index] = !this.circles[index]; } } 并没有出现错误,我不知道它到底在做什么,但什么也没发生 这是我到目前为止的位置。

client.pause (Boolean)

2 个答案:

答案 0 :(得分:1)

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

类似以下的事情应该起作用。

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

基本控制流程:

bot.py

async

owner.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)

...

launcher.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!")

...

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


编辑

以适应您当前的版本

对于您的情况,我假设您只是使用import MyBot ... bot = MyBot(...) bot.load_extension("path/to/owner_py_file") ... 之类的东西来创建一个机器人,这仍然是一个不错的选择,并且不允许您利用从继承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 替代。 请参考: this answer,以帮助解释为何有效。 ,甚至是docs。提示提示

on_message

如果上述实现无法为您服务,则可以提供我上面链接的答案中所述的方法:

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(...),尽管可以在其他地方定义。

答案 1 :(得分:0)

您可以使用get_prefix函数更改bot命令,以便它不会响应任何公共前缀。

backup_prefixes=['.','!','s.','k!']
prefixes = ['.','!','s.','k!']
def get_prefix(bot, msg):
    return commands.when_mentioned_or(*prefixes)(bot, msg)

bot = commands.Bot(command_prefix=get_prefix)

@bot.event
async def on_ready():
    print(bot.user.name)


@bot.command(pass_context=True)
async def resume(con):
    for i in backup_prefixes:
        prefixes.append(i)


@bot.command(pass_context=True)
async def pause(con):
    prefixes.clear()
    # prefixes.append("an unknow prefix so it can't be invoked") #Ex: aslkdjflkj2k4lkj21312kj
    prefixes.append(',')

您还可以添加更多if语句,以确保只有某些用户可以使用该命令来使机器人静音,以使其不会响应其他用户。