|
@@ -770,6 +770,59 @@ class Portal(DBPortal, BasePortal):
|
|
await self.signal.leave_group(user.username, self.chat_id)
|
|
await self.signal.leave_group(user.username, self.chat_id)
|
|
# TODO cleanup if empty
|
|
# TODO cleanup if empty
|
|
|
|
|
|
|
|
+ async def kick_matrix(self, user: u.User | p.Puppet, source: u.User) -> None:
|
|
|
|
+ try:
|
|
|
|
+ await self.signal.update_group(
|
|
|
|
+ source.username, self.chat_id, remove_members=[user.address]
|
|
|
|
+ )
|
|
|
|
+ except Exception as e:
|
|
|
|
+ self.log.exception(f"Failed to kick Signal user: {e}")
|
|
|
|
+ info = await self.signal.get_group(source.username, self.chat_id)
|
|
|
|
+ if user.address in info.members:
|
|
|
|
+ await self.main_intent.invite_user(
|
|
|
|
+ self.mxid,
|
|
|
|
+ user.mxid,
|
|
|
|
+ check_cache=True,
|
|
|
|
+ reason=f"Failed to kick Signal user: {e}",
|
|
|
|
+ )
|
|
|
|
+ await user.intent_for(self).ensure_joined(self.mxid)
|
|
|
|
+
|
|
|
|
+ async def ban_matrix(self, user: u.User | p.Puppet, source: u.User) -> None:
|
|
|
|
+ try:
|
|
|
|
+ await self.signal.ban_user(source.username, self.chat_id, users=[user.address])
|
|
|
|
+ except Exception as e:
|
|
|
|
+ self.log.exception(f"Failed to ban Signal user: {e}")
|
|
|
|
+ info = await self.signal.get_group(source.username, self.chat_id)
|
|
|
|
+ is_banned = False
|
|
|
|
+ if info.banned_members:
|
|
|
|
+ for member in info.banned_members:
|
|
|
|
+ is_banned = user.address.uuid == member.uuid or is_banned
|
|
|
|
+ if not is_banned:
|
|
|
|
+ await self.main_intent.unban_user(
|
|
|
|
+ self.mxid, user.mxid, reason=f"Failed to ban Signal user: {e}"
|
|
|
|
+ )
|
|
|
|
+ if user.address in info.members:
|
|
|
|
+ await self.main_intent.invite_user(
|
|
|
|
+ self.mxid,
|
|
|
|
+ user.mxid,
|
|
|
|
+ check_cache=True,
|
|
|
|
+ )
|
|
|
|
+ await user.intent_for(self).ensure_joined(self.mxid)
|
|
|
|
+
|
|
|
|
+ async def unban_matrix(self, user: u.User | p.Puppet, source: u.User) -> None:
|
|
|
|
+ try:
|
|
|
|
+ await self.signal.unban_user(source.username, self.chat_id, users=[user.address])
|
|
|
|
+ except Exception as e:
|
|
|
|
+ self.log.exception(f"Failed to unban Signal user: {e}")
|
|
|
|
+ info = await self.signal.get_group(source.username, self.chat_id)
|
|
|
|
+ if info.banned_members:
|
|
|
|
+ for member in info.banned_members:
|
|
|
|
+ if member.uuid == user.address.uuid:
|
|
|
|
+ await self.main_intent.ban_user(
|
|
|
|
+ self.mxid, user.mxid, reason=f"Failed to unban Signal user: {e}"
|
|
|
|
+ )
|
|
|
|
+ return
|
|
|
|
+
|
|
async def handle_matrix_invite(self, invited_by: u.User, user: u.User | p.Puppet) -> None:
|
|
async def handle_matrix_invite(self, invited_by: u.User, user: u.User | p.Puppet) -> None:
|
|
if self.is_direct:
|
|
if self.is_direct:
|
|
raise RejectMatrixInvite("You can't invite additional users to private chats.")
|
|
raise RejectMatrixInvite("You can't invite additional users to private chats.")
|