129 lines
3.7 KiB
Python
129 lines
3.7 KiB
Python
# main.py
|
|
|
|
import asyncio
|
|
import logging
|
|
import sqlite3
|
|
|
|
from aiogram import Bot, Dispatcher, types
|
|
from aiogram.filters.command import Command
|
|
|
|
# --- Import local modules ---
|
|
from keyboards import get_main_keyboard_by_role
|
|
from handlers import admin_handlers, user_handlers, settings_handlers # Import new settings handler
|
|
from localization import get_text
|
|
|
|
# --- Settings ---
|
|
BOT_TOKEN = "YOUR_BOT_TOKEN"
|
|
ADMIN_IDS = [YOUR_TELEGRAM_ID]
|
|
|
|
# --- Initialization ---
|
|
bot = Bot(token=BOT_TOKEN)
|
|
dp = Dispatcher()
|
|
|
|
# --- Database Initialization ---
|
|
def init_db():
|
|
"""Initializes the database and tables."""
|
|
conn = sqlite3.connect('bot.db')
|
|
cursor = conn.cursor()
|
|
|
|
# Enable foreign key support
|
|
cursor.execute("PRAGMA foreign_keys = ON")
|
|
|
|
# Create users table with a new language_code column
|
|
cursor.execute('''
|
|
CREATE TABLE IF NOT EXISTS users (
|
|
telegram_id INTEGER PRIMARY KEY,
|
|
username TEXT,
|
|
is_admin INTEGER DEFAULT 0,
|
|
language_code TEXT DEFAULT 'en'
|
|
)''')
|
|
|
|
# Create configs table with ON DELETE CASCADE
|
|
# This automatically deletes a user's configs when the user is deleted
|
|
cursor.execute('''
|
|
CREATE TABLE IF NOT EXISTS configs (
|
|
id INTEGER PRIMARY KEY AUTOINCREMENT,
|
|
user_id INTEGER,
|
|
config_type TEXT,
|
|
config_data TEXT,
|
|
FOREIGN KEY (user_id) REFERENCES users (telegram_id) ON DELETE CASCADE
|
|
)''')
|
|
|
|
# Create tutorials table
|
|
cursor.execute('''
|
|
CREATE TABLE IF NOT EXISTS tutorials (
|
|
id INTEGER PRIMARY KEY AUTOINCREMENT,
|
|
title TEXT,
|
|
content_text TEXT,
|
|
file_id TEXT
|
|
)''')
|
|
|
|
# Add/update admins from the ADMIN_IDS list
|
|
for admin_id in ADMIN_IDS:
|
|
cursor.execute(
|
|
"INSERT INTO users (telegram_id, is_admin, language_code) VALUES (?, 1, 'en') "
|
|
"ON CONFLICT(telegram_id) DO UPDATE SET is_admin = 1",
|
|
(admin_id,)
|
|
)
|
|
|
|
conn.commit()
|
|
conn.close()
|
|
|
|
# --- Register Routers ---
|
|
dp.include_router(admin_handlers.router)
|
|
dp.include_router(user_handlers.router)
|
|
dp.include_router(settings_handlers.router) # Register the new settings router
|
|
|
|
# --- /start Command Handler ---
|
|
@dp.message(Command("start"))
|
|
async def send_welcome(message: types.Message):
|
|
"""
|
|
Handles the /start command.
|
|
Greets the user, adds them to the DB if they are new,
|
|
and shows the appropriate menu in their selected language.
|
|
"""
|
|
user_id = message.from_user.id
|
|
username = message.from_user.username
|
|
|
|
conn = sqlite3.connect('bot.db')
|
|
cursor = conn.cursor()
|
|
|
|
# Check if user exists
|
|
cursor.execute("SELECT is_admin, language_code FROM users WHERE telegram_id = ?", (user_id,))
|
|
result = cursor.fetchone()
|
|
|
|
if result:
|
|
# User exists, get their role and language
|
|
is_admin, lang = result
|
|
else:
|
|
# New user, add to DB with default language 'en'
|
|
is_admin = 1 if user_id in ADMIN_IDS else 0
|
|
lang = 'en'
|
|
cursor.execute(
|
|
"INSERT INTO users (telegram_id, username, is_admin, language_code) VALUES (?, ?, ?, ?)",
|
|
(user_id, username, is_admin, lang)
|
|
)
|
|
conn.commit()
|
|
|
|
conn.close()
|
|
|
|
# Determine the welcome text based on role and language
|
|
welcome_text_key = 'welcome_admin' if is_admin else 'welcome'
|
|
welcome_text = get_text(welcome_text_key, lang)
|
|
|
|
# Show the main menu
|
|
await message.answer(
|
|
welcome_text,
|
|
reply_markup=get_main_keyboard_by_role(is_admin, lang)
|
|
)
|
|
|
|
# --- Entry Point ---
|
|
async def main():
|
|
"""Main function to start the bot."""
|
|
logging.basicConfig(level=logging.INFO)
|
|
init_db() # Initialize the database on startup
|
|
await dp.start_polling(bot)
|
|
|
|
if __name__ == "__main__":
|
|
asyncio.run(main())
|