Skip to content

Commit d9abf39

Browse files
committed
feat(chats): show settings icons on chat list buttons
- Add emoji indicators to Level 1 chat buttons: style emoji + 📝 (prompt) + ⏰/🔇 (auto-reply) - Button format: icons | chat_name (e.g. 💕📝⏰ | лиса) - Import and use CHAT_IGNORED_SENTINEL constant instead of hardcoded -1 - Update test_styles.py with new keyboard format assertions and ignore indicator test
1 parent 72af7da commit d9abf39

File tree

2 files changed

+44
-11
lines changed

2 files changed

+44
-11
lines changed

handlers/styles_handler.py

Lines changed: 22 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@
99
from config import (
1010
AUTO_REPLY_OPTIONS,
1111
ACTIVE_CHATS_LIMIT,
12+
CHAT_IGNORED_SENTINEL,
1213
CHATS_FETCH_LIMIT,
1314
DEBUG_PRINT,
1415
DEFAULT_STYLE,
@@ -69,13 +70,31 @@ def _find_chat_name(context: ContextTypes.DEFAULT_TYPE, chat_id: int) -> str:
6970

7071
def _build_styles_keyboard(
7172
dialogs: list[dict],
73+
user_settings: dict,
7274
) -> InlineKeyboardMarkup:
73-
"""Формирует inline-клавиатуру: одна кнопка с именем чата на строку."""
75+
"""Формирует inline-клавиатуру: одна кнопка с именем чата и иконками настроек."""
76+
chat_styles = user_settings.get("chat_styles") or {}
77+
chat_prompts = user_settings.get("chat_prompts") or {}
78+
global_style = user_settings.get("style") or DEFAULT_STYLE
79+
7480
keyboard = []
7581
for d in dialogs:
7682
chat_id = d["chat_id"]
7783
name = _chat_display_name(d)
78-
btn = InlineKeyboardButton(name, callback_data=f"chatmenu:{chat_id}")
84+
85+
# Emoji-индикаторы
86+
style = chat_styles.get(str(chat_id)) or global_style
87+
icons = _style_emoji(style)
88+
if chat_prompts.get(str(chat_id)):
89+
icons += "📝"
90+
ar = get_effective_auto_reply(user_settings, chat_id)
91+
if ar == CHAT_IGNORED_SENTINEL:
92+
icons += "🔇"
93+
elif ar is not None:
94+
icons += "⏰"
95+
96+
label = f"{icons} | {name}"
97+
btn = InlineKeyboardButton(label, callback_data=f"chatmenu:{chat_id}")
7998
keyboard.append([btn])
8099
return InlineKeyboardMarkup(keyboard)
81100

@@ -167,7 +186,7 @@ async def on_chats(update: Update, context: ContextTypes.DEFAULT_TYPE) -> None:
167186

168187
messages = await get_system_messages(u.language_code)
169188
title = messages.get("chats_title", "🎭 Chats")
170-
keyboard = _build_styles_keyboard(dialogs)
189+
keyboard = _build_styles_keyboard(dialogs, user_settings)
171190
await update.message.reply_text(title, reply_markup=keyboard)
172191

173192
if DEBUG_PRINT:

tests/test_styles.py

Lines changed: 22 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -235,22 +235,36 @@ def test_chat_display_name_empty(self):
235235
assert _chat_display_name({}) == "???"
236236

237237
def test_build_styles_keyboard_one_button_per_row(self):
238-
"""Level 1: одна кнопка с именем чата на каждую строку."""
238+
"""Одна кнопка на строку с emoji-индикаторами настроек."""
239239
dialogs = [
240240
{"chat_id": 100, "first_name": "Алиса", "last_name": "", "username": ""},
241241
{"chat_id": 200, "first_name": "Боб", "last_name": "", "username": ""},
242242
]
243-
keyboard = _build_styles_keyboard(dialogs)
243+
user_settings = {
244+
"style": "userlike",
245+
"chat_styles": {"100": "romance"},
246+
"chat_prompts": {"100": "Be formal"},
247+
"chat_auto_replies": {"100": 60},
248+
}
249+
keyboard = _build_styles_keyboard(dialogs, user_settings)
244250
buttons = keyboard.inline_keyboard
245251
assert len(buttons) == 2
246-
# Каждый ряд — 1 кнопка с именем чата
247252
assert len(buttons[0]) == 1
248-
assert buttons[0][0].text == "Алиса"
253+
# Алиса: romance + prompt + auto-reply
254+
assert buttons[0][0].text == "💕📝⏰ | Алиса"
249255
assert buttons[0][0].callback_data == "chatmenu:100"
250-
assert len(buttons[1]) == 1
251-
assert buttons[1][0].text == "Боб"
256+
# Боб: дефолтный стиль, без промпта, без auto-reply
257+
assert buttons[1][0].text == "🦉 | Боб"
252258
assert buttons[1][0].callback_data == "chatmenu:200"
253259

260+
def test_build_styles_keyboard_ignore_indicator(self):
261+
"""🔇 показывается для ignored чатов."""
262+
dialogs = [{"chat_id": 100, "first_name": "Алиса", "last_name": "", "username": ""}]
263+
user_settings = {"chat_auto_replies": {"100": -1}}
264+
keyboard = _build_styles_keyboard(dialogs, user_settings)
265+
assert "🔇" in keyboard.inline_keyboard[0][0].text
266+
assert "⏰" not in keyboard.inline_keyboard[0][0].text
267+
254268
def test_build_chat_settings_keyboard_three_buttons_column(self):
255269
"""Level 2: три кнопки в столбец — стиль, промпт, автоответ."""
256270
user_settings = {
@@ -355,8 +369,8 @@ async def test_shows_chat_buttons(self, mock_update, mock_context):
355369
kb = mock_update.message.reply_text.call_args.kwargs["reply_markup"]
356370
assert len(kb.inline_keyboard) == 1
357371
assert len(kb.inline_keyboard[0]) == 1 # одна кнопка на строку
358-
assert kb.inline_keyboard[0][0].text == "Алиса"
359-
assert kb.inline_keyboard[0][0].callback_data == "chatmenu:100"
372+
assert "Алиса" in kb.inline_keyboard[0][0].text
373+
assert "chatmenu:100" in kb.inline_keyboard[0][0].callback_data
360374

361375
@pytest.mark.asyncio
362376
async def test_opening_chats_clears_prompt_waiting_state(self, mock_update, mock_context):

0 commit comments

Comments
 (0)