Initial commit
This commit is contained in:
181
keyboards.py
Normal file
181
keyboards.py
Normal file
@@ -0,0 +1,181 @@
|
||||
# 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")]
|
||||
])
|
||||
Reference in New Issue
Block a user