Remove sims when the Discord user leaves

This commit is contained in:
Cadence Ember
2026-03-19 14:30:10 +13:00
parent d2557f73bb
commit 876d91fbf4
12 changed files with 187 additions and 6 deletions
@@ -65,7 +65,7 @@ test("message2event components: pk question mark output", async t => {
+ "<hr>"
+ "<blockquote><p><strong>System:</strong> INX (<code>xffgnx</code>)"
+ "<br><strong>Member:</strong> Lillith (<code>pphhoh</code>)"
+ "<br><strong>Sent by:</strong> infinidoge1337 (@unknown-user:)"
+ "<br><strong>Sent by:</strong> infinidoge1337 (<a href=\"https://matrix.to/#/@_ooye_infinidoge1337:cadence.moe\">@unknown-user</a>)"
+ "<br><br><strong>Account Roles (7)</strong>"
+ "<br>§b, !, ‼, Ears Port Ping, Ears Update Ping, Yttr Ping, unsup Ping</p>"
+ `🖼️ <a href="https://files.inx.moe/p/cdn/lillith.webp">https://files.inx.moe/p/cdn/lillith.webp</a>`
+38
View File
@@ -0,0 +1,38 @@
// @ts-check
const passthrough = require("../../passthrough")
const {db, select, from} = passthrough
/**
* @param {string} userID discord user ID that left
* @param {string} guildID discord guild ID that they left
*/
function removeMemberMxids(userID, guildID) {
// Get sims for user and remove
let membership = from("sim").join("sim_member", "mxid").join("channel_room", "room_id")
.select("room_id", "mxid").where({user_id: userID, guild_id: guildID}).and("ORDER BY room_id, mxid").all()
membership = membership.concat(from("sim_proxy").join("sim", "user_id").join("sim_member", "mxid").join("channel_room", "room_id")
.select("room_id", "mxid").where({proxy_owner_id: userID, guild_id: guildID}).and("ORDER BY room_id, mxid").all())
// Get user installed apps and remove
/** @type {string[]} */
let userAppDeletions = []
// 1. Select apps that have 1 user remaining
/** @type {Set<string>} */
const appsWithOneUser = new Set(db.prepare("SELECT app_bot_id FROM app_user_install WHERE guild_id = ? GROUP BY app_bot_id HAVING count(*) = 1").pluck().all(guildID))
// 2. Select apps installed by this user
const appsFromThisUser = new Set(select("app_user_install", "app_bot_id", {guild_id: guildID, user_id: userID}).pluck().all())
if (appsFromThisUser.size) userAppDeletions.push(userID)
// Then remove user installed apps if this was the last user with them
const appsToRemove = appsWithOneUser.intersection(appsFromThisUser)
for (const botID of appsToRemove) {
// Remove sims for user installed app
const appRemoval = removeMemberMxids(botID, guildID)
membership = membership.concat(appRemoval.membership)
userAppDeletions = userAppDeletions.concat(appRemoval.userAppDeletions)
}
return {membership, userAppDeletions}
}
module.exports.removeMemberMxids = removeMemberMxids
@@ -0,0 +1,43 @@
// @ts-check
const {test} = require("supertape")
const {removeMemberMxids} = require("./remove-member-mxids")
test("remove member mxids: would remove mxid for all rooms in this server", t => {
t.deepEqual(removeMemberMxids("772659086046658620", "112760669178241024"), {
userAppDeletions: [],
membership: [{
mxid: "@_ooye_cadence:cadence.moe",
room_id: "!fGgIymcYWOqjbSRUdV:cadence.moe"
}, {
mxid: "@_ooye_cadence:cadence.moe",
room_id: "!kLRqKKUQXcibIMtOpl:cadence.moe"
}]
})
})
test("remove member mxids: removes sims too", t => {
t.deepEqual(removeMemberMxids("196188877885538304", "112760669178241024"), {
userAppDeletions: [],
membership: [{
mxid: '@_ooye_ampflower:cadence.moe',
room_id: '!qzDBLKlildpzrrOnFZ:cadence.moe'
}, {
mxid: '@_ooye__pk_zoego:cadence.moe',
room_id: '!qzDBLKlildpzrrOnFZ:cadence.moe'
}]
})
})
test("remove member mxids: removes apps too", t => {
t.deepEqual(removeMemberMxids("197126718400626689", "66192955777486848"), {
userAppDeletions: ["197126718400626689"],
membership: [{
mxid: '@_ooye_infinidoge1337:cadence.moe',
room_id: '!BnKuBPCvyfOkhcUjEu:cadence.moe'
}, {
mxid: '@_ooye_evil_lillith_sheher:cadence.moe',
room_id: '!BnKuBPCvyfOkhcUjEu:cadence.moe'
}]
})
})