/
valek
/
Telegram-Bot
Обзор
Документация
Войти
/
valek
/
Telegram-Bot
Код
Запросы
0
Задачи
Вики
Пакеты
0
Релизы
0
CI/CD
Аналитика
Безопасность
master
main.py
173 строки
6 KB
valek
update: main.py
18 фев 2026, 16:04
Верифицирован
18 фев 2026, 16:04
736ac65
Код
Авторство
О чём код?
import telebot import os import random from sqlalchemy import func from telebot.storage import StateMemoryStorage from dotenv import load_dotenv from telebot import types from telebot.states import State, StatesGroup from models_bot import Session, load_db, Word, User, UserWord load_dotenv() state_storage = StateMemoryStorage() TOKEN = os.getenv('YOUR_TOKEN') bot = telebot.TeleBot(TOKEN, state_storage=state_storage) class Command: ADD_WORD = 'добавить' DELETE_WORD = 'удалить' NEXT = 'дальше' class MyStates(StatesGroup): target_word = State() translate_word = State() another_words = State() add_english = State() add_russian = State() delete_word = State() @bot.message_handler(commands=['start']) def bot_greeting(message): bot.send_message(message.chat.id, 'Привет! Давай попрактикуемся в английском языке.' 'Чтобы начать, введи команду /card') @bot.message_handler(commands=['card']) def start_bot(message): with Session() as session: user = session.query(User).filter(User.telegram_id == message.from_user.id).first() if not user: user = User(telegram_id=message.from_user.id) session.add(user) session.commit() word = random.choice(session.query(Word).all()) target_word = word.english russian_word = word.russian other_words = [w.english for w in session.query(Word).filter(Word.id != word.id).all()] wrong_words = random.sample(other_words, 3) markup = types.ReplyKeyboardMarkup(row_width=2) buttons = [types.KeyboardButton(w) for w in [target_word] + wrong_words] random.shuffle(buttons) buttons += [ types.KeyboardButton(Command.NEXT), types.KeyboardButton(Command.ADD_WORD), types.KeyboardButton(Command.DELETE_WORD) ] markup.add(*buttons) bot.send_message(message.chat.id, f"Угадай слово: {russian_word}", reply_markup=markup, parse_mode="Markdown") bot.set_state(message.from_user.id, MyStates.target_word, message.chat.id) with bot.retrieve_data(message.from_user.id, message.chat.id) as data: data['target_word'] = target_word data['russian_word'] = russian_word @bot.message_handler(func=lambda message: message.text not in [Command.ADD_WORD, Command.DELETE_WORD, Command.NEXT],) def check_answer(message): with bot.retrieve_data(message.from_user.id, message.chat.id) as data: target_word = data['target_word'] if message.text.strip().lower() == target_word.lower(): bot.send_message(message.chat.id, f"Правильно!") else: bot.send_message(message.chat.id, f"Неверно. Попробуйте ещё раз.") @bot.message_handler(func=lambda message: message.text == Command.NEXT) def next_word(message): start_bot(message) @bot.message_handler(func=lambda message: message.text == Command.ADD_WORD) def add_word_start(message): bot.send_message(message.chat.id, "Введите английское слово:") bot.set_state(message.from_user.id, MyStates.add_english, message.chat.id) @bot.message_handler(state=MyStates.add_english) def add_english(message): english_word = message.text.strip().lower() with Session() as session: word = session.query(Word).filter(func.lower(Word.english) == english_word).first() if not word: new_word = Word(english=english_word, russian="неизвестно") session.add(new_word) session.commit() bot.send_message(message.chat.id, "Слово добавлено. Теперь введите его перевод на русском:") word_id = new_word.word_id else: bot.send_message(message.chat.id, "Слово уже есть в базе.") word_id = word.id with bot.retrieve_data(message.from_user.id, message.chat.id) as data: data['word_id'] = word_id bot.set_state(message.from_user.id, MyStates.add_russian, message.chat.id) @bot.message_handler(state=MyStates.add_russian) def add_russian(message): russian = message.text.strip() with bot.retrieve_data(message.from_user.id, message.chat.id) as data: word_id = data.get('word_id') with Session() as session: user = session.query(User).filter(User.telegram_id == message.from_user.id).first() word = session.query(Word).get(word_id) word.russian = russian if not session.query(UserWord).filter_by(user_id=user.id, word_id=word_id).first(): user_word = UserWord(user_id=user.id, word_id=word_id) session.add(user_word) session.commit() bot.send_message(message.chat.id, f"Слово '{word.english}' → '{russian}' добавлено в ваш словарь!") bot.delete_state(message.from_user.id, message.chat.id) @bot.message_handler(func=lambda message: message.text == Command.DELETE_WORD) def start_delete_word(message): bot.send_message(message.chat.id, "Введите английское слово для удаления:") bot.set_state(message.from_user.id, MyStates.delete_word, message.chat.id) @bot.message_handler(state=MyStates.delete_word) def delete_word(message): user_id = message.from_user.id english = message.text.strip().lower() with Session() as session: user = session.query(User).filter(User.telegram_id == user_id).first() if not user: bot.send_message(message.chat.id, "Пользователь не найден.") bot.delete_state(user_id, message.chat.id) return user_word_entry = (session.query(UserWord).join(Word) .filter(UserWord.user_id == user.id, func.lower(Word.english) == english).first()) if user_word_entry: session.delete(user_word_entry) session.commit() bot.send_message(message.chat.id, f"🗑 Слово '{english}' удалено.") else: bot.send_message(message.chat.id, f"Слова '{english}' нет в вашем словаре.") bot.delete_state(user_id, message.chat.id) if __name__ == '__main__': load_db() print('Бот запущен...') bot.polling()