Compare commits
7 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
| 56b0b1fb5f | |||
| 10519bf68e | |||
| 7bff56070c | |||
| 5ed9a0d4fb | |||
| 63e1127353 | |||
| ab4661b5c6 | |||
| 52bf2a9589 |
@@ -1,3 +1,3 @@
|
||||
{
|
||||
".": "3.52.0"
|
||||
".": "3.52.1"
|
||||
}
|
||||
|
||||
@@ -1,5 +1,15 @@
|
||||
# Changelog
|
||||
|
||||
## [3.52.1](https://github.com/BEDOLAGA-DEV/remnawave-bedolaga-telegram-bot/compare/v3.52.0...v3.52.1) (2026-04-24)
|
||||
|
||||
|
||||
### Bug Fixes
|
||||
|
||||
* broadcast preview count — add .correlate(User) to EXISTS subqueries ([63e1127](https://github.com/BEDOLAGA-DEV/remnawave-bedolaga-telegram-bot/commit/63e112735302cc5fc961b2da87fb1250f922fe3d))
|
||||
* ignore bot's own messages in unknown message handlers ([52bf2a9](https://github.com/BEDOLAGA-DEV/remnawave-bedolaga-telegram-bot/commit/52bf2a9589e3e14abda78a62e45e86e022da4994))
|
||||
* unpin messages in Telegram BEFORE deactivating in DB ([ab4661b](https://github.com/BEDOLAGA-DEV/remnawave-bedolaga-telegram-bot/commit/ab4661b5c643d6dad787cc499c5cff128ec21be5))
|
||||
* use fresh DB session for deactivate after long unpin loop ([5ed9a0d](https://github.com/BEDOLAGA-DEV/remnawave-bedolaga-telegram-bot/commit/5ed9a0d4fbef5c92bfb4e7eb0daed493805c5e44))
|
||||
|
||||
## [3.52.0](https://github.com/BEDOLAGA-DEV/remnawave-bedolaga-telegram-bot/compare/v3.51.0...v3.52.0) (2026-04-24)
|
||||
|
||||
|
||||
|
||||
+1
-1
@@ -19,7 +19,7 @@ RUN --mount=type=cache,target=/root/.cache/uv \
|
||||
|
||||
FROM python:3.13-slim
|
||||
|
||||
ARG VERSION="v3.52.0" # x-release-please-version
|
||||
ARG VERSION="v3.52.1" # x-release-please-version
|
||||
ARG BUILD_DATE
|
||||
ARG VCS_REF
|
||||
|
||||
|
||||
@@ -1559,6 +1559,7 @@ async def get_target_users_count(db: AsyncSession, target: str) -> int:
|
||||
Subscription.user_id == User.id,
|
||||
Subscription.status == SubscriptionStatus.ACTIVE.value,
|
||||
)
|
||||
.correlate(User)
|
||||
.exists()
|
||||
)
|
||||
query = select(sql_func.count(User.id)).where(base_filter, ~subquery)
|
||||
@@ -1613,6 +1614,7 @@ async def get_target_users_count(db: AsyncSession, target: str) -> int:
|
||||
Subscription.user_id == User.id,
|
||||
Subscription.status == SubscriptionStatus.ACTIVE.value,
|
||||
)
|
||||
.correlate(User)
|
||||
.exists()
|
||||
)
|
||||
query = (
|
||||
|
||||
@@ -118,11 +118,12 @@ def register_handlers(dp: Dispatcher):
|
||||
dp.callback_query.register(handle_cancel, F.data.in_(['cancel', 'subscription_cancel']))
|
||||
|
||||
# Самый последний: ловим любые неизвестные текстовые сообщения
|
||||
# Исключаем специальные сервисные события (например, успешные платежи),
|
||||
# чтобы их обработка не прерывалась общим хендлером неизвестных сообщений
|
||||
# Исключаем специальные сервисные события (например, успешные платежи)
|
||||
# и сообщения от самого бота (например, фото главного меню)
|
||||
dp.message.register(
|
||||
handle_unknown_message,
|
||||
StateFilter(None),
|
||||
F.from_user.is_bot.is_(False),
|
||||
F.successful_payment.is_(None),
|
||||
F.text.is_not(None),
|
||||
~F.text.startswith('/'),
|
||||
@@ -133,6 +134,7 @@ def register_handlers(dp: Dispatcher):
|
||||
dp.message.register(
|
||||
handle_unknown_message,
|
||||
StateFilter(None),
|
||||
F.from_user.is_bot.is_(False),
|
||||
F.successful_payment.is_(None),
|
||||
F.text.is_(None),
|
||||
)
|
||||
|
||||
@@ -205,11 +205,13 @@ async def unpin_active_pinned_message(
|
||||
"""
|
||||
Открепляет активное сообщение у всех пользователей.
|
||||
|
||||
ВАЖНО: Извлекаем telegram_id в список ДО начала долгой операции,
|
||||
ВАЖНО: Деактивация в БД происходит ПОСЛЕ откреплений в Telegram,
|
||||
чтобы при сбое можно было повторить операцию.
|
||||
Извлекаем telegram_id в список ДО начала долгой операции,
|
||||
чтобы избежать обращения к ORM-объектам после истечения таймаута
|
||||
соединения с БД.
|
||||
"""
|
||||
pinned_message = await deactivate_active_pinned_message(db)
|
||||
pinned_message = await get_active_pinned_message(db)
|
||||
if not pinned_message:
|
||||
return 0, 0, False
|
||||
|
||||
@@ -260,6 +262,11 @@ async def unpin_active_pinned_message(
|
||||
await asyncio.gather(*tasks)
|
||||
await asyncio.sleep(0.05)
|
||||
|
||||
# Деактивируем ПОСЛЕ откреплений через fresh session —
|
||||
# исходная сессия может протухнуть за время долгого цикла Telegram API
|
||||
async with AsyncSessionLocal() as fresh_db:
|
||||
await deactivate_active_pinned_message(fresh_db)
|
||||
|
||||
return unpinned_count, failed_count, True
|
||||
|
||||
|
||||
|
||||
+1
-1
@@ -1,6 +1,6 @@
|
||||
[project]
|
||||
name = 'remnawave-bedolaga-telegram-bot'
|
||||
version = "3.52.0"
|
||||
version = "3.52.1"
|
||||
description = 'Telegram bot for RemnaWave VPN service'
|
||||
readme = 'README.md'
|
||||
license = { text = 'MIT' }
|
||||
|
||||
Reference in New Issue
Block a user