portal.py refactoring
This commit is contained in:
@@ -151,7 +151,7 @@ async def join(evt):
|
|||||||
for chat in updates.chats:
|
for chat in updates.chats:
|
||||||
portal = po.Portal.get_by_entity(chat)
|
portal = po.Portal.get_by_entity(chat)
|
||||||
if portal.mxid:
|
if portal.mxid:
|
||||||
await portal.invite_matrix([evt.sender.mxid])
|
await portal.invite_to_matrix([evt.sender.mxid])
|
||||||
return await evt.reply(f"Invited you to portal of {portal.title}")
|
return await evt.reply(f"Invited you to portal of {portal.title}")
|
||||||
else:
|
else:
|
||||||
await evt.reply(f"Creating room for {chat.title}... This might take a while.")
|
await evt.reply(f"Creating room for {chat.title}... This might take a while.")
|
||||||
|
|||||||
+26
-18
@@ -73,6 +73,8 @@ class Portal:
|
|||||||
if mxid:
|
if mxid:
|
||||||
self.by_mxid[mxid] = self
|
self.by_mxid[mxid] = self
|
||||||
|
|
||||||
|
# region Propegrties
|
||||||
|
|
||||||
@property
|
@property
|
||||||
def tgid_full(self):
|
def tgid_full(self):
|
||||||
return self.tgid, self.tg_receiver
|
return self.tgid, self.tg_receiver
|
||||||
@@ -96,6 +98,17 @@ class Portal:
|
|||||||
def has_bot(self):
|
def has_bot(self):
|
||||||
return self.bot and self.bot.is_in_chat(self.tgid)
|
return self.bot and self.bot.is_in_chat(self.tgid)
|
||||||
|
|
||||||
|
@property
|
||||||
|
def main_intent(self):
|
||||||
|
if not self._main_intent:
|
||||||
|
direct = self.peer_type == "user"
|
||||||
|
puppet = p.Puppet.get(self.tgid) if direct else None
|
||||||
|
self._main_intent = puppet.intent if direct else self.az.intent
|
||||||
|
return self._main_intent
|
||||||
|
|
||||||
|
# endregion
|
||||||
|
# region Deduplication
|
||||||
|
|
||||||
@staticmethod
|
@staticmethod
|
||||||
def _hash_event(event):
|
def _hash_event(event):
|
||||||
# Non-channel messages are unique per-user (wtf telegram), so we have no other choice than
|
# Non-channel messages are unique per-user (wtf telegram), so we have no other choice than
|
||||||
@@ -150,17 +163,10 @@ class Portal:
|
|||||||
def get_input_entity(self, user):
|
def get_input_entity(self, user):
|
||||||
return user.client.get_input_entity(self.peer)
|
return user.client.get_input_entity(self.peer)
|
||||||
|
|
||||||
|
# endregion
|
||||||
# region Matrix room info updating
|
# region Matrix room info updating
|
||||||
|
|
||||||
@property
|
async def invite_to_matrix(self, users):
|
||||||
def main_intent(self):
|
|
||||||
if not self._main_intent:
|
|
||||||
direct = self.peer_type == "user"
|
|
||||||
puppet = p.Puppet.get(self.tgid) if direct else None
|
|
||||||
self._main_intent = puppet.intent if direct else self.az.intent
|
|
||||||
return self._main_intent
|
|
||||||
|
|
||||||
async def invite_matrix(self, users):
|
|
||||||
if isinstance(users, str):
|
if isinstance(users, str):
|
||||||
await self.main_intent.invite(self.mxid, users, check_cache=True)
|
await self.main_intent.invite(self.mxid, users, check_cache=True)
|
||||||
elif isinstance(users, list):
|
elif isinstance(users, list):
|
||||||
@@ -169,12 +175,12 @@ class Portal:
|
|||||||
else:
|
else:
|
||||||
raise ValueError("Invalid invite identifier given to invite_matrix()")
|
raise ValueError("Invalid invite identifier given to invite_matrix()")
|
||||||
|
|
||||||
async def update_after_create(self, user, entity, direct, puppet=None,
|
async def update_matrix_room(self, user, entity, direct, puppet=None,
|
||||||
levels=None, users=None, participants=None):
|
levels=None, users=None, participants=None):
|
||||||
if not direct:
|
if not direct:
|
||||||
await self.update_info(user, entity)
|
await self.update_info(user, entity)
|
||||||
if not users or not participants:
|
if not users or not participants:
|
||||||
users, participants = await self.get_users(user, entity)
|
users, participants = await self._get_users(user, entity)
|
||||||
await self.sync_telegram_users(user, users)
|
await self.sync_telegram_users(user, users)
|
||||||
await self.update_telegram_participants(participants, levels)
|
await self.update_telegram_participants(participants, levels)
|
||||||
else:
|
else:
|
||||||
@@ -188,8 +194,8 @@ class Portal:
|
|||||||
if update_if_exists:
|
if update_if_exists:
|
||||||
if not entity:
|
if not entity:
|
||||||
entity = await user.client.get_entity(self.peer)
|
entity = await user.client.get_entity(self.peer)
|
||||||
await self.update_after_create(user, entity, self.peer_type == "user")
|
await self.update_matrix_room(user, entity, self.peer_type == "user")
|
||||||
await self.invite_matrix(invites or [])
|
await self.invite_to_matrix(invites or [])
|
||||||
return self.mxid
|
return self.mxid
|
||||||
async with self._room_create_lock:
|
async with self._room_create_lock:
|
||||||
return await self._create_matrix_room(user, entity, invites)
|
return await self._create_matrix_room(user, entity, invites)
|
||||||
@@ -230,7 +236,7 @@ class Portal:
|
|||||||
power_levels = self._get_base_power_levels({}, entity)
|
power_levels = self._get_base_power_levels({}, entity)
|
||||||
users = participants = None
|
users = participants = None
|
||||||
if not direct:
|
if not direct:
|
||||||
users, participants = await self.get_users(user, entity)
|
users, participants = await self._get_users(user, entity)
|
||||||
self._participants_to_power_levels(participants, power_levels)
|
self._participants_to_power_levels(participants, power_levels)
|
||||||
initial_state = [{
|
initial_state = [{
|
||||||
"type": "m.room.power_levels",
|
"type": "m.room.power_levels",
|
||||||
@@ -248,8 +254,8 @@ class Portal:
|
|||||||
self.save()
|
self.save()
|
||||||
self.az.state_store.set_power_levels(self.mxid, power_levels)
|
self.az.state_store.set_power_levels(self.mxid, power_levels)
|
||||||
user.register_portal(self)
|
user.register_portal(self)
|
||||||
await self.update_after_create(user, entity, direct, puppet,
|
await self.update_matrix_room(user, entity, direct, puppet,
|
||||||
levels=power_levels, users=users, participants=participants)
|
levels=power_levels, users=users, participants=participants)
|
||||||
|
|
||||||
def _get_base_power_levels(self, levels=None, entity=None):
|
def _get_base_power_levels(self, levels=None, entity=None):
|
||||||
levels = levels or {}
|
levels = levels or {}
|
||||||
@@ -264,6 +270,8 @@ class Portal:
|
|||||||
levels["events"]["m.room.topic"] = 50 if self.peer_type == "channel" else 99
|
levels["events"]["m.room.topic"] = 50 if self.peer_type == "channel" else 99
|
||||||
levels["events"]["m.room.power_levels"] = 75
|
levels["events"]["m.room.power_levels"] = 75
|
||||||
levels["events"]["m.room.history_visibility"] = 75
|
levels["events"]["m.room.history_visibility"] = 75
|
||||||
|
levels["state_default"] = 50
|
||||||
|
levels["users_default"] = 0
|
||||||
levels["events_default"] = (50 if self.peer_type == "channel" and not entity.megagroup
|
levels["events_default"] = (50 if self.peer_type == "channel" and not entity.megagroup
|
||||||
else 0)
|
else 0)
|
||||||
if "users" not in levels:
|
if "users" not in levels:
|
||||||
@@ -396,7 +404,7 @@ class Portal:
|
|||||||
return True
|
return True
|
||||||
return False
|
return False
|
||||||
|
|
||||||
async def get_users(self, user, entity):
|
async def _get_users(self, user, entity):
|
||||||
if self.peer_type == "chat":
|
if self.peer_type == "chat":
|
||||||
chat = await user.client(GetFullChatRequest(chat_id=self.tgid))
|
chat = await user.client(GetFullChatRequest(chat_id=self.tgid))
|
||||||
return chat.users, chat.full_chat.participants.participants
|
return chat.users, chat.full_chat.participants.participants
|
||||||
|
|||||||
Reference in New Issue
Block a user