Как мне сделать статус бота, который показывает всех участников, с которыми он играет? - PullRequest
0 голосов
/ 07 апреля 2020

В настоящее время я пытаюсь сделать команду цикла состояния для моего диска разногласия в переписке python переписать. Я сделал команду состояния, но получение статуса, показывающего количество всех пользователей на всех серверах, на которых работает бот, не работает. Когда я пытаюсь напечатать код, он работает просто отлично. Когда я пытаюсь запустить его как статус, я продолжаю показывать игру с 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 голосов
/ 07 апреля 2020

Причина, по которой он не работает должным образом, заключается в следующем:

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, например. Но это будет через ваши статусы. А также обновите статус количества участников.

...