Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 4 additions & 0 deletions telegram_bot_project/bot/buttons.py
Original file line number Diff line number Diff line change
Expand Up @@ -121,10 +121,12 @@ def morning_routine_keyboard() -> ReplyKeyboardMarkup:
drop_btn = KeyboardButton(text=MORNING_ROUTINE_DELETE_BTN)
all_btn = KeyboardButton(text=MY_MORNING_ROUTINE_BTN)
settings_btn = KeyboardButton(text=BUTTON_SETTINGS)
evening_switch_btn = KeyboardButton(text=ROUTINE_EVENING_VIEW)

keyboard = [
[add_btn, edit_btn],
[drop_btn, all_btn],
[evening_switch_btn],
[settings_btn]
]

Expand All @@ -141,10 +143,12 @@ def evening_routine_keyboard() -> ReplyKeyboardMarkup:
drop_btn = KeyboardButton(text=EVENING_ROUTINE_DELETE_BTN)
all_btn = KeyboardButton(text=MY_EVENING_ROUTINE_BTN)
settings_btn = KeyboardButton(text=BUTTON_SETTINGS)
morning_switch_btn = KeyboardButton(text=ROUTINE_MORNING_VIEW)

keyboard = [
[add_btn, edit_btn],
[drop_btn, all_btn],
[morning_switch_btn],
[settings_btn]
]

Expand Down
43 changes: 37 additions & 6 deletions telegram_bot_project/bot/commands.py
Original file line number Diff line number Diff line change
Expand Up @@ -337,7 +337,7 @@ async def show_morning_routines(message: types.Message):
await message.answer(formatted_morning_routine, reply_markup=morning_routine_keyboard())

# Delete Morning Routine Command Handler
async def delete_morning_routine(message: types.Message, state: FSMContext):
async def delete_morning_routine(message: types.Message, state: FSMContext, type: str):
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) or "ENGLISH"
Expand All @@ -346,7 +346,7 @@ async def delete_morning_routine(message: types.Message, state: FSMContext):
await message.answer(MESSAGES['ENGLISH']['AUTHORIZATION_PROBLEM'])
else:

morning_routine = await RoutineService.get_user_routines(user_id, routine_type="morning")
morning_routine = await RoutineService.get_user_routines(user_id, routine_type=type)
if not morning_routine:
await message.answer(MESSAGES[language]['NO_MORNING_ROUTINE'])
return
Expand All @@ -356,19 +356,50 @@ async def delete_morning_routine(message: types.Message, state: FSMContext):
await state.set_state(DialogStates.delete_morning_routine)

# Update Morning Routine Command Handler
async def update_morning_routine(message: types.Message, state: FSMContext):
async def update_morning_routine(message: types.Message, state: FSMContext, type: str):
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) or "ENGLISH"

if not user_find:
await message.answer(MESSAGES['ENGLISH']['AUTHORIZATION_PROBLEM'])
else:
morning_routine = await RoutineService.get_user_routines(user_id, routine_type="morning")
morning_routine = await RoutineService.get_user_routines(user_id, routine_type=type)
if not morning_routine:
await message.answer(MESSAGES[language]['NO_MORNING_ROUTINE'])
return
else:
await message.answer(MESSAGES[language]['NEW_ROUTINE_NAME'])
await message.answer(MESSAGES[language]['PROVIDE_ROUTINE_ID'])
await state.update_data(morning_routine=morning_routine)
await state.set_state(DialogStates.update_morning_routine_id)
await state.set_state(DialogStates.update_morning_routine_id)

# Show Evening Routine Command Handler
async def show_evening_routines(message: types.Message):
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) or "ENGLISH"

if not user_find:
await message.answer(MESSAGES['ENGLISH']['AUTHORIZATION_PROBLEM'])
return

print(f"--[INFO] - User with id: {user_id} - opened /evening_routines.")
evening_routine = await RoutineService.get_user_routines(user_id, routine_type="evening")
if not evening_routine:
await message.answer(MESSAGES[language]['NO_MORNING_ROUTINE'])
return

dividers: str = "\n" + ("-" * int(len(MESSAGES[language]['EVENING_ROUTINE_SHOW']) * 1.65))
formatted_routine_items = "\n".join(
f"# {idx}. {routine['routine_name']}"
for idx, routine in enumerate(evening_routine, start=1)
)

formatted_morning_routine = (
MESSAGES[language]['EVENING_ROUTINE_SHOW'] +
dividers +
"\n" +
formatted_routine_items
)

await message.answer(formatted_morning_routine, reply_markup=evening_routine_keyboard())
34 changes: 19 additions & 15 deletions telegram_bot_project/bot/handlers.py
Original file line number Diff line number Diff line change
Expand Up @@ -370,7 +370,7 @@ async def process_set_sleep_time(message: Message, state: FSMContext):
)
await state.clear()

