diff --git a/bot/handlers/admin/common.py b/bot/handlers/admin/common.py index ec42332..f08e342 100644 --- a/bot/handlers/admin/common.py +++ b/bot/handlers/admin/common.py @@ -106,7 +106,6 @@ async def admin_panel_actions_callback_handler( await admin_logs_handlers.display_logs_menu(callback, i18n_data, settings, session) elif action == "promo_management": - from . import promo_codes as admin_promo_handlers await admin_promo_handlers.promo_management_handler( callback, i18n_data, settings, session) elif action == "sync_panel": diff --git a/bot/handlers/admin/statistics.py b/bot/handlers/admin/statistics.py index 54622aa..4cdcc73 100644 --- a/bot/handlers/admin/statistics.py +++ b/bot/handlers/admin/statistics.py @@ -70,58 +70,66 @@ async def show_statistics_handler(callback: types.CallbackQuery, if system_stats: users = system_stats.get('users', {}) - active_users = users.get('active', 0) - disabled_users = users.get('disabled', 0) - expired_users = users.get('expired', 0) - limited_users = users.get('limited', 0) - total_users = users.get('total', 0) + status_counts = users.get('statusCounts', {}) + online_stats = system_stats.get('onlineStats', {}) - stats_text_parts.append(f"🟢 {_('admin_panel_online_label', default='Онлайн')}: {active_users}") - stats_text_parts.append(f"🔴 {_('admin_panel_offline_label', default='Офлайн')}: {disabled_users}") + active_users = status_counts.get('ACTIVE', 0) + disabled_users = status_counts.get('DISABLED', 0) + expired_users = status_counts.get('EXPIRED', 0) + limited_users = status_counts.get('LIMITED', 0) + total_users = users.get('totalUsers', 0) + online_now = online_stats.get('onlineNow', 0) + + stats_text_parts.append(f"🟢 {_('admin_panel_online_label', default='Онлайн')}: {online_now}") + stats_text_parts.append(f"📊 {_('admin_panel_active_label', default='Активных')}: {active_users}") + stats_text_parts.append(f"🔴 {_('admin_panel_disabled_label', default='Отключенных')}: {disabled_users}") stats_text_parts.append(f"⏰ {_('admin_panel_expired_label', default='Истекшие')}: {expired_users}") stats_text_parts.append(f"⚠️ {_('admin_panel_limited_label', default='Ограниченные')}: {limited_users}") stats_text_parts.append(f"👥 {_('admin_panel_total_users_label', default='Всего пользователей')}: {total_users}") # System resources - cpu = system_stats.get('cpu', {}) memory = system_stats.get('memory', {}) - if cpu: - cpu_usage = cpu.get('usage', 0) - stats_text_parts.append(f"🔄 {_('admin_panel_cpu_usage_label', default='Загрузка CPU')}: {cpu_usage:.1f}%") if memory: - memory_usage = memory.get('usage', 0) + memory_total = memory.get('total', 1) + memory_used = memory.get('used', 0) + memory_usage = (memory_used / memory_total) * 100 if memory_total > 0 else 0 stats_text_parts.append(f"💾 {_('admin_panel_memory_usage_label', default='Использование RAM')}: {memory_usage:.1f}%") else: stats_text_parts.append(f"⚠️ {_('admin_panel_system_stats_error', default='Ошибка получения системной статистики')}") # Bandwidth stats if bandwidth_stats: - today_traffic = bandwidth_stats.get('bandwidthToday', {}) week_traffic = bandwidth_stats.get('bandwidthLastSevenDays', {}) - month_traffic = bandwidth_stats.get('bandwidthLastThirtyDays', {}) - - if today_traffic: - today_total = today_traffic.get('total', '0 B') - stats_text_parts.append(f"📊 {_('admin_panel_traffic_today_label', default='Трафик сегодня')}: {today_total}") + month_traffic = bandwidth_stats.get('bandwidthLast30Days', {}) + # Fallback to the actual key name from API if the above doesn't exist + if not month_traffic: + month_traffic = bandwidth_stats.get('bandwidthLastThirtyDays', {}) if week_traffic: - week_total = week_traffic.get('total', '0 B') + week_total = week_traffic.get('current', '0 B') stats_text_parts.append(f"📊 {_('admin_panel_traffic_week_label', default='Трафик за неделю')}: {week_total}") if month_traffic: - month_total = month_traffic.get('total', '0 B') + month_total = month_traffic.get('current', '0 B') stats_text_parts.append(f"📊 {_('admin_panel_traffic_month_label', default='Трафик за месяц')}: {month_total}") else: stats_text_parts.append(f"⚠️ {_('admin_panel_bandwidth_stats_error', default='Ошибка получения статистики трафика')}") - # Nodes stats - if nodes_stats: + # Nodes stats + if nodes_stats and 'lastSevenDays' in nodes_stats: last_seven_days = nodes_stats.get('lastSevenDays', []) - active_nodes_count = len([node for node in last_seven_days if node.get('status') == 'active']) - total_nodes_count = len(last_seven_days) - stats_text_parts.append(f"🔗 {_('admin_panel_nodes_label', default='Активных нод')}: {active_nodes_count}/{total_nodes_count}") + # Get unique node names from the data + unique_nodes = set() + for node_data in last_seven_days: + unique_nodes.add(node_data.get('nodeName', '')) + total_nodes_count = len(unique_nodes) + # Assume all nodes are active since we don't have status info + stats_text_parts.append(f"🔗 {_('admin_panel_nodes_label', default='Активных нод')}: {total_nodes_count}/{total_nodes_count}") else: - stats_text_parts.append(f"⚠️ {_('admin_panel_nodes_stats_error', default='Ошибка получения статистики нод')}") + # Use nodes total from system stats as fallback + nodes_info = system_stats.get('nodes', {}) if system_stats else {} + total_online = nodes_info.get('totalOnline', 0) + stats_text_parts.append(f"🔗 {_('admin_panel_nodes_label', default='Активных нод')}: {total_online}") except Exception as e: logging.error(f"Failed to fetch panel statistics: {e}", exc_info=True) diff --git a/bot/handlers/inline_mode.py b/bot/handlers/inline_mode.py index 7634414..2224371 100644 --- a/bot/handlers/inline_mode.py +++ b/bot/handlers/inline_mode.py @@ -38,7 +38,7 @@ async def inline_query_handler(inline_query: InlineQuery, # For all users: referral functionality if not query or "реф" in query or "ref" in query or "друг" in query or "friend" in query: referral_result = await create_referral_result( - inline_query, bot, referral_service, i18n, current_lang + inline_query, bot, referral_service, i18n, current_lang, settings ) if referral_result: results.append(referral_result) @@ -46,14 +46,11 @@ async def inline_query_handler(inline_query: InlineQuery, # For admins: statistics if is_admin and (not query or "стат" in query or "stat" in query or "админ" in query or "admin" in query): stats_results = await create_admin_stats_results( - session, i18n, current_lang + session, i18n, current_lang, settings ) results.extend(stats_results) - # Show help if no specific query - if not query: - help_result = await create_help_result(i18n, current_lang, is_admin) - results.append(help_result) + # Limit results to 50 (Telegram limit) results = results[:50] @@ -72,7 +69,7 @@ async def inline_query_handler(inline_query: InlineQuery, async def create_referral_result(inline_query: InlineQuery, bot: Bot, referral_service: ReferralService, - i18n_instance, lang: str) -> Optional[InlineQueryResultArticle]: + i18n_instance, lang: str, settings: Settings) -> Optional[InlineQueryResultArticle]: """Create referral link result for inline query""" _ = lambda key, **kwargs: i18n_instance.gettext(lang, key, **kwargs) @@ -110,7 +107,7 @@ async def create_referral_result(inline_query: InlineQuery, bot: Bot, message_text=message_text, disable_web_page_preview=True ), - thumbnail_url="https://cdn-icons-png.flaticon.com/512/1077/1077114.png" + thumbnail_url=settings.INLINE_REFERRAL_THUMBNAIL_URL ) except Exception as e: @@ -118,24 +115,24 @@ async def create_referral_result(inline_query: InlineQuery, bot: Bot, return None -async def create_admin_stats_results(session: AsyncSession, i18n_instance, lang: str) -> List[InlineQueryResultArticle]: +async def create_admin_stats_results(session: AsyncSession, i18n_instance, lang: str, settings: Settings) -> List[InlineQueryResultArticle]: """Create admin statistics results for inline query""" _ = lambda key, **kwargs: i18n_instance.gettext(lang, key, **kwargs) results = [] try: # Quick user stats - user_stats_result = await create_user_stats_result(session, i18n_instance, lang) + user_stats_result = await create_user_stats_result(session, i18n_instance, lang, settings) if user_stats_result: results.append(user_stats_result) # Quick financial stats - financial_stats_result = await create_financial_stats_result(session, i18n_instance, lang) + financial_stats_result = await create_financial_stats_result(session, i18n_instance, lang, settings) if financial_stats_result: results.append(financial_stats_result) # Quick system stats - system_stats_result = await create_system_stats_result(session, i18n_instance, lang) + system_stats_result = await create_system_stats_result(session, i18n_instance, lang, settings) if system_stats_result: results.append(system_stats_result) @@ -145,7 +142,7 @@ async def create_admin_stats_results(session: AsyncSession, i18n_instance, lang: return results -async def create_user_stats_result(session: AsyncSession, i18n_instance, lang: str) -> Optional[InlineQueryResultArticle]: +async def create_user_stats_result(session: AsyncSession, i18n_instance, lang: str, settings: Settings) -> Optional[InlineQueryResultArticle]: """Create user statistics result""" _ = lambda key, **kwargs: i18n_instance.gettext(lang, key, **kwargs) @@ -188,7 +185,7 @@ async def create_user_stats_result(session: AsyncSession, i18n_instance, lang: s message_text=stats_text, parse_mode="HTML" ), - thumbnail_url="https://cdn-icons-png.flaticon.com/512/681/681494.png" + thumbnail_url=settings.INLINE_USER_STATS_THUMBNAIL_URL ) except Exception as e: @@ -196,7 +193,7 @@ async def create_user_stats_result(session: AsyncSession, i18n_instance, lang: s return None -async def create_financial_stats_result(session: AsyncSession, i18n_instance, lang: str) -> Optional[InlineQueryResultArticle]: +async def create_financial_stats_result(session: AsyncSession, i18n_instance, lang: str, settings: Settings) -> Optional[InlineQueryResultArticle]: """Create financial statistics result""" _ = lambda key, **kwargs: i18n_instance.gettext(lang, key, **kwargs) @@ -234,7 +231,7 @@ async def create_financial_stats_result(session: AsyncSession, i18n_instance, la message_text=stats_text, parse_mode="HTML" ), - thumbnail_url="https://cdn-icons-png.flaticon.com/512/2769/2769339.png" + thumbnail_url=settings.INLINE_FINANCIAL_STATS_THUMBNAIL_URL ) except Exception as e: @@ -242,7 +239,7 @@ async def create_financial_stats_result(session: AsyncSession, i18n_instance, la return None -async def create_system_stats_result(session: AsyncSession, i18n_instance, lang: str) -> Optional[InlineQueryResultArticle]: +async def create_system_stats_result(session: AsyncSession, i18n_instance, lang: str, settings: Settings) -> Optional[InlineQueryResultArticle]: """Create system statistics result with online/offline/expired/limited info""" _ = lambda key, **kwargs: i18n_instance.gettext(lang, key, **kwargs) @@ -307,7 +304,7 @@ async def create_system_stats_result(session: AsyncSession, i18n_instance, lang: message_text=stats_text, parse_mode="HTML" ), - thumbnail_url="https://cdn-icons-png.flaticon.com/512/2920/2920277.png" + thumbnail_url=settings.INLINE_SYSTEM_STATS_THUMBNAIL_URL ) except Exception as e: @@ -315,41 +312,3 @@ async def create_system_stats_result(session: AsyncSession, i18n_instance, lang: return None -async def create_help_result(i18n_instance, lang: str, is_admin: bool) -> InlineQueryResultArticle: - """Create help result explaining inline mode features""" - _ = lambda key, **kwargs: i18n_instance.gettext(lang, key, **kwargs) - - if is_admin: - help_text = _( - "inline_admin_help_message", - default="🤖 Inline режим бота\n\n" - "📱 Доступные команды:\n\n" - "🎁 реф/ref - поделиться реферальной ссылкой\n" - "👥 стат/stat - статистика пользователей\n" - "💰 финансы - финансовая статистика\n" - "🖥 система - системная статистика\n\n" - "💡 Просто напишите @{bot_username} и начните вводить команду в любом чате!" - ) - title = _("inline_admin_help_title", default="🤖 Inline помощь (Админ)") - description = _("inline_admin_help_description", default="Доступны команды: реф, стат, финансы, система") - else: - help_text = _( - "inline_user_help_message", - default="🤖 Inline режим бота\n\n" - "📱 Доступные команды:\n\n" - "🎁 реф/ref - поделиться реферальной ссылкой\n\n" - "💡 Просто напишите @{bot_username} и начните вводить 'реф' в любом чате!" - ) - title = _("inline_user_help_title", default="🤖 Inline помощь") - description = _("inline_user_help_description", default="Доступна команда: реф (реферальная ссылка)") - - return InlineQueryResultArticle( - id="help", - title=title, - description=description, - input_message_content=InputTextMessageContent( - message_text=help_text, - parse_mode="HTML" - ), - thumbnail_url="https://cdn-icons-png.flaticon.com/512/906/906794.png" - ) \ No newline at end of file diff --git a/config/settings.py b/config/settings.py index 208a4aa..ac6f649 100644 --- a/config/settings.py +++ b/config/settings.py @@ -111,6 +111,12 @@ class Settings(BaseSettings): SUBSCRIPTION_MINI_APP_URL: Optional[str] = Field(default=None) START_COMMAND_DESCRIPTION: Optional[str] = Field(default=None) + + # Inline mode thumbnail URLs + INLINE_REFERRAL_THUMBNAIL_URL: str = Field(default="https://cdn-icons-png.flaticon.com/512/1077/1077114.png") + INLINE_USER_STATS_THUMBNAIL_URL: str = Field(default="https://cdn-icons-png.flaticon.com/512/681/681494.png") + INLINE_FINANCIAL_STATS_THUMBNAIL_URL: str = Field(default="https://cdn-icons-png.flaticon.com/512/2769/2769339.png") + INLINE_SYSTEM_STATS_THUMBNAIL_URL: str = Field(default="https://cdn-icons-png.flaticon.com/512/2920/2920277.png") @computed_field @property