diff --git a/commands/stats.py b/commands/stats.py index 5a0a3d5..1de03ce 100644 --- a/commands/stats.py +++ b/commands/stats.py @@ -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) diff --git a/console_commands/stats.py b/console_commands/stats.py index 10a47b8..724b4f0 100644 --- a/console_commands/stats.py +++ b/console_commands/stats.py @@ -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) diff --git a/tests/test_commands_stats.py b/tests/test_commands_stats.py index 595941e..ca5dd92 100644 --- a/tests/test_commands_stats.py +++ b/tests/test_commands_stats.py @@ -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, категория исключена