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