소스 검색

Add support for inviting members to groups (#246)

Malte E 3 년 전
부모
커밋
e78ec2d4e2
3개의 변경된 파일29개의 추가작업 그리고 3개의 파일을 삭제
  1. 1 1
      ROADMAP.md
  2. 16 1
      mautrix_signal/matrix.py
  3. 12 1
      mautrix_signal/portal.py

+ 1 - 1
ROADMAP.md

@@ -19,7 +19,7 @@
     * [x] Avatar
   * [ ] Membership actions
     * [x] Join (accept invite)
-    * [ ] Invite
+    * [x] Invite
     * [x] Leave
     * [ ] Kick
   * [ ] Typing notifications

+ 16 - 1
mautrix_signal/matrix.py

@@ -17,7 +17,7 @@ from __future__ import annotations
 
 from typing import TYPE_CHECKING
 
-from mautrix.bridge import BaseMatrixHandler
+from mautrix.bridge import BaseMatrixHandler, RejectMatrixInvite
 from mautrix.types import (
     Event,
     EventID,
@@ -54,6 +54,21 @@ class MatrixHandler(BaseMatrixHandler):
 
         super().__init__(bridge=bridge)
 
+    async def handle_invite(
+        self, room_id: RoomID, user_id: UserID, inviter: u.User, event_id: EventID
+    ) -> None:
+        user = await u.User.get_by_mxid(user_id, create=False)
+        if not user or not await user.is_logged_in():
+            return
+        portal = await po.Portal.get_by_mxid(room_id)
+        if portal and not portal.is_direct:
+            try:
+                await portal.handle_matrix_invite(inviter, user)
+            except RejectMatrixInvite as e:
+                await portal.main_intent.send_notice(
+                    portal.mxid, f"Failed to invite {user.mxid} on Signal: {e}"
+                )
+
     async def send_welcome_message(self, room_id: RoomID, inviter: u.User) -> None:
         await super().send_welcome_message(room_id, inviter)
         if not inviter.notice_room:

+ 12 - 1
mautrix_signal/portal.py

@@ -50,7 +50,7 @@ from mausignald.types import (
     Sticker,
 )
 from mautrix.appservice import AppService, IntentAPI
-from mautrix.bridge import BasePortal, async_getter_lock
+from mautrix.bridge import BasePortal, RejectMatrixInvite, async_getter_lock
 from mautrix.errors import IntentError, MatrixError, MForbidden
 from mautrix.types import (
     AudioInfo,
@@ -725,6 +725,17 @@ class Portal(DBPortal, BasePortal):
                 await self.signal.leave_group(user.username, self.chat_id)
             # TODO cleanup if empty
 
+    async def handle_matrix_invite(self, invited_by: u.User, user: u.User | p.Puppet) -> None:
+        if self.is_direct:
+            raise RejectMatrixInvite("You can't invite additional users to private chats.")
+
+        try:
+            await self.signal.update_group(
+                invited_by.username, self.chat_id, add_members=[user.address]
+            )
+        except RPCError as e:
+            raise RejectMatrixInvite(e.message) from e
+
     async def handle_matrix_name(self, user: u.User, name: str) -> None:
         if self.name == name or self.is_direct or not name:
             return