fix: fallback morning-дайджеста перебирает каналы целевого сервера вместо всех серверов

This commit is contained in:
deadzilla 2026-07-11 23:45:25 +05:00
parent e2289e5092
commit 27eaa677fd

View File

@ -223,6 +223,15 @@ class Scheduler:
async def _run_morning(self): async def _run_morning(self):
logger.info("Выполняю morning в %s", self.morning_time) logger.info("Выполняю morning в %s", self.morning_time)
# Определяем целевой сервер для fallback
target_guild: discord.Guild | None = None
if self._target_channel_id:
guild = self.bot.get_guild(
(await self.bot.fetch_channel(self._target_channel_id)).guild.id
)
if guild:
target_guild = guild
# Если задан конкретный канал — отправляем туда # Если задан конкретный канал — отправляем туда
if self._target_channel_id: if self._target_channel_id:
# fetch_channel — API-запрос, не зависит от кэша # fetch_channel — API-запрос, не зависит от кэша
@ -242,17 +251,27 @@ class Scheduler:
"Канал с ID %s не текстовый — fallback", self._target_channel_id "Канал с ID %s не текстовый — fallback", self._target_channel_id
) )
# Fallback: первый канал с правами send_messages # Fallback: первый текстовый канал целевого сервера с правами send_messages
guilds_to_check: list[discord.Guild] = []
if target_guild:
guilds_to_check.append(target_guild)
guilds_to_check.extend(self.bot.guilds)
sent = False sent = False
for channel in self.bot.get_all_channels(): for guild in guilds_to_check:
if isinstance(channel, discord.TextChannel): for channel in guild.text_channels:
if channel.permissions_for(channel.guild.me).send_messages: if channel.permissions_for(guild.me).send_messages:
try: try:
await run_morning(self.bot, channel) await run_morning(self.bot, channel)
sent = True sent = True
return return
except Exception as e: except Exception as e:
logger.error("Ошибка отправки в #%s: %s", channel.name, e) logger.error(
"Ошибка отправки в #%s (%s): %s",
channel.name,
guild.name,
e,
)
continue continue
if not sent: if not sent:
logger.error("Не удалось найти канал для отправки morning-дайджеста") logger.error("Не удалось найти канал для отправки morning-дайджеста")