Browse Source

Fix handling some Instagram message types

Tulir Asokan 4 years ago
parent
commit
8bb09921c5
2 changed files with 24 additions and 8 deletions
  1. 18 7
      mauigpapi/types/thread_item.py
  2. 6 1
      mautrix_instagram/portal.py

+ 18 - 7
mauigpapi/types/thread_item.py

@@ -65,6 +65,7 @@ class ThreadItemType(SerializableEnum):
     AR_EFFECT = "ar_effect"
     SELFIE_STICKER = "selfie_sticker"
     REACTION = "reaction"
+    CLIP = "clip"
 
 
 @dataclass(kw_only=True)
@@ -207,8 +208,9 @@ class Location(SerializableAttrs):
     name: str
     address: str
     city: str
-    lng: float
-    lat: float
+    lng: Optional[float] = None
+    lat: Optional[float] = None
+    is_eligible_for_guides: bool = False
 
 
 @dataclass(kw_only=True)
@@ -409,13 +411,15 @@ class ReelShareItem(SerializableAttrs):
 @dataclass
 class StoryShareItem(SerializableAttrs):
     text: str
-    is_reel_persisted: bool
+    media: Union[ReelMediaShareItem, ExpiredMediaItem]
+
+    # Only present when not expired
+    is_reel_persisted: Optional[bool] = None
     # TODO enum?
-    reel_type: str  # user_reel
-    reel_id: str
+    reel_type: Optional[str] = None  # user_reel
+    reel_id: Optional[str] = None
     # TODO enum?
-    story_share_type: str  # default
-    media: Union[ReelMediaShareItem, ExpiredMediaItem]
+    story_share_type: Optional[str] = None  # default
 
     # Only present when expired
     message: Optional[str] = None
@@ -432,6 +436,12 @@ class StoryShareItem(SerializableAttrs):
         return _dict_to_attrs(cls, data)
 
 
+@dataclass
+class ClipItem(SerializableAttrs):
+    # TODO there are some additional fields in clips
+    clip: MediaShareItem
+
+
 @dataclass(kw_only=True)
 class ThreadItem(SerializableAttrs):
     item_id: Optional[str] = None
@@ -458,6 +468,7 @@ class ThreadItem(SerializableAttrs):
     reactions: Optional[Reactions] = None
     like: Optional[str] = None
     link: Optional[LinkItem] = None
+    clip: Optional[ClipItem] = None
 
     @classmethod
     def deserialize(cls, data: JSON, catch_errors: bool = True) -> Union['ThreadItem', Obj]:

+ 6 - 1
mautrix_instagram/portal.py

@@ -502,8 +502,12 @@ class Portal(DBPortal, BasePortal):
         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_location(self, intent: IntentAPI, item: ThreadItem) -> EventID:
+    async def _handle_instagram_location(self, intent: IntentAPI, item: ThreadItem
+                                         ) -> Optional[EventID]:
         loc = item.location
+        if not loc.lng or not loc.lat:
+            # TODO handle somehow
+            return None
         long_char = "E" if loc.lng > 0 else "W"
         lat_char = "N" if loc.lat > 0 else "S"
 
@@ -600,6 +604,7 @@ class Portal(DBPortal, BasePortal):
                 event_id = await self._handle_instagram_reel_share(source, intent, item)
             elif item.media_share or item.story_share:
                 event_id = await self._handle_instagram_media_share(source, intent, item)
+            # TODO handle item.clip?
             if item.text:
                 event_id = await self._handle_instagram_text(intent, item, item.text)
             elif item.like: