fix: InaccessibleMessage middleware / bulk restore_trials / auto-renew reset addons

This commit is contained in:
Capybara-z
2026-02-06 22:17:52 +03:00
parent 0873cdb16d
commit e4b79d4410
3 changed files with 29 additions and 16 deletions
+12 -15
View File
@@ -11,7 +11,7 @@ from aiogram.types import (
)
from aiogram.utils.formatting import BlockQuote, Bold, Text
from aiogram.utils.keyboard import InlineKeyboardBuilder
from sqlalchemy import func, select, update
from sqlalchemy import exists, func, select, update
from sqlalchemy.ext.asyncio import AsyncSession
from database import (
@@ -287,25 +287,22 @@ async def confirm_restore_trials(callback_query: types.CallbackQuery):
IsAdminFilter(),
)
async def restore_trials(callback_query: types.CallbackQuery, session: AsyncSession):
users_result = await session.execute(select(User.tg_id).where(User.trial == 1))
users_with_trial_used = [row[0] for row in users_result.all()]
users_to_reset = []
for tg_id in users_with_trial_used:
has_keys = await session.execute(select(Key.tg_id).where(Key.tg_id == tg_id).limit(1))
if not has_keys.scalar():
users_to_reset.append(tg_id)
if users_to_reset:
stmt = update(User).where(User.tg_id.in_(users_to_reset)).values(trial=0)
await session.execute(stmt)
await session.commit()
stmt = (
update(User)
.where(
User.trial == 1,
~exists(select(Key.tg_id).where(Key.tg_id == User.tg_id)),
)
.values(trial=0)
)
result = await session.execute(stmt)
await session.commit()
builder = InlineKeyboardBuilder()
builder.row(build_admin_back_btn())
await callback_query.message.edit_text(
text=f"✅ Пробники восстановлены для {len(users_to_reset)} пользователей без подписок.",
text=f"✅ Пробники восстановлены для {result.rowcount} пользователей без подписок.",
reply_markup=builder.as_markup(),
)
@@ -379,6 +379,17 @@ async def try_auto_renew(ctx: NotificationContext, key) -> tuple[bool, Optional[
plan=current_tariff["id"],
)
new_tariff_device_limit = current_tariff.get("device_limit")
new_tariff_traffic_limit = current_tariff.get("traffic_limit")
reset_values = {
"selected_device_limit": new_tariff_device_limit,
"current_device_limit": new_tariff_device_limit,
"selected_traffic_limit": new_tariff_traffic_limit,
"current_traffic_limit": new_tariff_traffic_limit,
"selected_price_rub": int(current_tariff["price_rub"]) if current_tariff.get("price_rub") is not None else None,
}
await ctx.session.execute(update(Key).where(Key.client_id == client_id).values(**reset_values))
if ctx.bulk_updates is not None:
if tg_id in ctx.bulk_updates["balance_changes"]:
ctx.bulk_updates["balance_changes"][tg_id] -= renewal_cost
+6 -1
View File
@@ -2,7 +2,9 @@ from collections.abc import Awaitable, Callable
from typing import Any
from aiogram import BaseMiddleware
from aiogram.types import CallbackQuery, TelegramObject
from aiogram.types import CallbackQuery, InaccessibleMessage, TelegramObject
from bot import bot
class CallbackAnswerMiddleware(BaseMiddleware):
@@ -14,4 +16,7 @@ class CallbackAnswerMiddleware(BaseMiddleware):
) -> Any:
if isinstance(event, CallbackQuery):
await event.answer()
if isinstance(event.message, InaccessibleMessage):
new_message = await bot.send_message(event.message.chat.id, "")
object.__setattr__(event, "message", new_message)
return await handler(event, data)