Как сделать что бы я мог добавить задания(ДЗ) и их авто проверку в моего бота на Auiogram 3x Python

Здравствуйте, я очень долго уже пытаюсь добавить одну функцию в бота, но все не получается. Задумка бота в том, что админы могут загружать курсы с ютуба и свои личные, то есть в бота. В принципе это уже работает, но хотелось бы добавить еще домашние задания и их авто проверку.

Надо сделать что бы к курсам я еще мог добавлять домашние задания. Добавлять эти домашние задания я буду так же через тг бота. Мне надо что бы после того как я добавил сам курс у меня появилось сообщение с текстом "Добавить Домашние Задания?" а ниже этого текста две инлайн кнопки На одной написано "Да" а на другой написано "Нет" если человек нажимает на нет то пишется то чно курс успешно добавлен а если он нажимает на да то появляется сообщение "Введите количество Домашних Заданий" - эта кнопка будет отвечать за то сколько раз бот будет просить ввести данные домашних заданий. Для добавления домашнего задания бот будет просить 1.Название 2.Описание 3.Само задание 4.Ответ. По окончанию заполнения всех заданий бот напишет "Курс и задания были загружены успешно" Как получить доступ к этим заданиям: Когда человек выберет курс и ему придет сообщение с названием, описанием, автором и ссылкой, то под ссылкой должна находиться еще одна кнопка с названием "Домашнее задание" если человек на нее нажмет то ему покажется название и id урока курсов которые он выбрал ниже так же будет инлайн кнопка с надписью "Открыть задание по id" если человек на нее нажмет то ему появится сообщение с текстом "Введите ID задания" если человек вводит id то ему показывается соответствующее домашнее задание оно будет выглядеть таким образом: Сверху будет написано "Название" ниже названия будет описание ниже описания само задание и под этим сообщением будут кнопки с текстом "Следующее задание(Будет показывать следующее задание если оно есть а если нет то будет исчезать)" "Проверить решение(Надо придумать как можно сделать что бы проверка решения проходила автоматически, ответ он будет брать из внесенных данных а именно из 4.Ответ)" "Ответ(Эта кнопка будет показывать ответ на данное задание беря информацию внесенную в базу данных 4.Ответ)" "К выбору курсов(Эта кнопка будет отправлять сообщение где человек будет выбирать то откуда брать знания из бота или из ютуба)" "Предыдущее задание(это кнопка будет возвращать человека к предыдущему заданию если оно есть а если его нет то кнопка будет исчезать)"

Вот ссылка на гит хаб если вдруг кто знает как это сделать и поможет. Заранее спасибо. https://github.com/ITGOComp/BotCursesAio

P.S. К сожалению у меня не получилось это сделать. Для удобства код был прокомментирован ChatGPT.


Ответы (1 шт):

Автор решения: Otets Valerian

Сама суть проста, а реализация чуть посложнее. Для начала нужна админ-меню или тп. Далее нужна отдельная бд с заданиями и ответами к ним, а так же правильными ответами. Каждое задание будет пронумеровано для удобства их вызова ученику. С бд разобрались, далее начинается создание функции добавления задания с ответами. Для этого желательно создать отдельный класс или файл для работы с бд.

Как это может выглядеть: '''

class DataBase:
    def __init__(self, db_file):    #db_file - имя бд
        self.connection = sqlite3.connect(db_file)
        self.cursor = self.connection.cursor()

    def user_exists(self, user_id):
        with self.connection:
            result = self.cursor.execute("SELECT * FROM users WHERE user_id = ?", (user_id,)).fetchall()
            return bool(len(result))

    def add_user(self,  user_id, lang="ru"):
        with self.connection:
            return self.cursor.execute("INSERT INTO users (user_id, lang) VALUES (?,?)", (user_id, lang,))

    def get_lang(self, user_id):
        with self.connection:
            return self.cursor.execute("SELECT lang FROM users WHERE user_id = ?", (user_id,)).fetchone()[0]

    def update_lang(self, user_id, lang):
        with self.connection:
            return self.cursor.execute("UPDATE users SET lang = ? WHERE user_id = ?", (lang, user_id,))

    def add_cond(self, user_id, cond):
        with self.connection:
            return self.cursor.execute("UPDATE users SET Conditional = ? WHERE user_id = ?", (cond, user_id,))

    def get_cond(self, user_id):
        with self.connection:
            return self.cursor.execute("SELECT Conditional FROM users WHERE user_id = ?", (user_id,)).fetchone()[0]

'''

После добавления заданий надо их выводить из бд. Для этого надо будет просто считывать как номер задания (отдельная колонка с название по типу id_job), так и само задание под этим номером (name_job):

'''

async def printJob(...):
    text = cursor.execute("SELECT id_job, name_job FROM Job").fetchone()[0]
    await bot.send_message(msg.from_user.id, text=text)

'''

После чего пользователь выбирает задание, отправляя цифру боту. После этого генерирует клавиатуру:

'''

async print_KB(...):
    answer = []
    for i in range(0, 4):
        answer.append(cursor.execute(f"SELECT asnwer_{i} FROM Job WHERE id_job = ?", (message.text,)).fetchone()[0])
    keyboard = ReplyKeyboardMarkup(resize_keyboard=True,
        keyboard=[
            [
                KeyboardButton(text=answer(0)),
                KeyboardButton(text=answer(1)),
                KeyboardButton(text=answer(2)),
                KeyboardButton(text=answer(3))
            ]
        ]
    )

'''

Далее простая проверка ответа из бд:

'''

def cheking_the_answer(...):
    True_answer = cursor.execute("SELECT TrueAnswer FROM Job WHERE id_job = ?", ("номер вопроса")).fetchone()[0]
    if message.text == True_answer:
        print("Ты молодец")
    else:
        print("В следующий раз получиться")

'''

Так же это надо будет завернуть все в State.

p.s. за какие либо не точности в sql-командах прошу прощения, по памяти писал. А так это лишь упрощенный пример как все может выглядеть, поэтому все надо будет дополнить и переделать под себя

→ Ссылка