Add missing awaits and use lock for create_matrix_room. Fixes #49

This commit is contained in:
Tulir Asokan
2018-02-10 21:33:57 +02:00
parent 772e80f74c
commit 8a5c067259
2 changed files with 21 additions and 10 deletions
+1 -1
View File
@@ -293,7 +293,7 @@ class CommandHandler:
if not portal: if not portal:
return await evt.reply("This is not a portal room.") return await evt.reply("This is not a portal room.")
for user in portal.main_intent.get_room_members(portal.mxid): for user in await portal.main_intent.get_room_members(portal.mxid):
if user != portal.main_intent.mxid: if user != portal.main_intent.mxid:
try: try:
await portal.main_intent.kick(portal.mxid, user, "Portal deleted.") await portal.main_intent.kick(portal.mxid, user, "Portal deleted.")
+20 -9
View File
@@ -17,6 +17,7 @@
from io import BytesIO from io import BytesIO
from collections import deque from collections import deque
from datetime import datetime from datetime import datetime
import asyncio
import random import random
import mimetypes import mimetypes
import hashlib import hashlib
@@ -56,6 +57,7 @@ class Portal:
self.about = about self.about = about
self.photo_id = photo_id self.photo_id = photo_id
self._main_intent = None self._main_intent = None
self._room_create_lock = asyncio.Lock()
self._dedup = deque() self._dedup = deque()
self._dedup_mxid = {} self._dedup_mxid = {}
@@ -160,17 +162,26 @@ class Portal:
await puppet.intent.join_room(self.mxid) await puppet.intent.join_room(self.mxid)
async def create_matrix_room(self, user, entity=None, invites=None, update_if_exists=True): async def create_matrix_room(self, user, entity=None, invites=None, update_if_exists=True):
if not entity: if self.mxid:
entity = await user.client.get_entity(self.peer) if update_if_exists:
self.log.debug("Fetched data: %s", entity) if not entity:
entity = await user.client.get_entity(self.peer)
await self.update_after_create(user, entity, self.peer_type == "user")
await self.invite_matrix(invites or [])
return self.mxid
async with self._room_create_lock:
return await self._create_matrix_room(user, entity, invites)
async def _create_matrix_room(self, user, entity, invites):
direct = self.peer_type == "user" direct = self.peer_type == "user"
if self.mxid: if self.mxid:
if update_if_exists:
await self.update_after_create(user, entity, direct)
await self.invite_matrix(invites or [])
return self.mxid return self.mxid
if not entity:
entity = await user.client.get_entity(self.peer)
self.log.debug("Fetched data: %s", entity)
self.log.debug(f"Creating room for {self.tgid_log}") self.log.debug(f"Creating room for {self.tgid_log}")
try: try:
@@ -695,7 +706,7 @@ class Portal:
async def handle_telegram_message(self, source, sender, evt): async def handle_telegram_message(self, source, sender, evt):
if not self.mxid: if not self.mxid:
await self.create_matrix_room(source, invites=[source.mxid]) await self.create_matrix_room(source, invites=[source.mxid], update_if_exists=False)
tg_space = self.tgid if self.peer_type == "channel" else source.tgid tg_space = self.tgid if self.peer_type == "channel" else source.tgid
@@ -738,7 +749,8 @@ class Portal:
create_and_exit = (MessageActionChatCreate, MessageActionChannelCreate) create_and_exit = (MessageActionChatCreate, MessageActionChannelCreate)
create_and_continue = (MessageActionChatAddUser, MessageActionChatJoinedByLink) create_and_continue = (MessageActionChatAddUser, MessageActionChatJoinedByLink)
if isinstance(action, create_and_exit + create_and_continue): if isinstance(action, create_and_exit + create_and_continue):
self.create_matrix_room(source, invites=[source.mxid]) await self.create_matrix_room(source, invites=[source.mxid],
update_if_exists=isinstance(action, create_and_exit))
if not isinstance(action, create_and_continue): if not isinstance(action, create_and_continue):
return return
@@ -756,7 +768,6 @@ class Portal:
elif isinstance(action, MessageActionChatJoinedByLink): elif isinstance(action, MessageActionChatJoinedByLink):
await self.add_telegram_user(sender.id, source) await self.add_telegram_user(sender.id, source)
elif isinstance(action, MessageActionChatDeleteUser): elif isinstance(action, MessageActionChatDeleteUser):
kick_message = None
if sender.id != action.user_id: if sender.id != action.user_id:
kick_message = f"Kicked by {sender.displayname}" kick_message = f"Kicked by {sender.displayname}"
await self.delete_telegram_user(action.user_id, kick_message) await self.delete_telegram_user(action.user_id, kick_message)