Fix possible duplicate room creation after upgrading group and restarting
This commit is contained in:
@@ -386,7 +386,7 @@ async def upgrade(evt: CommandEvent) -> Dict:
|
|||||||
|
|
||||||
try:
|
try:
|
||||||
await portal.upgrade_telegram_chat(evt.sender)
|
await portal.upgrade_telegram_chat(evt.sender)
|
||||||
return await evt.reply(f"Group upgraded to supergroup. New ID: {portal.tgid}")
|
return await evt.reply(f"Group upgraded to supergroup. New ID: -100{portal.tgid}")
|
||||||
except ChatAdminRequiredError:
|
except ChatAdminRequiredError:
|
||||||
return await evt.reply("You don't have the permission to upgrade this group.")
|
return await evt.reply("You don't have the permission to upgrade this group.")
|
||||||
except ValueError as e:
|
except ValueError as e:
|
||||||
|
|||||||
+26
-21
@@ -282,12 +282,16 @@ class Portal:
|
|||||||
def get_input_entity(self, user: 'u.User') -> Awaitable[TypeInputPeer]:
|
def get_input_entity(self, user: 'u.User') -> Awaitable[TypeInputPeer]:
|
||||||
return user.client.get_input_entity(self.peer)
|
return user.client.get_input_entity(self.peer)
|
||||||
|
|
||||||
async def get_entity(self, user: 'u.User') -> TypeChat:
|
async def get_entity(self, user: 'AbstractUser') -> TypeChat:
|
||||||
try:
|
try:
|
||||||
return await user.client.get_entity(self.peer)
|
return await user.client.get_entity(self.peer)
|
||||||
except ValueError:
|
except ValueError:
|
||||||
self.log.warning(f"Could not find entity for {self.tgid_log} with user {user.tgid} "
|
if user.is_bot:
|
||||||
f"falling back to get_dialogs.")
|
self.log.warning(f"Could not find entity for {self.tgid_log} with bot {user.tgid}. "
|
||||||
|
"Failing...")
|
||||||
|
raise
|
||||||
|
self.log.warning(f"Could not find entity for {self.tgid_log} with user {user.tgid}. "
|
||||||
|
"falling back to get_dialogs.")
|
||||||
async for dialog in user.client.iter_dialogs():
|
async for dialog in user.client.iter_dialogs():
|
||||||
if dialog.entity.id == self.tgid:
|
if dialog.entity.id == self.tgid:
|
||||||
return dialog.entity
|
return dialog.entity
|
||||||
@@ -321,7 +325,7 @@ class Portal:
|
|||||||
await puppet.update_info(user, entity)
|
await puppet.update_info(user, entity)
|
||||||
await puppet.intent.join_room(self.mxid)
|
await puppet.intent.join_room(self.mxid)
|
||||||
|
|
||||||
async def create_matrix_room(self, user: "AbstractUser", entity: TypeChat = None,
|
async def create_matrix_room(self, user: 'AbstractUser', entity: TypeChat = None,
|
||||||
invites: InviteList = None, update_if_exists: bool = True,
|
invites: InviteList = None, update_if_exists: bool = True,
|
||||||
synchronous: bool = False) -> Optional[str]:
|
synchronous: bool = False) -> Optional[str]:
|
||||||
if self.mxid:
|
if self.mxid:
|
||||||
@@ -452,7 +456,7 @@ class Portal:
|
|||||||
if user and user.is_bot:
|
if user and user.is_bot:
|
||||||
user.register_portal(self)
|
user.register_portal(self)
|
||||||
|
|
||||||
async def sync_telegram_users(self, source: "AbstractUser", users: List[User]) -> None:
|
async def sync_telegram_users(self, source: 'AbstractUser', users: List[User]) -> None:
|
||||||
allowed_tgids = set()
|
allowed_tgids = set()
|
||||||
for entity in users:
|
for entity in users:
|
||||||
puppet = p.Puppet.get(TelegramID(entity.id))
|
puppet = p.Puppet.get(TelegramID(entity.id))
|
||||||
@@ -522,7 +526,7 @@ class Portal:
|
|||||||
user.unregister_portal(self)
|
user.unregister_portal(self)
|
||||||
await self.main_intent.kick(self.mxid, user.mxid, kick_message)
|
await self.main_intent.kick(self.mxid, user.mxid, kick_message)
|
||||||
|
|
||||||
async def update_info(self, user: "AbstractUser", entity: TypeChat = None) -> None:
|
async def update_info(self, user: 'AbstractUser', entity: TypeChat = None) -> None:
|
||||||
if self.peer_type == "user":
|
if self.peer_type == "user":
|
||||||
self.log.warning(f"Called update_info() for direct chat portal {self.tgid_log}")
|
self.log.warning(f"Called update_info() for direct chat portal {self.tgid_log}")
|
||||||
return
|
return
|
||||||
@@ -586,13 +590,13 @@ class Portal:
|
|||||||
return max(photo.sizes, key=(lambda photo2: (
|
return max(photo.sizes, key=(lambda photo2: (
|
||||||
len(photo2.bytes) if isinstance(photo2, PhotoCachedSize) else photo2.size)))
|
len(photo2.bytes) if isinstance(photo2, PhotoCachedSize) else photo2.size)))
|
||||||
|
|
||||||
async def remove_avatar(self, _: "AbstractUser", save: bool = False) -> None:
|
async def remove_avatar(self, _: 'AbstractUser', save: bool = False) -> None:
|
||||||
await self.main_intent.set_room_avatar(self.mxid, None)
|
await self.main_intent.set_room_avatar(self.mxid, None)
|
||||||
self.photo_id = None
|
self.photo_id = None
|
||||||
if save:
|
if save:
|
||||||
self.save()
|
self.save()
|
||||||
|
|
||||||
async def update_avatar(self, user: "AbstractUser", photo: FileLocation,
|
async def update_avatar(self, user: 'AbstractUser', photo: FileLocation,
|
||||||
save: bool = False) -> bool:
|
save: bool = False) -> bool:
|
||||||
photo_id = f"{photo.volume_id}-{photo.local_id}"
|
photo_id = f"{photo.volume_id}-{photo.local_id}"
|
||||||
if self.photo_id != photo_id:
|
if self.photo_id != photo_id:
|
||||||
@@ -1214,7 +1218,7 @@ class Portal:
|
|||||||
await self.handle_matrix_power_levels(source, levels["users"], {})
|
await self.handle_matrix_power_levels(source, levels["users"], {})
|
||||||
|
|
||||||
async def invite_telegram(self, source: 'u.User',
|
async def invite_telegram(self, source: 'u.User',
|
||||||
puppet: Union[p.Puppet, "AbstractUser"]) -> None:
|
puppet: Union[p.Puppet, 'AbstractUser']) -> None:
|
||||||
if self.peer_type == "chat":
|
if self.peer_type == "chat":
|
||||||
await source.client(
|
await source.client(
|
||||||
AddChatUserRequest(chat_id=self.tgid, user_id=puppet.tgid, fwd_limit=0))
|
AddChatUserRequest(chat_id=self.tgid, user_id=puppet.tgid, fwd_limit=0))
|
||||||
@@ -1235,7 +1239,7 @@ class Portal:
|
|||||||
return f"https://t.me/{self.username}/{evt.id}"
|
return f"https://t.me/{self.username}/{evt.id}"
|
||||||
return None
|
return None
|
||||||
|
|
||||||
async def handle_telegram_photo(self, source: "AbstractUser", intent: IntentAPI, evt: Message,
|
async def handle_telegram_photo(self, source: 'AbstractUser', intent: IntentAPI, evt: Message,
|
||||||
relates_to: Dict = None) -> Optional[Dict]:
|
relates_to: Dict = None) -> Optional[Dict]:
|
||||||
largest_size = self._get_largest_photo_size(evt.media.photo)
|
largest_size = self._get_largest_photo_size(evt.media.photo)
|
||||||
file = await util.transfer_file_to_matrix(self.db, source.client, intent,
|
file = await util.transfer_file_to_matrix(self.db, source.client, intent,
|
||||||
@@ -1329,7 +1333,7 @@ class Portal:
|
|||||||
|
|
||||||
return info, name
|
return info, name
|
||||||
|
|
||||||
async def handle_telegram_document(self, source: "AbstractUser", intent: IntentAPI,
|
async def handle_telegram_document(self, source: 'AbstractUser', intent: IntentAPI,
|
||||||
evt: Message,
|
evt: Message,
|
||||||
relates_to: dict = None) -> Optional[Dict]:
|
relates_to: dict = None) -> Optional[Dict]:
|
||||||
document = evt.media.document
|
document = evt.media.document
|
||||||
@@ -1368,7 +1372,7 @@ class Portal:
|
|||||||
kwargs["file_type"] = "m.file"
|
kwargs["file_type"] = "m.file"
|
||||||
return await intent.send_file(**kwargs)
|
return await intent.send_file(**kwargs)
|
||||||
|
|
||||||
def handle_telegram_location(self, _: "AbstractUser", intent: IntentAPI, evt: Message,
|
def handle_telegram_location(self, _: 'AbstractUser', intent: IntentAPI, evt: Message,
|
||||||
relates_to: dict = None) -> Awaitable[dict]:
|
relates_to: dict = None) -> Awaitable[dict]:
|
||||||
location = evt.media.geo
|
location = evt.media.geo
|
||||||
long = location.long
|
long = location.long
|
||||||
@@ -1396,7 +1400,7 @@ class Portal:
|
|||||||
"m.relates_to": relates_to or None,
|
"m.relates_to": relates_to or None,
|
||||||
}, timestamp=evt.date, external_url=self.get_external_url(evt))
|
}, timestamp=evt.date, external_url=self.get_external_url(evt))
|
||||||
|
|
||||||
async def handle_telegram_text(self, source: "AbstractUser", intent: IntentAPI, is_bot: bool,
|
async def handle_telegram_text(self, source: 'AbstractUser', intent: IntentAPI, is_bot: bool,
|
||||||
evt: Message) -> dict:
|
evt: Message) -> dict:
|
||||||
self.log.debug(f"Sending {evt.message} to {self.mxid} by {intent.mxid}")
|
self.log.debug(f"Sending {evt.message} to {self.mxid} by {intent.mxid}")
|
||||||
text, html, relates_to = await formatter.telegram_to_matrix(evt, source, self.main_intent)
|
text, html, relates_to = await formatter.telegram_to_matrix(evt, source, self.main_intent)
|
||||||
@@ -1406,7 +1410,7 @@ class Portal:
|
|||||||
msgtype=msgtype, timestamp=evt.date,
|
msgtype=msgtype, timestamp=evt.date,
|
||||||
external_url=self.get_external_url(evt))
|
external_url=self.get_external_url(evt))
|
||||||
|
|
||||||
async def handle_telegram_edit(self, source: "AbstractUser", sender: p.Puppet,
|
async def handle_telegram_edit(self, source: 'AbstractUser', sender: p.Puppet,
|
||||||
evt: Message) -> None:
|
evt: Message) -> None:
|
||||||
if not self.mxid:
|
if not self.mxid:
|
||||||
return
|
return
|
||||||
@@ -1451,7 +1455,7 @@ class Portal:
|
|||||||
msg.update(mxid=mxid, mx_room=self.mxid)
|
msg.update(mxid=mxid, mx_room=self.mxid)
|
||||||
DBMessage.update_by_mxid(temporary_identifier, self.mxid, mxid=mxid)
|
DBMessage.update_by_mxid(temporary_identifier, self.mxid, mxid=mxid)
|
||||||
|
|
||||||
async def handle_telegram_message(self, source: "AbstractUser", sender: p.Puppet,
|
async def handle_telegram_message(self, source: 'AbstractUser', sender: p.Puppet,
|
||||||
evt: Message) -> None:
|
evt: Message) -> None:
|
||||||
if not self.mxid:
|
if not self.mxid:
|
||||||
await self.create_matrix_room(source, invites=[source.mxid], update_if_exists=False)
|
await self.create_matrix_room(source, invites=[source.mxid], update_if_exists=False)
|
||||||
@@ -1545,7 +1549,7 @@ class Portal:
|
|||||||
self.db.rollback()
|
self.db.rollback()
|
||||||
await intent.redact(self.mxid, mxid)
|
await intent.redact(self.mxid, mxid)
|
||||||
|
|
||||||
async def _create_room_on_action(self, source: "AbstractUser",
|
async def _create_room_on_action(self, source: 'AbstractUser',
|
||||||
action: TypeMessageAction) -> bool:
|
action: TypeMessageAction) -> bool:
|
||||||
if source.is_relaybot:
|
if source.is_relaybot:
|
||||||
return False
|
return False
|
||||||
@@ -1558,7 +1562,7 @@ class Portal:
|
|||||||
return False
|
return False
|
||||||
return True
|
return True
|
||||||
|
|
||||||
async def handle_telegram_action(self, source: "AbstractUser", sender: p.Puppet,
|
async def handle_telegram_action(self, source: 'AbstractUser', sender: p.Puppet,
|
||||||
update: MessageService) -> None:
|
update: MessageService) -> None:
|
||||||
action = update.action
|
action = update.action
|
||||||
should_ignore = ((not self.mxid and not await self._create_room_on_action(source, action))
|
should_ignore = ((not self.mxid and not await self._create_room_on_action(source, action))
|
||||||
@@ -1724,9 +1728,9 @@ class Portal:
|
|||||||
config=json.dumps(self.local_config))
|
config=json.dumps(self.local_config))
|
||||||
|
|
||||||
def migrate_and_save(self, new_id: TelegramID) -> None:
|
def migrate_and_save(self, new_id: TelegramID) -> None:
|
||||||
existing = DBPortal.query.get(self.tgid_full)
|
self.db.delete(self.db_instance)
|
||||||
if existing:
|
self.db.commit()
|
||||||
self.db.delete(existing)
|
self._db_instance = None
|
||||||
try:
|
try:
|
||||||
del self.by_tgid[self.tgid_full]
|
del self.by_tgid[self.tgid_full]
|
||||||
except KeyError:
|
except KeyError:
|
||||||
@@ -1734,7 +1738,8 @@ class Portal:
|
|||||||
self.tgid = new_id
|
self.tgid = new_id
|
||||||
self.tg_receiver = new_id
|
self.tg_receiver = new_id
|
||||||
self.by_tgid[self.tgid_full] = self
|
self.by_tgid[self.tgid_full] = self
|
||||||
self.save()
|
self.db.add(self.db_instance)
|
||||||
|
self.db.commit()
|
||||||
|
|
||||||
def save(self) -> None:
|
def save(self) -> None:
|
||||||
self.db_instance.mxid = self.mxid
|
self.db_instance.mxid = self.mxid
|
||||||
|
|||||||
Reference in New Issue
Block a user