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
|
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)
|
||||||
|
|
||||||
|
|||||||
@ -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)
|
||||||
|
|
||||||
|
|||||||
@ -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, категория исключена
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user