如何使机器人状态显示机器人正在玩的所有成员?

时间:2020-04-07 10:31:40

标签: python discord.py discord.py-rewrite

我目前正在尝试以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)))```

1 个答案:

答案 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。但是它将循环显示您的状态。并更新会员计数状态。