diff --git a/.idea/inspectionProfiles/profiles_settings.xml b/.idea/inspectionProfiles/profiles_settings.xml new file mode 100644 index 0000000..105ce2d --- /dev/null +++ b/.idea/inspectionProfiles/profiles_settings.xml @@ -0,0 +1,6 @@ + + + + \ No newline at end of file diff --git a/.idea/misc.xml b/.idea/misc.xml new file mode 100644 index 0000000..5acfcc5 --- /dev/null +++ b/.idea/misc.xml @@ -0,0 +1,7 @@ + + + + + + \ No newline at end of file diff --git a/.idea/modules.xml b/.idea/modules.xml new file mode 100644 index 0000000..7a54bf8 --- /dev/null +++ b/.idea/modules.xml @@ -0,0 +1,8 @@ + + + + + + + + \ No newline at end of file diff --git a/.idea/ontology-bot.iml b/.idea/ontology-bot.iml new file mode 100644 index 0000000..74d515a --- /dev/null +++ b/.idea/ontology-bot.iml @@ -0,0 +1,10 @@ + + + + + + + + + + \ No newline at end of file diff --git a/.idea/vcs.xml b/.idea/vcs.xml new file mode 100644 index 0000000..94a25f7 --- /dev/null +++ b/.idea/vcs.xml @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git a/main.py b/main.py new file mode 100644 index 0000000..394e140 --- /dev/null +++ b/main.py @@ -0,0 +1,418 @@ +import telebot +from telebot import types +import sqlite3 + +# Создаем экземпляр бота с указанием токена +bot = telebot.TeleBot('7160826305:AAE034sFnCCmdh-KfSBUrvlvr_rmdBJHwXg') + +# Создаем глобальный словарь для хранения вопросов и вариантов ответов +questions = { + "question1": { + "question": "Вопрос для темы 1", + "options": ['Ответ 1', 'Ответ 2', 'Ответ 3', 'Ответ 4'], + "correct_option_id": 2 + }, + "question2": { + "question": "Вопрос для темы 2", + "options": ['Ответ 1', 'Ответ 2', 'Ответ 3', 'Ответ 4'], + "correct_option_id": 2 + }, + "question3": { + "question": "Вопрос для темы 3", + "options": ['Ответ 1', 'Ответ 2', 'Ответ 3', 'Ответ 4'], + "correct_option_id": 2 + }, + "question4": { + "question": "Вопрос для темы 4", + "options": ['Ответ 1', 'Ответ 2', 'Ответ 3', 'Ответ 4'], + "correct_option_id": 2 + }, + "question5": { + "question": "Вопрос для темы 5", + "options": ['Ответ 1', 'Ответ 2', 'Ответ 3', 'Ответ 4'], + "correct_option_id": 2 + }, + "question6": { + "question": "Вопрос для темы 6", + "options": ['Ответ 1', 'Ответ 2', 'Ответ 3', 'Ответ 4'], + "correct_option_id": 2 + }, + "question7": { + "question": "Вопрос для темы 7", + "options": ['Ответ 1', 'Ответ 2', 'Ответ 3', 'Ответ 4'], + "correct_option_id": 2 + }, + "question8": { + "question": "Вопрос для темы 8", + "options": ['Ответ 1', 'Ответ 2', 'Ответ 3', 'Ответ 4'], + "correct_option_id": 2 + }, +} + +links = { + "https://telegra.ph/ONTOLOGIYA-KAK-UCHENIE-O-BYTII-04-13", + "https://telegra.ph/Primenenie-ontologij-04-13", + "https://telegra.ph/Sovremennaya-ontologiya-aktualnye-problemy-04-13", + "https://telegra.ph/Filosofiya-nauki-i-konkretnye-nauki-04-13", + "https://telegra.ph/FILOSOFSKIE-PROBLEMY-INFORMATIKI-04-13", + "https://telegra.ph/Isklyuchitelnost-ponyatiya-informacii-04-13", + "https://telegra.ph/Filosofskie-problemy-informatiki-i-informacionnyh-tehnologij-04-13", + "https://telegra.ph/Filosofskie-problemy-informatiki-i-informacionnyh-tehnologij-04-13", +} + +# Функция для обработки команды /start +@bot.message_handler(commands=['start']) +def handle_start(message): + # Получаем информацию о пользователе + username = message.from_user.first_name + user_id = message.from_user.id + chat_id = message.chat.id + + # Подключаемся к базе данных + conn = sqlite3.connect('users.db') + cursor = conn.cursor() + + # Проверяем, есть ли пользователь уже в базе данных + cursor.execute("SELECT * FROM users WHERE chat_id=?", (chat_id,)) + existing_user = cursor.fetchone() + + if existing_user: + bot.reply_to(message, 'С возвращением!') + else: + bot.reply_to(message, 'Привет, {}! Я записал тебя в базу данных.'.format(username)) + # Добавляем нового пользователя в базу данных + cursor.execute("INSERT INTO users (username, user_id, chat_id, count) VALUES (?, ?, ?, 0)", + (username, user_id, chat_id)) + cursor.execute("INSERT INTO topics (chat_id, question1, question2, question3, question4, question5, question6, question7, question8) VALUES (?, 0, 0, 0, 0, 0, 0, 0, 0)", (chat_id,)) + + + # Сохраняем изменения в базе данных + conn.commit() + + # Закрываем соединение с базой данных + conn.close() + + # Запрашиваем у пользователя выбор из меню + bot.send_message(chat_id, "Пожалуйста, выбери один из пунктов меню:", + reply_markup=create_menu_keyboard()) + +# Создаем клавиатуру с пунктами меню +def create_menu_keyboard(): + keyboard = types.ReplyKeyboardMarkup(row_width=1, resize_keyboard=True) + keyboard.add(types.KeyboardButton('Темы')) + keyboard.add(types.KeyboardButton('Профиль')) + keyboard.add(types.KeyboardButton('Рейтинг')) + return keyboard + +# Функция для обработки выбора пользователя +@bot.message_handler(func=lambda message: True) +def handle_menu(message): + if message.text == 'Темы': + show_topics(message.chat.id) + elif message.text == 'Профиль': + show_profile(message.chat.id) + elif message.text == 'Рейтинг': + show_rating(message.chat.id) + elif message.text == 'Вернуться к главному меню': + bot.send_message(message.chat.id, "Пожалуйста, выбери один из пунктов меню:", + reply_markup=create_menu_keyboard()) + +# Функция для отображения рейтинга пользователей +def show_rating(chat_id): + # Подключаемся к базе данных + conn = sqlite3.connect('users.db') + cursor = conn.cursor() + + # Получаем список пользователей, отсортированный по убыванию баллов (count) + cursor.execute("SELECT username, count FROM users ORDER BY count DESC") + rating = cursor.fetchall() + + # Формируем сообщение с рейтингом пользователей + message = "Рейтинг пользователей:\n" + for i, (username, count) in enumerate(rating, start=1): + message += f"{i}. {username}: {count} баллов\n" + + # Отправляем сообщение с рейтингом + bot.send_message(chat_id, message) + + # Закрываем соединение с базой данных + conn.close() + + bot.send_message(chat_id, "Для возврата к главному меню нажмите кнопку ниже:", + reply_markup=create_main_menu_keyboard()) + +# Функция для создания клавиатуры главного меню +def create_main_menu_keyboard(): + keyboard = types.ReplyKeyboardMarkup(row_width=1, resize_keyboard=True) + keyboard.add(types.KeyboardButton('Вернуться к главному меню')) + return keyboard + +# Функция для отображения профиля пользователя +def show_profile(chat_id): + # Подключаемся к базе данных + conn = sqlite3.connect('users.db') + cursor = conn.cursor() + + # Получаем информацию о пользователе из таблицы users + cursor.execute("SELECT username, count FROM users WHERE chat_id=?", (chat_id,)) + user_data = cursor.fetchone() + + # Получаем информацию о темах, которые пользователь прошел из таблицы topics + cursor.execute("SELECT * FROM topics WHERE chat_id=?", (chat_id,)) + topics_data = cursor.fetchone() + + # Подсчитываем количество тем, которые пользователь прошел + num_topics_passed = sum(topic_flag for topic_flag in topics_data[2:]) + + # Формируем сообщение с профилем пользователя + if user_data: + username, count = user_data + message = f"Профиль пользователя {username}:\n" + message += f"Баллов: {count}\n" + message += f"Количество тем, которые прошел: {num_topics_passed} из 8" + else: + message = "Профиль пользователя не найден" + + # Отправляем сообщение с профилем пользователя + bot.send_message(chat_id, message) + + keyboard = types.InlineKeyboardMarkup(row_width=1) + keyboard.add(types.InlineKeyboardButton(text="Сбросить прогресс", callback_data="remove_progress")) + bot.send_message(chat_id, 'Вы можете сбросить процесс прохождения ' + 'всех тем, нажав на кнопку ниже (но учтите, что потеряете все баллы)', + reply_markup=keyboard) + + # Закрываем соединение с базой данных + conn.close() + + bot.send_message(chat_id, "Для возврата к главному меню нажмите кнопку ниже:", + reply_markup=create_main_menu_keyboard()) + + +# Функция для отображения клавиатуры с темами +def show_topics(chat_id, page = 1): + + # Создаем клавиатуру с темами в зависимости от текущей страницы + keyboard = create_topics_keyboard(page) + + # Отправляем сообщение с клавиатурой тем + bot.send_message(chat_id, "Выберите тему:", reply_markup=keyboard) + + bot.send_message(chat_id, "Для возврата к главному меню нажмите кнопку ниже:", + reply_markup=create_main_menu_keyboard()) + +def create_topics_keyboard(page): + # Создаем клавиатуру с темами + keyboard = types.InlineKeyboardMarkup(row_width=1) + + # Определяем диапазон тем для текущей страницы + start_topic = (page - 1) * 4 + 1 + end_topic = min(page * 4, 8) # Всего 8 тем + + if start_topic == 1: + keyboard.add(types.InlineKeyboardButton(text="1.Онтология как учение о бытии", callback_data="topic1")) + keyboard.add(types.InlineKeyboardButton(text="2.Применение онтологий", callback_data="topic2")) + keyboard.add(types.InlineKeyboardButton(text="3.Современная онтология: актуальные проблемы", callback_data="topic3")) + keyboard.add(types.InlineKeyboardButton(text="4.Философия науки и конкретные науки", callback_data="topic4")) + elif start_topic == 5: + keyboard.add(types.InlineKeyboardButton(text="5.Философские проблемы информатики", callback_data="topic5")) + keyboard.add(types.InlineKeyboardButton(text="6.Исключительность понятия информации", callback_data="topic6")) + keyboard.add(types.InlineKeyboardButton(text="7.Философские проблемы информатики и информационных технологий", callback_data="topic7")) + keyboard.add(types.InlineKeyboardButton(text="8.Факты об онтологии", callback_data="topic8")) + + # Добавляем кнопки для перехода к следующей странице + if end_topic < 8: + keyboard.add(types.InlineKeyboardButton(text="Следующая страница ->", callback_data=f"next_page{page+1}")) + + # Добавляем кнопку для перехода к предыдущей странице (если не на первой странице) + if page > 1: + keyboard.add(types.InlineKeyboardButton(text="<- Предыдущая страница", callback_data=f"prev_page{page-1}")) + + return keyboard + +# Обработчик для нажатия на кнопку "Следующая страница" или "Предыдущая страница" +@bot.callback_query_handler(func=lambda call: call.data.startswith(('next_page', 'prev_page'))) +def handle_page_navigation(call): + page = int(call.data.split('page')[-1]) + + # Удаляем предыдущее сообщение + bot.delete_message(call.message.chat.id, call.message.message_id) + bot.delete_message(call.message.chat.id, call.message.message_id + 1) + + # Показываем темы для новой страницы + show_topics(call.message.chat.id, page) + +# Обработчик для нажатия на кнопку с темой +@bot.callback_query_handler(func=lambda call: True) +def handle_topic(call): + topic = call.data + chat_id = call.message.chat.id + global questions + + # Отправляем сообщение с текстом по выбранной теме + if topic == "remove_progress": + conn = sqlite3.connect('users.db') + cursor = conn.cursor() + cursor.execute( + "UPDATE topics SET question1 = 0 WHERE chat_id=?", + (call.message.chat.id,)) + cursor.execute("UPDATE users SET count = 0 WHERE user_id=?", (call.message.chat.id,)) + bot.send_message(chat_id, 'Прогресс очищен') + # Закрываем соединение с базой данных + conn.commit() + conn.close() + elif topic == "topic1": + keyboard = types.InlineKeyboardMarkup(row_width=1) + test_button = types.InlineKeyboardButton(text="Пройти тест по статье", callback_data="question1") + keyboard.add(test_button) + + # Отправляем ссылку на статью + bot.send_message(chat_id, "https://telegra.ph/ONTOLOGIYA-KAK-UCHENIE-O-BYTII-04-13", + reply_markup=keyboard) + bot.delete_message(chat_id, call.message.message_id) + bot.delete_message(chat_id, call.message.message_id + 1) + + bot.send_message(chat_id, "Для возврата к главному меню нажмите кнопку ниже:", + reply_markup=create_main_menu_keyboard()) + elif topic == "topic2": + keyboard = types.InlineKeyboardMarkup(row_width=1) + test_button = types.InlineKeyboardButton(text="Пройти тест по статье", callback_data="question2") + keyboard.add(test_button) + + # Отправляем ссылку на статью + bot.send_message(chat_id, "https://telegra.ph/Primenenie-ontologij-04-13", + reply_markup=keyboard) + bot.delete_message(chat_id, call.message.message_id) + elif topic == "topic3": + keyboard = types.InlineKeyboardMarkup(row_width=1) + test_button = types.InlineKeyboardButton(text="Пройти тест по статье", callback_data="question3") + keyboard.add(test_button) + + # Отправляем ссылку на статью + bot.send_message(chat_id, "https://telegra.ph/Sovremennaya-ontologiya-aktualnye-problemy-04-13", + reply_markup=keyboard) + bot.delete_message(chat_id, call.message.message_id) + elif topic == "topic4": + keyboard = types.InlineKeyboardMarkup(row_width=1) + test_button = types.InlineKeyboardButton(text="Пройти тест по статье", callback_data="question4") + keyboard.add(test_button) + + # Отправляем ссылку на статью + bot.send_message(chat_id, "https://telegra.ph/Filosofiya-nauki-i-konkretnye-nauki-04-13", + reply_markup=keyboard) + bot.delete_message(chat_id, call.message.message_id) + elif topic == "topic5": + keyboard = types.InlineKeyboardMarkup(row_width=1) + test_button = types.InlineKeyboardButton(text="Пройти тест по статье", callback_data="question5") + keyboard.add(test_button) + + # Отправляем ссылку на статью + bot.send_message(chat_id, "https://telegra.ph/FILOSOFSKIE-PROBLEMY-INFORMATIKI-04-13", + reply_markup=keyboard) + bot.delete_message(chat_id, call.message.message_id) + elif topic == "topic6": + keyboard = types.InlineKeyboardMarkup(row_width=1) + test_button = types.InlineKeyboardButton(text="Пройти тест по статье", callback_data="question6") + keyboard.add(test_button) + + # Отправляем ссылку на статью + bot.send_message(chat_id, "https://telegra.ph/Isklyuchitelnost-ponyatiya-informacii-04-13", + reply_markup=keyboard) + bot.delete_message(chat_id, call.message.message_id) + elif topic == "topic7": + keyboard = types.InlineKeyboardMarkup(row_width=1) + test_button = types.InlineKeyboardButton(text="Пройти тест по статье", callback_data="question7") + keyboard.add(test_button) + + # Отправляем ссылку на статью + bot.send_message(chat_id, "https://telegra.ph/Filosofskie-problemy-informatiki-i-informacionnyh-tehnologij-04-13", + reply_markup=keyboard) + bot.delete_message(chat_id, call.message.message_id) + elif topic == "topic8": + keyboard = types.InlineKeyboardMarkup(row_width=1) + test_button = types.InlineKeyboardButton(text="Пройти тест по статье", callback_data="question8") + keyboard.add(test_button) + + # Отправляем ссылку на статью + bot.send_message(chat_id, "https://telegra.ph/Filosofskie-problemy-informatiki-i-informacionnyh-tehnologij-04-13", + reply_markup=keyboard) + bot.delete_message(chat_id, call.message.message_id) + elif topic in questions: + conn = sqlite3.connect('users.db') + cursor = conn.cursor() + cursor.execute(f"SELECT {topic} FROM topics WHERE chat_id={call.message.chat.id}") + result = cursor.fetchone() + if result is not None: + if result[0] == 0: # Проверяем, что first_flag равен 0 + cursor.execute(f"UPDATE topics SET {topic} = 1 WHERE chat_id={call.message.chat.id}") + conn.commit() + + question_data = questions[topic] + question = question_data["question"] + options = question_data["options"] + correct = question_data["correct_option_id"] + + poll = bot.send_poll(call.message.chat.id, question, options, is_anonymous=False, + type='quiz', open_period=30, correct_option_id=correct) + else: + bot.send_message(chat_id, "Жулик! Проходить тест можно только один раз!") + else: + bot.send_message(chat_id, "Вас нет в базе данных!") + conn.close() + + +# Обработка ответов на опросы +@bot.poll_answer_handler(func=lambda poll_answer: True) +def handle_poll_answer(poll_answer): + chosen_option_id = poll_answer.option_ids + + # Проверяем, совпадает ли выбранный вариант с правильным + if chosen_option_id[0] == 2: + result_message = "Правильно! 🎉" + right_answer(poll_answer.user.id) + else: + result_message = "Неправильно 😞" + + # Отправляем сообщение с результатом + bot.send_message(poll_answer.user.id, result_message) + +def right_answer(user_id): + conn = sqlite3.connect('users.db') + cursor = conn.cursor() + cursor.execute("UPDATE users SET count = count + 1 WHERE user_id=?", (user_id,)) + conn.commit() + conn.close() + +# Создаем таблицу пользователей в базе данных +def create_table(): + conn = sqlite3.connect('users.db') + cursor = conn.cursor() + cursor.execute('''CREATE TABLE IF NOT EXISTS users (id INTEGER PRIMARY KEY, username VARCHAR, user_id VARCHAR, chat_id VARCHAR, count INTEGER)''') + conn.commit() + conn.close() + +def create_falg_table(): + conn = sqlite3.connect('users.db') + cursor = conn.cursor() + cursor.execute('''CREATE TABLE IF NOT EXISTS topics ( + id INTEGER PRIMARY KEY, + chat_id VARCHAR, + question1 INTEGER, + question2 INTEGER, + question3 INTEGER, + question4 INTEGER, + question5 INTEGER, + question6 INTEGER, + question7 INTEGER, + question8 INTEGER + )''') + conn.commit() + conn.close() + +# Вызываем функцию для создания таблицы пользователей +create_table() +create_falg_table() + +# Запускаем бота +bot.polling() + diff --git a/users.db b/users.db new file mode 100644 index 0000000..c7f8e53 Binary files /dev/null and b/users.db differ