Jelajahi Sumber

message resend success: send SUCCESS checkpoint

Signed-off-by: Sumner Evans <sumner@beeper.com>
Sumner Evans 2 tahun lalu
induk
melakukan
eb12bd091b
3 mengubah file dengan 33 tambahan dan 3 penghapusan
  1. 6 0
      mausignald/types.py
  2. 7 1
      mautrix_signal/signal.py
  3. 20 2
      mautrix_signal/user.py

+ 6 - 0
mausignald/types.py

@@ -672,6 +672,12 @@ class WebsocketType(SerializableEnum):
     UNIDENTIFIED = "UNIDENTIFIED"
 
 
+@dataclass
+class MessageResendSuccessEvent(SerializableAttrs):
+    account: str
+    timestamp: int
+
+
 @dataclass
 class WebsocketConnectionStateChangeEvent(SerializableAttrs):
     state: WebsocketConnectionState

+ 7 - 1
mautrix_signal/signal.py

@@ -26,6 +26,7 @@ from mausignald.types import (
     ErrorMessage,
     IncomingMessage,
     MessageData,
+    MessageResendSuccessEvent,
     OfferMessageType,
     OwnReadReceipt,
     ReceiptMessage,
@@ -37,7 +38,6 @@ from mausignald.types import (
 )
 from mautrix.types import EventID, EventType, Format, MessageType, TextMessageEventContent
 from mautrix.util.logging import TraceLogger
-from mautrix.util.message_send_checkpoint import MessageSendCheckpointStatus
 
 from . import portal as po, puppet as pu, user as u
 from .db import Message as DBMessage
@@ -67,6 +67,7 @@ class SignalHandler(SignaldClient):
         self.add_event_handler(
             WebsocketConnectionStateChangeEvent, self.on_websocket_connection_state_change
         )
+        self.add_event_handler(MessageResendSuccessEvent, self.on_message_resend_success)
 
     async def on_message(self, evt: IncomingMessage) -> None:
         sender = await pu.Puppet.get_by_address(evt.source, resolve_via=evt.account)
@@ -179,6 +180,11 @@ class SignalHandler(SignaldClient):
         user = await u.User.get_by_username(evt.account)
         user.on_websocket_connection_state_change(evt)
 
+    @staticmethod
+    async def on_message_resend_success(evt: MessageResendSuccessEvent):
+        user = await u.User.get_by_username(evt.account)
+        user.on_message_resend_success(evt)
+
     async def handle_message(
         self,
         user: u.User,

+ 20 - 2
mautrix_signal/user.py

@@ -26,19 +26,21 @@ from mausignald.types import (
     Account,
     Address,
     GroupV2,
+    MessageResendSuccessEvent,
     Profile,
     WebsocketConnectionState,
     WebsocketConnectionStateChangeEvent,
 )
 from mautrix.appservice import AppService
 from mautrix.bridge import AutologinError, BaseUser, async_getter_lock
-from mautrix.types import RoomID, UserID
+from mautrix.types import EventType, RoomID, UserID
 from mautrix.util.bridge_state import BridgeState, BridgeStateEvent
+from mautrix.util.message_send_checkpoint import MessageSendCheckpointStatus
 from mautrix.util.opt_prometheus import Gauge
 
 from . import portal as po, puppet as pu
 from .config import Config
-from .db import User as DBUser
+from .db import Message as DBMessage, User as DBUser
 
 if TYPE_CHECKING:
     from .__main__ import SignalBridge
@@ -248,6 +250,22 @@ class User(DBUser, BaseUser):
 
         self._websocket_connection_state = bridge_state
 
+    async def on_message_resend_success(self, evt: MessageResendSuccessEvent):
+        # These messages mean we need to resend the message to that user.
+        my_uuid = self.address.uuid
+        self.log.debug(f"Successfully resent message {my_uuid}/{evt.timestamp}")
+        message = await DBMessage.find_by_sender_timestamp(my_uuid, evt.timestamp)
+        if not message:
+            self.log.warning("couldn't find message that was resent")
+            return
+        self.log.debug(f"Successfully resent {message.mxid} in {message.mx_room}")
+        self.send_remote_checkpoint(
+            status=MessageSendCheckpointStatus.SUCCESS,
+            event_id=message.mxid,
+            room_id=message.mx_room,
+            event_type=EventType.ROOM_MESSAGE,
+        )
+
     async def _sync_puppet(self) -> None:
         puppet = await self.get_puppet()
         if not puppet: