首页 > 解决方案 > 如何在 discord.py 中创建一个不断变化的 Discord bot 丰富的存在?

问题描述

所以,我正在制作一个 Discord 机器人。它工作正常,命令也工作。我想做的是让状态,也就是丰富的存在,不断变化。例如,/h > 1 sec later > /he > 1 sec later > /hel > one sec later > /help然后继续重复。所以,我想我会把它放在一个while True:循环中。但是,这显然会阻止机器人的其余部分运行。然后,我想我会使用线程,但这也不起作用(或者我做错了)。然后,我将永远循环放在 on_ready() 函数中,并且状态有效,但它在经过几个字符后暂停了 15 秒。此外,它会停止机器人的其余部分,这意味着命令也不起作用。我不确定还能做什么。

代码:

import os
import random
import discord
from dotenv import load_dotenv
import time
from threading import Thread

from website import main

load_dotenv()
TOKEN= os.getenv('DISCORD_TOKEN')
GUILD = os.getenv('GUILD_NAME')
print(TOKEN)

client = discord.Client()

async def update_presence():
    while True:
        await client.change_presence(activity=discord.Game(name='/h'))
        time.sleep(1)
        await client.change_presence(activity=discord.Game(name='/he'))
        time.sleep(1)
        await client.change_presence(activity=discord.Game(name='/hel'))
        time.sleep(1)
        await client.change_presence(activity=discord.Game(name='/help'))
        time.sleep(1)

@client.event
async def on_ready():
    await client.change_presence(activity=discord.Game('/help'))
    print(f'{client.user} has connected to Discord!')

main()
t = Thread(target=update_presence)
t.start()
client.run(TOKEN)

标签: pythondiscord.py

解决方案


混合协程Threading是一个坏主意,也是time.sleep一个阻塞函数,请asyncio.sleep改用:

import asyncio

async def update_presence():
    while True:
        await client.change_presence(activity=discord.Game(name='/h'))
        await asyncio.sleep(1)
        await client.change_presence(activity=discord.Game(name='/he'))
        await asyncio.sleep(1)
        await client.change_presence(activity=discord.Game(name='/hel'))
        await asyncio.sleep(1)
        await client.change_presence(activity=discord.Game(name='/help'))
        await asyncio.sleep(1)

然后使用loop.create_task创建后台任务

bot.loop.create_task(update_presence())

另一种选择是使用 discord.py 扩展tasks

from discord.ext import tasks


@tasks.loop(seconds=1)
async def update_presence():
    await client.change_presence(activity=discord.Game(name='/h'))
    await asyncio.sleep(1)
    await client.change_presence(activity=discord.Game(name='/he'))
    await asyncio.sleep(1)
    await client.change_presence(activity=discord.Game(name='/hel'))
    await asyncio.sleep(1)
    await client.change_presence(activity=discord.Game(name='/help'))


update_presence.start()

参考:


推荐阅读