Skip to content

Commit ee6ea39

Browse files
committed
Idea-Configuration[Idea-Saving-Implementation] C:2
1 parent 34f6717 commit ee6ea39

File tree

6 files changed

+102
-39
lines changed

6 files changed

+102
-39
lines changed

โ€Žtelegram_bot_project/bot/buttons.pyโ€Ž

Lines changed: 10 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -27,4 +27,13 @@ def menu_reply_keyboard() -> ReplyKeyboardMarkup:
2727
reply_keyboard.keyboard.append([button_settings, button_idea])
2828
reply_keyboard.keyboard.append([button_day, button_task])
2929

30-
return reply_keyboard
30+
return reply_keyboard
31+
32+
def get_idea_conf_keyboard() -> InlineKeyboardMarkup:
33+
inline_markup = InlineKeyboardMarkup(inline_keyboard=[], row_width=2)
34+
35+
delete_button: InlineKeyboardButton = InlineKeyboardButton(text=DEL_BUTTON, callback_data="delete_idea")
36+
save_button: InlineKeyboardButton = InlineKeyboardButton(text=SAVE_BUTTON, callback_data="save_idea")
37+
38+
inline_markup.inline_keyboard.append([delete_button, save_button])
39+
return inline_markup

โ€Žtelegram_bot_project/bot/callbacks.pyโ€Ž

Lines changed: 45 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,10 @@
1-
from typing import Optional
1+
from typing import Optional, Any
22
from aiogram import types
3+
from aiogram.fsm.context import FSMContext
34

45
from bot.buttons import menu_reply_keyboard
56
from messages import MESSAGES
7+
from service.idea import IdeaService
68
from service.user import UserService
79

810
async def start_callback_language(callback_query: types.CallbackQuery) -> None:
@@ -31,4 +33,45 @@ async def start_callback_language(callback_query: types.CallbackQuery) -> None:
3133

3234
case _:
3335
print(f"--[INFO] - User {user_id} ({user_name}) sent invalid callback: {callback_query.data}")
34-
await callback_query.message.answer(MESSAGES[language]["LANGUAGE_INVALID"])
36+
await callback_query.message.answer(MESSAGES[language]["LANGUAGE_INVALID"])
37+
38+
39+
async def callback_idea_process(callback_query: types.CallbackQuery, state: FSMContext) -> None:
40+
await callback_query.answer()
41+
42+
user_id: int = callback_query.from_user.id
43+
user_name: str = callback_query.from_user.username or "unknown"
44+
user_find: Optional[dict] = await UserService.get_user_by_id(user_id)
45+
language: str = await UserService.get_user_language(user_id)
46+
if not language:
47+
language = 'ENGLISH'
48+
49+
if not user_find:
50+
await callback_query.message.answer(MESSAGES['ENGLISH']["AUTHORIZATION_PROBLEM"])
51+
return
52+
53+
match callback_query.data:
54+
case "delete_idea":
55+
print(f"--[INFO] - User {user_id} ({user_name}) deleted idea.")
56+
await callback_query.message.answer(MESSAGES[language]["IDEA_DELETE"], reply_markup=menu_reply_keyboard())
57+
await state.clear()
58+
case "save_idea":
59+
try:
60+
data: Any = await state.get_data()
61+
idea: str = data.get("idea")
62+
63+
if not idea:
64+
print(f"--[INFO] - User {user_id} ({user_name}) sent empty idea.")
65+
await callback_query.message.answer(MESSAGES[language]["IDEA_PROBLEM"], reply_markup=menu_reply_keyboard())
66+
return
67+
else:
68+
await IdeaService.create_user_idea(user_id, idea)
69+
70+
print(f"--[INFO] - User {user_id} ({user_name}) saved idea: {idea}")
71+
await callback_query.message.answer(MESSAGES[language]["IDEA_SAVED"], reply_markup=menu_reply_keyboard())
72+
await state.clear()
73+
except Exception as e:
74+
await callback_query.message.answer(MESSAGES[language]["IDEA_PROBLEM"])
75+
case _:
76+
print(f"--[INFO] - User {user_id} ({user_name}) sent invalid callback: {callback_query.data}")
77+
await callback_query.message.answer(MESSAGES[language]["IDEA_PROBLEM"], reply_markup=menu_reply_keyboard())
Lines changed: 7 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1,15 +1,12 @@
11
from aiogram.fsm.context import FSMContext
2-
from aiogram.types import Message
2+
from aiogram.types import Message, InlineKeyboardMarkup
33

4-
from bot.buttons import menu_reply_keyboard
4+
from bot.buttons import get_idea_conf_keyboard
55
from messages import MESSAGES
6-
from service.idea import IdeaService
76
from service.user import UserService
87

