ontology-bot/main.py

413 lines
22 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')
current_poll = ""
# Создаем глобальный словарь для хранения вопросов и вариантов ответов
questions = {
"question1": {
"question": "В каких формах проявляется бытие?",
"options": [
'Природа, общество, культура, животные, растения',
'Физическое бытие, социальное бытие, идеальное бытие',
'Природа, общество, «вторая» природа, человек, дух и сознание',
'Природа, общество, культура, личность, духовность'],
"correct_option_id": 2
},
"question2": {
"question": "Что сдерживает разработчиков сайтов от внедрения поддержки онтологий?",
"options": [
'Недостаток обучения',
'Отсутствие стимулов',
'Высокие затраты',
'Отсутствие необходимых ресурсов'],
"correct_option_id": 1
},
"question3": {
"question": "Что подразумевается под 'онтологией человека' в рамках антропоонтологии?",
"options": [
'Учение о человеке в контексте социокультурной среды',
'Исследование психологических и социальных аспектов бытия человека',
'Анализ человеческого существования и его соотношения с бытием',
'Рассмотрение человека как объекта для философского анализа'],
"correct_option_id": 2
},
"question4": {
"question": "Какие философские понятия используются инженерами и математиками в информационных технологиях?",
"options": [
'Этика и моральные принципы',
'Онтологии философии и метафоры',
'Логика и рассуждения',
'Онтологии предметных областей и понятия «сущность связь»'],
"correct_option_id": 3
},
"question5": {
"question": "Какой принцип истолкования понятия 'информация' был широко используем до внедрения компьютерной техники?",
"options": [
'Принцип антропологии',
'Принцип материализма',
'Принцип субъективизма',
'Принцип реализма'],
"correct_option_id": 0
},
"question6": {
"question": "Почему понятие информации остается многозначным и почему не происходит вытеснения устаревших определений?",
"options": [
'Из-за несовершенства средств символической логики',
'Из-за разнообразия контекстов его применения и широкого спектра отношений, которые оно охватывает',
'Из-за отсутствия интереса к уточнению понятия в научном сообществе',
'Из-за недостаточной актуальности данной проблемы в современном мире'],
"correct_option_id": 1
},
"question7": {
"question": "Какое новое информационное взаимодействие возникло с появлением интернета?",
"options": [
'Человек — компьютер — интернет',
'Человек — компьютер — база данных',
'Человек — интернет — сервер',
'Человек — компьютер — сеть'],
"correct_option_id": 0
},
"question8": {
"question": "Кто автор этой цитаты: 'Я знаю, что ничего не знаю'",
"options": [
'Жан-Жак Руссо',
'Платон',
'Вольтер',
'Сократ'],
"correct_option_id": 3
},
}
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-15",
"https://telegra.ph/Isklyuchitelnost-ponyatiya-informacii-04-13",
"https://telegra.ph/Filosofskie-problemy-informatiki-i-informacionnyh-tehnologij-04-15",
"https://telegra.ph/50-interesnyh-faktov-o-filosofii-04-15",
]
# Функция для обработки команды /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 == 'Темы' or 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)
keyboard_gift = types.InlineKeyboardMarkup(row_width=1)
keyboard_gift.add(types.InlineKeyboardButton(text="Получить подарок", callback_data="get_gift"))
if num_topics_passed >= 7:
bot.send_message(chat_id, 'Поздравляем c прохождением всех тем 🎉🎉🎉')
if count >= 5:
bot.send_message(chat_id, 'Вашего количества баллов достаточно для получения '
'подарка. Нажмите на кнопку ниже для его получения', reply_markup=keyboard_gift)
else:
bot.send_message(chat_id, 'К сожалению ваших баллов не хватает для получения '
'особого подарка 😞 Однако вы можете сбросить процесс и пройти '
'все темы заново, нажав на кнопку')
# Закрываем соединение с базой данных
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="Бонус. 50 интересных фактов о философии", 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()
for i in range(1, 9):
cursor.execute(f"UPDATE topics SET question{i} = 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 == "get_gift":
bot.send_sticker(chat_id, 'CAACAgIAAxkBAAEL6uFmHSUgskynfau96BoqFXOp9nCdYwACpUkAAiBb6UhP0zOL--pvTjQE')
bot.send_message(chat_id, 'Вот ваш подарок - стикерпак Бытие УлГТУ '
'от разработчиков: https://t.me/addstickers/ontology_ulstu', disable_web_page_preview=True)
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)
keyboard_menu = create_main_menu_keyboard()
keyboard_menu.add(types.KeyboardButton('Вернуться к выбору тем'))
bot.send_message(chat_id, "Для возврата к главному меню нажмите кнопку ниже:", reply_markup=keyboard_menu)
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=60, correct_option_id=correct)
global current_poll
current_poll = topic
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):
global current_poll
chosen_option_id = poll_answer.option_ids[0]
question_data = questions[current_poll]
correct = question_data["correct_option_id"]
# Проверяем, совпадает ли выбранный вариант с правильным
if chosen_option_id == correct:
result_message = "Правильно! 🎉"
right_answer(poll_answer.user.id)
else:
result_message = "Неправильно 😞"
# Отправляем сообщение с результатом
bot.send_message(poll_answer.user.id, result_message)
current_poll = ""
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()