async def process_set_routine_time(message: Message, state: FSMContext):
async def process_set_routine(message: Message, state: FSMContext, type: str):
user_id = message.from_user.id
user_find = await UserService.get_user_by_id(user_id)
language = await UserService.get_user_language(user_id) or "ENGLISH"
Expand All @@ -380,31 +380,33 @@ async def process_set_routine_time(message: Message, state: FSMContext):
return

routine_title: str = message.text.strip()
routine_keyboard: ReplyKeyboardMarkup = morning_routine_keyboard() if type == "morning" else evening_routine_keyboard()
if not validate_text(routine_title):
await message.answer(MESSAGES[language]['INVALID_MORNING_ROUTINE'], reply_markup=morning_routine_keyboard())
await message.answer(MESSAGES[language]['INVALID_MORNING_ROUTINE'], reply_markup=routine_keyboard)
return

try:
await RoutineService.create_routine(user_id, routine_type="morning", routine_name=routine_title)
await RoutineService.create_routine(user_id, routine_type=type, routine_name=routine_title)

print(f"User with id: {user_id} set routine title: {routine_title}")
await message.answer(MESSAGES[language]['ROUTINE_SAVED'].format(routine_title), reply_markup=morning_routine_keyboard())
await message.answer(MESSAGES[language]['ROUTINE_SAVED'].format(routine_title), reply_markup=routine_keyboard)
await state.clear()
except:
await message.answer(MESSAGES[language]['ROUTINE_EXISTS'], reply_markup=morning_routine_keyboard())
await message.answer(MESSAGES[language]['ROUTINE_EXISTS'], reply_markup=routine_keyboard)

async def process_delete_morning_routine(message: Message, state: FSMContext):
async def process_delete_morning_routine(message: Message, state: FSMContext, type: str):
user_id = message.from_user.id
user_find = await UserService.get_user_by_id(user_id)
language = await UserService.get_user_language(user_id) or "ENGLISH"
routine_keyboard: ReplyKeyboardMarkup = morning_routine_keyboard() if type == "morning" else evening_routine_keyboard()

if not user_find:
await message.answer(MESSAGES["ENGLISH"]['AUTHORIZATION_PROBLEM'])
return

routine_num: int = int(message.text.strip())
if (routine_num < 1):
await message.answer(MESSAGES[language]['COMPLETE_TASK_INVALID'], reply_markup=morning_routine_keyboard())
await message.answer(MESSAGES[language]['COMPLETE_TASK_INVALID'], reply_markup=routine_keyboard)
return
else:
data = await state.get_data()
Expand All @@ -416,21 +418,22 @@ async def process_delete_morning_routine(message: Message, state: FSMContext):
await RoutineService.delete_routine(real_id)
print(f"User with id: {user_id} deleted routine with id: {real_id}")

await message.answer(MESSAGES[language]['ROUTINE_DELETED'].format(routine_num, routine_to_delete['routine_name']), reply_markup=morning_routine_keyboard())
await message.answer(MESSAGES[language]['ROUTINE_DELETED'].format(routine_num, routine_to_delete['routine_name']), reply_markup=routine_keyboard)
await state.clear()

async def process_update_morning_routine(message: Message, state: FSMContext):
async def process_update_morning_routine(message: Message, state: FSMContext, type: str):
user_id = message.from_user.id
user_find = await UserService.get_user_by_id(user_id)
language = await UserService.get_user_language(user_id) or "ENGLISH"
routine_keyboard: ReplyKeyboardMarkup = morning_routine_keyboard() if type == "morning" else evening_routine_keyboard()

if not user_find:
await message.answer(MESSAGES["ENGLISH"]['AUTHORIZATION_PROBLEM'])
return

routine_num: int = int(message.text.strip())
if (routine_num < 1):
await message.answer(MESSAGES[language]['COMPLETE_TASK_INVALID'], reply_markup=morning_routine_keyboard())
await message.answer(MESSAGES[language]['COMPLETE_TASK_INVALID'], reply_markup=routine_keyboard)
return
else:
data = await state.get_data()
Expand All @@ -439,22 +442,23 @@ async def process_update_morning_routine(message: Message, state: FSMContext):
routine_to_update = routines[routine_num - 1]
real_id = routine_to_update["id"]

await message.answer(MESSAGES[language]['NEW_ROUTINE_NAME'])
await message.answer(MESSAGES[language]['NEW_ROUTINE_NAME'], reply_markup=routine_keyboard)
await state.update_data(routine_id=real_id)
await state.set_state(DialogStates.update_morning_routine)

