diff --git a/pyrogram/methods/chats/pin_chat_message.py b/pyrogram/methods/chats/pin_chat_message.py index 1eaf6bcd..db4d1086 100644 --- a/pyrogram/methods/chats/pin_chat_message.py +++ b/pyrogram/methods/chats/pin_chat_message.py @@ -22,14 +22,18 @@ from typing import Union import pyrogram from pyrogram import raw, types +from ..messages.inline_session import get_session + class PinChatMessage: + async def pin_chat_message( self: "pyrogram.Client", chat_id: Union[int, str], message_id: int, disable_notification: bool = False, both_sides: bool = False, + business_connection_id: str = None, ) -> "types.Message": """Pin a message in a group, channel or your own chat. You must be an administrator in the chat for this to work and must have the "can_pin_messages" admin right in @@ -52,6 +56,9 @@ class PinChatMessage: both_sides (``bool``, *optional*): Pass True to pin the message for both sides (you and recipient). Applicable to private chats only. Defaults to False. + + business_connection_id (``str``, *optional*): + Unique identifier of the business connection on behalf of which the message will be pinned. Returns: :obj:`~pyrogram.types.Message`: On success, the service message is returned. @@ -65,19 +72,39 @@ class PinChatMessage: # Pin without notification await app.pin_chat_message(chat_id, message_id, disable_notification=True) """ - r = await self.invoke( - raw.functions.messages.UpdatePinnedMessage( - peer=await self.resolve_peer(chat_id), - id=message_id, - silent=disable_notification or None, - pm_oneside=not both_sides or None - ) + rpc = raw.functions.messages.UpdatePinnedMessage( + peer=await self.resolve_peer(chat_id), + id=message_id, + silent=disable_notification or None, + pm_oneside=not both_sides or None ) + session = None + business_connection = None + if business_connection_id: + business_connection = self.business_user_connection_cache[business_connection_id] + if not business_connection: + business_connection = await self.get_business_connection(business_connection_id) + session = await get_session( + self, + business_connection._raw.connection.dc_id + ) + + if business_connection_id: + r = await session.invoke( + raw.functions.InvokeWithBusinessConnection( + query=rpc, + connection_id=business_connection_id + ) + ) + else: + r = await self.invoke(rpc) + users = {u.id: u for u in r.users} chats = {c.id: c for c in r.chats} for i in r.updates: if isinstance(i, (raw.types.UpdateNewMessage, - raw.types.UpdateNewChannelMessage)): - return await types.Message._parse(self, i.message, users, chats) + raw.types.UpdateNewChannelMessage, + raw.types.UpdateBotNewBusinessMessage)): + return await types.Message._parse(self, i.message, users, chats, business_connection_id=business_connection_id) diff --git a/pyrogram/methods/chats/unpin_chat_message.py b/pyrogram/methods/chats/unpin_chat_message.py index abd01b03..7959962f 100644 --- a/pyrogram/methods/chats/unpin_chat_message.py +++ b/pyrogram/methods/chats/unpin_chat_message.py @@ -22,12 +22,15 @@ from typing import Union import pyrogram from pyrogram import raw +from ..messages.inline_session import get_session + class UnpinChatMessage: async def unpin_chat_message( self: "pyrogram.Client", chat_id: Union[int, str], - message_id: int = 0 + message_id: int = 0, + business_connection_id: str = None, ) -> bool: """Unpin a message in a group, channel or your own chat. You must be an administrator in the chat for this to work and must have the "can_pin_messages" admin @@ -38,12 +41,15 @@ class UnpinChatMessage: Parameters: chat_id (``int`` | ``str``): Unique identifier (int) or username (str) of the target chat. - You can also use chat public link in form of *t.me/* (str). message_id (``int``, *optional*): Identifier of a message to unpin. + Required if ``business_connection_id`` is specified. If not specified, the most recent pinned message (by sending date) will be unpinned. + business_connection_id (``str``, *optional*): + Unique identifier of the business connection on behalf of which the message will be unpinned. + Returns: ``bool``: True on success. @@ -52,12 +58,32 @@ class UnpinChatMessage: await app.unpin_chat_message(chat_id, message_id) """ - await self.invoke( - raw.functions.messages.UpdatePinnedMessage( - peer=await self.resolve_peer(chat_id), - id=message_id, - unpin=True - ) + rpc = raw.functions.messages.UpdatePinnedMessage( + peer=await self.resolve_peer(chat_id), + id=message_id, + unpin=True ) + + session = None + business_connection = None + if business_connection_id: + business_connection = self.business_user_connection_cache[business_connection_id] + if not business_connection: + business_connection = await self.get_business_connection(business_connection_id) + session = await get_session( + self, + business_connection._raw.connection.dc_id + ) + + if business_connection_id: + await session.invoke( + raw.functions.InvokeWithBusinessConnection( + query=rpc, + connection_id=business_connection_id + ) + ) + else: + await self.invoke(rpc) return True + \ No newline at end of file