98
async def process_idea_save(message: Message, state: FSMContext) -> None:
109
user_id = message.from_user.id
11-
user_name = message.from_user.username or "unknown"
12-
1310
user_find = await UserService.get_user_by_id(user_id)
1411
if not user_find or not user_find.get("id"):
1512
await message.answer(MESSAGES["ENGLISH"]['AUTHORIZATION_PROBLEM'])
@@ -20,10 +17,11 @@ async def process_idea_save(message: Message, state: FSMContext) -> None:
2017

2118
print(f"--[INFO] User with id: {user_id} - provide idea.")
2219
try:
23-
await IdeaService.create_user_idea(user_id, idea)
24-
print(f"--[INFO] - User {user_id} ({user_name}) saved idea: {idea}")
25-
await message.answer(MESSAGES[language]['IDEA_SAVED'], reply_markup=menu_reply_keyboard())
26-
await state.clear()
20+
await state.update_data(idea=idea)
21+
22+
dividers: str = "\n" + ("-" * int(len(MESSAGES[language]['IDEA_ACTION']) * 1.65))
23+
keyboard: InlineKeyboardMarkup = get_idea_conf_keyboard()
24+
await message.answer(MESSAGES[language]['IDEA_ACTION'] + dividers + f"\nIDEA: {idea}", reply_markup=keyboard)
2725
except Exception as e:
2826
print(f"[ERROR] Saving idea failed: {e}")
2927
await message.answer(MESSAGES[language].get('ERROR_SAVING_IDEA', 'ะžัˆะธะฑะบะฐ ะฟั€ะธ ัะพั…ั€ะฐะฝะตะฝะธะธ ะธะดะตะธ. ะŸะพะฟั€ะพะฑัƒะนั‚ะต ะฟะพะทะถะต.'))

โ€Žtelegram_bot_project/main.pyโ€Ž

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@
77
from config import TOKEN
88
from bot.commands import start_command, help_command, menu_command, language_command, idea_command
99
from bot.handlers import process_idea_save
10-
from bot.callbacks import start_callback_language
10+
from bot.callbacks import start_callback_language, callback_idea_process
1111
from states import DialogStates
1212

1313
storage: MemoryStorage = MemoryStorage()
@@ -38,6 +38,10 @@ async def idea(message: Message, state: FSMContext):
3838
async def callback_language(callback_query: CallbackQuery):
3939
await start_callback_language(callback_query)
4040

41+
@dp.callback_query(F.data.in_({"delete_idea", "save_idea"}))
42+
async def callback_idea(callback_query: CallbackQuery, state: FSMContext):
43+
await callback_idea_process(callback_query, state)
44+
4145
@dp.message()
4246
async def process_idea_fallback(message: Message, state: FSMContext):
4347
current_state = await state.get_state()

โ€Žtelegram_bot_project/messages.pyโ€Ž

Lines changed: 34 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -2,51 +2,57 @@
22

33
MESSAGES: Any = {
44
"UKRANIAN": {
5-
"START_MSG": "๐ŸŽ‰ ะ›ะฐัะบะฐะฒะพ ะฟั€ะพัะธะผะพ ะดะพ ะฑะพั‚ะฐ!\nะ“ะพั‚ะพะฒั– ะฟะพั‡ะฐั‚ะธ ะฝะพะฒะธะน ะฟั€ะพะดัƒะบั‚ะธะฒะฝะธะน ะดะตะฝัŒ?",
6-
"START_MSG_AGAIN": "๐Ÿ‘‹ ะ— ะฟะพะฒะตั€ะฝะตะฝะฝัะผ, ั‡ะตะผะฟั–ะพะฝะต!\nะ ะฐะดะธะน ะฒะฐั ะฑะฐั‡ะธั‚ะธ ะทะฝะพะฒัƒ ๐Ÿ˜Š",
7-
"HELP_MSG": "โ„น๏ธ ะŸะพั‚ั€ั–ะฑะฝะฐ ะดะพะฟะพะผะพะณะฐ?\nะ’ะธะบะพั€ะธัั‚ะพะฒัƒะนั‚ะต /start, /language ะฐะฑะพ /menu, ั‰ะพะฑ ะทะฝะฐะนั‚ะธ ะฟะพั‚ั€ั–ะฑะฝะต ๐Ÿ“‹",
8-
"MENU_MSG": "๐Ÿ“‹ **ะ’ะฐัˆะต ะผะตะฝัŽ:**\nะžะฑะธั€ะฐะนั‚ะต ะดั–ัŽ ะฝะธะถั‡ะต ๐Ÿ‘‡",
9-
"AUTHORIZATION_PROBLEM": "๐Ÿšซ ะฃะฟั, ะฒะธ ะฝะต ะฐะฒั‚ะพั€ะธะทะพะฒะฐะฝั–.\nะ‘ัƒะดัŒ ะปะฐัะบะฐ, ัะฟั€ะพะฑัƒะนั‚ะต /start, ั‰ะพะฑ ะฟะพั‡ะฐั‚ะธ.",
10-
"TEXT_RESPONSE": "โœ‰๏ธ ะ’ะธ ะฝะฐะฟะธัะฐะปะธ: \"{response}\".\nะ”ัะบัƒัŽ ะทะฐ ะฟะพะฒั–ะดะพะผะปะตะฝะฝั! ๐Ÿ™Œ",
11-
"CONTINUE_MSG": "โœจ ะงะธะผ ั‰ะต ะผะพะถัƒ ะดะพะฟะพะผะพะณั‚ะธ?\nะกะผั–ะปะธะฒะพ ะบะพั€ะธัั‚ัƒะนั‚ะตััŒ /menu ะดะปั ะฒัั–ั… ะผะพะถะปะธะฒะพัั‚ะตะน ๐ŸŒŸ",
12-
"SETTINGS_RESPONSE": "๐Ÿ”ง ะ’ั–ะดะบั€ะธะฒะฐัŽ ะฝะฐะปะฐัˆั‚ัƒะฒะฐะฝะฝั...",
5+
"START_MSG": "๐ŸŽ‰ ะ›ะฐัะบะฐะฒะพ ะฟั€ะพัะธะผะพ ะดะพ ะฑะพั‚ะฐ!\nะ“ะพั‚ะพะฒั– ั€ะพะทะฟะพั‡ะฐั‚ะธ ัะฒั–ะน ะฟั€ะพะดัƒะบั‚ะธะฒะฝะธะน ะดะตะฝัŒ ั€ะฐะทะพะผ ะทั– ะผะฝะพัŽ?",
6+
"START_MSG_AGAIN": "๐Ÿ‘‹ ะ’ั–ั‚ะฐัŽ ะท ะฟะพะฒะตั€ะฝะตะฝะฝัะผ, ั‡ะตะผะฟั–ะพะฝะต!\nะ ะฐะดะธะน ะทะฝะพะฒัƒ ะฑะฐั‡ะธั‚ะธ ะฒะฐั ๐Ÿ˜Š",
7+
"HELP_MSG": "โ„น๏ธ ะŸะพั‚ั€ั–ะฑะฝะฐ ะดะพะฟะพะผะพะณะฐ?\nะกะฟั€ะพะฑัƒะนั‚ะต /start, /language ะฐะฑะพ /menu โ€” ั ะทะฐะฒะถะดะธ ะฟะพั€ัƒั‡, ั‰ะพะฑ ะดะพะฟะพะผะพะณั‚ะธ ๐Ÿ“‹",
8+
"MENU_MSG": "๐Ÿ“‹ **ะžััŒ ะฒะฐัˆะต ะผะตะฝัŽ:**\nะžะฑะตั€ั–ั‚ัŒ ะฟะพั‚ั€ั–ะฑะฝัƒ ะดั–ัŽ ๐Ÿ‘‡",
9+
"AUTHORIZATION_PROBLEM": "๐Ÿšซ ะฃะฟั, ะทะดะฐั”ั‚ัŒัั, ะฒะธ ะฝะต ะฐะฒั‚ะพั€ะธะทะพะฒะฐะฝั–.\nะ‘ัƒะดัŒ ะปะฐัะบะฐ, ะฒะฒะตะดั–ั‚ัŒ /start, ั‰ะพะฑ ะฟะพั‡ะฐั‚ะธ.",
10+
"TEXT_RESPONSE": "โœ‰๏ธ ะ’ะธ ะฝะฐะฟะธัะฐะปะธ: \"{response}\".\nะ”ัะบัƒัŽ, ั‰ะพ ะฟะพะดั–ะปะธะปะธัั! ๐Ÿ™Œ",
11+
"CONTINUE_MSG": "โœจ ะงะธะผ ั‰ะต ะผะพะถัƒ ะดะพะฟะพะผะพะณั‚ะธ?\nะกะผั–ะปะธะฒะพ ะฒั–ะดะบั€ะธะฒะฐะนั‚ะต /menu ะดะปั ะฒัั–ั… ะผะพะถะปะธะฒะพัั‚ะตะน ๐ŸŒŸ",
12+
"SETTINGS_RESPONSE": "๐Ÿ”ง ะ’ั–ะดะบั€ะธะฒะฐัŽ ะฝะฐะปะฐัˆั‚ัƒะฒะฐะฝะฝั ะดะปั ะฒะฐั...",
1313
"MYDAY_RESPONSE": "๐Ÿ“… ะžััŒ ะฒะฐัˆ ะฟะปะฐะฝ ะฝะฐ ััŒะพะณะพะดะฝั–...",
14-
"IDEA_RESPONSE": "๐Ÿ’ก ะŸะพะดั–ะปั–ั‚ัŒัั ัะฒะพั”ัŽ ั–ะดะตั”ัŽ, ั ะฒัะต ะทะฐะฟะธัˆัƒ!",
15-
"IDEA_SAVED": "๐Ÿ’ก ะ†ะดะตั ัƒัะฟั–ัˆะฝะพ ะทะฑะตั€ะตะถะตะฝะฐ.",
16-
"ADD_TASK_RESPONSE": "๐Ÿ“ ะกั‚ะฒะพั€ัŽั”ะผะพ ะฝะพะฒัƒ ะทะฐะดะฐั‡ัƒ...",
14+
"IDEA_RESPONSE": "๐Ÿ’ก ะ ะพะทะบะฐะถั–ั‚ัŒ ัะฒะพัŽ ั–ะดะตัŽ โ€” ั ะพะฑะพะฒโ€™ัะทะบะพะฒะพ ั—ั— ะทะฐั„ั–ะบััƒัŽ!",
15+
"IDEA_SAVED": "๐Ÿ’ก ะ†ะดะตั ัƒัะฟั–ัˆะฝะพ ะทะฑะตั€ะตะถะตะฝะฐ. ะœะพะปะพะดะตั†ัŒ!",
16+
"ADD_TASK_RESPONSE": "๐Ÿ“ ะกั‚ะฒะพั€ัŽั”ะผะพ ะฝะพะฒะต ะทะฐะฒะดะฐะฝะฝั...",
17+
"IDEA_ACTION": "ะฉะพ ะฑะฐะถะฐั”ั‚ะต ะทั€ะพะฑะธั‚ะธ ะท ั†ั–ั”ัŽ ั–ะดะตั”ัŽ?",
18+
"IDEA_DELETE": "๐Ÿ—‘๏ธ ะ†ะดะตัŽ ะฑัƒะปะพ ะฒะธะดะฐะปะตะฝะพ.",
19+
"IDEA_PROBLEM": "โš ๏ธ ะ’ะธะฝะธะบะปะฐ ะฟั€ะพะฑะปะตะผะฐ ั–ะท ะทะฑะตั€ะตะถะตะฝะฝัะผ ั–ะดะตั—. ะกะฟั€ะพะฑัƒะนั‚ะต ั‰ะต ั€ะฐะท.",
1720
"LANGUAGE_ASK": (
1821
"๐ŸŒ **ะžะฑะตั€ั–ั‚ัŒ ะผะพะฒัƒ ั–ะฝั‚ะตั€ั„ะตะนััƒ:**\n"
1922
"ะะฐั‚ะธัะฝั–ั‚ัŒ ะบะฝะพะฟะบัƒ ะฝะธะถั‡ะต, ั‰ะพะฑ ะฟั€ะพะดะพะฒะถะธั‚ะธ:"
2023
),
2124
"LANGUAGE_OK": (
22-
"โœ… **ะœะพะฒัƒ ะพะฝะพะฒะปะตะฝะพ!**\n"
25+
"โœ… **ะœะพะฒัƒ ัƒัะฟั–ัˆะฝะพ ะพะฝะพะฒะปะตะฝะพ!**\n"
2326
"ะŸั€ะพะดะพะฒะถัƒั”ะผะพ ะฟั€ะฐั†ัŽะฒะฐั‚ะธ ั€ะฐะทะพะผ."
2427
),
2528
"LANGUAGE_INVALID": (
26-
"โš ๏ธ ะฃะฟั! ะฆะต ะฝะตะดั–ะนัะฝะธะน ะฒะฐั€ั–ะฐะฝั‚.\n"
29+
"โš ๏ธ ะฃะฟั! ะฆะตะน ะฒะฐั€ั–ะฐะฝั‚ ะฝะตะดั–ะนัะฝะธะน.\n"
2730
"ะ‘ัƒะดัŒ ะปะฐัะบะฐ, ะพะฑะตั€ั–ั‚ัŒ ะผะพะฒัƒ ะทั– ัะฟะธัะบัƒ."
2831
)
2932
},
3033
"ENGLISH": {
31-
"START_MSG": "๐ŸŽ‰ Welcome to the bot!\nReady to kick off a productive day?",
32-
"START_MSG_AGAIN": "๐Ÿ‘‹ Welcome back, legend!\nHappy to see you again ๐Ÿ˜Š",
33-
"HELP_MSG": "โ„น๏ธ Need some help?\nUse /start, /language, or /menu to get around ๐Ÿ“‹",
34-
"MENU_MSG": "๐Ÿ“‹ **Your menu:**\nPick what youโ€™d like to do ๐Ÿ‘‡",
35-
"AUTHORIZATION_PROBLEM": "๐Ÿšซ Oops! Youโ€™re not authorized.\nPlease use /start to begin.",
34+
"START_MSG": "๐ŸŽ‰ Welcome to the bot!\nReady to start a productive day together?",
35+
"START_MSG_AGAIN": "๐Ÿ‘‹ Welcome back, legend!\nGlad to see you again ๐Ÿ˜Š",
36+
"HELP_MSG": "โ„น๏ธ Need help?\nTry /start, /language, or /menu โ€” Iโ€™m here for you ๐Ÿ“‹",
37+
"MENU_MSG": "๐Ÿ“‹ **Hereโ€™s your menu:**\nChoose what you'd like to do ๐Ÿ‘‡",
38+
"AUTHORIZATION_PROBLEM": "๐Ÿšซ Oops! Youโ€™re not authorized yet.\nPlease type /start to begin.",
3639
"TEXT_RESPONSE": "โœ‰๏ธ You wrote: \"{response}\".\nThanks for sharing! ๐Ÿ™Œ",
37-
"CONTINUE_MSG": "โœจ What else can I help you with?\nUse /menu to explore all options ๐ŸŒŸ",
38-
"SETTINGS_RESPONSE": "๐Ÿ”ง Opening your settings...",
40+
"CONTINUE_MSG": "โœจ What else can I do for you?\nFeel free to use /menu for all options ๐ŸŒŸ",
41+
"SETTINGS_RESPONSE": "๐Ÿ”ง Opening your settings now...",
3942
"MYDAY_RESPONSE": "๐Ÿ“… Hereโ€™s your plan for today...",
40-
"IDEA_RESPONSE": "๐Ÿ’ก Tell me your idea, Iโ€™ll save it for you!",
41-
"IDEA_SAVED": "๐Ÿ’ก Idea saved successfully.",
43+
"IDEA_RESPONSE": "๐Ÿ’ก Share your idea with me โ€” Iโ€™ll save it safely!",
44+
"IDEA_SAVED": "๐Ÿ’ก Idea saved successfully. Well done!",
4245
"ADD_TASK_RESPONSE": "๐Ÿ“ Creating a new task...",
46+
"IDEA_ACTION": "What would you like to do with your idea?",
47+
"IDEA_DELETE": "๐Ÿ—‘๏ธ Idea has been deleted.",
48+
"IDEA_PROBLEM": "โš ๏ธ There was an issue saving your idea. Please try again.",
4349
"LANGUAGE_ASK": (
44-
"๐ŸŒ **Choose your language:**\n"
50+
"๐ŸŒ **Please choose your interface language:**\n"
4551
"Tap a button below to continue:"
4652
),
4753
"LANGUAGE_OK": (
48-
"โœ… **Language updated!**\n"
49-
"Letโ€™s keep moving forward."
54+
"โœ… **Language updated successfully!**\n"
55+
"Letโ€™s keep moving forward together."
5056
),
5157
"LANGUAGE_INVALID": (
5258
"โš ๏ธ Oops! Thatโ€™s not a valid option.\n"
@@ -61,4 +67,6 @@
6167
BUTTON_SETTINGS: str = "โš™๏ธ Settings"
6268
BUTTON_HELP: str = "โ“ Help"
6369
BUTTON_UA_LANG: str = "๐Ÿ‡บ๐Ÿ‡ฆ Ukrainian"
64-
BUTTON_EN_LANG: str = "๐Ÿ‡ฌ๐Ÿ‡ง English"
70+
BUTTON_EN_LANG: str = "๐Ÿ‡ฌ๐Ÿ‡ง English"
71+
DEL_BUTTON: str = "๐Ÿ—‘๏ธ Delete"
72+
SAVE_BUTTON: str = "๐Ÿ’พ Save"

โ€Žtelegram_bot_project/states.pyโ€Ž

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,3 +2,4 @@
22

33
class DialogStates(StatesGroup):
44
waiting_for_idea = State()
5+
confirm_idea = State()

0 commit comments

Comments
ย (0)