mirror of
https://github.com/HKUDS/nanobot.git
synced 2026-06-13 22:34:06 +00:00
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:
parent
894811db8b
commit
c574b028c1
@ -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
|
||||||
|
|||||||
@ -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"
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user