ontology-bot/main.py

407 lines
21 KiB
Python
Raw Normal View History

2024-04-15 11:04:40 +04:00
import telebot
from telebot import types
import sqlite3
# Создаем экземпляр бота с указанием токена
2024-04-15 11:19:29 +04:00
bot = telebot.TeleBot('sekretik')
2024-04-15 11:04:40 +04:00
2024-04-15 22:44:56 +04:00
current_poll = ""
2024-04-15 11:04:40 +04:00
# Создаем глобальный словарь для хранения вопросов и вариантов ответов
questions = {
"question1": {
2024-04-16 01:04:00 +04:00
"question": "В каких формах проявляется бытие?",
"options": [
'Природа, общество, культура, животные, растения',
'Физическое бытие, социальное бытие, идеальное бытие',
'Природа, общество, «вторая» природа, человек, дух и сознание',
'Природа, общество, культура, личность, духовность'],
"correct_option_id": 2
2024-04-15 11:04:40 +04:00
},
"question2": {
2024-04-16 01:04:00 +04:00
"question": "Что сдерживает разработчиков сайтов от внедрения поддержки онтологий?",
"options": [
'Недостаток обучения',
'Отсутствие стимулов',
'Высокие затраты',
'Отсутствие необходимых ресурсов'],
2024-04-15 22:44:56 +04:00
"correct_option_id": 1
2024-04-15 11:04:40 +04:00
},
"question3": {
2024-04-16 01:04:00 +04:00
"question": "Что подразумевается под 'онтологией человека' в рамках антропоонтологии?",
"options": [
'Учение о человеке в контексте социокультурной среды',
'Исследование психологических и социальных аспектов бытия человека',
'Анализ человеческого существования и его соотношения с бытием',
'Рассмотрение человека как объекта для философского анализа'],
2024-04-15 11:04:40 +04:00
"correct_option_id": 2
},
"question4": {
2024-04-16 01:04:00 +04:00
"question": "Какие философские понятия используются инженерами и математиками в информационных технологиях?",
"options": [
'Этика и моральные принципы',
'Онтологии философии и метафоры',
'Логика и рассуждения',
'Онтологии предметных областей и понятия «сущность связь»'],
2024-04-15 22:44:56 +04:00
"correct_option_id": 3
2024-04-15 11:04:40 +04:00
},
"question5": {
2024-04-16 01:04:00 +04:00
"question": "Какой принцип истолкования понятия 'информация' был широко используем до внедрения компьютерной техники?",
"options": [
'Принцип антропологии',
'Принцип материализма',
'Принцип субъективизма',
'Принцип реализма'],
2024-04-15 22:44:56 +04:00
"correct_option_id": 0
2024-04-15 11:04:40 +04:00
},
"question6": {
2024-04-16 01:04:00 +04:00
"question": "Почему понятие информации остается многозначным и почему не происходит вытеснения устаревших определений?",
"options": [
'Из-за несовершенства средств символической логики',
'Из-за разнообразия контекстов его применения и широкого спектра отношений, которые оно охватывает',
'Из-за отсутствия интереса к уточнению понятия в научном сообществе',
'Из-за недостаточной актуальности данной проблемы в современном мире'],
2024-04-15 22:44:56 +04:00
"correct_option_id": 1
2024-04-15 11:04:40 +04:00
},
"question7": {
2024-04-16 01:04:00 +04:00
"question": "Какое новое информационное взаимодействие возникло с появлением интернета?",
"options": [
'Человек — компьютер — интернет',
'Человек — компьютер — база данных',
'Человек — интернет — сервер',
'Человек — компьютер — сеть'],
"correct_option_id": 0
2024-04-15 11:04:40 +04:00
},
"question8": {
2024-04-16 02:08:31 +04:00
"question": "Кто автор этой цитаты: 'Я знаю, что ничего не знаю'",
"options": [
'Жан-Жак Руссо',
'Платон',
'Вольтер',
'Сократ'],
2024-04-15 22:44:56 +04:00
"correct_option_id": 3
2024-04-15 11:04:40 +04:00
},
}
2024-04-15 12:18:08 +04:00
links = [
2024-04-15 11:04:40 +04:00
"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",
2024-04-16 02:08:31 +04:00
"https://telegra.ph/50-interesnyh-faktov-o-filosofii-04-15",
2024-04-15 12:18:08 +04:00
]
2024-04-15 11:04:40 +04:00
# Функция для обработки команды /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):
2024-04-15 17:33:38 +04:00
if message.text == 'Темы' or message.text == 'Вернуться к выбору тем':
2024-04-15 11:04:40 +04:00
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, 'Вы можете сбросить процесс прохождения '
2024-04-15 17:33:38 +04:00
'всех тем, нажав на кнопку ниже (но учтите, что потеряете ВСЕ баллы)',
2024-04-15 11:04:40 +04:00
reply_markup=keyboard)
2024-04-15 17:33:38 +04:00
keyboard_gift = types.InlineKeyboardMarkup(row_width=1)
keyboard_gift.add(types.InlineKeyboardButton(text="Получить подарок", callback_data="get_gift"))
2024-04-16 02:08:31 +04:00
if count >= 5:
2024-04-15 17:33:38 +04:00
bot.send_message(chat_id, 'Поздравляем! Вашего количества баллов достаточно для получения '
'подарка. Нажмите на кнопку ниже для его получения', reply_markup=keyboard_gift)
2024-04-15 11:04:40 +04:00
# Закрываем соединение с базой данных
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"))
2024-04-16 02:08:31 +04:00
keyboard.add(types.InlineKeyboardButton(text="Бонус. 50 интересных фактов о философии", callback_data="topic8"))
2024-04-15 11:04:40 +04:00
# Добавляем кнопки для перехода к следующей странице
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()
2024-04-15 22:44:56 +04:00
for i in range(1, 9):
cursor.execute(f"UPDATE topics SET question{i} = 0 WHERE chat_id={call.message.chat.id}")
2024-04-15 11:04:40 +04:00
cursor.execute("UPDATE users SET count = 0 WHERE user_id=?", (call.message.chat.id,))
bot.send_message(chat_id, 'Прогресс очищен')
# Закрываем соединение с базой данных
conn.commit()
conn.close()
2024-04-15 17:33:38 +04:00
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)
2024-04-15 12:18:08 +04:00
elif topic.startswith("topic"):
number = int(topic[len("topic"):]) # Извлекаем подстроку после "topic"
2024-04-15 11:04:40 +04:00
keyboard = types.InlineKeyboardMarkup(row_width=1)
2024-04-15 12:18:08 +04:00
test_button = types.InlineKeyboardButton(text="Пройти тест по статье", callback_data=f"question{number}")
2024-04-15 11:04:40 +04:00
keyboard.add(test_button)
# Отправляем ссылку на статью
2024-04-15 12:18:08 +04:00
bot.send_message(chat_id, links[number - 1], reply_markup=keyboard)
2024-04-15 11:04:40 +04:00
bot.delete_message(chat_id, call.message.message_id)
bot.delete_message(chat_id, call.message.message_id + 1)
2024-04-15 17:33:38 +04:00
keyboard_menu = create_main_menu_keyboard()
keyboard_menu.add(types.KeyboardButton('Вернуться к выбору тем'))
bot.send_message(chat_id, "Для возврата к главному меню нажмите кнопку ниже:", reply_markup=keyboard_menu)
2024-04-15 11:04:40 +04:00
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,
2024-04-16 02:08:31 +04:00
type='quiz', open_period=60, correct_option_id=correct)
2024-04-15 22:44:56 +04:00
global current_poll
current_poll = topic
2024-04-15 11:04:40 +04:00
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):
2024-04-15 22:44:56 +04:00
global current_poll
chosen_option_id = poll_answer.option_ids[0]
question_data = questions[current_poll]
correct = question_data["correct_option_id"]
2024-04-15 11:04:40 +04:00
# Проверяем, совпадает ли выбранный вариант с правильным
2024-04-15 22:44:56 +04:00
if chosen_option_id == correct:
2024-04-15 11:04:40 +04:00
result_message = "Правильно! 🎉"
right_answer(poll_answer.user.id)
else:
result_message = "Неправильно 😞"
# Отправляем сообщение с результатом
bot.send_message(poll_answer.user.id, result_message)
2024-04-15 22:44:56 +04:00
current_poll = ""
2024-04-15 11:04:40 +04:00
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()