Do cache space members in member_cache

This commit is contained in:
Cadence Ember 2025-01-20 02:33:24 +13:00
commit 5b06d5984a
9 changed files with 40 additions and 52 deletions

View file

@ -258,13 +258,18 @@ async function getMemberFromCacheOrHomeserver(roomID, mxid, api) {
const row = select("member_cache", ["displayname", "avatar_url"], {room_id: roomID, mxid}).get()
if (row) return row
return api.getStateEvent(roomID, "m.room.member", mxid).then(event => {
const displayname = event?.displayname || null
const avatar_url = event?.avatar_url || null
db.prepare("INSERT INTO member_cache (room_id, mxid, displayname, avatar_url) VALUES (?, ?, ?, ?) ON CONFLICT DO UPDATE SET displayname = ?, avatar_url = ?").run(
roomID, mxid,
displayname, avatar_url,
displayname, avatar_url
)
const room = select("channel_room", "room_id", {room_id: roomID}).get()
if (room) {
// save the member to the cache so we don't have to check with the homeserver next time
// the cache will be kept in sync by the `m.room.member` event listener
const displayname = event?.displayname || null
const avatar_url = event?.avatar_url || null
db.prepare("INSERT INTO member_cache (room_id, mxid, displayname, avatar_url) VALUES (?, ?, ?, ?) ON CONFLICT DO UPDATE SET displayname = ?, avatar_url = ?").run(
roomID, mxid,
displayname, avatar_url,
displayname, avatar_url
)
}
return event
}).catch(() => {
return {displayname: null, avatar_url: null}

View file

@ -3535,8 +3535,8 @@ test("event2message: does not cache the member if the room is not known", async
},
event_id: "$g07oYSZFWBkxohNEfywldwgcWj1hbhDzQ1sBAKvqOOU",
origin_server_ts: 1688301929913,
room_id: "!should_be_newly_cached:cadence.moe",
sender: "@should_be_newly_cached:cadence.moe",
room_id: "!not_real:cadence.moe",
sender: "@should_not_be_cached:cadence.moe",
type: "m.room.message",
unsigned: {
age: 405299
@ -3545,9 +3545,9 @@ test("event2message: does not cache the member if the room is not known", async
api: {
getStateEvent: async (roomID, type, stateKey) => {
called++
t.equal(roomID, "!should_be_newly_cached:cadence.moe")
t.equal(roomID, "!not_real:cadence.moe")
t.equal(type, "m.room.member")
t.equal(stateKey, "@should_be_newly_cached:cadence.moe")
t.equal(stateKey, "@should_not_be_cached:cadence.moe")
return {
avatar_url: "mxc://cadence.moe/this_is_the_avatar"
}
@ -3559,9 +3559,9 @@ test("event2message: does not cache the member if the room is not known", async
messagesToDelete: [],
messagesToEdit: [],
messagesToSend: [{
username: "should_be_newly_cached",
username: "should_not_be_cached",
content: "testing the member state cache",
avatar_url: undefined,
avatar_url: "https://bridge.example.org/download/matrix/cadence.moe/this_is_the_avatar",
allowed_mentions: {
parse: ["users", "roles"]
}
@ -3569,7 +3569,7 @@ test("event2message: does not cache the member if the room is not known", async
}
)
t.deepEqual(select("member_cache", ["avatar_url", "displayname", "mxid"], {room_id: "!should_be_newly_cached:cadence.moe"}).all(), [])
t.deepEqual(select("member_cache", ["avatar_url", "displayname", "mxid"], {room_id: "!not_real:cadence.moe"}).all(), [])
t.equal(called, 1, "getStateEvent should be called once")
})

View file

@ -205,8 +205,8 @@ async event => {
return db.prepare("DELETE FROM member_cache WHERE room_id = ? and mxid = ?").run(event.room_id, event.state_key)
}
const room = select("channel_room", "room_id", {room_id: event.room_id})
if (!room) return // don't cache members in unbridged rooms
const exists = select("channel_room", "room_id", {room_id: event.room_id}) ?? select("guild_space", "space_id", {space_id: event.room_id})
if (!exists) return // don't cache members in unbridged rooms
// Member is here
let powerLevel = 0