Убраны приватные атрибуты с объекта discord.py Bot: START_TIME вынесен на уровень модуля, _scheduler удалён (не использовался)
This commit is contained in:
parent
5a65be97d9
commit
bb9e50fb05
6
bot.py
6
bot.py
@ -23,6 +23,9 @@ if TYPE_CHECKING:
|
|||||||
|
|
||||||
logger = logging.getLogger(__name__)
|
logger = logging.getLogger(__name__)
|
||||||
|
|
||||||
|
# Время запуска бота (на уровне модуля, чтобы не хранить на объекте discord.py Bot)
|
||||||
|
START_TIME: float = time.time()
|
||||||
|
|
||||||
|
|
||||||
class TextHelpCommand(commands.HelpCommand):
|
class TextHelpCommand(commands.HelpCommand):
|
||||||
"""Выводит справку по командам простым текстом вместо embed."""
|
"""Выводит справку по командам простым текстом вместо embed."""
|
||||||
@ -104,7 +107,7 @@ class BotRunner:
|
|||||||
intents=intents,
|
intents=intents,
|
||||||
help_command=TextHelpCommand(),
|
help_command=TextHelpCommand(),
|
||||||
)
|
)
|
||||||
self.bot._start_time = time.time()
|
|
||||||
self.stop_event = threading.Event()
|
self.stop_event = threading.Event()
|
||||||
self.bot_ready = threading.Event()
|
self.bot_ready = threading.Event()
|
||||||
self.scheduler: SchedulerType | None = None
|
self.scheduler: SchedulerType | None = None
|
||||||
@ -142,7 +145,6 @@ class BotRunner:
|
|||||||
|
|
||||||
morning_time = os.getenv("MORNING_TIME", "07:00")
|
morning_time = os.getenv("MORNING_TIME", "07:00")
|
||||||
self.scheduler = Scheduler(self.bot, morning_time)
|
self.scheduler = Scheduler(self.bot, morning_time)
|
||||||
self.bot._scheduler = self.scheduler
|
|
||||||
await self.scheduler.start()
|
await self.scheduler.start()
|
||||||
logger.info(
|
logger.info(
|
||||||
"Планировщик запущен (время: %s, сервер: %s)", morning_time, guild.name
|
"Планировщик запущен (время: %s, сервер: %s)", morning_time, guild.name
|
||||||
|
|||||||
@ -13,9 +13,11 @@ class Status(commands.Cog):
|
|||||||
@commands.command(name="status")
|
@commands.command(name="status")
|
||||||
async def status(self, ctx: commands.Context) -> None:
|
async def status(self, ctx: commands.Context) -> None:
|
||||||
"""Статус бота: пинг к Discord gateway и время работы"""
|
"""Статус бота: пинг к Discord gateway и время работы"""
|
||||||
|
# Lazy import чтобы избежать циклического импорта (bot -> commands -> bot)
|
||||||
|
from bot import START_TIME # noqa: F401
|
||||||
|
|
||||||
latency_ms = round(ctx.bot.latency * 1000, 1)
|
latency_ms = round(ctx.bot.latency * 1000, 1)
|
||||||
start_time = getattr(ctx.bot, "_start_time", time.time())
|
uptime_seconds = time.time() - START_TIME
|
||||||
uptime_seconds = time.time() - start_time
|
|
||||||
uptime_str = self._format_uptime(uptime_seconds)
|
uptime_str = self._format_uptime(uptime_seconds)
|
||||||
|
|
||||||
embed = discord.Embed(
|
embed = discord.Embed(
|
||||||
|
|||||||
@ -2,7 +2,7 @@
|
|||||||
|
|
||||||
import time
|
import time
|
||||||
|
|
||||||
from unittest.mock import AsyncMock, MagicMock
|
from unittest.mock import AsyncMock, MagicMock, patch
|
||||||
|
|
||||||
from commands.status import Status
|
from commands.status import Status
|
||||||
|
|
||||||
@ -14,11 +14,11 @@ class TestStatusCommand:
|
|||||||
"""Команда status отправляет embed-сообщение."""
|
"""Команда status отправляет embed-сообщение."""
|
||||||
mock_ctx = MagicMock()
|
mock_ctx = MagicMock()
|
||||||
mock_ctx.bot.latency = 0.042
|
mock_ctx.bot.latency = 0.042
|
||||||
mock_ctx.bot._start_time = time.time()
|
|
||||||
mock_ctx.send = AsyncMock(return_value=None)
|
mock_ctx.send = AsyncMock(return_value=None)
|
||||||
|
|
||||||
cog = Status()
|
with patch("bot.START_TIME", time.time()):
|
||||||
await cog.status(cog, mock_ctx)
|
cog = Status()
|
||||||
|
await cog.status(cog, mock_ctx)
|
||||||
|
|
||||||
mock_ctx.send.assert_awaited_once()
|
mock_ctx.send.assert_awaited_once()
|
||||||
call_args = mock_ctx.send.call_args
|
call_args = mock_ctx.send.call_args
|
||||||
@ -30,11 +30,11 @@ class TestStatusCommand:
|
|||||||
"""Uptime форматируется корректно."""
|
"""Uptime форматируется корректно."""
|
||||||
mock_ctx = MagicMock()
|
mock_ctx = MagicMock()
|
||||||
mock_ctx.bot.latency = 0.050
|
mock_ctx.bot.latency = 0.050
|
||||||
mock_ctx.bot._start_time = time.time() - 90061 # 1д 1ч 1м 1с
|
|
||||||
mock_ctx.send = AsyncMock(return_value=None)
|
mock_ctx.send = AsyncMock(return_value=None)
|
||||||
|
|
||||||
cog = Status()
|
with patch("bot.START_TIME", time.time() - 90061): # 1д 1ч 1м 1с
|
||||||
await cog.status(cog, mock_ctx)
|
cog = Status()
|
||||||
|
await cog.status(cog, mock_ctx)
|
||||||
|
|
||||||
call_args = mock_ctx.send.call_args
|
call_args = mock_ctx.send.call_args
|
||||||
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]
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user