async def process_save_updated_morning_routine(message: Message, state: FSMContext):
async def process_save_updated_morning_routine(message: Message, state: FSMContext, type: str):
user_id = message.from_user.id
user_find = await UserService.get_user_by_id(user_id)
language = await UserService.get_user_language(user_id) or "ENGLISH"
routine_keyboard: ReplyKeyboardMarkup = morning_routine_keyboard() if type == "morning" else evening_routine_keyboard()

if not user_find:
await message.answer(MESSAGES["ENGLISH"]['AUTHORIZATION_PROBLEM'])
return

routine_title: str = message.text.strip()
if not validate_text(routine_title):
await message.answer(MESSAGES[language]['INVALID_MORNING_ROUTINE'], reply_markup=morning_routine_keyboard())
await message.answer(MESSAGES[language]['INVALID_MORNING_ROUTINE'], reply_markup=routine_keyboard)
return

data = await state.get_data()
Expand All @@ -463,7 +467,7 @@ async def process_save_updated_morning_routine(message: Message, state: FSMConte
try:
await RoutineService.update_routine(routine_id, routine_title)
print(f"User with id: {user_id} updated routine title: {routine_title}")
await message.answer(MESSAGES[language]['ROUTINE_NAME_SET'].format(routine_title), reply_markup=morning_routine_keyboard())
await message.answer(MESSAGES[language]['ROUTINE_NAME_SET'].format(routine_title), reply_markup=routine_keyboard)
await state.clear()
except:
await message.answer(MESSAGES[language]['ROUTINE_EXISTS'], reply_markup=morning_routine_keyboard())
await message.answer(MESSAGES[language]['ROUTINE_EXISTS'], reply_markup=routine_keyboard)
62 changes: 55 additions & 7 deletions telegram_bot_project/main.py
Original file line number Diff line number Diff line change
Expand Up @@ -151,23 +151,63 @@ async def routine(message: Message):

@dp.message(lambda m: m.text == MORNINGG_ROUTINE_ADD_BTN)
async def morning_add(message: Message, state: FSMContext):
await state.set_state(DialogStates.add_morning_routine)
await state.update_data(routine_type="morning")
await set_morning_routine(message, state)

@dp.message(Command("morning_routines"))
async def morning_routines(message: Message):
await show_morning_routines(message)

@dp.message(lambda m: m.text == ROUTINE_MORNING_VIEW)
async def morning_routines_view(message: types.Message):
await show_morning_routines(message)

@dp.message(lambda m: m.text == MY_MORNING_ROUTINE_BTN)
async def morning_routines_show(message: types.Message):
await show_morning_routines(message)

@dp.message(lambda m: m.text == MORNING_ROUTINE_DELETE_BTN)
async def morning_routines_delete(message: types.Message, state: FSMContext):
await delete_morning_routine(message, state)
await state.set_state(DialogStates.delete_morning_routine)
await state.update_data(routine_type="morning")
await delete_morning_routine(message, state, type="morning")

@dp.message(lambda m: m.text == MORNING_ROUTINE_EDIT_BTN)
async def morning_routines_edit(message: types.Message, state: FSMContext):
await update_morning_routine(message, state)
await state.set_state(DialogStates.update_morning_routine)
await state.update_data(routine_type="morning")
await update_morning_routine(message, state, type="morning")

@dp.message(lambda m: m.text == EVENING_ROUTINE_ADD_BTN)
async def evening_routine_add(message: Message, state: FSMContext):
await state.set_state(DialogStates.add_morning_routine)
await state.update_data(routine_type="evening")
await set_morning_routine(message, state)

@dp.message(lambda m: m.text == EVENING_ROUTINE_DELETE_BTN)
async def evening_routines_delete(message: types.Message, state: FSMContext):
await state.set_state(DialogStates.delete_morning_routine)
await state.update_data(routine_type="evening")
await delete_morning_routine(message, state, type="evening")

@dp.message(lambda m: m.text == EVENING_ROUTINE_EDIT_BTN)
async def evening_routines_edit(message: types.Message, state: FSMContext):
await state.set_state(DialogStates.update_morning_routine)
await state.update_data(routine_type="evening")
await update_morning_routine(message, state, type="evening")

@dp.message(lambda m: m.text == MY_EVENING_ROUTINE_BTN)
async def evening_routines_show(message: types.Message):
await show_evening_routines(message)

@dp.message(Command("evening_routines"))
async def morning_routines(message: Message):
await show_evening_routines(message)

@dp.message(lambda m: m.text == ROUTINE_EVENING_VIEW)
async def evening_routines_view(message: types.Message):
await show_evening_routines(message)

@dp.callback_query(F.data.in_({"morning_view", "evening_view"}))
async def callback_routine(callback_query: CallbackQuery):
Expand All @@ -188,7 +228,7 @@ async def callback_idea(callback_query: CallbackQuery, state: FSMContext):
@dp.message()
async def process_fallback(message: Message, state: FSMContext):
current_state = await state.get_state()
print(f"[DEBUG] Current state: {current_state}")
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:
Expand All @@ -214,13 +254,21 @@ async def process_fallback(message: Message, state: FSMContext):
elif current_state == DialogStates.set_sleep_time:
await process_set_sleep_time(message, state)
elif current_state == DialogStates.add_morning_routine:
await process_set_routine_time(message, state)
data = await state.get_data()
routine_type = data.get("routine_type", "morning")
await process_set_routine(message, state, type=routine_type)
elif current_state == DialogStates.delete_morning_routine:
await process_delete_morning_routine(message, state)
data = await state.get_data()
routine_type = data.get("routine_type", "morning")
await process_delete_morning_routine(message, state, type=routine_type)
elif current_state == DialogStates.update_morning_routine:
await process_save_updated_morning_routine(message, state)
data = await state.get_data()
routine_type = data.get("routine_type", "morning")
await process_save_updated_morning_routine(message, state, type=routine_type)
elif current_state == DialogStates.update_morning_routine_id:
await process_update_morning_routine(message, state)
data = await state.get_data()
routine_type = data.get("routine_type", "morning")
await process_update_morning_routine(message, state, type=routine_type)

# Main Function
async def main():
Expand Down
23 changes: 13 additions & 10 deletions telegram_bot_project/messages.py
Original file line number Diff line number Diff line change
Expand Up @@ -50,6 +50,7 @@
"UPDATE_TASK_SUCCESS": "✅ Завдання №{} оновлено! 🏆",
"UPDATE_TASK_PROBLEM": "⚠️ Помилка під час оновлення. 😕",
"UPDATE_TASK_NAME_MSG": "📝 Введіть нову назву завдання:",
"EVENING_ROUTINE_SHOW": "Список твоїх вечірніх розпорядків",
"UPDATE_TASK_NAME_INVALID": "❌ Неправильна назва! 🔄",
"SETTINGS_MENU": "⚙️ Ласкаво просимо в Налаштування",
"ROUTINE_MENU_DAY": "Встановіть розпорядок за кнопками -> Morning / Evening",
Expand Down Expand Up @@ -150,7 +151,8 @@
"ROUTINE_EXISTS": "Routine with this title already exists.",
"ROUTINE_SAVED": "Routine - {} successfully saved!",
"MORNING_ROUTINE_SHOW": "Your Morning Routine List",
"NO_MORNING_ROUTINE": "You already doesn't have a morning routine set yet. Set it to keep your routine on track!",
"EVENING_ROUTINE_SHOW": "Your Evening Routine List",
"NO_MORNING_ROUTINE": "You already doesn't have a routine set yet. Set it to keep your routine on track!",
"PROVIDE_ROUTINE_ID": "Please provide the Number of the routine:",
"ROUTINE_DELETED": "Routine deleted",
"NEW_ROUTINE_NAME": "Please enter the new routine name:",
Expand Down Expand Up @@ -208,15 +210,16 @@
ROUTINE_SET_SLEEP_BUTTON = "🌙 Set Sleep Time"
ROUTINE_MY_TIME = "🕒 My Routine"
ROUTINE_MORNING_VIEW = "Morning Routine"
ROUTINE_EVENING_VIEW = "Afternoon Routine"
ROUTINE_EVENING_VIEW = "Evening Routine"

MORNINGG_ROUTINE_ADD_BTN = "Add"
MORNING_ROUTINE_DELETE_BTN = "Delete"
MORNING_ROUTINE_EDIT_BTN = "Edit"
MY_MORNING_ROUTINE_BTN = "My Morning Routine"
MORNINGG_ROUTINE_ADD_BTN = "➕ Add Morning"
MORNING_ROUTINE_DELETE_BTN = "🗑️ Delete Morning"
MORNING_ROUTINE_EDIT_BTN = "✏️ Edit Morning"
MY_MORNING_ROUTINE_BTN = "🌅 My Morning Routine"

EVENING_ROUTINE_ADD_BTN = "➕ Add Evening"
EVENING_ROUTINE_DELETE_BTN = "🗑️ Delete Evening"
EVENING_ROUTINE_EDIT_BTN = "✏️ Edit Evening"
MY_EVENING_ROUTINE_BTN = "🌙 My Evening Routine"

EVENING_ROUTINE_ADD_BTN = "Add"
EVENING_ROUTINE_DELETE_BTN = "Delete"
EVENING_ROUTINE_EDIT_BTN = "Edit"
MY_EVENING_ROUTINE_BTN = "My Evening Routine"