首页 > 解决方案 > 在机器人重启或崩溃 discord.py 的情况下如何触发事件

问题描述

我希望我的机器人在我重新启动或崩溃时激活一个删除瞬时数据的事件。我尝试on_disconnect用作事件,但它不起作用。在下面的代码中,我用作on_disconnect命令,但我希望有一个事件。这是可能的?

async def on_disconnect(ctx):
    cursor = levelsystem_db.cursor()
    for member in ctx.guild.members:
        cursor.execute(f"SELECT * FROM anti_spam WHERE client_id = {str(member.id)}")
        result = cursor.fetchall()
        print(member, member.id, len(result))
        if (len(result) != 0):
            cursor.execute(f"DELETE FROM anti_spam WHERE client_id = {str(member.id)}")
            levelsystem_db.commit()
            print(f"ho rimosso i dati di {member}")

编辑:

import discord


class Bot(discord.Client):
    def __init__(self) -> None:
        discord.Client.__init__(self)
        return

    async def on_ready(self) -> None:
        await self.close()  # This can simulate a crash for now
        return

if __name__ == '__main__':
    client = Bot()
    client.run(token)
    # Code after crash here
    print('Bot has crashed')
    cursor = levelsystem_db.cursor()
    guild = client.get_guild(637626960599842824)
    print(guild)
    for member in guild.members:
        cursor.execute(f"SELECT * FROM anti_spam WHERE client_id = {str(member.id)}")
        result = cursor.fetchall()
        print(member, member.id, len(result))
        if (len(result) != 0):
            cursor.execute(f"DELETE FROM anti_spam WHERE client_id = {str(member.id)}")
            levelsystem_db.commit()
            print(f"ho rimosso i dati di {member}")

标签: discord.py

解决方案


如果机器人崩溃,你可以在你的代码之后client.run('TOKEN')执行。例如:

import discord


class Bot(discord.Client):
    def __init__(self) -> None:
        discord.Client.__init__(self)
        return

    async def on_ready(self) -> None:
        await self.close()  # This can simulate a crash for now
        return


if __name__ == '__main__':
    client = Bot()
    client.run('TOKEN')

    # Code after crash here
    print('Bot has crashed')

通过这种实现,您甚至可以调用一个子进程来使机器人重新联机。

编辑(事件循环错误修复):

您将要导入这些:

from asyncio import set_event_loop
from asyncio import SelectorEventLoop
from selectors import SelectSelector

然后在创建客户端之前有这一行:

set_event_loop(SelectorEventLoop(SelectSelector()))

推荐阅读