182 lines
8.9 KiB
Python
182 lines
8.9 KiB
Python
# 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")]
|
||
])
|