Python

Python discord.py + mcstatus

при нуле игроков бот остается в статусе онлайн, вот код -
 @bot.event 
async def on_ready():
print("Bot is ready")

while True:
status = server.status()
player_count = status.players.online

if player_count % 10 == 1 and player_count % 100 != 11:
end = "игрока"
elif player_count % 10 in [2, 3, 4] and player_count % 100 not in [12, 13, 14]:
end = "игроков"
else:
end = "игроков"

if player_count == 0:
activity = discord.Activity(type=discord.ActivityType.watching, name=f"на {player_count} {end}")
await bot.change_presence(status=discord.Status.idle)
elif player_count != 0:
activity = discord.Activity(type=discord.ActivityType.watching, name=f"на {player_count} {end}")
else:
activity = discord.Activity(type=discord.ActivityType.playing, name=f"ВЫКЛ")
await bot.change_presence(status=discord.Status.dnd)
await bot.change_presence(activity=activity)


await asyncio.sleep(5)
         if player_count == 0:  
activity = discord.Activity(type=discord.ActivityType.watching, name=f"на {player_count} {end}")
await bot.change_presence(status=discord.Status.idle)
# ^ тут ты поставил статус
...
await bot.change_presence(activity=activity)
# ^ а тут ты его сразу убрал (по умолчанию activity это Status.online)

await asyncio.sleep(5)
Таянище Салико
Таянище Салико
34 941
Лучший ответ
Проблема, с которой вы сталкиваетесь, может быть связана с тем, что в коде вы используете нулевое значение для статуса бота. Операторы условий в вашем коде не учитывают этот случай. Чтобы правильно обработать нулевое значение игроков, вам нужно добавить отдельное условие.

Вот обновленный код, который обрабатывает нулевое количество игроков и ставит соответствующий статус:

 import discord  

import asyncio

from mcstatus import MinecraftServer



server_address = "your_server_ip"

server_port = 25565

server = MinecraftServer.lookup(f"{server_address}:{server_port}")



bot = commands.Bot(command_prefix='!')



@bot.event

async def on_ready():

print("Bot is ready")



while True:

try:

status = server.status()

player_count = status.players.online



if player_count % 10 == 1 and player_count % 100 != 11:

end = "игрока"

elif player_count % 10 in [2, 3, 4] and player_count % 100 not in [12, 13, 14]:

end = "игроков"

else:

end = "игроков"



if player_count == 0:

activity = discord.Activity(type=discord.ActivityType.watching, name=f"на {player_count} {end}")

await bot.change_presence(status=discord.Status.idle, activity=activity)

else:

activity = discord.Activity(type=discord.ActivityType.watching, name=f"на {player_count} {end}")

await bot.change_presence(status=discord.Status.online, activity=activity)



except:

activity = discord.Activity(type=discord.ActivityType.playing, name="ВЫКЛ")

await bot.change_presence(status=discord.Status.dnd, activity=activity)



await asyncio.sleep(5)



bot.run("YOUR_BOT_TOKEN")

Обратите внимание, что в коде также добавлен блок try-except для обработки ошибок, которые могут возникнуть при попытке получить статус сервера.
Vanek
Vanek
119