Skip to content

Commit 80a62d5

Browse files
authored
Merge pull request chigwell#282 from vsem-azamat/feat/pin-message-notify
feat(messages): add optional notify to pin_message
2 parents 7c6e117 + 5ff21bb commit 80a62d5

2 files changed

Lines changed: 57 additions & 2 deletions

File tree

‎telegram_mcp/tools/messages.py‎

Lines changed: 10 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1795,15 +1795,23 @@ async def delete_messages_bulk(
17951795
@with_account(readonly=False)
17961796
@validate_id("chat_id")
17971797
async def pin_message(
1798-
chat_id: Union[int, str], message_id: int, account: Optional[str] = None
1798+
chat_id: Union[int, str],
1799+
message_id: int,
1800+
notify: bool = False,
1801+
account: Optional[str] = None,
17991802
) -> str:
18001803
"""
18011804
Pin a message in a chat.
1805+
1806+
Args:
1807+
chat_id: The ID or username of the chat.
1808+
message_id: The ID of the message to pin.
1809+
notify: Notify chat members about the pin. Default False pins silently.
18021810
"""
18031811
try:
18041812
cl = get_client(account)
18051813
entity = await resolve_entity(chat_id, cl)
1806-
await cl.pin_message(entity, message_id)
1814+
await cl.pin_message(entity, message_id, notify=notify)
18071815
return f"Message {message_id} pinned in chat {chat_id}."
18081816
except Exception as e:
18091817
return log_and_format_error("pin_message", e, chat_id=chat_id, message_id=message_id)

‎tests/test_pin_notify.py‎

Lines changed: 47 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,47 @@
1+
import pytest
2+
3+
from telegram_mcp.tools import messages
4+
5+
6+
class _PinClient:
7+
def __init__(self):
8+
self.calls = []
9+
10+
async def pin_message(self, entity, message_id, **kwargs):
11+
self.calls.append((entity, message_id, kwargs))
12+
13+
14+
@pytest.fixture
15+
def client(monkeypatch):
16+
cl = _PinClient()
17+
18+
async def fake_resolve(chat_id, client=None):
19+
return "entity"
20+
21+
monkeypatch.setattr(messages, "get_client", lambda account=None: cl)
22+
monkeypatch.setattr(messages, "resolve_entity", fake_resolve)
23+
return cl
24+
25+
26+
@pytest.mark.asyncio
27+
async def test_pin_message_is_silent_by_default(client):
28+
result = await messages.pin_message(chat_id=1, message_id=2)
29+
30+
assert result == "Message 2 pinned in chat 1."
31+
assert client.calls == [("entity", 2, {"notify": False})]
32+
33+
34+
@pytest.mark.asyncio
35+
async def test_pin_message_notifies_when_requested(client):
36+
result = await messages.pin_message(chat_id=1, message_id=2, notify=True)
37+
38+
assert result == "Message 2 pinned in chat 1."
39+
assert client.calls == [("entity", 2, {"notify": True})]
40+
41+
42+
def test_pin_message_schema_exposes_optional_notify():
43+
tool = messages.mcp._tool_manager.get_tool("pin_message")
44+
notify = tool.parameters["properties"]["notify"]
45+
46+
assert notify["default"] is False
47+
assert "notify" not in tool.parameters.get("required", [])

0 commit comments

Comments
 (0)