Bridge changes to permissions from Telegram
This commit is contained in:
@@ -11,6 +11,7 @@
|
|||||||
### Improved
|
### Improved
|
||||||
* Redacting reactions on Matrix no longer removes the user's other reactions to
|
* Redacting reactions on Matrix no longer removes the user's other reactions to
|
||||||
the same message (premium users can have up to 3 reactions per message).
|
the same message (premium users can have up to 3 reactions per message).
|
||||||
|
* Changes to default user permissions on Telegram are now bridged.
|
||||||
|
|
||||||
### Fixed
|
### Fixed
|
||||||
|
|
||||||
|
|||||||
@@ -41,6 +41,7 @@ from telethon.tl.types import (
|
|||||||
TypeUpdate,
|
TypeUpdate,
|
||||||
UpdateChannel,
|
UpdateChannel,
|
||||||
UpdateChannelUserTyping,
|
UpdateChannelUserTyping,
|
||||||
|
UpdateChatDefaultBannedRights,
|
||||||
UpdateChatParticipantAdmin,
|
UpdateChatParticipantAdmin,
|
||||||
UpdateChatParticipants,
|
UpdateChatParticipants,
|
||||||
UpdateChatUserTyping,
|
UpdateChatUserTyping,
|
||||||
@@ -346,6 +347,8 @@ class AbstractUser(ABC):
|
|||||||
await self.update_admin(update)
|
await self.update_admin(update)
|
||||||
elif isinstance(update, UpdateChatParticipants):
|
elif isinstance(update, UpdateChatParticipants):
|
||||||
await self.update_participants(update)
|
await self.update_participants(update)
|
||||||
|
elif isinstance(update, UpdateChatDefaultBannedRights):
|
||||||
|
await self.update_default_banned_rights(update)
|
||||||
elif isinstance(update, (UpdatePinnedMessages, UpdatePinnedChannelMessages)):
|
elif isinstance(update, (UpdatePinnedMessages, UpdatePinnedChannelMessages)):
|
||||||
await self.update_pinned_messages(update)
|
await self.update_pinned_messages(update)
|
||||||
elif isinstance(update, (UpdateUserName, UpdateUserPhoto)):
|
elif isinstance(update, (UpdateUserName, UpdateUserPhoto)):
|
||||||
@@ -392,6 +395,12 @@ class AbstractUser(ABC):
|
|||||||
if portal and portal.mxid:
|
if portal and portal.mxid:
|
||||||
await portal.update_power_levels(update.participants.participants)
|
await portal.update_power_levels(update.participants.participants)
|
||||||
|
|
||||||
|
@staticmethod
|
||||||
|
async def update_default_banned_rights(update: UpdateChatDefaultBannedRights) -> None:
|
||||||
|
portal = await po.Portal.get_by_entity(update.peer)
|
||||||
|
if portal and portal.mxid:
|
||||||
|
await portal.update_default_banned_rights(update.default_banned_rights)
|
||||||
|
|
||||||
async def update_read_receipt(self, update: UpdateReadHistoryOutbox) -> None:
|
async def update_read_receipt(self, update: UpdateReadHistoryOutbox) -> None:
|
||||||
if not isinstance(update.peer, PeerUser):
|
if not isinstance(update.peer, PeerUser):
|
||||||
self.log.debug("Unexpected read receipt peer: %s", update.peer)
|
self.log.debug("Unexpected read receipt peer: %s", update.peer)
|
||||||
|
|||||||
@@ -65,6 +65,7 @@ from telethon.tl.types import (
|
|||||||
Channel,
|
Channel,
|
||||||
ChannelFull,
|
ChannelFull,
|
||||||
Chat,
|
Chat,
|
||||||
|
ChatBannedRights,
|
||||||
ChatFull,
|
ChatFull,
|
||||||
ChatPhoto,
|
ChatPhoto,
|
||||||
ChatPhotoEmpty,
|
ChatPhotoEmpty,
|
||||||
@@ -994,6 +995,12 @@ class Portal(DBPortal, BasePortal):
|
|||||||
if await putil.participants_to_power_levels(self, users, levels):
|
if await putil.participants_to_power_levels(self, users, levels):
|
||||||
await self.main_intent.set_power_levels(self.mxid, levels)
|
await self.main_intent.set_power_levels(self.mxid, levels)
|
||||||
|
|
||||||
|
async def update_default_banned_rights(self, dbr: ChatBannedRights) -> None:
|
||||||
|
self.log.debug("Default rights in chat changed: %s", dbr)
|
||||||
|
levels = await self.main_intent.get_power_levels(self.mxid)
|
||||||
|
levels = putil.get_base_power_levels(self, levels, dbr=dbr)
|
||||||
|
await self.main_intent.set_power_levels(self.mxid, levels)
|
||||||
|
|
||||||
async def _add_bot_chat(self, bot: User) -> None:
|
async def _add_bot_chat(self, bot: User) -> None:
|
||||||
if self.bot and bot.id == self.bot.tgid:
|
if self.bot and bot.id == self.bot.tgid:
|
||||||
await self.bot.add_chat(self.tgid, self.peer_type)
|
await self.bot.add_chat(self.tgid, self.peer_type)
|
||||||
|
|||||||
@@ -34,8 +34,12 @@ from ..types import TelegramID
|
|||||||
|
|
||||||
|
|
||||||
def get_base_power_levels(
|
def get_base_power_levels(
|
||||||
portal: po.Portal, levels: PowerLevelContent = None, entity: TypeChat = None
|
portal: po.Portal,
|
||||||
|
levels: PowerLevelContent = None,
|
||||||
|
entity: TypeChat | None = None,
|
||||||
|
dbr: ChatBannedRights | None = None,
|
||||||
) -> PowerLevelContent:
|
) -> PowerLevelContent:
|
||||||
|
is_initial = not levels
|
||||||
levels = levels or PowerLevelContent()
|
levels = levels or PowerLevelContent()
|
||||||
if portal.peer_type == "user":
|
if portal.peer_type == "user":
|
||||||
overrides = portal.config["bridge.initial_power_level_overrides.user"]
|
overrides = portal.config["bridge.initial_power_level_overrides.user"]
|
||||||
@@ -51,7 +55,7 @@ def get_base_power_levels(
|
|||||||
levels.events_default = overrides.get("events_default", 0)
|
levels.events_default = overrides.get("events_default", 0)
|
||||||
else:
|
else:
|
||||||
overrides = portal.config["bridge.initial_power_level_overrides.group"]
|
overrides = portal.config["bridge.initial_power_level_overrides.group"]
|
||||||
dbr = entity.default_banned_rights
|
dbr = dbr or entity.default_banned_rights
|
||||||
if not dbr:
|
if not dbr:
|
||||||
portal.log.debug(f"default_banned_rights is None in {entity}")
|
portal.log.debug(f"default_banned_rights is None in {entity}")
|
||||||
dbr = ChatBannedRights(
|
dbr = ChatBannedRights(
|
||||||
@@ -80,16 +84,14 @@ def get_base_power_levels(
|
|||||||
levels.events_default = overrides.get(
|
levels.events_default = overrides.get(
|
||||||
"events_default",
|
"events_default",
|
||||||
50
|
50
|
||||||
if portal.peer_type == "channel" and not entity.megagroup or dbr.send_messages
|
if portal.peer_type == "channel" and not portal.megagroup or dbr.send_messages
|
||||||
else 0,
|
else 0,
|
||||||
)
|
)
|
||||||
for evt_type, value in overrides.get("events", {}).items():
|
for evt_type, value in overrides.get("events", {}).items():
|
||||||
levels.events[EventType.find(evt_type)] = value
|
levels.events[EventType.find(evt_type)] = value
|
||||||
userlevel_overrides = overrides.get("users", {})
|
userlevel_overrides = overrides.get("users", {})
|
||||||
bot_level = levels.get_user_level(portal.main_intent.mxid)
|
if is_initial:
|
||||||
for user, user_level in levels.users.items():
|
levels.users.update(userlevel_overrides)
|
||||||
if user_level < bot_level:
|
|
||||||
levels.users[user] = userlevel_overrides.get(user, 0)
|
|
||||||
if portal.main_intent.mxid not in levels.users:
|
if portal.main_intent.mxid not in levels.users:
|
||||||
levels.users[portal.main_intent.mxid] = 100
|
levels.users[portal.main_intent.mxid] = 100
|
||||||
return levels
|
return levels
|
||||||
|
|||||||
Reference in New Issue
Block a user