Skip to content

Commit 7f27ced

Browse files
committed
Refactor: improve code formatting and logging consistency across multiple files
1 parent 8f45ad8 commit 7f27ced

File tree

4 files changed

+46
-26
lines changed

4 files changed

+46
-26
lines changed

handlers/planner.py

Lines changed: 27 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -1,14 +1,13 @@
1+
import re
12
from aiogram import Router, types, F
23
from aiogram.filters import Command
34
from aiogram.fsm.context import FSMContext
45
from aiogram.fsm.state import State, StatesGroup
56
from aiogram.types.message import Message
6-
77
from services.llm import generate_study_plan, translate_text
88
from services.pdf import save_plan_to_pdf
99
from services.txt import save_plan_to_txt
1010
from services.db import save_user_plan, get_user_plan, get_user_language
11-
import re
1211

1312
router = Router()
1413

@@ -38,7 +37,9 @@ async def handle_topic(message: types.Message, state: FSMContext):
3837
topic = message.text.strip()
3938

4039
# Send waiting message
41-
await send_translated(message, "⏳ Please wait a moment. Generating your study plan...")
40+
await send_translated(
41+
message, "⏳ Please wait a moment. Generating your study plan..."
42+
)
4243

4344
# Send "typing" action to show the bot is working
4445
if message.bot and message.chat and message.chat.id:
@@ -62,21 +63,26 @@ async def handle_topic(message: types.Message, state: FSMContext):
6263
await state.set_state(PlanFormat.waiting_for_format)
6364
user_id = message.from_user.id if message.from_user else 0
6465
user_lang = get_user_language(user_id) or "en"
65-
prompt = await translate_text("In which format do you want to save the plan?", user_lang)
66+
prompt = await translate_text(
67+
"In which format do you want to save the plan?", user_lang
68+
)
6669
await send_translated(message, prompt)
6770
keyboard = types.InlineKeyboardMarkup(
6871
inline_keyboard=[
6972
[
7073
types.InlineKeyboardButton(
71-
text=await translate_text("📄 pdf", user_lang), callback_data="format_pdf"
74+
text=await translate_text("📄 pdf", user_lang),
75+
callback_data="format_pdf",
7276
),
7377
types.InlineKeyboardButton(
74-
text=await translate_text("📄 txt", user_lang), callback_data="format_txt"
78+
text=await translate_text("📄 txt", user_lang),
79+
callback_data="format_txt",
7580
),
7681
],
7782
[
7883
types.InlineKeyboardButton(
79-
text=await translate_text("⏭ Skip", user_lang), callback_data="format_skip"
84+
text=await translate_text("⏭ Skip", user_lang),
85+
callback_data="format_skip",
8086
)
8187
],
8288
]
@@ -135,27 +141,31 @@ async def show_next_actions(message: types.Message, state: FSMContext):
135141
await state.set_state(PlanFormat.waiting_for_next_action)
136142
user_id = message.from_user.id if message.from_user else 0
137143
user_lang = get_user_language(user_id) or "en"
138-
await send_translated(message, await translate_text("What else would you like to do?", user_lang))
144+
await send_translated(
145+
message, await translate_text("What else would you like to do?", user_lang)
146+
)
139147
keyboard = types.InlineKeyboardMarkup(
140148
inline_keyboard=[
141149
[
142150
types.InlineKeyboardButton(
143151
text=await translate_text("⏰ Schedule reminders", user_lang),
144-
callback_data="schedule_reminders"
152+
callback_data="schedule_reminders",
145153
)
146154
],
147155
[
148156
types.InlineKeyboardButton(
149157
text=await translate_text("🔄 Create a new plan", user_lang),
150-
callback_data="new_plan"
158+
callback_data="new_plan",
151159
)
152160
],
153161
[
154162
types.InlineKeyboardButton(
155-
text=await translate_text("👋 Nothing, have a nice day!", user_lang),
156-
callback_data="goodbye"
163+
text=await translate_text(
164+
"👋 Nothing, have a nice day!", user_lang
165+
),
166+
callback_data="goodbye",
157167
)
158-
]
168+
],
159169
]
160170
)
161171
await message.answer("Choose your next action:", reply_markup=keyboard)
@@ -254,13 +264,13 @@ async def send_translated(message, text):
254264
if user_lang != "en":
255265
text = await translate_text(text, user_lang)
256266
# Clean/escape unsupported HTML/Markdown links and tags
257-
text = re.sub(r'<(https?://[^>]+)>', r'\1', text)
258-
text = re.sub(r'<([^ >]+)>', r'\1', text)
267+
text = re.sub(r"<(https?://[^>]+)>", r"\1", text)
268+
text = re.sub(r"<([^ >]+)>", r"\1", text)
259269
# If text is empty or only whitespace, send an informative message
260-
if not text or text.strip() == '':
270+
if not text or text.strip() == "":
261271
await message.answer("[Error] Empty text for user message.")
262272
return
263273
# If text is longer than Telegram limit, split into parts
264274
max_len = 4096
265275
for i in range(0, len(text), max_len):
266-
await message.answer(text[i:i+max_len])
276+
await message.answer(text[i : i + max_len])

