create syncSpaceFully
This commit is contained in:
		
							parent
							
								
									aa263d3eb8
								
							
						
					
					
						commit
						5e6bb0cd2e
					
				
					 2 changed files with 43 additions and 5 deletions
				
			
		| 
						 | 
					@ -82,7 +82,7 @@ async function channelToKState(channel, guild) {
 | 
				
			||||||
		avatarEventContent.url = await file.uploadDiscordFileToMxc(avatarEventContent.discord_path) // TODO: somehow represent future values in kstate (callbacks?), while still allowing for diffing, so test cases don't need to touch the media API
 | 
							avatarEventContent.url = await file.uploadDiscordFileToMxc(avatarEventContent.discord_path) // TODO: somehow represent future values in kstate (callbacks?), while still allowing for diffing, so test cases don't need to touch the media API
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	let history_visibility = "invited"
 | 
						let history_visibility = "shared"
 | 
				
			||||||
	if (channel["thread_metadata"]) history_visibility = "world_readable"
 | 
						if (channel["thread_metadata"]) history_visibility = "world_readable"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	const channelKState = {
 | 
						const channelKState = {
 | 
				
			||||||
| 
						 | 
					@ -106,6 +106,9 @@ async function channelToKState(channel, guild) {
 | 
				
			||||||
			events: {
 | 
								events: {
 | 
				
			||||||
				"m.room.avatar": 0
 | 
									"m.room.avatar": 0
 | 
				
			||||||
			}
 | 
								}
 | 
				
			||||||
 | 
							},
 | 
				
			||||||
 | 
							"chat.schildi.hide_ui/read_receipts": {
 | 
				
			||||||
 | 
								hidden: true
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -67,6 +67,7 @@ async function guildToKState(guild) {
 | 
				
			||||||
	return guildKState
 | 
						return guildKState
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/** Efficiently update space name, space avatar, and child room avatars. */
 | 
				
			||||||
async function syncSpace(guildID) {
 | 
					async function syncSpace(guildID) {
 | 
				
			||||||
	/** @ts-ignore @type {DiscordTypes.APIGuild} */
 | 
						/** @ts-ignore @type {DiscordTypes.APIGuild} */
 | 
				
			||||||
	const guild = discord.guilds.get(guildID)
 | 
						const guild = discord.guilds.get(guildID)
 | 
				
			||||||
| 
						 | 
					@ -77,10 +78,7 @@ async function syncSpace(guildID) {
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	const guildKState = await guildToKState(guild)
 | 
						const guildKState = await guildToKState(guild)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	if (!spaceID) {
 | 
						if (!spaceID) return
 | 
				
			||||||
		const spaceID = await createSpace(guild, guildKState)
 | 
					 | 
				
			||||||
		return spaceID // Naturally, the newly created space is already up to date, so we can always skip syncing here.
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
	console.log(`[space sync] to matrix: ${guild.name}`)
 | 
						console.log(`[space sync] to matrix: ${guild.name}`)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -111,6 +109,43 @@ async function syncSpace(guildID) {
 | 
				
			||||||
	return spaceID
 | 
						return spaceID
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/**
 | 
				
			||||||
 | 
					 * Inefficiently force the space and its existing child rooms to be fully updated.
 | 
				
			||||||
 | 
					 * Should not need to be called as part of the bridge's normal operation.
 | 
				
			||||||
 | 
					 */
 | 
				
			||||||
 | 
					async function syncSpaceFully(guildID) {
 | 
				
			||||||
 | 
						/** @ts-ignore @type {DiscordTypes.APIGuild} */
 | 
				
			||||||
 | 
						const guild = discord.guilds.get(guildID)
 | 
				
			||||||
 | 
						assert.ok(guild)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						/** @type {string?} */
 | 
				
			||||||
 | 
						const spaceID = db.prepare("SELECT space_id from guild_space WHERE guild_id = ?").pluck().get(guildID)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						const guildKState = await guildToKState(guild)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						if (!spaceID) return
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						console.log(`[space sync] to matrix: ${guild.name}`)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						// sync guild state to space
 | 
				
			||||||
 | 
						const spaceKState = await createRoom.roomToKState(spaceID)
 | 
				
			||||||
 | 
						const spaceDiff = ks.diffKState(spaceKState, guildKState)
 | 
				
			||||||
 | 
						await createRoom.applyKStateDiffToRoom(spaceID, spaceDiff)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						const childRooms = ks.kstateToState(spaceKState).filter(({type, content}) => {
 | 
				
			||||||
 | 
							return type === "m.space.child" && "via" in content
 | 
				
			||||||
 | 
						}).map(({state_key}) => state_key)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						for (const roomID of childRooms) {
 | 
				
			||||||
 | 
							const channelID = db.prepare("SELECT channel_id FROM channel_room WHERE room_id = ?").pluck().get(roomID)
 | 
				
			||||||
 | 
							if (!channelID) continue
 | 
				
			||||||
 | 
							await createRoom.syncRoom(channelID)
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						return spaceID
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
module.exports.createSpace = createSpace
 | 
					module.exports.createSpace = createSpace
 | 
				
			||||||
module.exports.syncSpace = syncSpace
 | 
					module.exports.syncSpace = syncSpace
 | 
				
			||||||
 | 
					module.exports.syncSpaceFully = syncSpaceFully
 | 
				
			||||||
module.exports.guildToKState = guildToKState
 | 
					module.exports.guildToKState = guildToKState
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue