浏览代码

Add bridge and get-id commands

Maximilian Gaedig 2 年之前
父节点
当前提交
5960cc4288
共有 2 个文件被更改,包括 71 次插入1 次删除
  1. 62 1
      mautrix_signal/commands/signal.py
  2. 9 0
      mautrix_signal/portal.py

+ 62 - 1
mautrix_signal/commands/signal.py

@@ -25,7 +25,7 @@ from mautrix.bridge.commands import SECTION_ADMIN, HelpSection, command_handler
 from mautrix.types import ContentURI, EventID, EventType, PowerLevelStateEventContent, RoomID
 from mautrix.types import ContentURI, EventID, EventType, PowerLevelStateEventContent, RoomID
 
 
 from .. import portal as po, puppet as pu
 from .. import portal as po, puppet as pu
-from ..util import normalize_number
+from ..util import normalize_number, id_to_str
 from .auth import make_qr
 from .auth import make_qr
 from .typehint import CommandEvent
 from .typehint import CommandEvent
 
 
@@ -352,6 +352,67 @@ async def create(evt: CommandEvent) -> EventID:
     await portal.create_signal_group(evt.sender, levels)
     await portal.create_signal_group(evt.sender, levels)
     await evt.reply(f"Signal chat created. ID: {portal.chat_id}")
     await evt.reply(f"Signal chat created. ID: {portal.chat_id}")
 
 
+@command_handler(
+    needs_auth=True,
+    management_only=False,
+    help_section=SECTION_SIGNAL,
+    help_text="Get the current Signal group ID.",
+)
+async def get_id(evt: CommandEvent) -> EventID:
+    if evt.portal:
+        return await evt.reply(f"ID: {evt.portal.chat_id}")
+    await evt.reply("This is not a portal room.")
+    
+
+@command_handler(
+    needs_auth=True,
+    management_only=False,
+    help_section=SECTION_SIGNAL,
+    help_text="Bridge the current Matrix room to the Signal chat with the given ID",
+    help_args="<id>",
+)
+async def bridge(evt: CommandEvent) -> EventID:
+    if evt.portal:
+        return await evt.reply("This is already a portal room.")
+    chat_id = GroupID(evt.args[0])
+    title, about, levels, encrypted, avatar_url = await get_initial_state(
+        evt.az.intent, evt.room_id
+    )
+    portal = await po.Portal.get_by_chat_id(
+        chat_id, create=True
+    )
+    if portal.mxid:
+        await evt.reply(
+            f"You already have a chat with the groupID {id_to_str(chat_id)}: "
+            f"[{portal.mxid}](https://matrix.to/#/{portal.mxid})"
+        )
+        await portal.main_intent.invite_user(portal.mxid, evt.sender.mxid)
+        return
+    
+    portal = po.Portal(
+        chat_id=chat_id,
+        mxid=evt.room_id,
+        name=title,
+        topic=about or "",
+        encrypted=encrypted,
+        receiver="",
+        avatar_url=avatar_url,
+    )
+    bot_pl = levels.get_user_level(evt.az.bot_mxid)
+    if bot_pl < levels.get_event_level(EventType.ROOM_POWER_LEVELS):
+        await evt.reply(missing_power_warning.format(bot_mxid=evt.az.bot_mxid))
+    elif bot_pl <= 50:
+        await evt.reply(low_power_warning.format(bot_mxid=evt.az.bot_mxid))
+    if levels.state_default < 50 and (
+        levels.events[EventType.ROOM_NAME] >= 50
+        or levels.events[EventType.ROOM_AVATAR] >= 50
+        or levels.events[EventType.ROOM_TOPIC] >= 50
+    ):
+        await evt.reply(meta_power_warning)
+
+    await portal.bridge_signal_group(evt.sender, levels)
+    await evt.reply(f"Signal chat bridged. ID: {portal.chat_id}")
+
 
 
 async def get_initial_state(
 async def get_initial_state(
     intent: IntentAPI, room_id: RoomID
     intent: IntentAPI, room_id: RoomID

+ 9 - 0
mautrix_signal/portal.py

@@ -1509,6 +1509,15 @@ class Portal(DBPortal, BasePortal):
         await self.update()
         await self.update()
         await self.update_bridge_info()
         await self.update_bridge_info()
 
 
+    async def bridge_signal_group(
+        self, source: u.User, levels: PowerLevelStateEventContent
+    ) -> None:
+        await self._postinit()
+        await self.insert()
+        await self.handle_matrix_power_level(source, levels)
+        await self.update()
+        await self.update_bridge_info()
+
     # endregion
     # endregion
     # region Updating portal info
     # region Updating portal info