Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- import sqlite3
- import time
- from datetime import datetime
- from telegram import Update, ReplyKeyboardMarkup
- from telegram.ext import Updater, CommandHandler, MessageHandler, Filters, CallbackContext, ConversationHandler
- # Database Setup
- conn = sqlite3.connect("quiz_bot.db", check_same_thread=False)
- cursor = conn.cursor()
- cursor.execute("""
- CREATE TABLE IF NOT EXISTS users (
- id INTEGER PRIMARY KEY,
- username TEXT,
- score REAL,
- last_played DATE
- )
- """)
- cursor.execute("""
- CREATE TABLE IF NOT EXISTS admins (
- id INTEGER PRIMARY KEY,
- password TEXT
- )
- """)
- cursor.execute("""
- CREATE TABLE IF NOT EXISTS questions (
- id INTEGER PRIMARY KEY,
- question TEXT,
- option1 TEXT,
- option2 TEXT,
- option3 TEXT,
- option4 TEXT,
- correct_option INTEGER
- )
- """)
- conn.commit()
- # States for conversation handler
- ADMIN_AUTH, ADD_QUESTIONS, QUIZ_ACTIVE = range(3)
- admin_password = "securepassword"
- game_active = False
- # Start Command
- def start(update: Update, context: CallbackContext) -> None:
- update.message.reply_text("Привет! Добро пожаловать в квиз-игру. Используйте /startgame, чтобы начать игру.")
- # Admin Authentication
- def admin(update: Update, context: CallbackContext) -> int:
- update.message.reply_text("Введите пароль администратора:")
- return ADMIN_AUTH
- def check_admin(update: Update, context: CallbackContext) -> int:
- if update.message.text == admin_password:
- update.message.reply_text("Аутентификация успешна! Используйте /questions, чтобы добавить вопросы.")
- return ConversationHandler.END
- else:
- update.message.reply_text("Неверный пароль. Попробуйте снова.")
- return ADMIN_AUTH
- # Adding Questions
- def add_questions(update: Update, context: CallbackContext) -> int:
- update.message.reply_text("Введите вопрос и 4 варианта ответа через запятую, последний вариант - правильный.")
- return ADD_QUESTIONS
- def save_question(update: Update, context: CallbackContext) -> int:
- try:
- question_data = update.message.text.split(",")
- if len(question_data) == 5:
- cursor.execute("INSERT INTO questions (question, option1, option2, option3, option4, correct_option) VALUES (?, ?, ?, ?, ?, ?)",
- question_data)
- conn.commit()
- update.message.reply_text("Вопрос добавлен!")
- else:
- update.message.reply_text("Ошибка! Введите вопрос правильно.")
- except Exception as e:
- update.message.reply_text(f"Ошибка: {e}")
- return ConversationHandler.END
- # Start and Stop Game
- def start_game(update: Update, context: CallbackContext) -> None:
- global game_active
- game_active = True
- update.message.reply_text("Игра началась! Отвечайте на вопросы.")
- def stop_game(update: Update, context: CallbackContext) -> None:
- global game_active
- game_active = False
- update.message.reply_text("Игра завершена! Итоги будут подведены.")
- # Quiz Handling
- def play_quiz(update: Update, context: CallbackContext) -> None:
- if not game_active:
- update.message.reply_text("Сейчас нельзя играть. Дождитесь начала игры.")
- return
- cursor.execute("SELECT * FROM questions ORDER BY RANDOM() LIMIT 5")
- questions = cursor.fetchall()
- score = 0
- start_time = time.time()
- for q in questions:
- question_text = f"{q[1]}\n1. {q[2]}\n2. {q[3]}\n3. {q[4]}\n4. {q[5]}"
- update.message.reply_text(question_text)
- response = context.bot.wait_for_message(chat_id=update.message.chat_id)
- if response.text.strip() == str(q[6]):
- score += 1
- elapsed_time = time.time() - start_time
- final_score = round(score / elapsed_time, 2)
- cursor.execute("INSERT INTO users (username, score, last_played) VALUES (?, ?, ?) ON CONFLICT(id) DO UPDATE SET score=?, last_played=?",
- (update.message.chat.username, final_score, datetime.now(), final_score, datetime.now()))
- conn.commit()
- update.message.reply_text(f"Ваш результат: {final_score} очков!")
- # Leaderboard
- def leaderboard(update: Update, context: CallbackContext) -> None:
- cursor.execute("SELECT username, score FROM users ORDER BY score DESC LIMIT 10")
- leaders = cursor.fetchall()
- text = "🏆 Таблица лидеров: \n" + "\n".join([f"{i+1}. {user[0]} - {user[1]} очков" for i, user in enumerate(leaders)])
- update.message.reply_text(text)
- # Main Bot Setup
- def main():
- updater = Updater("YOUR_TELEGRAM_BOT_TOKEN")
- dp = updater.dispatcher
- dp.add_handler(CommandHandler("start", start))
- dp.add_handler(CommandHandler("startgame", start_game))
- dp.add_handler(CommandHandler("stopgame", stop_game))
- dp.add_handler(CommandHandler("leaderboard", leaderboard))
- dp.add_handler(ConversationHandler(
- entry_points=[CommandHandler("admin", admin)],
- states={ADMIN_AUTH: [MessageHandler(Filters.text & ~Filters.command, check_admin)]},
- fallbacks=[]
- ))
- dp.add_handler(ConversationHandler(
- entry_points=[CommandHandler("questions", add_questions)],
- states={ADD_QUESTIONS: [MessageHandler(Filters.text & ~Filters.command, save_question)]},
- fallbacks=[]
- ))
- dp.add_handler(MessageHandler(Filters.text & ~Filters.command, play_quiz))
- updater.start_polling()
- updater.idle()
- if __name__ == "__main__":
- main()
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement