Skip to content

Commit 21e1954

Browse files
authored
Merge pull request #12 from gnatykdm/Idea-Configuration
Idea-Configuration[Idea-Menu] C:4
2 parents d9d5215 + 83fc625 commit 21e1954

File tree

7 files changed

+78
-23
lines changed

7 files changed

+78
-23
lines changed

sql/schema.sql

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -25,7 +25,7 @@ CREATE TABLE tasks (
2525
CREATE TABLE ideas (
2626
id SERIAL PRIMARY KEY,
2727
user_id BIGINT NOT NULL REFERENCES users(id) ON DELETE CASCADE,
28-
idea_name VARCHAR(255) NOT NULL,
28+
idea_name VARCHAR(255) NOT NULL UNIQUE,
2929
creation_date TIMESTAMP NOT NULL DEFAULT NOW()
3030
);
3131

telegram_bot_project/bot/buttons.py

Lines changed: 18 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -17,17 +17,17 @@ def get_language_keyboard() -> InlineKeyboardMarkup:
1717

1818

1919
def menu_reply_keyboard() -> ReplyKeyboardMarkup:
20-
reply_keyboard = ReplyKeyboardMarkup(keyboard=[], resize_keyboard=True, row_width=2)
20+
menu_reply_keyboard = ReplyKeyboardMarkup(keyboard=[], resize_keyboard=True, row_width=2)
2121

2222
button_settings = KeyboardButton(text=BUTTON_SETTINGS)
2323
button_idea = KeyboardButton(text=BUTTON_IDEA)
2424
button_day = KeyboardButton(text=BUTTON_MYDAY)
2525
button_task = KeyboardButton(text=BUTTON_ADD_TASK)
2626

27-
reply_keyboard.keyboard.append([button_settings, button_idea])
28-
reply_keyboard.keyboard.append([button_day, button_task])
27+
menu_reply_keyboard.keyboard.append([button_settings, button_idea])
28+
menu_reply_keyboard.keyboard.append([button_day, button_task])
2929

30-
return reply_keyboard
30+
return menu_reply_keyboard
3131

3232
def get_idea_conf_keyboard() -> InlineKeyboardMarkup:
3333
inline_markup = InlineKeyboardMarkup(inline_keyboard=[], row_width=2)
@@ -36,4 +36,17 @@ def get_idea_conf_keyboard() -> InlineKeyboardMarkup:
3636
save_button: InlineKeyboardButton = InlineKeyboardButton(text=SAVE_BUTTON, callback_data="save_idea")
3737

3838
inline_markup.inline_keyboard.append([delete_button, save_button])
39-
return inline_markup
39+
return inline_markup
40+
41+
def idea_reply_keyboard() -> ReplyKeyboardMarkup:
42+
idea_reply_keyboard = ReplyKeyboardMarkup(keyboard=[], resize_keyboard=True, row_width=2)
43+
44+
button_menu = KeyboardButton(text=MENU_BUTTON)
45+
button_delete = KeyboardButton(text=DEL_BUTTON)
46+
button_add = KeyboardButton(text=BUTTON_IDEA)
47+
button_all_ideas = KeyboardButton(text=ALL_IDEAS)
48+
49+
idea_reply_keyboard.keyboard.append([button_delete, button_add])
50+
idea_reply_keyboard.keyboard.append([button_menu, button_all_ideas])
51+
52+
return idea_reply_keyboard

telegram_bot_project/bot/callbacks.py

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22
from aiogram import types
33
from aiogram.fsm.context import FSMContext
44

5-
from bot.buttons import menu_reply_keyboard
5+
from bot.buttons import menu_reply_keyboard, idea_reply_keyboard
66
from messages import MESSAGES
77
from service.idea import IdeaService
88
from service.user import UserService
@@ -53,7 +53,7 @@ async def callback_idea_process(callback_query: types.CallbackQuery, state: FSMC
5353
match callback_query.data:
5454
case "delete_idea":
5555
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())
56+
await callback_query.message.answer(MESSAGES[language]["IDEA_DELETE"], reply_markup=idea_reply_keyboard())
5757
await state.clear()
5858
case "save_idea":
5959
try:
@@ -62,16 +62,16 @@ async def callback_idea_process(callback_query: types.CallbackQuery, state: FSMC
6262

6363
if not idea:
6464
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())
65+
await callback_query.message.answer(MESSAGES[language]["IDEA_PROBLEM"], reply_markup=idea_reply_keyboard())
6666
return
6767
else:
6868
await IdeaService.create_user_idea(user_id, idea)
6969

7070
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())
71+
await callback_query.message.answer(MESSAGES[language]["IDEA_SAVED"], reply_markup=idea_reply_keyboard())
7272
await state.clear()
7373
except Exception as e:
7474
await callback_query.message.answer(MESSAGES[language]["IDEA_PROBLEM"])
7575
case _:
7676
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())
77+
await callback_query.message.answer(MESSAGES[language]["IDEA_PROBLEM"], reply_markup=idea_reply_keyboard())

telegram_bot_project/bot/commands.py

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@
66
from messages import MESSAGES
77
from service.idea import IdeaService
88
from service.user import UserService
9-
from bot.buttons import get_language_keyboard, menu_reply_keyboard
9+
from bot.buttons import get_language_keyboard, menu_reply_keyboard, idea_reply_keyboard
1010
from states import DialogStates
1111

1212
# Start Command Handler
@@ -88,8 +88,8 @@ async def ideas_command(message: types.Message):
8888
dividers: str = "\n" + ("-" * int(len(MESSAGES[language]['IDEAS_SHOW']) * 1.65))
8989

