Переглянути джерело

Add join group command

Probably doesn't work perfectly
Tulir Asokan 3 роки тому
батько
коміт
ca3169c4ab
3 змінених файлів з 39 додано та 1 видалено
  1. 6 1
      mausignald/signald.py
  2. 10 0
      mausignald/types.py
  3. 23 0
      mautrix_signal/commands/signal.py

+ 6 - 1
mausignald/signald.py

@@ -11,7 +11,7 @@ import asyncio
 
 from mautrix.util.logging import TraceLogger
 
-from .errors import AuthorizationFailedError, InternalError, RPCError, UnexpectedResponse
+from .errors import AuthorizationFailedError, RPCError, UnexpectedResponse
 from .rpc import CONNECT_EVENT, DISCONNECT_EVENT, SignaldRPCClient
 from .types import (
     Account,
@@ -24,6 +24,7 @@ from .types import (
     GroupID,
     GroupV2,
     IncomingMessage,
+    JoinGroupResponse,
     LinkPreview,
     LinkSession,
     Mention,
@@ -320,6 +321,10 @@ class SignaldClient(SignaldRPCClient):
         v2 = [GroupV2.deserialize(group) for group in resp.get("groups", [])]
         return legacy + v2
 
+    async def join_group(self, username: str, uri: str) -> JoinGroupResponse:
+        resp = await self.request_v1("join_group", account=username, uri=uri)
+        return JoinGroupResponse.deserialize(resp)
+
     async def update_group(
         self,
         username: str,

+ 10 - 0
mausignald/types.py

@@ -591,3 +591,13 @@ class WebsocketConnectionStateChangeEvent(SerializableAttrs):
     account: str
     socket: Optional[WebsocketType] = None
     exception: Optional[str] = None
+
+
+@dataclass
+class JoinGroupResponse(SerializableAttrs):
+    group_id: str = field(json="groupID")
+    pending_admin_approval: bool = field(json="pendingAdminApproval")
+    member_count: Optional[int] = field(json="memberCount", default=None)
+    revision: Optional[int] = None
+    title: Optional[str] = None
+    description: Optional[str] = None

+ 23 - 0
mautrix_signal/commands/signal.py

@@ -101,6 +101,29 @@ async def pm(evt: CommandEvent) -> None:
     await evt.reply(f"Created a portal room with {_pill(puppet)} and invited you to it")
 
 
+@command_handler(
+    needs_auth=True,
+    management_only=False,
+    help_section=SECTION_SIGNAL,
+    help_text="Join a Signal group with an invite link",
+    help_args="<_link_>",
+)
+async def join(evt: CommandEvent) -> EventID:
+    if len(evt.args) == 0:
+        return await evt.reply("**Usage:** `$cmdprefix+sp join <invite link>`")
+    try:
+        resp = await evt.bridge.signal.join_group(evt.sender.username, evt.args[0])
+        if resp.pending_admin_approval:
+            return await evt.reply(
+                f"Successfully requested to join {resp.title}, waiting for admin approval."
+            )
+        else:
+            return await evt.reply(f"Successfully joined {resp.title}")
+    except Exception:
+        evt.log.exception("Error trying to join group")
+        await evt.reply("Failed to join group (see logs for more details)")
+
+
 @command_handler(
     needs_auth=True,
     management_only=False,