ontology-bot/main.py

356 lines
17 KiB
Python
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

import telebot
from telebot import types
import sqlite3
# Создаем экземпляр бота с указанием токена
bot = telebot.TeleBot('sekretik')
# Создаем глобальный словарь для хранения вопросов и вариантов ответов
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.startswith("topic"):
number = int(topic[len("topic"):]) # Извлекаем подстроку после "topic"
keyboard = types.InlineKeyboardMarkup(row_width=1)
test_button = types.InlineKeyboardButton(text="Пройти тест по статье", callback_data=f"question{number}")
keyboard.add(test_button)
# Отправляем ссылку на статью
bot.send_message(chat_id, links[number - 1], 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 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()