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
6 changes: 4 additions & 2 deletions src/bot/constants.py
Original file line number Diff line number Diff line change
Expand Up @@ -87,15 +87,17 @@ def format_hours_display(hours: int) -> str:
"🚫 {user_mention} telah dibatasi setelah {message_count} pesan.\n"
"Mohon lengkapi {missing_text} kamu untuk mematuhi aturan grup.\n\n"
"📖 [Baca aturan grup]({rules_link})\n"
"✉️ [Hubungi langsung robot untuk membuka pembatasan (mohon pertimbangkan bahwa percakapan dengan robot saat ini sebagian besar belum direkam)]({dm_link})"
"✉️ [Hubungi langsung robot untuk membuka pembatasan]({dm_link}) "
"(mohon pertimbangkan bahwa percakapan dengan robot saat ini sebagian besar belum direkam)"
)

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

# Captcha verification message templates
Expand Down
14 changes: 7 additions & 7 deletions src/bot/services/telegram_utils.py
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,7 @@
from telegram import Bot, Chat, Message, User
from telegram.constants import ChatMemberStatus
from telegram.error import BadRequest, Forbidden
from telegram.helpers import mention_markdown
from telegram.helpers import escape_markdown, mention_markdown

logger = logging.getLogger(__name__)

Expand All @@ -28,11 +28,10 @@ def get_user_mention(user: User | Chat) -> str:
Returns:
str: Formatted user mention (either @username or markdown mention).
"""
return (
f"@{user.username.lstrip('@')}"
if user.username
else mention_markdown(user.id, user.full_name, version=1)
)
if user.username:
escaped = escape_markdown(user.username.lstrip("@"), version=1)
return f"@{escaped}"
return mention_markdown(user.id, user.full_name, version=1)


def get_user_mention_by_id(
Expand All @@ -54,7 +53,8 @@ def get_user_mention_by_id(
str: Formatted mention string.
"""
if username:
return f"@{username.lstrip('@')}"
escaped = escape_markdown(username.lstrip("@"), version=1)
return f"@{escaped}"
return mention_markdown(user_id, user_full_name, version=1)


Expand Down
1 change: 1 addition & 0 deletions tests/test_captcha.py
Original file line number Diff line number Diff line change
Expand Up @@ -647,6 +647,7 @@ def create_chat_member_update(self, old_status, new_status, user_id=12345, group
new_member.user.id = user_id
new_member.user.is_bot = False
new_member.user.full_name = "Test User"
new_member.user.username = "testuser"
update.chat_member.new_chat_member = new_member

update.effective_chat = MagicMock()
Expand Down
1 change: 1 addition & 0 deletions tests/test_check.py
Original file line number Diff line number Diff line change
Expand Up @@ -413,6 +413,7 @@ async def test_warn_callback_success(

mock_chat = MagicMock()
mock_chat.full_name = "Test User"
mock_chat.username = "testuser"
mock_context.bot.get_chat.return_value = mock_chat

with (
Expand Down
10 changes: 5 additions & 5 deletions tests/test_telegram_utils.py
Original file line number Diff line number Diff line change
Expand Up @@ -67,7 +67,7 @@ def test_get_user_mention_special_characters_in_username(self):

result = get_user_mention(user)

assert result == "@user_name_123"
assert result == r"@user\_name\_123"

@patch("bot.services.telegram_utils.mention_markdown")
def test_get_user_mention_special_characters_in_full_name(self, mock_mention_markdown):
Expand Down Expand Up @@ -106,7 +106,7 @@ def test_get_user_mention_with_prefixed_username(self):

result = get_user_mention(user)

assert result == "@already_prefixed"
assert result == r"@already\_prefixed"

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

result = get_user_mention(chat)

assert result == "@john_doe"
assert result == r"@john\_doe"

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

result = get_user_mention(chat)

assert result == "@prefixed_chat"
assert result == r"@prefixed\_chat"

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

assert result == "@john_doe_123"
assert result == r"@john\_doe\_123"

def test_get_user_mention_by_id_with_prefixed_username(self):
"""Test that username with @ prefix is normalized."""
Expand Down
2 changes: 1 addition & 1 deletion tests/test_verify_handler.py
Original file line number Diff line number Diff line change
Expand Up @@ -308,7 +308,7 @@ async def test_verify_sends_clearance_message_when_warnings_deleted(
call_kwargs = mock_context.bot.send_message.call_args.kwargs
assert call_kwargs["chat_id"] == gc.group_id
assert call_kwargs["message_thread_id"] == gc.warning_topic_id
assert "@verified_user" in call_kwargs["text"]
assert r"@verified\_user" in call_kwargs["text"]
assert call_kwargs["parse_mode"] == "Markdown"

async def test_verify_handles_non_restricted_user_gracefully(
Expand Down