首页 > 解决方案 > 执行 client.run() 后如何运行 discord 机器人?

问题描述

class MyClient(discord.Client):
    def __init__(self, *args, loop=None, **options):
        intents = discord.Intents.default()
        intents.members = True
        self.data = {}
        super().__init__(intents=intents, *args, loop=None, **options)

    async def on_ready(self):
        print('Logged on as {0}!'.format(self.user))
        for guild in self.guilds:
            members = []
            async for member in guild.fetch_members():
                members.append(member)
                if member.name == "Name":
                    await member.send("Hello :wave:")
            self.data[guild] = members
            print(self.data[guild])

    async def on_message(self, message):
        if message.author == self.user:
            return

        if message.content.startswith('$hello'):
            await message.author.send(":wave:")

    async def sendMessage(self, name, message):
        for guild in self.data:
            for member in self.data[guild]:
                if name == member.name:
                    print(member.name)
                    await member.send(message)

在另一个文件中,即 main.py 或其他文件中,

client = MyClient()
client.run(TOKEN)

while True:
    sleep(5)
    client.sendMessage("Me", "Hello")

理想情况下,一旦我的其他代码完成运行或类似性质的东西,我会使用它来通知我。我已经尝试过线程,如本示例https://stackoverflow.com/a/62894021/9092466中所示,但我不知道如何让代码等待客户端完成准备

标签: pythondiscord.py

解决方案


不建议对 discord.py 等异步库使用 using sleep,您可以使用 discord.py 的任务来运行循环

from discord.ext import tasks

class MyClient(discord.Client):
    def __init__(self, *args, loop=None, **options):
        intents = discord.Intents.default()
        intents.members = True
        self.data = {}
        super().__init__(intents=intents, *args, loop=None, **options)
        self.send_message.start()

    @tasks.loop(seconds= 5)
    async def send_message(self, name, message):
        for guild in self.data:
            for member in self.data[guild]:
                if name == member.name:
                    print(member.name)
                    await member.send(message)

    @send_message.before_loop
    async def before_sending(self): #waiting until the bot is ready
        print('waiting...')
        await self.bot.wait_until_ready()

参考:


推荐阅读