Skip to content

Commit ac37695

Browse files
committed
Store full membership events in state store and bump version to 0.2.0
This allows efficient get_displayname and get_avatar_url methods
1 parent 7bffa62 commit ac37695

File tree

5 files changed

+62
-23
lines changed

5 files changed

+62
-23
lines changed

mautrix_appservice/__init__.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
from .appservice import AppService
22
from .errors import MatrixError, MatrixRequestError, IntentError
33

4-
__version__ = "0.1.5"
4+
__version__ = "0.2.0"
55
__author__ = "Tulir Asokan <[email protected]>"

mautrix_appservice/appservice.py

Lines changed: 4 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -51,7 +51,10 @@ async def default_query_handler(_):
5151
self.app.router.add_route("GET", "/rooms/{alias}", self._http_query_alias)
5252
self.app.router.add_route("GET", "/users/{user_id}", self._http_query_user)
5353

54-
self.matrix_event_handler(self.update_state_store)
54+
async def update_state(event):
55+
self.state_store.update_state(event)
56+
57+
self.matrix_event_handler(update_state)
5558

5659
@property
5760
def http_session(self) -> aiohttp.ClientSession:
@@ -156,14 +159,6 @@ async def _http_handle_transaction(self, request: web.Request) -> web.Response:
156159

157160
return web.json_response({})
158161

159-
async def update_state_store(self, event: dict):
160-
event_type = event["type"]
161-
if event_type == "m.room.power_levels":
162-
self.state_store.set_power_levels(event["room_id"], event["content"])
163-
elif event_type == "m.room.member":
164-
self.state_store.set_membership(event["room_id"], event["state_key"],
165-
event["content"]["membership"])
166-
167162
def handle_matrix_event(self, event: dict):
168163
async def try_handle(handler_func: HandlerFunc):
169164
try:

mautrix_appservice/intent_api.py

Lines changed: 21 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -360,6 +360,19 @@ async def set_join_rule(self, room_id: str, join_rule: str, **kwargs):
360360
"join_rule": join_rule,
361361
}, **kwargs)
362362

363+
async def get_displayname(self, room_id: str, user_id: str, ignore_cache=False) -> str:
364+
return (await self.get_member_info(room_id, user_id, ignore_cache)).get("displayname", None)
365+
366+
async def get_avatar_url(self, room_id: str, user_id: str, ignore_cache=False) -> str:
367+
return (await self.get_member_info(room_id, user_id, ignore_cache)).get("avatar_url", None)
368+
369+
async def get_member_info(self, room_id: str, user_id: str, ignore_cache=False) -> dict:
370+
member = self.state_store.get_member(room_id, user_id)
371+
if len(member) == 0 or ignore_cache:
372+
event = await self.get_state_event(room_id, "m.room.member", user_id)
373+
member = event.get("content", {})
374+
return member
375+
363376
async def get_event(self, room_id: str, event_id: str) -> dict:
364377
await self.ensure_joined(room_id)
365378
return await self.client.request("GET", f"/rooms/{room_id}/event/{event_id}")
@@ -532,7 +545,14 @@ async def get_state_event(self, room_id: str, event_type: str, state_key: Option
532545
raise ValueError("Event type not given")
533546
await self.ensure_joined(room_id)
534547
url = self._get_state_url(room_id, event_type, state_key)
535-
return await self.client.request("GET", url)
548+
content = await self.client.request("GET", url)
549+
self.state_store.update_state({
550+
"type": event_type,
551+
"room_id": room_id,
552+
"state_key": state_key,
553+
"content": content,
554+
})
555+
return content
536556

537557
def join_room(self, room_id: str):
538558
if not room_id:

mautrix_appservice/state_store.py

Lines changed: 35 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@ def __init__(self, autosave_file: str = None):
1010

1111
# Persistent storage
1212
self.registrations = set()
13-
self.memberships = {}
13+
self.members = {}
1414
self.power_levels = {}
1515

1616
# Non-persistent storage
@@ -25,7 +25,7 @@ def save(self, file: str):
2525

2626
json.dump({
2727
"registrations": list(self.registrations),
28-
"memberships": self.memberships,
28+
"members": self.members,
2929
"power_levels": self.power_levels,
3030
}, output)
3131

@@ -44,8 +44,8 @@ def load(self, file: str):
4444
data = json.load(input_source)
4545
if "registrations" in data:
4646
self.registrations = set(data["registrations"])
47-
if "memberships" in data:
48-
self.memberships = data["memberships"]
47+
if "members" in data:
48+
self.members = data["members"]
4949
if "power_levels" in data:
5050
self.power_levels = data["power_levels"]
5151

@@ -86,18 +86,42 @@ def registered(self, user: str):
8686
self.registrations.add(user)
8787
self._autosave()
8888

89+
def update_state(self, event: dict):
90+
event_type = event["type"]
91+
if event_type == "m.room.power_levels":
92+
self.set_power_levels(event["room_id"], event["content"])
93+
elif event_type == "m.room.member":
94+
self.set_member(event["room_id"], event["state_key"], event["content"])
95+
96+
def get_member(self, room: str, user: str) -> dict:
97+
return self.members.get(room, {}).get(user, {})
98+
99+
def set_member(self, room: str, user: str, member: dict):
100+
if room not in self.members:
101+
self.members[room] = {}
102+
self.members[room][user] = member
103+
self._autosave()
104+
105+
def set_membership(self, room: str, user: str, membership: str):
106+
if room not in self.members:
107+
self.members[room] = {
108+
user: {
109+
"membership": membership
110+
}
111+
}
112+
elif user not in self.members[room]:
113+
self.members[room][user] = {
114+
"membership": membership
115+
}
116+
else:
117+
self.members[room][user]["membership"] = membership
118+
89119
def get_membership(self, room: str, user: str) -> str:
90-
return self.memberships.get(room, {}).get(user, "left")
120+
return self.get_member(room, user).get("membership", "left")
91121

92122
def is_joined(self, room: str, user: str) -> bool:
93123
return self.get_membership(room, user) == "join"
94124

95-
def set_membership(self, room: str, user: str, membership: str):
96-
if room not in self.memberships:
97-
self.memberships[room] = {}
98-
self.memberships[room][user] = membership
99-
self._autosave()
100-
101125
def joined(self, room: str, user: str):
102126
return self.set_membership(room, user, "join")
103127

setup.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22

33
setuptools.setup(
44
name="mautrix-appservice",
5-
version="0.1.5",
5+
version="0.2.0",
66
url="https://github.com/tulir/mautrix-appservice-python",
77

88
author="Tulir Asokan",

0 commit comments

Comments
 (0)