fix: !stats исключает CategoryChannel из подсчёта каналов

guild.channels содержит все типы включая CategoryChannel.
Категории — это контейнеры для группировки, а не каналы.

Изменено:
  - commands/stats.py: filter по isinstance(CategoryChannel)
  - console_commands/stats.py: аналогичный фильтр
  - test_commands_stats.py: тест test_stats_excludes_categories
  - Итого: 234 теста
This commit is contained in:
deadzilla 2026-06-12 17:01:53 +05:00
parent f2844f0453
commit f4d267d254
3 changed files with 36 additions and 2 deletions

View File

@ -10,7 +10,10 @@ class Stats(commands.Cog):
"""Количество серверов, каналов и пользователей""" """Количество серверов, каналов и пользователей"""
guilds = ctx.bot.guilds guilds = ctx.bot.guilds
total_guilds = len(guilds) total_guilds = len(guilds)
total_channels = sum(guild.channels.__len__() for guild in guilds) total_channels = sum(
len([ch for ch in guild.channels if not isinstance(ch, discord.CategoryChannel)])
for guild in guilds
)
total_members = sum(guild.member_count or 0 for guild in guilds) total_members = sum(guild.member_count or 0 for guild in guilds)
latency_ms = round(ctx.bot.latency * 1000, 1) latency_ms = round(ctx.bot.latency * 1000, 1)

View File

@ -1,3 +1,6 @@
import discord
def stats(stop_event, bot): def stats(stop_event, bot):
"""Показать статистику серверов: серверы, каналы, пользователи""" """Показать статистику серверов: серверы, каналы, пользователи"""
if stop_event.is_set(): if stop_event.is_set():
@ -5,7 +8,10 @@ def stats(stop_event, bot):
guilds = bot.guilds guilds = bot.guilds
total_guilds = len(guilds) total_guilds = len(guilds)
total_channels = sum(len(guild.channels) for guild in guilds) total_channels = sum(
len([ch for ch in guild.channels if not isinstance(ch, discord.CategoryChannel)])
for guild in guilds
)
total_members = sum(guild.member_count or 0 for guild in guilds) total_members = sum(guild.member_count or 0 for guild in guilds)
latency_ms = round(bot.latency * 1000, 1) latency_ms = round(bot.latency * 1000, 1)

View File

@ -91,3 +91,28 @@ class TestStatsCommand:
embed = call_args[1]["embed"] if call_args[1] else call_args[0][0] embed = call_args[1]["embed"] if call_args[1] else call_args[0][0]
fields = {f.name: f.value for f in embed.fields} fields = {f.name: f.value for f in embed.fields}
assert fields["Пользователей"] == "0" assert fields["Пользователей"] == "0"
async def test_stats_excludes_categories(self):
"""Категории не входят в счётчик каналов."""
import discord
from commands.stats import Stats
guild = MagicMock()
text_ch = MagicMock()
voice_ch = MagicMock()
category_ch = MagicMock(spec=discord.CategoryChannel)
guild.channels = [text_ch, voice_ch, category_ch]
guild.member_count = 50
mock_ctx = MagicMock()
mock_ctx.bot.latency = 0.040
mock_ctx.bot.guilds = [guild]
mock_ctx.send = AsyncMock(return_value=None)
cog = Stats()
await cog.stats(cog, mock_ctx)
call_args = mock_ctx.send.call_args
embed = call_args[1]["embed"] if call_args[1] else call_args[0][0]
fields = {f.name: f.value for f in embed.fields}
assert fields["Каналов"] == "2" # text + voice, категория исключена