What's Changed in v3.4.0
✨ New Features
- Add admin blocked users management panel with bulk operations, ban/unban, and localization support
- Add referral diagnostics system with log analysis, missing bonus detection, and period-based reports
- Add Kassa AI payment status checking and admin management UI for payment verification
- Add cabinet API endpoints for device reduction (reduce device limit and get partial refund)
- Add cabinet API endpoints for admin user management: full deletion, trial reset, subscription reset, and user disable
- Add cabinet API endpoints for promocode activation/deactivation with discount lifecycle management
- Add startup notification service with rich system info (users, balances, subscriptions, open tickets, panel status)
- Add Telegram error logging handler that forwards ERROR/CRITICAL log records to admin chat with deduplication and throttling
- Add admin error notification system with throttling, buffering, and traceback file attachments
- Add promo broadcast message placeholder rendering (discount_percent, valid_hours, server_name, etc.)
- Add release-please and release workflows for automated releases
🐛 Bug Fixes
- Fix blocked users bypassing channel subscription check and getting subscriptions reactivated
- Fix referral system bonus calculations and contest reward processing
- Fix lazy loading error when resuming paused daily subscriptions on balance top-up
- Fix
DEFAULT_LANGUAGE_CODEreferences in menu handler (renamed toDEFAULT_LANGUAGE) - Fix traffic top-up keyboard redirecting to wrong callback (
topup_amount_→balance_topup) - Fix route matching in admin tickets: move
/settingsbefore/{ticket_id}to prevent static route collision - Fix async lazy load error when assigning promo_groups to tariffs by adding explicit refresh
- Fix promo group resolution in cabinet purchase flow to use
get_primary_promo_group()with legacy fallback - Fix trial info endpoint returning hardcoded values instead of actual trial tariff parameters
- Fix DB connection closed errors in auth middleware by gracefully handling
InterfaceError/OperationalError - Fix tariff traffic top-up package editor crashing on non-text input
- Fix user deletion not cleaning up Wata, CloudPayments, and Kassa AI payment records
- Fix SQLAlchemy connection closed errors during long broadcast operations
- Apply promo group discounts to device purchase, traffic purchase, and tariff switch in cabinet
⚡ Improvements
- Redesign version update notification with blockquote expandable and Markdown→HTML conversion
- Redesign admin notification messages for trial activation and subscription purchase
- Add 6-hour cooldown for autopay insufficient balance notifications to reduce spam
- Exclude daily subscriptions from global autopay processing
- Stabilize mass broadcast system for 100k+ users with proper rate limiting and progress tracking
- Add user identifier (telegram_id) to Wata and Kassa AI payment descriptions for easier reconciliation
- Add error notifications to all CloudPayments failure paths (creation, webhook, user lookup)
- Enforce minimum device limit based on tariff when reducing devices
- Fix traffic top-up pricing in tariff mode to charge flat monthly rate instead of prorated remaining-time price
- Simplify error handler and decorator code by removing redundant error notification plumbing
🏗️ Infrastructure & CI
- Update Docker registry workflow to use
${{ github.repository }}instead of hardcoded image name - Update Docker Hub and Docker Registry workflow configurations
- Update Dockerfile version to v3.4.0
- Add release-please workflow for automated changelog generation
- Add release workflow with categorized changelog and Docker pull instructions
Full Changelog: v3.3.0...v3.4.0