1+ from typing import Optional
2+
3+ from application .dtos import MoodStatsDTO
4+ from application .use_cases .get_user_profile import UserSettings
15from domain .entities import StatsPeriod
26
37
8+ class StringBuilder :
9+ def __init__ (self ) -> None :
10+ self ._text = ""
11+
12+ def append (self , text : str ) -> "StringBuilder" :
13+ self ._text += text
14+ return self
15+
16+ def add_line (self , text : str ) -> "StringBuilder" :
17+ self ._text += "\n " + text
18+ return self
19+
20+ def add_doble_line (self , text : str ) -> "StringBuilder" :
21+ self ._text += "\n \n " + text
22+ return self
23+
24+ def get_text (self ) -> str :
25+ return self ._text
26+
27+
428class Messages :
529 WELCOME_STUB_MESSAGE = "нажми /start чтобы начать"
630 WELCOME_TEXT = (
@@ -28,7 +52,7 @@ class Messages:
2852 "Сгенерировано @mood_diary_bbot"
2953 )
3054
31- CHOOSE_PERIOD = "📊 Выбери период:"
55+ CHOOSE_PERIOD = "📊 Выбери период для получения статистики :"
3256
3357 INOGRAPHIC_GENERATING = "🎨 Генерирую инфографику..."
3458
@@ -87,14 +111,20 @@ class Messages:
87111 "Хотите обновить?"
88112 )
89113
90- STATS_TITLE = "📊 Статистика: {period}"
114+ PROFILE_TITLE = "Профиль: {full_name}"
115+ PROFILE_SETTINGS = "🔧 Настройки"
116+ PROFILE_SETTINGS_REMINDER = "Напоминание:"
117+ PROFILE_SETTINGS_REMINDER_ENABLED = "🔔 Включено"
118+ PROFILE_SETTINGS_REMINDER_DISABLED = "🔕 Выключено"
119+
120+ PROFILE_STATS_TITLE = "📊 Статистика: {period}"
91121
92- STATS_NO_DATA = (
122+ PROFILE_STATS_NO_DATA = (
93123 "❌ Нет записей за этот период.\n \n "
94124 "Используй /mood чтобы добавить первую запись!"
95125 )
96126
97- STATS_DETAILS = (
127+ PROFILE_STATS_DETAILS = (
98128 "{emoji} Среднее настроение: {avg}/10 ({mood_text})\n \n "
99129 "📈 Детали:\n "
100130 "• Записей: {total}\n "
@@ -105,6 +135,67 @@ class Messages:
105135 "• Последняя: {last}"
106136 )
107137
138+ @classmethod
139+ def get_profile_text (
140+ cls ,
141+ full_name : str ,
142+ user_settings : UserSettings ,
143+ ) -> str :
144+ return (
145+ StringBuilder ()
146+ .append (Messages .format (Messages .PROFILE_TITLE , full_name = full_name ))
147+ .add_doble_line (Messages .format (Messages .PROFILE_SETTINGS ))
148+ .add_line (
149+ Messages .format (
150+ Messages .PROFILE_SETTINGS_REMINDER ,
151+ enabled = user_settings .reminder_enabled ,
152+ )
153+ )
154+ .add_line (
155+ Messages .format (
156+ Messages .PROFILE_SETTINGS_REMINDER_ENABLED
157+ if user_settings .reminder_enabled
158+ else Messages .PROFILE_SETTINGS_REMINDER_DISABLED
159+ )
160+ )
161+ .get_text ()
162+ )
163+
164+ @classmethod
165+ def get_profile_text_with_stats (
166+ cls ,
167+ full_name : str ,
168+ period : StatsPeriod ,
169+ mood_stats : Optional [MoodStatsDTO ],
170+ user_settings : UserSettings ,
171+ ) -> str :
172+
173+ period_label = Messages .get_period_str_by_day (period .value )
174+ profile_text = cls .get_profile_text (full_name , user_settings )
175+ return (
176+ StringBuilder ()
177+ .append (profile_text )
178+ .add_doble_line (
179+ Messages .format (Messages .PROFILE_STATS_TITLE , period = period_label )
180+ )
181+ .add_doble_line (
182+ Messages .format (
183+ Messages .PROFILE_STATS_DETAILS ,
184+ emoji = Messages .get_mood_emoji (int (mood_stats .avg_mood )),
185+ avg = mood_stats .avg_mood ,
186+ mood_text = Messages .get_mood_text (mood_stats .avg_mood ),
187+ total = mood_stats .total_entries ,
188+ min = mood_stats .min_mood ,
189+ max = mood_stats .max_mood ,
190+ first = mood_stats .first_entry_date or "—" ,
191+ last = mood_stats .last_entry_date or "—" ,
192+ )
193+ if mood_stats is not None
194+ else Messages .PROFILE_STATS_NO_DATA
195+ )
196+ .get_text ()
197+ )
198+
108199 BTN_MOOD = "🎯 Оценить настроение"
109200 BTN_STATS = "📊 Моя статистика"
110201 BTN_EXPORT = "📈 Экспорт"
0 commit comments