Don't overwrite room custom topics

This commit is contained in:
Cadence Ember 2025-02-01 23:12:50 +13:00
commit ad51079448
9 changed files with 57 additions and 19 deletions

View file

@ -89,9 +89,10 @@ async function channelToKState(channel, guild, di) {
assert(typeof parentSpaceID === "string")
}
const channelRow = select("channel_room", ["nick", "custom_avatar"], {channel_id: channel.id}).get()
const channelRow = select("channel_room", ["nick", "custom_avatar", "custom_topic"], {channel_id: channel.id}).get()
const customName = channelRow?.nick
const customAvatar = channelRow?.custom_avatar
const hasCustomTopic = channelRow?.custom_topic
const [convertedName, convertedTopic] = convertNameAndTopic(channel, guild, customName)
const avatarEventContent = {}
@ -167,6 +168,8 @@ async function channelToKState(channel, guild, di) {
}
}
if (hasCustomTopic) delete channelKState["m.room.topic/"]
return {spaceID: parentSpaceID, privacyLevel, channelKState}
}

View file

@ -94,6 +94,26 @@ test("channel2room: room where limited people can mention everyone", async t =>
t.equal(called, 1)
})
test("channel2room: matrix room that already has a custom topic set", async t => {
let called = 0
async function getStateEvent(roomID, type, key) { // getting power levels from space to apply to room
called++
t.equal(roomID, "!jjWAGMeQdNrVZSSfvz:cadence.moe")
t.equal(type, "m.room.power_levels")
t.equal(key, "")
return {}
}
db.prepare("UPDATE channel_room SET custom_topic = 1 WHERE channel_id = ?").run(testData.channel.general.id)
const expected = mixin({}, testData.room.general, {"m.room.power_levels/": {notifications: {room: 20}}})
// @ts-ignore
delete expected["m.room.topic/"]
t.deepEqual(
kstateStripConditionals(await channelToKState(testData.channel.general, testData.guild.general, {api: {getStateEvent}}).then(x => x.channelKState)),
expected
)
t.equal(called, 1)
})
test("convertNameAndTopic: custom name and topic", t => {
t.deepEqual(
_convertNameAndTopic({id: "123", name: "the-twilight-zone", topic: "Spooky stuff here. :ghost:", type: 0}, {id: "456"}, "hauntings"),

View file

@ -0,0 +1,5 @@
BEGIN TRANSACTION;
ALTER TABLE channel_room ADD COLUMN custom_topic INTEGER DEFAULT 0;
COMMIT;

View file

@ -10,6 +10,8 @@ export type Models = {
speedbump_id: string | null
speedbump_webhook_id: string | null
speedbump_checked: number | null
guild_id: string | null
custom_topic: number
}
event_message: {

View file

@ -164,6 +164,17 @@ async event => {
db.prepare("UPDATE channel_room SET nick = ? WHERE room_id = ?").run(name, event.room_id)
}))
sync.addTemporaryListener(as, "type:m.room.topic", guard("m.room.topic",
/**
* @param {Ty.Event.StateOuter<Ty.Event.M_Room_Topic>} event
*/
async event => {
if (event.state_key !== "") return
if (utils.eventSenderIsFromDiscord(event.sender)) return
const customTopic = +!!event.content.topic
db.prepare("UPDATE channel_room SET custom_topic = ? WHERE room_id = ?").run(customTopic, event.room_id)
}))
sync.addTemporaryListener(as, "type:m.room.pinned_events", guard("m.room.pinned_events",
/**
* @param {Ty.Event.StateOuter<Ty.Event.M_Room_PinnedEvents>} event

4
src/types.d.ts vendored
View file

@ -243,6 +243,10 @@ export namespace Event {
name?: string
}
export type M_Room_Topic = {
topic?: string
}
export type M_Room_PinnedEvents = {
pinned: string[]
}

View file

@ -177,16 +177,12 @@ test("api invite: can invite to a moderated guild", async t => {
async inviteToRoom(roomID, mxidToInvite, mxid) {
t.equal(roomID, "!jjWAGMeQdNrVZSSfvz:cadence.moe")
called++
},
async setUserPowerCascade(roomID, mxid, power) {
t.equal(power, 0)
called++
}
}
})
)
t.notOk(error)
t.equal(called, 3)
t.equal(called, 2)
})
test("api invite: does not reinvite joined users", async t => {
@ -205,14 +201,10 @@ test("api invite: does not reinvite joined users", async t => {
async getStateEvent(roomID, type, key) {
called++
return {membership: "join"}
},
async setUserPowerCascade(roomID, mxid, power) {
t.equal(power, 0)
called++
}
}
})
)
t.notOk(error)
t.equal(called, 2)
t.equal(called, 1)
})