Skip to content

Commit 3a38890

Browse files
authored
Merge pull request #2 from rezhajulio/fix/markdown-v1-parsing
fix: resolve Markdown v1 parsing failures in Telegram messages
2 parents 311543b + e34bbdd commit 3a38890

6 files changed

Lines changed: 19 additions & 15 deletions

File tree

src/bot/constants.py

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -87,15 +87,17 @@ def format_hours_display(hours: int) -> str:
8787
"🚫 {user_mention} telah dibatasi setelah {message_count} pesan.\n"
8888
"Mohon lengkapi {missing_text} kamu untuk mematuhi aturan grup.\n\n"
8989
"📖 [Baca aturan grup]({rules_link})\n"
90-
"✉️ [Hubungi langsung robot untuk membuka pembatasan (mohon pertimbangkan bahwa percakapan dengan robot saat ini sebagian besar belum direkam)]({dm_link})"
90+
"✉️ [Hubungi langsung robot untuk membuka pembatasan]({dm_link}) "
91+
"(mohon pertimbangkan bahwa percakapan dengan robot saat ini sebagian besar belum direkam)"
9192
)
9293

9394
# Restriction message when user reaches time threshold (scheduler)
9495
RESTRICTION_MESSAGE_AFTER_TIME = (
9596
"🚫 {user_mention} telah dibatasi karena tidak melengkapi profil "
9697
"dalam {threshold_display}.\n\n"
9798
"📖 [Baca aturan grup]({rules_link})\n"
98-
"✉️ [Hubungi langsung robot untuk membuka pembatasan (mohon pertimbangkan bahwa percakapan dengan robot saat ini sebagian besar belum direkam)]({dm_link})"
99+
"✉️ [Hubungi langsung robot untuk membuka pembatasan]({dm_link}) "
100+
"(mohon pertimbangkan bahwa percakapan dengan robot saat ini sebagian besar belum direkam)"
99101
)
100102

101103
# Captcha verification message templates

src/bot/services/telegram_utils.py

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@
1010
from telegram import Bot, Chat, Message, User
1111
from telegram.constants import ChatMemberStatus
1212
from telegram.error import BadRequest, Forbidden
13-
from telegram.helpers import mention_markdown
13+
from telegram.helpers import escape_markdown, mention_markdown
1414

1515
logger = logging.getLogger(__name__)
1616

@@ -28,11 +28,10 @@ def get_user_mention(user: User | Chat) -> str:
2828
Returns:
2929
str: Formatted user mention (either @username or markdown mention).
3030
"""
31-
return (
32-
f"@{user.username.lstrip('@')}"
33-
if user.username
34-
else mention_markdown(user.id, user.full_name, version=1)
35-
)
31+
if user.username:
32+
escaped = escape_markdown(user.username.lstrip("@"), version=1)
33+
return f"@{escaped}"
34+
return mention_markdown(user.id, user.full_name, version=1)
3635

3736

3837
def get_user_mention_by_id(
@@ -54,7 +53,8 @@ def get_user_mention_by_id(
5453
str: Formatted mention string.
5554
"""
5655
if username:
57-
return f"@{username.lstrip('@')}"
56+
escaped = escape_markdown(username.lstrip("@"), version=1)
57+
return f"@{escaped}"
5858
return mention_markdown(user_id, user_full_name, version=1)
5959

6060

tests/test_captcha.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -647,6 +647,7 @@ def create_chat_member_update(self, old_status, new_status, user_id=12345, group
647647
new_member.user.id = user_id
648648
new_member.user.is_bot = False
649649
new_member.user.full_name = "Test User"
650+
new_member.user.username = "testuser"
650651
update.chat_member.new_chat_member = new_member
651652

652653
update.effective_chat = MagicMock()

tests/test_check.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -413,6 +413,7 @@ async def test_warn_callback_success(
413413

414414
mock_chat = MagicMock()
415415
mock_chat.full_name = "Test User"
416+
mock_chat.username = "testuser"
416417
mock_context.bot.get_chat.return_value = mock_chat
417418

418419
with (

tests/test_telegram_utils.py

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -67,7 +67,7 @@ def test_get_user_mention_special_characters_in_username(self):
6767

6868
result = get_user_mention(user)
6969

70-
assert result == "@user_name_123"
70+
assert result == r"@user\_name\_123"
7171

7272
@patch("bot.services.telegram_utils.mention_markdown")
7373
def test_get_user_mention_special_characters_in_full_name(self, mock_mention_markdown):
@@ -106,7 +106,7 @@ def test_get_user_mention_with_prefixed_username(self):
106106

107107
result = get_user_mention(user)
108108

109-
assert result == "@already_prefixed"
109+
assert result == r"@already\_prefixed"
110110

111111
def test_get_user_mention_chat_with_username(self):
112112
"""Test getting mention for Chat object with username."""
@@ -117,7 +117,7 @@ def test_get_user_mention_chat_with_username(self):
117117

118118
result = get_user_mention(chat)
119119

120-
assert result == "@john_doe"
120+
assert result == r"@john\_doe"
121121

122122
def test_get_user_mention_chat_with_prefixed_username(self):
123123
"""Test that Chat with @ prefixed username is normalized."""
@@ -128,7 +128,7 @@ def test_get_user_mention_chat_with_prefixed_username(self):
128128

129129
result = get_user_mention(chat)
130130

131-
assert result == "@prefixed_chat"
131+
assert result == r"@prefixed\_chat"
132132

133133
@patch("bot.services.telegram_utils.mention_markdown")
134134
def test_get_user_mention_chat_without_username(self, mock_mention_markdown):
@@ -231,7 +231,7 @@ def test_get_user_mention_by_id_with_username_special_chars(self):
231231
"""Test mention by ID with username containing underscores."""
232232
result = get_user_mention_by_id(123456, "John Doe", username="john_doe_123")
233233

234-
assert result == "@john_doe_123"
234+
assert result == r"@john\_doe\_123"
235235

236236
def test_get_user_mention_by_id_with_prefixed_username(self):
237237
"""Test that username with @ prefix is normalized."""

tests/test_verify_handler.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -308,7 +308,7 @@ async def test_verify_sends_clearance_message_when_warnings_deleted(
308308
call_kwargs = mock_context.bot.send_message.call_args.kwargs
309309
assert call_kwargs["chat_id"] == gc.group_id
310310
assert call_kwargs["message_thread_id"] == gc.warning_topic_id
311-
assert "@verified_user" in call_kwargs["text"]
311+
assert r"@verified\_user" in call_kwargs["text"]
312312
assert call_kwargs["parse_mode"] == "Markdown"
313313

314314
async def test_verify_handles_non_restricted_user_gracefully(

0 commit comments

Comments
 (0)