Przeglądaj źródła

Add basic support for profile share messages

Tulir Asokan 3 lat temu
rodzic
commit
41e4d946a0

+ 3 - 1
ROADMAP.md

@@ -24,7 +24,9 @@
       * [x] Gifs
       * [x] Voice messages
       * [x] Locations
-      * [x] Story/reel share
+      * [x] Story/reel/clip share
+      * [x] Profile share
+      * [ ] Product share
     * [x] Replies
   * [x] Message unsend
   * [x] Message reactions

+ 2 - 0
mauigpapi/types/account.py

@@ -55,6 +55,8 @@ class BaseResponseUser(UserIdentifier, SerializableAttrs):
     friendship_status: Optional[FriendshipStatus] = None
     # Not exactly sure when this is present
     latest_reel_media: Optional[int] = None
+    has_highlight_reels: bool = False
+    follow_friction_type: Optional[int] = None
 
 
 @dataclass(kw_only=True)

+ 6 - 0
mauigpapi/types/thread_item.py

@@ -461,6 +461,11 @@ class FelixShareItem(SerializableAttrs):
     text: Optional[str] = None
 
 
+@dataclass
+class ProfileItem(BaseResponseUser, SerializableAttrs):
+    pass
+
+
 @dataclass(kw_only=True)
 class ThreadItem(SerializableAttrs):
     item_id: Optional[str] = None
@@ -489,6 +494,7 @@ class ThreadItem(SerializableAttrs):
     link: Optional[LinkItem] = None
     clip: Optional[ClipItem] = None
     felix_share: Optional[FelixShareItem] = None
+    profile: Optional[ProfileItem] = None
 
     @classmethod
     def deserialize(cls, data: JSON, catch_errors: bool = True) -> Union['ThreadItem', Obj]:

+ 13 - 0
mautrix_instagram/portal.py

@@ -797,6 +797,17 @@ class Portal(DBPortal, BasePortal):
 
         return await self._send_message(intent, content, timestamp=item.timestamp // 1000)
 
+    async def _handle_instagram_profile(self, intent: IntentAPI, item: ThreadItem
+                                        ) -> Optional[EventID]:
+        username = item.profile.username
+        user_link = f'<a href="https://www.instagram.com/{username}/">@{username}</a>'
+        text = f"Shared @{username}'s profile"
+        html = f"Shared {user_link}'s profile"
+        content = TextMessageEventContent(msgtype=MessageType.TEXT, format=Format.HTML,
+                                          body=text, formatted_body=html)
+        await self._add_instagram_reply(content, item.replied_to_message)
+        return await self._send_message(intent, content, timestamp=item.timestamp // 1000)
+
     async def handle_instagram_item(self, source: 'u.User', sender: 'p.Puppet', item: ThreadItem,
                                     is_backfill: bool = False) -> None:
         try:
@@ -868,6 +879,8 @@ class Portal(DBPortal, BasePortal):
                 event_id = await self._handle_instagram_media(source, intent, item)
             elif item.location:
                 event_id = await self._handle_instagram_location(intent, item)
+            elif item.profile:
+                event_id = await self._handle_instagram_profile(intent, item)
             elif item.reel_share:
                 event_id = await self._handle_instagram_reel_share(source, intent, item)
             elif item.media_share or item.story_share or item.clip or item.felix_share: