Add initial power level bridging

This commit is contained in:
Tulir Asokan
2018-01-27 21:01:54 +02:00
parent caffff79ae
commit 06cc5246ab
6 changed files with 148 additions and 27 deletions
+19 -4
View File
@@ -28,7 +28,6 @@ class StateStore:
def __init__(self):
self.memberships = {}
self.power_levels = {}
self.power_level_requirements = {}
def _get_membership(self, room, user):
return self.memberships.get(room, {}).get(user, "left")
@@ -50,13 +49,29 @@ class StateStore:
def left(self, room, user):
return self._set_membership(room, user, "left")
def has_power_level_data(self, room):
return room in self.power_levels
def has_power_level(self, room, user, event):
return True
room_levels = self.power_levels.get(room, {})
required = room_levels["events"].get(event, 95)
has = room_levels["users"].get(user, 0)
return has >= required
def set_power_level(self, room, user, level):
if not room in self.power_levels:
self.power_levels[room] = {}
self.power_levels[room][user] = level
self.power_levels[room] = {
"users": {},
"events": {},
}
self.power_levels[room]["users"][user] = level
def set_power_levels(self, room, content):
if "events" not in content:
content["events"] = {}
if "users" not in content:
content["users"] = {}
self.power_levels[room] = content
class AppService:
+19 -1
View File
@@ -59,7 +59,7 @@ class HTTPAPI(MatrixHttpApi):
return super()._send(method, path, content, query_params, headers, api_path=api_path)
def create_room(self, alias=None, is_public=False, name=None, topic=None, is_direct=False,
invitees=()):
invitees=(), initial_state=[]):
"""Perform /createRoom.
Args:
alias (str): Optional. The room alias name to set for this room.
@@ -79,6 +79,8 @@ class HTTPAPI(MatrixHttpApi):
content["name"] = name
if topic:
content["topic"] = topic
if initial_state:
content["initial_state"] = initial_state
content["is_direct"] = is_direct
return self._send("POST", "/createRoom", content)
@@ -212,6 +214,17 @@ class IntentAPI:
self._ensure_has_power_level_for(room_id, "m.room.name")
return self.client.set_room_name(room_id, name)
def get_power_levels(self, room_id):
self._ensure_joined(room_id)
levels = self.client.get_power_levels(room_id)
self.state_store.set_power_levels(room_id, levels)
return levels
def set_power_levels(self, room_id, content):
response = self.send_state_event(room_id, "m.room.power_levels", content)
self.state_store.set_power_levels(room_id, content)
return response
def set_typing(self, room_id, is_typing=True, timeout=5000):
self._ensure_joined(room_id)
return self.client.set_typing(room_id, is_typing, timeout)
@@ -311,8 +324,13 @@ class IntentAPI:
self.registered = True
def _ensure_has_power_level_for(self, room_id, event_type):
if not self.state_store.has_power_level_data(room_id):
self.get_power_levels(room_id)
if self.state_store.has_power_level(room_id, self.mxid, event_type):
return
elif not self.bot:
pass
# raise IntentError(f"Power level of {self.mxid} is not enough for {event_type} in {room_id}")
# TODO implement
# endregion