python - 如何在 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)
解决方案
混合协程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()
参考:
推荐阅读
- python - 终端和 VS 代码中的 Anaconda 错误
- xml - 如何使用importxml同时将文本和数值数据导入谷歌电子表格
- c++ - 如何解决由于 Outlook 加载项中的后台线程而导致的挂起问题
- spring-boot - Spring boot:错误要求在 JpaRepository 中实现所有方法
- git - BitBucket Git - 致命:无法访问... SSL 例程:SSL23_GET_SERVER_HELLO:sslv3 警报握手失败
- c# - 如何在 Umbraco 中的第一个 / 之后删除 Url 值
- c# - 让一个精灵向另一个移动。不需要类似于从头开始的旋转。C#
- css - 仅在 CSS 中定位 WebKit 浏览器?(2019 年版)
- jquery - 如何在单个函数中绑定jquery多个按钮事件
- google-apps-script - 简单的表单提交重定向到错误的页面,为什么?