Add room list debugger
This commit is contained in:
		
							parent
							
								
									cf8867f945
								
							
						
					
					
						commit
						5b21344a65
					
				
					 4 changed files with 76 additions and 6 deletions
				
			
		|  | @ -436,7 +436,7 @@ async function unbridgeDeletedChannel(channel, guildID) { | |||
| 	powerLevelContent.users ??= {} | ||||
| 	const bot = `@${reg.sender_localpart}:${reg.ooye.server_name}` | ||||
| 	for (const mxid of Object.keys(powerLevelContent.users)) { | ||||
| 		if (mUtils.eventSenderIsFromDiscord(mxid) && mxid !== bot) { | ||||
| 		if (powerLevelContent.users[mxid] >= 100 && mUtils.eventSenderIsFromDiscord(mxid) && mxid !== bot) { | ||||
| 			delete powerLevelContent.users[mxid] | ||||
| 			await api.sendState(roomID, "m.room.power_levels", "", powerLevelContent, mxid) | ||||
| 		} | ||||
|  |  | |||
|  | @ -154,3 +154,40 @@ block body | |||
|       button.s-btn.s-btn__icon.s-btn__filled#link-button | ||||
|         != icons.Icons.IconMerge | ||||
|         = ` Link` | ||||
| 
 | ||||
|   details.mt48 | ||||
|     summary Debug room list | ||||
|     .d-grid.grid__2.gx24 | ||||
|       div | ||||
|         h3.mt24 Channels | ||||
|         p Channels are read from the channel_room table and then merged with the discord.channels memory cache to make the merged list. Anything in memory cache that's not in channel_room is considered unlinked. | ||||
|       div | ||||
|         h3.mt24 Rooms | ||||
|         p Rooms use the same merged list as channels, based on augmented channel_room data. Then, rooms are read from the space. Anything in the space that's not merged is considered unlinked. | ||||
|       div | ||||
|         h3.mt24 Unavailable channels: Deleted from Discord | ||||
|         .s-card.p0 | ||||
|           ul.my8.ml24 | ||||
|             each row in removedUncachedChannels | ||||
|               li: a(href=`https://discord.com/channels/${guild_id}/${row.channel_id}`)= row.nick || row.name | ||||
|         h3.mt24 Unavailable channels: Wrong type | ||||
|         .s-card.p0 | ||||
|           ul.my8.ml24 | ||||
|             each row in removedWrongTypeChannels | ||||
|               li: a(href=`https://discord.com/channels/${guild_id}/${row.channel_id}`) (#{row.type}) #{row.name} | ||||
|       div- // Rooms | ||||
|         h3.mt24 Unavailable rooms: Already linked | ||||
|         .s-card.p0 | ||||
|           ul.my8.ml24 | ||||
|             each row in removedLinkedRooms | ||||
|               li: a(href=`https://matrix.to/#/${row.room_id}`)= row.name | ||||
|         h3.mt24 Unavailable rooms: Wrong type | ||||
|         .s-card.p0 | ||||
|           ul.my8.ml24 | ||||
|             each row in removedWrongTypeRooms | ||||
|               li: a(href=`https://matrix.to/#/${row.room_id}`) (#{row.room_type}) #{row.name} | ||||
|         h3.mt24 Unavailable rooms: Archived thread | ||||
|         .s-card.p0 | ||||
|           ul.my8.ml24 | ||||
|             each row in removedArchivedThreadRooms | ||||
|               li: a(href=`https://matrix.to/#/${row.room_id}`)= row.name | ||||
|  |  | |||
|  | @ -42,6 +42,26 @@ function getAPI(event) { | |||
| /** @type {LRUCache<string, string>} nonce to guild id */ | ||||
| const validNonce = new LRUCache({max: 200}) | ||||
| 
 | ||||
| /** | ||||
|  * Modifies the input, removing items that don't pass the filter. Returns the items that didn't pass. | ||||
|  * @param {T[]} xs | ||||
|  * @param {(x: T, i?: number) => any} fn | ||||
|  * @template T | ||||
|  * @returns T[] | ||||
|  */ | ||||
| function filterTo(xs, fn) { | ||||
| 	/** @type {T[]} */ | ||||
| 	const filtered = [] | ||||
| 	for (let i = xs.length-1; i >= 0; i--) { | ||||
| 		const x = xs[i] | ||||
| 		if (!fn(x, i)) { | ||||
| 			filtered.unshift(x) | ||||
| 			xs.splice(i, 1) | ||||
| 		} | ||||
| 	} | ||||
| 	return filtered | ||||
| } | ||||
| 
 | ||||
| /** | ||||
|  * @param {string} guildID | ||||
|  * @param {Ty.R.Hierarchy[]} rooms | ||||
|  | @ -62,21 +82,28 @@ function getChannelRoomsLinks(guildID, rooms) { | |||
| 	assert(channelIDs) | ||||
| 
 | ||||
| 	let linkedChannels = select("channel_room", ["channel_id", "room_id", "name", "nick"], {channel_id: channelIDs}).all() | ||||
| 	let linkedChannelsWithDetails = linkedChannels.map(c => ({channel: discord.channels.get(c.channel_id), ...c})).filter(c => c.channel) | ||||
| 	let linkedChannelsWithDetails = linkedChannels.map(c => ({channel: discord.channels.get(c.channel_id), ...c})) | ||||
| 	let removedUncachedChannels = filterTo(linkedChannelsWithDetails, c => c.channel) | ||||
| 	let linkedChannelIDs = linkedChannelsWithDetails.map(c => c.channel_id) | ||||
| 	linkedChannelsWithDetails.sort((a, b) => getPosition(a.channel) - getPosition(b.channel)) | ||||
| 
 | ||||
| 	let unlinkedChannelIDs = channelIDs.filter(c => !linkedChannelIDs.includes(c)) | ||||
| 	let unlinkedChannels = unlinkedChannelIDs.map(c => discord.channels.get(c)).filter(c => c && [0, 5].includes(c.type)) | ||||
| 	let unlinkedChannels = unlinkedChannelIDs.map(c => discord.channels.get(c)) | ||||
| 	let removedWrongTypeChannels = filterTo(unlinkedChannels, c => c && [0, 5].includes(c.type)) | ||||
| 	unlinkedChannels.sort((a, b) => getPosition(a) - getPosition(b)) | ||||
| 
 | ||||
| 	let linkedRoomIDs = linkedChannels.map(c => c.room_id) | ||||
| 	let unlinkedRooms = rooms.filter(r => !linkedRoomIDs.includes(r.room_id) && !r.room_type) | ||||
| 	let unlinkedRooms = [...rooms] | ||||
| 	let removedLinkedRooms = filterTo(unlinkedRooms, r => !linkedRoomIDs.includes(r.room_id)) | ||||
| 	let removedWrongTypeRooms = filterTo(unlinkedRooms, r => !r.room_type) | ||||
| 	// https://discord.com/developers/docs/topics/threads#active-archived-threads
 | ||||
| 	// need to filter out linked archived threads from unlinkedRooms, will just do that by comparing against the name
 | ||||
| 	unlinkedRooms = unlinkedRooms.filter(r => r.name && !r.name.match(/^\[(🔒)?⛓️\]/)) | ||||
| 	let removedArchivedThreadRooms = filterTo(unlinkedRooms, r => r.name && !r.name.match(/^\[(🔒)?⛓️\]/)) | ||||
| 
 | ||||
| 	return {linkedChannelsWithDetails, unlinkedChannels, unlinkedRooms} | ||||
| 	return { | ||||
| 		linkedChannelsWithDetails, unlinkedChannels, unlinkedRooms, | ||||
| 		removedUncachedChannels, removedWrongTypeChannels, removedLinkedRooms, removedWrongTypeRooms, removedArchivedThreadRooms | ||||
| 	} | ||||
| } | ||||
| 
 | ||||
| as.router.get("/guild", defineEventHandler(async event => { | ||||
|  |  | |||
|  | @ -63,6 +63,12 @@ as.router.post("/api/link", defineEventHandler(async event => { | |||
| 	// Sync room data and space child
 | ||||
| 	await createRoom.syncRoom(parsedBody.discord) | ||||
| 
 | ||||
| 	// Send a notification in the room
 | ||||
| 	await api.sendEvent(parsedBody.matrix, "m.room.message", { | ||||
| 		msgtype: "m.notice", | ||||
| 		body: "👋 This room is now bridged with Discord. Say hi!" | ||||
| 	}) | ||||
| 
 | ||||
| 	setResponseHeader(event, "HX-Refresh", "true") | ||||
| 	return null // 204
 | ||||
| })) | ||||
|  |  | |||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue