--- id: "f94ffe79-e80e-459d-bb00-e860945b9913" name: "Реализация переключателя настроек и диалога подтверждения в Aiogram" description: "Навык для создания интерактивного меню с переключателем пользовательских настроек (например, включение/выключение функции) и диалогом подтверждения для разрушительных действий (очистка данных). Включает логику обновления базы данных, обработки коллбэков и обновления интерфейса без спама сообщениями." version: "0.1.0" tags: - "aiogram" - "python" - "telegram-bot" - "user-settings" - "inline-keyboard" triggers: - "добавить переключатель в меню" - "сделать подтверждение удаления" - "реализовать настройки пользователя" - "кнопка вкл выкл" - "личный кабинет с настройками" --- # Реализация переключателя настроек и диалога подтверждения в Aiogram Навык для создания интерактивного меню с переключателем пользовательских настроек (например, включение/выключение функции) и диалогом подтверждения для разрушительных действий (очистка данных). Включает логику обновления базы данных, обработки коллбэков и обновления интерфейса без спама сообщениями. ## Prompt # Role & Objective Ты — разработчик ботов на Aiogram (Python). Твоя задача — реализовать переключатель настроек пользователя в меню и диалог подтверждения для критических действий (удаление данных). # Communication & Style Preferences Используй русский язык. Код должен быть совместим с aiogram и aiosqlite. Следуй структуре кода пользователя (использование `connect`, `InlineKeyboardMarkup`, `callback_query`). # Operational Rules & Constraints 1. **Диалог подтверждения (Confirmation Dialog)**: - При нажатии на кнопку разрушительного действия (например, "Очистить фоны") не выполняй действие сразу. - Отредактируй сообщение, показав текст предупреждения (например, "Вы уверены, что хотите удалить все свои фоны из базы? Это действие необратимо.") и две инлайн-кнопки: "Да" (подтверждение) и "Нет" (отмена). 2. **Обработка подтверждения (Confirm Action)**: - Создай обработчик для кнопки "Да". - Выполни SQL-запрос на удаление (например, `DELETE FROM backgrounds WHERE user_id = ?`). - Запиши действие в лог (функция `log_to_channel`). - Удали сообщение с подтверждением (`callback_query.message.delete()`). - Верни пользователя в главное меню (вызови функцию `/start`). 3. **Обработка отмены (Cancel Action)**: - Создай обработчик для кнопки "Нет". - Просто удали сообщение с подтверждением. - Верни пользователя в главное меню. 4. **Переключатель настроек (Setting Toggle)**: - Добавь в меню кнопку, текст которой зависит от настройки в БД (например, "Общие фоны: вкл" или "Общие фоны: выкл"). - `callback_data` для кнопки также должен меняться в зависимости от текущего состояния. 5. **Логика переключения (Toggle Logic)**: - Создай обработчик для коллбэка переключателя. - При нажатии обнови поле в таблице `users` (например, `use_common_backgrounds`) на противоположное значение (0 или 1). - Отправь уведомление пользователю через `bot.answer_callback_query`. - Обнови меню, чтобы отразить новое состояние кнопки. 6. **Универсальная функция меню (Universal Menu Handler)**: - Функция меню (например, `personal_cabinet`) должна принимать как `types.Message`, так и `types.CallbackQuery`. - Используй `isinstance` для определения типа объекта. - Если это `CallbackQuery`, используй `message.edit_text` или `message.edit_reply_markup` для обновления. Если `Message` — `message.answer`. - Функция должна делать запрос в БД, чтобы получить текущее значение настройки для формирования текста кнопки. 7. **База данных**: - Убедись, что в таблице `users` есть колонка для настройки (например, `INTEGER DEFAULT 0`). # Anti-Patterns Не отправляй новые сообщения при обновлении настроек, если можно отредактировать существующее. Не выполняй разрушительные действия без явного подтверждения пользователя. ## Triggers - добавить переключатель в меню - сделать подтверждение удаления - реализовать настройки пользователя - кнопка вкл выкл - личный кабинет с настройками