diff --git a/telegram_bot_project/bot/buttons.py b/telegram_bot_project/bot/buttons.py index 83dfb00..6691d96 100644 --- a/telegram_bot_project/bot/buttons.py +++ b/telegram_bot_project/bot/buttons.py @@ -1,7 +1,6 @@ from aiogram.types import InlineKeyboardMarkup, InlineKeyboardButton, ReplyKeyboardMarkup, KeyboardButton from messages import * - def get_language_keyboard() -> InlineKeyboardMarkup: inline_markup = InlineKeyboardMarkup(inline_keyboard=[], row_width=2) @@ -42,7 +41,7 @@ def idea_reply_keyboard() -> ReplyKeyboardMarkup: idea_reply_keyboard = ReplyKeyboardMarkup(keyboard=[], resize_keyboard=True, row_width=2) button_menu = KeyboardButton(text=MENU_BUTTON) - button_delete = KeyboardButton(text=DEL_BUTTON) + button_delete = KeyboardButton(text=DEL_IDEA_BUTTON) button_add = KeyboardButton(text=BUTTON_IDEA) button_all_ideas = KeyboardButton(text=ALL_IDEAS) diff --git a/telegram_bot_project/bot/commands.py b/telegram_bot_project/bot/commands.py index 1f0e2e8..b5c0186 100644 --- a/telegram_bot_project/bot/commands.py +++ b/telegram_bot_project/bot/commands.py @@ -93,3 +93,15 @@ async def ideas_command(message: types.Message): ) await message.answer(formatted_ideas, reply_markup=idea_reply_keyboard()) + +# Delete Idea Handler +async def delete_idea_command(message: types.Message, state: FSMContext): + user_id: int = message.from_user.id + user_find: Any = await UserService.get_user_by_id(user_id) + language: str = await UserService.get_user_language(user_id) + + if not user_find: + await message.answer(MESSAGES['ENGLISH']['AUTHORIZATION_PROBLEM']) + else: + await message.answer(MESSAGES[language]['DELETE_IDEA']) + await state.set_state(DialogStates.delete_idea) diff --git a/telegram_bot_project/bot/handlers.py b/telegram_bot_project/bot/handlers.py index a856f9b..0eeeb61 100644 --- a/telegram_bot_project/bot/handlers.py +++ b/telegram_bot_project/bot/handlers.py @@ -1,7 +1,7 @@ from aiogram.fsm.context import FSMContext from aiogram.types import Message -from bot.buttons import get_idea_conf_keyboard, menu_reply_keyboard +from bot.buttons import get_idea_conf_keyboard, menu_reply_keyboard, idea_reply_keyboard from messages import MESSAGES from service.idea import IdeaService from service.user import UserService @@ -46,3 +46,36 @@ async def process_idea_save(message: Message, state: FSMContext) -> None: "⚠️ Error saving the idea. Please try again later." ) ) + +async def process_idea_delete(message: Message, state: FSMContext) -> None: + user_id = message.from_user.id + user_find = await UserService.get_user_by_id(user_id) + if not user_find or not user_find.get("id"): + await message.answer(MESSAGES["ENGLISH"]['AUTHORIZATION_PROBLEM']) + return + + language = await UserService.get_user_language(user_id) or "ENGLISH" + ideas = await IdeaService.get_all_ideas_by_user_id(user_id) + + print(f"--[DEBUG] User {user_id} ideas: {ideas}") + + try: + user_number = int(message.text.strip()) + except ValueError: + await message.answer(MESSAGES[language]['NOT_VALID_IDEA_NUM'], reply_markup=idea_reply_keyboard()) + return + + index = user_number - 1 + if not (0 <= index < len(ideas)): + await message.answer(MESSAGES[language]['INVALID_IDEA_NUM'], reply_markup=idea_reply_keyboard()) + return + + idea_to_delete = ideas[index] + real_id = idea_to_delete["id"] + + print(f"--[DEBUG] Deleting idea with id {real_id} for user {user_id}") + + await IdeaService.delete_user_idea(real_id) + + await message.answer(MESSAGES[language]['IDEA_DELETED'].format(user_number, idea_to_delete['idea_name']), reply_markup=idea_reply_keyboard()) + await state.clear() \ No newline at end of file diff --git a/telegram_bot_project/main.py b/telegram_bot_project/main.py index 28bd4fc..92f6755 100644 --- a/telegram_bot_project/main.py +++ b/telegram_bot_project/main.py @@ -6,9 +6,9 @@ from aiogram.types import Message, CallbackQuery from config import TOKEN from bot.commands import * -from bot.handlers import process_idea_save +from bot.handlers import process_idea_save, process_idea_delete from bot.callbacks import start_callback_language, callback_idea_process -from messages import BUTTON_IDEA +from messages import * from states import DialogStates storage: MemoryStorage = MemoryStorage() @@ -24,6 +24,7 @@ async def help(message: Message): await help_command(message) @dp.message(Command("menu")) +@dp.message(lambda m: m.text == MENU_BUTTON) async def menu(message: Message): await menu_command(message) @@ -32,13 +33,19 @@ async def language(message: Message): await language_command(message) @dp.message(Command("idea")) +@dp.message(lambda m: m.text == BUTTON_IDEA) async def idea(message: Message, state: FSMContext): await idea_command(message, state) @dp.message(Command("ideas")) +@dp.message(lambda m: m.text == ALL_IDEAS) async def ideas(message: Message): await ideas_command(message) +@dp.message(lambda m: m.text == DEL_IDEA_BUTTON) +async def delete_idea(message: Message, state: FSMContext): + await delete_idea_command(message, state) + @dp.callback_query(F.data.in_({"lang_ua", "lang_en"})) async def callback_language(callback_query: CallbackQuery): await start_callback_language(callback_query) @@ -53,7 +60,8 @@ async def process_idea_fallback(message: Message, state: FSMContext): print(f"[DEBUG] Current state: {current_state}") if current_state == DialogStates.waiting_for_idea.state: await process_idea_save(message, state) - + elif current_state == DialogStates.delete_idea.state: + await process_idea_delete(message, state) # Main Function async def main(): bot = Bot(token=TOKEN) diff --git a/telegram_bot_project/messages.py b/telegram_bot_project/messages.py index 59958c4..ab84940 100644 --- a/telegram_bot_project/messages.py +++ b/telegram_bot_project/messages.py @@ -20,6 +20,10 @@ "IDEAS_SHOW": "💡 Усі ваші ідеї: ", "IDEA_EXISTS": "⚠️ Ця ідея вже існує.", "NO_IDEAS": "📝 Ви ще не маєте ідей.", + "DELETE_IDEA": "ℹ️ Вкажіть номер ідеї, яку хочете видалити", + "NOT_VALID_IDEA_NUM": "❌ Будь ласка, введіть дійсний номер.", + "INVALID_IDEA_NUM": "❌ Неправильний номер. Спробуйте ще раз.", + "IDEA_DELETED": "🗑️ Ідею №{} '{}' було видалено.", "LANGUAGE_ASK": ( "🌐 **Оберіть мову інтерфейсу:**\n" "Натисніть кнопку нижче, щоб продовжити:" @@ -51,7 +55,11 @@ "IDEA_PROBLEM": "⚠️ There was an issue saving your idea. Please try again.", "IDEAS_SHOW": "💡 Here are your ideas: ", "IDEA_EXISTS": "⚠️ This idea already exists", + "DELETE_IDEA": "ℹ️ Enter the idea number you want to delete", + "NOT_VALID_IDEA_NUM": "❌ Please enter a valid number.", + "INVALID_IDEA_NUM": "❌ Invalid number. Please try again.", "NO_IDEAS": "📝 You don't have any ideas yet. Be the first to save one!", + "IDEA_DELETED": "🗑️ Idea #{} '{}' has been deleted.", "LANGUAGE_ASK": ( "🌐 **Please choose your interface language:**\n" "Tap a button below to continue:" @@ -67,14 +75,15 @@ } } -BUTTON_ADD_TASK: str = "➕ Add Task" +BUTTON_ADD_TASK: str = "➕ New Task" BUTTON_IDEA: str = "💡 Save Idea" BUTTON_MYDAY: str = "📅 My Day" BUTTON_SETTINGS: str = "⚙️ Settings" BUTTON_HELP: str = "❓ Help" -BUTTON_UA_LANG: str = "🇺🇦 Ukrainian" +BUTTON_UA_LANG: str = "🌻 Українська" BUTTON_EN_LANG: str = "🇬🇧 English" -DEL_BUTTON: str = "🗑️ Delete" +DEL_BUTTON: str = "🗑️ Delete Idea" +DEL_IDEA_BUTTON: str = "🗑️ Delete" SAVE_BUTTON: str = "💾 Save" -MENU_BUTTON: str = "Menu" -ALL_IDEAS: str = "All ideas" \ No newline at end of file +MENU_BUTTON: str = "📂 Menu" +ALL_IDEAS: str = "📝 All Ideas" diff --git a/telegram_bot_project/states.py b/telegram_bot_project/states.py index d2ec95b..4183416 100644 --- a/telegram_bot_project/states.py +++ b/telegram_bot_project/states.py @@ -2,4 +2,5 @@ class DialogStates(StatesGroup): waiting_for_idea = State() - confirm_idea = State() \ No newline at end of file + confirm_idea = State() + delete_idea = State() \ No newline at end of file