Files
Connex/keyboards.py
2025-09-15 00:47:01 +02:00

182 lines
8.9 KiB
Python
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# keyboards.py
import sqlite3
from aiogram.types import InlineKeyboardMarkup, InlineKeyboardButton
from localization import get_text
USERS_PER_PAGE = 5
# --- ОСНОВНЫЕ КЛАВИАТУРЫ ---
def get_main_keyboard_by_role(is_admin: bool, lang: str) -> InlineKeyboardMarkup:
"""Возвращает админскую или пользовательскую клавиатуру на нужном языке."""
buttons = []
if is_admin:
buttons = [
[InlineKeyboardButton(text=get_text('manage_users_btn', lang), callback_data="admin_users_page_0")],
[InlineKeyboardButton(text=get_text('manage_configs_btn', lang), callback_data="admin_configs_page_0")],
[InlineKeyboardButton(text=get_text('manage_tutorials_btn', lang), callback_data="admin_tutorials_menu")],
[InlineKeyboardButton(text=get_text('mass_send_btn', lang), callback_data="mass_send_start")]
]
else:
buttons = [
[InlineKeyboardButton(text=get_text('my_configs_btn', lang), callback_data="user_configs")],
[InlineKeyboardButton(text=get_text('help_btn', lang), callback_data="user_help")]
]
# Добавляем кнопку настроек для всех
buttons.append([InlineKeyboardButton(text=get_text('settings', lang), callback_data="settings")])
return InlineKeyboardMarkup(inline_keyboard=buttons)
def get_back_to_menu_keyboard(lang: str) -> InlineKeyboardMarkup:
return InlineKeyboardMarkup(inline_keyboard=[
[InlineKeyboardButton(text=get_text('back_to_menu', lang), callback_data="admin_menu")]
])
# --- НАСТРОЙКИ ЯЗЫКА ---
def get_language_choice_keyboard() -> InlineKeyboardMarkup:
return InlineKeyboardMarkup(inline_keyboard=[
[InlineKeyboardButton(text="English 🇬🇧", callback_data="set_lang_en")],
[InlineKeyboardButton(text="Русский 🇷🇺", callback_data="set_lang_ru")]
])
# --- УПРАВЛЕНИЕ ПОЛЬЗОВАТЕЛЯМИ ---
def get_users_keyboard(page: int, lang: str) -> InlineKeyboardMarkup:
conn = sqlite3.connect('bot.db')
cursor = conn.cursor()
cursor.execute("SELECT COUNT(*) FROM users WHERE is_admin = 0")
total_users = cursor.fetchone()[0]
offset = page * USERS_PER_PAGE
cursor.execute("SELECT telegram_id, username FROM users WHERE is_admin = 0 LIMIT ? OFFSET ?", (USERS_PER_PAGE, offset))
users = cursor.fetchall()
conn.close()
keyboard = []
for user_id, username in users:
button_text = f"@{username}" if username else f"ID: {user_id}"
keyboard.append([InlineKeyboardButton(text=button_text, callback_data=f"manage_user_{user_id}")])
nav_buttons = []
if page > 0:
nav_buttons.append(InlineKeyboardButton(text=get_text('prev_btn', lang), callback_data=f"admin_users_page_{page-1}"))
if (page + 1) * USERS_PER_PAGE < total_users:
nav_buttons.append(InlineKeyboardButton(text=get_text('next_btn', lang), callback_data=f"admin_users_page_{page+1}"))
if nav_buttons:
keyboard.append(nav_buttons)
keyboard.append([InlineKeyboardButton(text=get_text('add_user_btn', lang), callback_data="add_user")])
keyboard.append([InlineKeyboardButton(text=get_text('back_to_menu', lang), callback_data="admin_menu")])
return InlineKeyboardMarkup(inline_keyboard=keyboard)
def user_management_keyboard(user_id: int, lang: str) -> InlineKeyboardMarkup:
return InlineKeyboardMarkup(inline_keyboard=[
[InlineKeyboardButton(text=get_text('delete_user_btn', lang), callback_data=f"delete_user_{user_id}")],
[InlineKeyboardButton(text=get_text('back_to_list_btn', lang), callback_data="admin_users_page_0")]
])
# --- УПРАВЛЕНИЕ КОНФИГУРАЦИЯМИ ---
def get_users_for_configs_keyboard(page: int, lang: str) -> InlineKeyboardMarkup:
# Эта функция дублирует get_users_keyboard, но с другими callback_data
conn = sqlite3.connect('bot.db')
cursor = conn.cursor()
cursor.execute("SELECT COUNT(*) FROM users WHERE is_admin = 0")
total_users = cursor.fetchone()[0]
offset = page * USERS_PER_PAGE
cursor.execute("SELECT telegram_id, username FROM users WHERE is_admin = 0 LIMIT ? OFFSET ?", (USERS_PER_PAGE, offset))
users = cursor.fetchall()
conn.close()
keyboard = []
for user_id, username in users:
button_text = f"@{username}" if username else f"ID: {user_id}"
keyboard.append([InlineKeyboardButton(text=button_text, callback_data=f"user_configs_manage_{user_id}")])
nav_buttons = []
if page > 0:
nav_buttons.append(InlineKeyboardButton(text=get_text('prev_btn', lang), callback_data=f"admin_configs_page_{page-1}"))
if (page + 1) * USERS_PER_PAGE < total_users:
nav_buttons.append(InlineKeyboardButton(text=get_text('next_btn', lang), callback_data=f"admin_configs_page_{page+1}"))
if nav_buttons:
keyboard.append(nav_buttons)
keyboard.append([InlineKeyboardButton(text=get_text('back_to_menu', lang), callback_data="admin_menu")])
return InlineKeyboardMarkup(inline_keyboard=keyboard)
def get_user_configs_management_keyboard(user_id: int, lang: str) -> InlineKeyboardMarkup:
conn = sqlite3.connect('bot.db')
cursor = conn.cursor()
cursor.execute("SELECT id, config_type, config_data FROM configs WHERE user_id = ?", (user_id,))
configs = cursor.fetchall()
conn.close()
keyboard = []
for config_id, config_type, config_data in configs:
if config_type.startswith("file:"):
display_text = f"{get_text('file_prefix', lang)}: {config_type.split(':', 1)[1]}"
else:
short_data = config_data[:20] + '...' if len(config_data) > 20 else config_data
display_text = f"{config_type}: {short_data}"
button_text = f"{get_text('delete_config_prefix', lang)} {display_text}"
keyboard.append([InlineKeyboardButton(text=button_text, callback_data=f"delete_config:{config_id}:{user_id}")])
keyboard.append([InlineKeyboardButton(text=get_text('add_config_btn', lang), callback_data=f"add_config_{user_id}")])
keyboard.append([InlineKeyboardButton(text=get_text('back_to_users_list_btn', lang), callback_data="admin_configs_page_0")])
keyboard.append([InlineKeyboardButton(text=get_text('main_menu', lang), callback_data="admin_menu")])
return InlineKeyboardMarkup(inline_keyboard=keyboard)
# --- УПРАВЛЕНИЕ ТУТОРИАЛАМИ ---
def get_tutorials_admin_keyboard(lang: str) -> InlineKeyboardMarkup:
conn = sqlite3.connect('bot.db')
cursor = conn.cursor()
cursor.execute("SELECT id, title FROM tutorials")
tutorials = cursor.fetchall()
conn.close()
keyboard = []
for tutorial_id, title in tutorials:
keyboard.append([InlineKeyboardButton(text=f"{get_text('delete_tutorial_prefix', lang)} {title}", callback_data=f"delete_tutorial_{tutorial_id}")])
keyboard.append([InlineKeyboardButton(text=get_text('add_tutorial_btn', lang), callback_data="add_tutorial")])
keyboard.append([InlineKeyboardButton(text=get_text('back_to_menu', lang), callback_data="admin_menu")])
return InlineKeyboardMarkup(inline_keyboard=keyboard)
def get_tutorials_user_keyboard(lang: str) -> InlineKeyboardMarkup:
conn = sqlite3.connect('bot.db')
cursor = conn.cursor()
cursor.execute("SELECT id, title FROM tutorials")
tutorials = cursor.fetchall()
conn.close()
keyboard = []
if not tutorials:
keyboard.append([InlineKeyboardButton(text=get_text('no_tutorials_yet', lang), callback_data="no_op")])
else:
for tutorial_id, title in tutorials:
keyboard.append([InlineKeyboardButton(text=f"📖 {title}", callback_data=f"view_tutorial_{tutorial_id}")])
# Добавляем кнопку "Назад", которая вернет пользователя в главное меню
# Для этого нам нужна информация о его роли
# Проще всего будет, если обработчик этой кнопки сам вернет главное меню
# Поэтому здесь просто ставим callback_data, который поймает user_handler
keyboard.append([InlineKeyboardButton(text=get_text('back_to_menu', 'ru' if lang=='ru' else 'en'), callback_data="user_main_menu")])
return InlineKeyboardMarkup(inline_keyboard=keyboard)
# --- РАССЫЛКА И ПРОЧЕЕ ---
def get_confirm_send_keyboard(lang: str) -> InlineKeyboardMarkup:
return InlineKeyboardMarkup(inline_keyboard=[
[InlineKeyboardButton(text=get_text('send_btn', lang), callback_data="send_confirmed")],
[InlineKeyboardButton(text=get_text('cancel_btn', lang), callback_data="send_cancelled")]
])
def get_skip_media_keyboard(lang: str) -> InlineKeyboardMarkup:
return InlineKeyboardMarkup(inline_keyboard=[
[InlineKeyboardButton(text=get_text('skip_btn', lang), callback_data="skip_media")]
])