Unbridge rooms when their channel is deleted
This commit is contained in:
		| @@ -370,11 +370,16 @@ async function _unbridgeRoom(channelID) { | ||||
| 	/** @ts-ignore @type {DiscordTypes.APIGuildChannel} */ | ||||
| 	const channel = discord.channels.get(channelID) | ||||
| 	assert.ok(channel) | ||||
| 	return unbridgeDeletedChannel(channel.id, channel.guild_id) | ||||
| 	assert.ok(channel.guild_id) | ||||
| 	return unbridgeDeletedChannel(channel, channel.guild_id) | ||||
| } | ||||
|  | ||||
| async function unbridgeDeletedChannel(channelID, guildID) { | ||||
| 	const roomID = select("channel_room", "room_id", {channel_id: channelID}).pluck().get() | ||||
| /** | ||||
|  * @param {DiscordTypes.APIGuildChannel} channel | ||||
|  * @param {string} guildID | ||||
|  */ | ||||
| async function unbridgeDeletedChannel(channel, guildID) { | ||||
| 	const roomID = select("channel_room", "room_id", {channel_id: channel.id}).pluck().get() | ||||
| 	assert.ok(roomID) | ||||
| 	const spaceID = select("guild_space", "space_id", {guild_id: guildID}).pluck().get() | ||||
| 	assert.ok(spaceID) | ||||
| @@ -384,7 +389,11 @@ async function unbridgeDeletedChannel(channelID, guildID) { | ||||
| 	await api.sendState(spaceID, "m.space.child", roomID, {}) | ||||
|  | ||||
| 	// remove declaration that the room is bridged | ||||
| 	await api.sendState(roomID, "uk.half-shot.bridge", `moe.cadence.ooye://discord/${guildID}/${channelID}`, {}) | ||||
| 	await api.sendState(roomID, "uk.half-shot.bridge", `moe.cadence.ooye://discord/${guildID}/${channel.id}`, {}) | ||||
| 	if ("topic" in channel) { | ||||
| 		// previously the Matrix topic would say the channel ID. we should remove that | ||||
| 		await api.sendState(roomID, "m.room.topic", "", {topic: channel.topic || ""}) | ||||
| 	} | ||||
|  | ||||
| 	// send a notification in the room | ||||
| 	await api.sendEvent(roomID, "m.room.message", { | ||||
| @@ -396,8 +405,7 @@ async function unbridgeDeletedChannel(channelID, guildID) { | ||||
| 	await api.leaveRoom(roomID) | ||||
|  | ||||
| 	// delete room from database | ||||
| 	const {changes} = db.prepare("DELETE FROM channel_room WHERE room_id = ? AND channel_id = ?").run(roomID, channelID) | ||||
| 	assert.equal(changes, 1) | ||||
| 	db.prepare("DELETE FROM channel_room WHERE room_id = ? AND channel_id = ?").run(roomID, channel.id) | ||||
| } | ||||
|  | ||||
| /** | ||||
|   | ||||
| @@ -147,6 +147,9 @@ const utils = { | ||||
| 				} else if (message.t === "CHANNEL_PINS_UPDATE") { | ||||
| 					await eventDispatcher.onChannelPinsUpdate(client, message.d) | ||||
|  | ||||
| 				} else if (message.t === "CHANNEL_DELETE") { | ||||
| 					await eventDispatcher.onChannelDelete(client, message.d) | ||||
|  | ||||
| 				} else if (message.t === "THREAD_CREATE") { | ||||
| 					// @ts-ignore | ||||
| 					await eventDispatcher.onThreadCreate(client, message.d) | ||||
|   | ||||
| @@ -230,6 +230,19 @@ module.exports = { | ||||
| 		await updatePins.updatePins(data.channel_id, roomID, convertedTimestamp) | ||||
| 	}, | ||||
|  | ||||
| 	/** | ||||
| 	 * @param {import("./discord-client")} client | ||||
| 	 * @param {DiscordTypes.GatewayChannelDeleteDispatchData} channel | ||||
| 	 */ | ||||
| 	async onChannelDelete(client, channel) { | ||||
| 		const guildID = channel["guild_id"] | ||||
| 		if (!guildID) return // channel must have been a DM channel or something | ||||
| 		const roomID = select("channel_room", "room_id", {channel_id: channel.id}).pluck().get() | ||||
| 		if (!roomID) return // channel wasn't being bridged in the first place | ||||
| 		// @ts-ignore | ||||
| 		await createRoom.unbridgeDeletedChannel(channel, guildID) | ||||
| 	}, | ||||
|  | ||||
| 	/** | ||||
| 	 * @param {import("./discord-client")} client | ||||
| 	 * @param {DiscordTypes.GatewayMessageCreateDispatchData} message | ||||
|   | ||||
| @@ -17,7 +17,7 @@ discord.snow.interaction.bulkOverwriteApplicationCommands(id, [{ | ||||
| 	name: "Permissions", | ||||
| 	contexts: [DiscordTypes.InteractionContextType.Guild], | ||||
| 	type: DiscordTypes.ApplicationCommandType.Message, | ||||
| 	default_member_permissions: String(DiscordTypes.PermissionFlagsBits.KickMembers) | ||||
| 	default_member_permissions: String(DiscordTypes.PermissionFlagsBits.KickMembers | DiscordTypes.PermissionFlagsBits.ManageRoles) | ||||
| }, { | ||||
| 	name: "invite", | ||||
| 	contexts: [DiscordTypes.InteractionContextType.Guild], | ||||
|   | ||||
		Reference in New Issue
	
	Block a user
	 Cadence Ember
					Cadence Ember