【问题标题】:How do I run the discord bot after doing client.run()?执行 client.run() 后如何运行不和谐机器人?
【发布时间】:2021-05-24 12:49:00
【问题描述】:
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,但我不知道如何让代码等待客户端完成准备

【问题讨论】:

    标签: python discord.py


    【解决方案1】:

    不建议在discord.py之类的异步库中使用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()
    

    参考资料:

    【讨论】:

    • 那我怎么称呼它?因此,假设我正在训练一个模型,并且我希望 discord 在我完成时通知我。我会做 client.send_message(name, msg)
    猜你喜欢
    • 1970-01-01
    • 2021-08-30
    • 2018-04-17
    • 2021-05-08
    • 1970-01-01
    • 2021-05-17
    • 2020-06-30
    • 2021-08-09
    • 1970-01-01
    相关资源
    最近更新 更多