Initial commit

This commit is contained in:
root
2025-09-15 00:47:01 +02:00
commit a50fa92542
8 changed files with 1200 additions and 0 deletions

181
keyboards.py Normal file
View 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")]
])