Merge branch 'master' into bots
This commit is contained in:
@@ -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):
|
||||
|
||||
@@ -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()
|
||||
|
||||
@@ -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()
|
||||
|
||||
|
||||
Reference in New Issue
Block a user