diff --git a/mautrix_appservice/intent_api.py b/mautrix_appservice/intent_api.py index c05ba587..d738e8da 100644 --- a/mautrix_appservice/intent_api.py +++ b/mautrix_appservice/intent_api.py @@ -427,9 +427,19 @@ class IntentAPI: @staticmethod def _get_event_url(room_id, event_type, txn_id): + if not room_id: + raise ValueError("Room ID not given") + elif not event_type: + raise ValueError("Event type not given") + elif not txn_id: + raise ValueError("Transaction ID not given") return f"/rooms/{quote(room_id)}/send/{quote(event_type)}/{quote(txn_id)}" async def send_event(self, room_id, event_type, content, txn_id=None): + if not room_id: + raise ValueError("Room ID not given") + elif not event_type: + raise ValueError("Event type not given") await self.ensure_joined(room_id) await self._ensure_has_power_level_for(room_id, event_type) @@ -442,29 +452,47 @@ class IntentAPI: @staticmethod def _get_state_url(room_id, event_type, state_key=""): + if not room_id: + raise ValueError("Room ID not given") + elif not event_type: + raise ValueError("Event type not given") url = f"/rooms/{quote(room_id)}/state/{quote(event_type)}" if state_key: url += f"/{quote(state_key)}" return url async def send_state_event(self, room_id, event_type, content, state_key=""): + if not room_id: + raise ValueError("Room ID not given") + elif not event_type: + raise ValueError("Event type not given") await self.ensure_joined(room_id) await self._ensure_has_power_level_for(room_id, event_type) url = self._get_state_url(room_id, event_type, state_key) return await self.client.request("PUT", url, content) async def get_state_event(self, room_id, event_type, state_key=""): + if not room_id: + raise ValueError("Room ID not given") + elif not event_type: + raise ValueError("Event type not given") await self.ensure_joined(room_id) url = self._get_state_url(room_id, event_type, state_key) return await self.client.request("GET", url) def join_room(self, room_id): + if not room_id: + raise ValueError("Room ID not given") return self.ensure_joined(room_id, ignore_cache=True) def _join_room_direct(self, room): + if not room: + raise ValueError("Room ID not given") return self.client.request("POST", f"/join/{quote(room)}") def leave_room(self, room_id): + if not room_id: + raise ValueError("Room ID not given") try: self.state_store.left(room_id, self.mxid) return self.client.request("POST", f"/rooms/{quote(room_id)}/leave") @@ -473,6 +501,8 @@ class IntentAPI: raise def get_room_memberships(self, room_id): + if not room_id: + raise ValueError("Room ID not given") return self.client.request("GET", f"/rooms/{quote(room_id)}/members") async def get_room_members(self, room_id, allowed_memberships=("join",)): @@ -490,6 +520,8 @@ class IntentAPI: # region Ensure functions async def ensure_joined(self, room_id, ignore_cache=False): + if not room_id: + raise ValueError("Room ID not given") if not ignore_cache and self.state_store.is_joined(room_id, self.mxid): return await self.ensure_registered() @@ -524,6 +556,11 @@ class IntentAPI: self.state_store.registered(self.mxid) async def _ensure_has_power_level_for(self, room_id, event_type): + if not room_id: + raise ValueError("Room ID not given") + elif not event_type: + raise ValueError("Event type not given") + if not self.state_store.has_power_levels(room_id): await self.get_power_levels(room_id) if self.state_store.has_power_level(room_id, self.mxid, event_type): diff --git a/mautrix_telegram/commands/telegram.py b/mautrix_telegram/commands/telegram.py index 10693a94..3d94645a 100644 --- a/mautrix_telegram/commands/telegram.py +++ b/mautrix_telegram/commands/telegram.py @@ -151,11 +151,12 @@ async def join(evt): for chat in updates.chats: portal = po.Portal.get_by_entity(chat) if portal.mxid: - await portal.create_matrix_room(evt.sender, chat, [evt.sender.mxid]) - return await evt.reply(f"Created room for {portal.title}") - else: await portal.invite_matrix([evt.sender.mxid]) return await evt.reply(f"Invited you to portal of {portal.title}") + else: + await evt.reply(f"Creating room for {chat.title}... This might take a while.") + await portal.create_matrix_room(evt.sender, chat, [evt.sender.mxid]) + return await evt.reply(f"Created room for {portal.title}") @command_handler() diff --git a/mautrix_telegram/portal.py b/mautrix_telegram/portal.py index 5018a58e..bbfd0689 100644 --- a/mautrix_telegram/portal.py +++ b/mautrix_telegram/portal.py @@ -397,10 +397,18 @@ class Portal: return chat.users, chat.full_chat.participants.participants elif self.peer_type == "channel": try: - participants = await user.client(GetParticipantsRequest( - entity, ChannelParticipantsRecent(), offset=0, limit=100, hash=0 - )) - return participants.users, participants.participants + users, participants = [], [] + offset = 0 + while True: + response = await user.client(GetParticipantsRequest( + entity, ChannelParticipantsSearch(""), offset=offset, limit=100, hash=0 + )) + if not response.users: + break + participants += response.participants + users += response.users + offset += len(response.users) + return users, participants except ChatAdminRequiredError: return [], [] elif self.peer_type == "user": @@ -1058,6 +1066,11 @@ class Portal: self.db.commit() def delete(self): + try: + del self.by_tgid[self.tgid_full] + del self.by_mxid[self.mxid] + except KeyError: + pass self.db.delete(self.to_db()) self.db.commit()