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:
parent
f2844f0453
commit
f4d267d254
@ -10,7 +10,10 @@ class Stats(commands.Cog):
|
||||
"""Количество серверов, каналов и пользователей"""
|
||||
guilds = ctx.bot.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)
|
||||
latency_ms = round(ctx.bot.latency * 1000, 1)
|
||||
|
||||
|
||||
@ -1,3 +1,6 @@
|
||||
import discord
|
||||
|
||||
|
||||
def stats(stop_event, bot):
|
||||
"""Показать статистику серверов: серверы, каналы, пользователи"""
|
||||
if stop_event.is_set():
|
||||
@ -5,7 +8,10 @@ def stats(stop_event, bot):
|
||||
|
||||
guilds = bot.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)
|
||||
latency_ms = round(bot.latency * 1000, 1)
|
||||
|
||||
|
||||
@ -91,3 +91,28 @@ class TestStatsCommand:
|
||||
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["Пользователей"] == "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, категория исключена
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user