Merge branch 'master' into rlottie
This commit is contained in:
@@ -147,7 +147,8 @@ class BasePortal(ABC):
|
||||
|
||||
@property
|
||||
def has_bot(self) -> bool:
|
||||
return bool(self.bot and self.bot.is_in_chat(self.tgid))
|
||||
return ((bool(self.bot) and self.bot.is_in_chat(self.tgid))
|
||||
or (self.peer_type == "user" and self.tg_receiver == self.bot.tgid))
|
||||
|
||||
@property
|
||||
def main_intent(self) -> IntentAPI:
|
||||
|
||||
@@ -90,6 +90,8 @@ class PortalMatrix(BasePortal, MautrixBasePortal, ABC):
|
||||
**kwargs: Any) -> None:
|
||||
if not self.has_bot:
|
||||
return
|
||||
elif self.peer_type == "user" and not config["bridge.relaybot.private_chat.state_changes"]:
|
||||
return
|
||||
async with self.send_lock(self.bot.tgid):
|
||||
message = await self._get_state_change_message(event, user, **kwargs)
|
||||
if not message:
|
||||
@@ -124,27 +126,33 @@ class PortalMatrix(BasePortal, MautrixBasePortal, ABC):
|
||||
await user.client.send_read_acknowledge(self.peer, max_id=message.tgid,
|
||||
clear_mentions=True)
|
||||
|
||||
async def kick_matrix(self, user: Union['u.User', 'p.Puppet'], source: 'u.User') -> None:
|
||||
async def _preproc_kick_ban(self, user: Union['u.User', 'p.Puppet'], source: 'u.User'
|
||||
) -> Optional['AbstractUser']:
|
||||
if user.tgid == source.tgid:
|
||||
return
|
||||
return None
|
||||
if self.peer_type == "user" and user.tgid == self.tgid:
|
||||
self.delete()
|
||||
try:
|
||||
del self.by_tgid[self.tgid_full]
|
||||
del self.by_mxid[self.mxid]
|
||||
except KeyError:
|
||||
pass
|
||||
return
|
||||
return None
|
||||
if isinstance(user, u.User) and await user.needs_relaybot(self):
|
||||
if not self.bot:
|
||||
return
|
||||
# TODO kick and ban message
|
||||
return
|
||||
return None
|
||||
# TODO kick message
|
||||
return None
|
||||
if await source.needs_relaybot(self):
|
||||
if not self.has_bot:
|
||||
return
|
||||
source = self.bot
|
||||
await source.client.kick_participant(self.peer, user.peer)
|
||||
return None
|
||||
return self.bot
|
||||
return source
|
||||
|
||||
async def kick_matrix(self, user: Union['u.User', 'p.Puppet'], source: 'u.User') -> None:
|
||||
source = await self._preproc_kick_ban(user, source)
|
||||
if source is not None:
|
||||
await source.client.kick_participant(self.peer, user.peer)
|
||||
|
||||
async def ban_matrix(self, user: Union['u.User', 'p.Puppet'], source: 'u.User'):
|
||||
source = await self._preproc_kick_ban(user, source)
|
||||
if source is not None:
|
||||
await source.client.edit_permissions(self.peer, user.peer, view_messages=False)
|
||||
|
||||
async def leave_matrix(self, user: 'u.User', event_id: EventID) -> None:
|
||||
if await user.needs_relaybot(self):
|
||||
|
||||
@@ -164,7 +164,8 @@ class PortalMetadata(BasePortal, ABC):
|
||||
AddChatUserRequest(chat_id=self.tgid, user_id=puppet.tgid, fwd_limit=0))
|
||||
elif self.peer_type == "channel":
|
||||
await source.client(InviteToChannelRequest(channel=self.peer, users=[puppet.tgid]))
|
||||
else:
|
||||
# We don't care if there are invites for private chat portals with the relaybot.
|
||||
elif not self.bot or self.tg_receiver != self.bot.tgid:
|
||||
raise ValueError("Invalid peer type for Telegram user invite")
|
||||
|
||||
async def sync_matrix_members(self) -> None:
|
||||
@@ -293,6 +294,11 @@ class PortalMetadata(BasePortal, ABC):
|
||||
if not direct:
|
||||
users, participants = await self._get_users(user, entity)
|
||||
self._participants_to_power_levels(participants, power_levels)
|
||||
elif self.tg_receiver == self.bot.tgid:
|
||||
invites = config["bridge.relaybot.private_chat.invite"]
|
||||
for invite in invites:
|
||||
power_levels.users[invite] = 100
|
||||
self.title = puppet.displayname
|
||||
initial_state = [{
|
||||
"type": EventType.ROOM_POWER_LEVELS.serialize(),
|
||||
"content": power_levels.serialize(),
|
||||
@@ -302,11 +308,15 @@ class PortalMetadata(BasePortal, ABC):
|
||||
"type": "m.room.related_groups",
|
||||
"content": {"groups": [config["appservice.community_id"]]},
|
||||
})
|
||||
creation_content = {}
|
||||
if not config["bridge.federate_rooms"]:
|
||||
creation_content["m.federate"] = False
|
||||
|
||||
room_id = await self.main_intent.create_room(alias_localpart=alias, preset=preset,
|
||||
is_direct=direct, invitees=invites or [],
|
||||
name=self.title, topic=self.about,
|
||||
initial_state=initial_state)
|
||||
initial_state=initial_state,
|
||||
creation_content=creation_content)
|
||||
if not room_id:
|
||||
raise Exception(f"Failed to create room")
|
||||
|
||||
@@ -341,7 +351,7 @@ class PortalMetadata(BasePortal, ABC):
|
||||
self.log.debug(f"default_banned_rights is None in {entity}")
|
||||
dbr = ChatBannedRights(invite_users=True, change_info=True, pin_messages=True,
|
||||
send_stickers=False, send_messages=False, until_date=None)
|
||||
levels.ban = 99
|
||||
levels.ban = 50
|
||||
levels.kick = 50
|
||||
levels.redact = 50
|
||||
levels.invite = 50 if dbr.invite_users else 0
|
||||
|
||||
Reference in New Issue
Block a user