handlers/start.py

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,11 +8,12 @@
88

99
router = Router()
1010

11+
1112
@router.message(Command("start"))
1213
async def start_handler(message: types.Message, state: FSMContext):
1314
await send_translated(
1415
message,
15-
"👋 Hi! I am a bot for creating study plans.\nUse the /plan command to start creating a study plan."
16+
"👋 Hi! I am a bot for creating study plans.\nUse the /plan command to start creating a study plan.",
1617
)
1718
# Immediately prompt for language selection
1819
user_id = message.from_user.id if message.from_user else 0

services/llm.py

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -85,7 +85,7 @@ async def generate_study_plan(topic: str) -> list:
8585
try:
8686
return await generate_groq_plan(topic)
8787
except Exception as e:
88-
logger.error(f"Groq fallback error: {e}")
88+
logger.error("Groq fallback error: %s", e)
8989
# Fallback: local
9090
return generate_local_plan(topic)
9191

@@ -96,7 +96,7 @@ async def translate_text(text: str, target_lang: str) -> str:
9696
f"Translate the following text to {target_lang}. "
9797
f"Output only the translation, no explanations, no extra text.\n{text}"
9898
)
99-
logger.info(f"Translating to {target_lang}: {text}")
99+
logger.info("Translating to %s: %s", target_lang, text)
100100
# Try OpenAI
101101
if OPENAI_API_KEY and client is not None:
102102
try:
@@ -105,7 +105,7 @@ async def translate_text(text: str, target_lang: str) -> str:
105105
messages=[{"role": "user", "content": prompt}],
106106
)
107107
translated = response.choices[0].message.content
108-
logger.info(f"OpenAI translation result: {translated}")
108+
logger.info("OpenAI translation result: %s", translated)
109109
if translated:
110110
return translated.strip()
111111
except Exception: # pylint: disable=broad-exception-caught
@@ -114,7 +114,7 @@ async def translate_text(text: str, target_lang: str) -> str:
114114
try:
115115
return await groq_translate_text(text, target_lang)
116116
except Exception as e:
117-
logger.error(f"Groq translation fallback error: {e}")
117+
logger.error("Groq translation fallback error: %s", e)
118118
return text
119119

120120
async def generate_groq_plan(topic: str) -> list:

tests/test_start_handler.py

Lines changed: 13 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -16,13 +16,22 @@ def __init__(self):
1616
self.chat = type("Chat", (), {"id": 1})()
1717
self.from_user = type("User", (), {"id": 1})()
1818
self.answer_text = None
19-
async def answer(self, text):
19+
self.all_answers = []
20+
async def answer(self, text, *_args, **_kwargs):
2021
self.answer_text = text
22+
self.all_answers.append(text)
2123
return text
2224

25+
class DummyState:
26+
"""Dummy state for testing purposes."""
27+
async def set_state(self, *_args, **_kwargs):
28+
pass
29+
async def clear(self):
30+
pass
31+
2332
@pytest.mark.asyncio
2433
async def test_start_handler():
2534
message = DummyMessage()
26-
await start_handler(message)
27-
assert message.answer_text is not None
28-
assert "bot for creating study plans" in message.answer_text
35+
state = DummyState()
36+
await start_handler(message, state)
37+
assert any("bot for creating study plans" in msg for msg in message.all_answers)

0 commit comments

Comments
 (0)