fix(feishu): allow punctuation after mention placeholders

maintainer edit: Keep the shared-prefix guard for Feishu numbered mention keys while still resolving placeholders followed by punctuation, matching the previous user-visible mention behavior.
This commit is contained in:
chengyongru 2026-06-05 14:12:10 +08:00 committed by Xubin Ren
parent 894811db8b
commit c574b028c1
2 changed files with 10 additions and 2 deletions

View File

@ -485,7 +485,9 @@ class FeishuChannel(BaseChannel):
key = mention.key or None key = mention.key or None
if not key: if not key:
continue continue
pattern = rf"{re.escape(key)}(?=\s|$)" # Feishu placeholders are numbered keys like @_user_1. Keep
# punctuation-adjacent mentions valid without matching @_user_10.
pattern = rf"{re.escape(key)}(?![A-Za-z0-9_])"
if not re.search(pattern, text): if not re.search(pattern, text):
continue continue
@ -532,7 +534,7 @@ class FeishuChannel(BaseChannel):
candidate = text.lstrip() candidate = text.lstrip()
for mention in mentions: for mention in mentions:
key = getattr(mention, "key", None) or "" key = getattr(mention, "key", None) or ""
if not key or not re.match(rf"{re.escape(key)}(?=\s|$)", candidate): if not key or not re.match(rf"{re.escape(key)}(?![A-Za-z0-9_])", candidate):
continue continue
if not self._is_bot_mention_event(mention): if not self._is_bot_mention_event(mention):
continue continue

View File

@ -44,6 +44,12 @@ class TestResolveMentions:
assert "@_user_1" not in result assert "@_user_1" not in result
assert "@_user_2" not in result assert "@_user_2" not in result
def test_mention_before_punctuation_replaced(self):
text = "hello @_user_1, are you there?"
mentions = [_mention("@_user_1", "Alice", open_id="ou_a")]
result = FeishuChannel._resolve_mentions(text, mentions)
assert result == "hello @Alice (ou_a), are you there?"
def test_no_mentions_returns_text(self): def test_no_mentions_returns_text(self):
assert FeishuChannel._resolve_mentions("hello world", None) == "hello world" assert FeishuChannel._resolve_mentions("hello world", None) == "hello world"
assert FeishuChannel._resolve_mentions("hello world", []) == "hello world" assert FeishuChannel._resolve_mentions("hello world", []) == "hello world"