9090
formatted_ideas = MESSAGES[language]['IDEAS_SHOW'] + dividers + "\n" + "\n".join(
91-
f"# {num}. {idea['idea_name']}\n[{format_date(idea['creation_date'])}]"
91+
f"# {num}. {idea['idea_name']}\n\n - 📅 - [{format_date(idea['creation_date'])}]\n"
9292
for num, idea in enumerate(ideas, start=1)
9393
)
9494

95-
await message.answer(formatted_ideas, reply_markup=menu_reply_keyboard())
95+
await message.answer(formatted_ideas, reply_markup=idea_reply_keyboard())
Lines changed: 30 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,9 @@
11
from aiogram.fsm.context import FSMContext
2-
from aiogram.types import Message, InlineKeyboardMarkup
2+
from aiogram.types import Message
33

4-
from bot.buttons import get_idea_conf_keyboard
4+
from bot.buttons import get_idea_conf_keyboard, menu_reply_keyboard
55
from messages import MESSAGES
6+
from service.idea import IdeaService
67
from service.user import UserService
78

89
async def process_idea_save(message: Message, state: FSMContext) -> None:
@@ -12,16 +13,36 @@ async def process_idea_save(message: Message, state: FSMContext) -> None:
1213
await message.answer(MESSAGES["ENGLISH"]['AUTHORIZATION_PROBLEM'])
1314
return
1415

15-
language = await UserService.get_user_language(user_id)
16-
idea = message.text
16+
language = await UserService.get_user_language(user_id) or "ENGLISH"
17+
idea = message.text.strip()
18+
19+
exist = await IdeaService.get_by_idea_name(idea)
20+
if exist:
21+
await message.answer(
22+
MESSAGES[language].get('IDEA_EXIST', "⚠️ This idea already exists."),
23+
reply_markup=menu_reply_keyboard()
24+
)
25+
return
26+
27+
print(f"--[INFO] User with id: {user_id} provided idea.")
1728

18-
print(f"--[INFO] User with id: {user_id} - provide idea.")
1929
try:
2030
await state.update_data(idea=idea)
2131

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)
32+
divider = "\n" + ("-" * int(len(MESSAGES[language]['IDEA_ACTION']) * 1.65))
33+
34+
keyboard = get_idea_conf_keyboard()
35+
36+
await message.answer(
37+
f"{MESSAGES[language]['IDEA_ACTION']}{divider}\n💡 *Idea:* {idea}",
38+
reply_markup=keyboard
39+
)
40+
2541
except Exception as e:
2642
print(f"[ERROR] Saving idea failed: {e}")
27-
await message.answer(MESSAGES[language].get('ERROR_SAVING_IDEA', 'Ошибка при сохранении идеи. Попробуйте позже.'))
43+
await message.answer(
44+
MESSAGES[language].get(
45+
'ERROR_SAVING_IDEA',
46+
"⚠️ Error saving the idea. Please try again later."
47+
)
48+
)

telegram_bot_project/messages.py

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@
1818
"IDEA_DELETE": "🗑️ Ідею було видалено.",
1919
"IDEA_PROBLEM": "⚠️ Виникла проблема із збереженням ідеї. Спробуйте ще раз.",
2020
"IDEAS_SHOW": "💡 Усі ваші ідеї: ",
21+
"IDEA_EXISTS": "⚠️ Ця ідея вже існує.",
2122
"NO_IDEAS": "📝 Ви ще не маєте ідей.",
2223
"LANGUAGE_ASK": (
2324
"🌐 **Оберіть мову інтерфейсу:**\n"
@@ -49,6 +50,7 @@
4950
"IDEA_DELETE": "🗑️ Idea has been deleted.",
5051
"IDEA_PROBLEM": "⚠️ There was an issue saving your idea. Please try again.",
5152
"IDEAS_SHOW": "💡 Here are your ideas: ",
53+
"IDEA_EXISTS": "⚠️ This idea already exists",
5254
"NO_IDEAS": "📝 You don't have any ideas yet. Be the first to save one!",
5355
"LANGUAGE_ASK": (
5456
"🌐 **Please choose your interface language:**\n"
@@ -74,3 +76,5 @@
7476
BUTTON_EN_LANG: str = "🇬🇧 English"
7577
DEL_BUTTON: str = "🗑️ Delete"
7678
SAVE_BUTTON: str = "💾 Save"
79+
MENU_BUTTON: str = "Menu"
80+
ALL_IDEAS: str = "All ideas"

telegram_bot_project/service/idea.py

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
from sqlalchemy import text
2+
from typing import Optional
23
from config import get_session
34

45
class IdeaService:
@@ -17,6 +18,22 @@ async def create_user_idea(user_id: int, idea_name: str) -> int:
1718
await session.commit()
1819
return result.scalar()
1920

21+
@staticmethod
22+
async def get_by_idea_name(idea_name: str) -> Optional[int]:
23+
async with get_session() as session:
24+
query = text(
25+
"""
26+
SELECT id
27+
FROM ideas
28+
WHERE idea_name = :idea_name
29+
"""
30+
)
31+
32+
result = await session.execute(query, {"idea_name": idea_name})
33+
row = result.first()
34+
35+
return row[0] if row else None
36+
2037
@staticmethod
2138
async def update_user_idea(idea_id: int, new_name: str) -> None:
2239
async with get_session() as session:

0 commit comments

Comments
 (0)