我目前正在尝试以discord python重写为我的discord bot发出状态循环命令。我发出了status命令,但无法显示该机器人所在的所有服务器中所有用户的数量。当我尝试打印代码时,它可以正常工作。当我尝试将其作为状态运行时,我一直显示与0个成员一起玩。我不知道该如何解决。
代码:
from discord.ext import commands, tasks
import asyncio
import os
import random
from itertools import cycle
client = commands.Bot(command_prefix = '?')
status = cycle(["?help", "Welcoming People", f"Playing with {len(set(client.users))} users"])
@client.remove_command('help')
@client.event
async def on_ready():
change_status.start()
print ('Bot online')
print (f"Playing with {len(client.users)} users")
@tasks.loop(seconds=10)
async def change_status():
await client.change_presence(status=discord.Status.idle, activity=discord.Game(next(status)))```
答案 0 :(得分:0)
它无法正常工作的原因如下:
status = cycle(["?help", "Welcoming People", f"Playing with {len(set(client.users))} users"])
我们使用不更新的数组启动循环。为说明起见,请键入它(我们感兴趣的字符串):
f"Playing with {len(set(client.users))} users"
在创建字符串时,我们输入了此时的值。变成:
"Playing with 0 users"
这将在阵列周期保持中使用。由于循环仅知道此字符串,因此将仅使用此字符串。 如果要更新字符串,则必须手动更改该字符串,并在每次需要时进行更新。
我建议您创建自己的循环变体。哪个会更新字符串。一种方法:
last_string = 0
@tasks.loop(seconds=10)
async def change_status():
# Update the member count string
list[str_member_index] = f"Playing with {len(set(client.users))} users"
status_str = list[last_string]
await client.change_presence(status=discord.Status.idle, activity=discord.Game(status_str))
last_string += 1
if last_string == len(list):
last_string = 0
该代码尚不完整,因为例如您仍然需要分配str_member_index
。但是它将循环显示您的状态。并更新会员计数状态。