allow migrating from old to new bridge
This commit is contained in:
		
							parent
							
								
									5185ae45ab
								
							
						
					
					
						commit
						39458bd2bf
					
				
					 13 changed files with 214 additions and 42 deletions
				
			
		| 
						 | 
				
			
			@ -78,7 +78,10 @@ async function syncSpace(guildID) {
 | 
			
		|||
 | 
			
		||||
	const guildKState = await guildToKState(guild)
 | 
			
		||||
 | 
			
		||||
	if (!spaceID) return
 | 
			
		||||
	if (!spaceID) {
 | 
			
		||||
		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}`)
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -123,7 +126,10 @@ async function syncSpaceFully(guildID) {
 | 
			
		|||
 | 
			
		||||
	const guildKState = await guildToKState(guild)
 | 
			
		||||
 | 
			
		||||
	if (!spaceID) return
 | 
			
		||||
	if (!spaceID) {
 | 
			
		||||
		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}`)
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -12,9 +12,9 @@ const discordPackets = sync.require("./discord-packets")
 | 
			
		|||
class DiscordClient {
 | 
			
		||||
	/**
 | 
			
		||||
	 * @param {string} discordToken
 | 
			
		||||
	 * @param {boolean} listen whether to set up the event listeners for OOYE to operate
 | 
			
		||||
	 * @param {string} listen "full", "half", "no" - whether to set up the event listeners for OOYE to operate
 | 
			
		||||
	 */
 | 
			
		||||
	constructor(discordToken, listen = true) {
 | 
			
		||||
	constructor(discordToken, listen = "full") {
 | 
			
		||||
		this.discordToken = discordToken
 | 
			
		||||
		this.snow = new SnowTransfer(discordToken)
 | 
			
		||||
		this.cloud = new CloudStorm(discordToken, {
 | 
			
		||||
| 
						 | 
				
			
			@ -44,8 +44,8 @@ class DiscordClient {
 | 
			
		|||
		this.guilds = new Map()
 | 
			
		||||
		/** @type {Map<string, Array<string>>} */
 | 
			
		||||
		this.guildChannelMap = new Map()
 | 
			
		||||
		if (listen) {
 | 
			
		||||
			this.cloud.on("event", message => discordPackets.onPacket(this, message))
 | 
			
		||||
		if (listen !== "no") {
 | 
			
		||||
			this.cloud.on("event", message => discordPackets.onPacket(this, message, listen))
 | 
			
		||||
		}
 | 
			
		||||
		this.cloud.on("error", console.error)
 | 
			
		||||
	}
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -10,8 +10,9 @@ const utils = {
 | 
			
		|||
	/**
 | 
			
		||||
	 * @param {import("./discord-client")} client
 | 
			
		||||
	 * @param {import("cloudstorm").IGatewayMessage} message
 | 
			
		||||
	 * @param {string} listen "full", "half", "no" - whether to set up the event listeners for OOYE to operate
 | 
			
		||||
	 */
 | 
			
		||||
	async onPacket(client, message) {
 | 
			
		||||
	async onPacket(client, message, listen) {
 | 
			
		||||
		// requiring this later so that the client is already constructed by the time event-dispatcher is loaded
 | 
			
		||||
		/** @type {typeof import("./event-dispatcher")} */
 | 
			
		||||
		const eventDispatcher = sync.require("./event-dispatcher")
 | 
			
		||||
| 
						 | 
				
			
			@ -41,7 +42,9 @@ const utils = {
 | 
			
		|||
				arr.push(thread.id)
 | 
			
		||||
				client.channels.set(thread.id, thread)
 | 
			
		||||
			}
 | 
			
		||||
			eventDispatcher.checkMissedMessages(client, message.d)
 | 
			
		||||
			if (listen === "full") {
 | 
			
		||||
				eventDispatcher.checkMissedMessages(client, message.d)
 | 
			
		||||
			}
 | 
			
		||||
 | 
			
		||||
		} else if (message.t === "GUILD_UPDATE") {
 | 
			
		||||
			const guild = client.guilds.get(message.d.id)
 | 
			
		||||
| 
						 | 
				
			
			@ -90,35 +93,37 @@ const utils = {
 | 
			
		|||
		}
 | 
			
		||||
 | 
			
		||||
		// Event dispatcher for OOYE bridge operations
 | 
			
		||||
		try {
 | 
			
		||||
			if (message.t === "GUILD_UPDATE") {
 | 
			
		||||
				await eventDispatcher.onGuildUpdate(client, message.d)
 | 
			
		||||
		if (listen === "full") {
 | 
			
		||||
			try {
 | 
			
		||||
				if (message.t === "GUILD_UPDATE") {
 | 
			
		||||
					await eventDispatcher.onGuildUpdate(client, message.d)
 | 
			
		||||
 | 
			
		||||
			} else if (message.t === "CHANNEL_UPDATE") {
 | 
			
		||||
				await eventDispatcher.onChannelOrThreadUpdate(client, message.d, false)
 | 
			
		||||
				} else if (message.t === "CHANNEL_UPDATE") {
 | 
			
		||||
					await eventDispatcher.onChannelOrThreadUpdate(client, message.d, false)
 | 
			
		||||
 | 
			
		||||
			} else if (message.t === "THREAD_CREATE") {
 | 
			
		||||
				// @ts-ignore
 | 
			
		||||
				await eventDispatcher.onThreadCreate(client, message.d)
 | 
			
		||||
				} else if (message.t === "THREAD_CREATE") {
 | 
			
		||||
					// @ts-ignore
 | 
			
		||||
					await eventDispatcher.onThreadCreate(client, message.d)
 | 
			
		||||
 | 
			
		||||
			} else if (message.t === "THREAD_UPDATE") {
 | 
			
		||||
				await eventDispatcher.onChannelOrThreadUpdate(client, message.d, true)
 | 
			
		||||
				} else if (message.t === "THREAD_UPDATE") {
 | 
			
		||||
					await eventDispatcher.onChannelOrThreadUpdate(client, message.d, true)
 | 
			
		||||
 | 
			
		||||
			} else if (message.t === "MESSAGE_CREATE") {
 | 
			
		||||
				await eventDispatcher.onMessageCreate(client, message.d)
 | 
			
		||||
				} else if (message.t === "MESSAGE_CREATE") {
 | 
			
		||||
					await eventDispatcher.onMessageCreate(client, message.d)
 | 
			
		||||
 | 
			
		||||
			} else if (message.t === "MESSAGE_UPDATE") {
 | 
			
		||||
				await eventDispatcher.onMessageUpdate(client, message.d)
 | 
			
		||||
				} else if (message.t === "MESSAGE_UPDATE") {
 | 
			
		||||
					await eventDispatcher.onMessageUpdate(client, message.d)
 | 
			
		||||
 | 
			
		||||
			} else if (message.t === "MESSAGE_DELETE") {
 | 
			
		||||
				await eventDispatcher.onMessageDelete(client, message.d)
 | 
			
		||||
				} else if (message.t === "MESSAGE_DELETE") {
 | 
			
		||||
					await eventDispatcher.onMessageDelete(client, message.d)
 | 
			
		||||
 | 
			
		||||
			} else if (message.t === "MESSAGE_REACTION_ADD") {
 | 
			
		||||
				await eventDispatcher.onReactionAdd(client, message.d)
 | 
			
		||||
				} else if (message.t === "MESSAGE_REACTION_ADD") {
 | 
			
		||||
					await eventDispatcher.onReactionAdd(client, message.d)
 | 
			
		||||
				}
 | 
			
		||||
			} catch (e) {
 | 
			
		||||
				// Let OOYE try to handle errors too
 | 
			
		||||
				eventDispatcher.onError(client, e, message)
 | 
			
		||||
			}
 | 
			
		||||
		} catch (e) {
 | 
			
		||||
			// Let OOYE try to handle errors too
 | 
			
		||||
			eventDispatcher.onError(client, e, message)
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -23,10 +23,6 @@ const discordCommandHandler = sync.require("./discord-command-handler")
 | 
			
		|||
 | 
			
		||||
let lastReportedEvent = 0
 | 
			
		||||
 | 
			
		||||
function isGuildAllowed(guildID) {
 | 
			
		||||
	return ["112760669178241024", "497159726455455754", "1100319549670301727"].includes(guildID)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// Grab Discord events we care about for the bridge, check them, and pass them on
 | 
			
		||||
 | 
			
		||||
module.exports = {
 | 
			
		||||
| 
						 | 
				
			
			@ -93,12 +89,22 @@ module.exports = {
 | 
			
		|||
			if (latestWasBridged) continue
 | 
			
		||||
 | 
			
		||||
			/** More recent messages come first. */
 | 
			
		||||
			console.log(`[check missed messages] in ${channel.id} (${guild.name} / ${channel.name}) because its last message ${channel.last_message_id} is not in the database`)
 | 
			
		||||
			const messages = await client.snow.channel.getChannelMessages(channel.id, {limit: 50})
 | 
			
		||||
			// console.log(`[check missed messages] in ${channel.id} (${guild.name} / ${channel.name}) because its last message ${channel.last_message_id} is not in the database`)
 | 
			
		||||
			let messages
 | 
			
		||||
			try {
 | 
			
		||||
				messages = await client.snow.channel.getChannelMessages(channel.id, {limit: 50})
 | 
			
		||||
			} catch (e) {
 | 
			
		||||
				if (e.message === `{"message": "Missing Access", "code": 50001}`) { // pathetic error handling from SnowTransfer
 | 
			
		||||
					console.log(`[check missed messages] no permissions to look back in channel ${channel.name} (${channel.id})`)
 | 
			
		||||
					continue // Sucks.
 | 
			
		||||
				} else {
 | 
			
		||||
					throw e // Sucks more.
 | 
			
		||||
				}
 | 
			
		||||
			}
 | 
			
		||||
			let latestBridgedMessageIndex = messages.findIndex(m => {
 | 
			
		||||
				return prepared.get(m.id)
 | 
			
		||||
			})
 | 
			
		||||
			console.log(`[check missed messages] got ${messages.length} messages; last message that IS bridged is at position ${latestBridgedMessageIndex} in the channel`)
 | 
			
		||||
			// console.log(`[check missed messages] got ${messages.length} messages; last message that IS bridged is at position ${latestBridgedMessageIndex} in the channel`)
 | 
			
		||||
			if (latestBridgedMessageIndex === -1) latestBridgedMessageIndex = 1 // rather than crawling the ENTIRE channel history, let's just bridge the most recent 1 message to make it up to date.
 | 
			
		||||
			for (let i = Math.min(messages.length, latestBridgedMessageIndex)-1; i >= 0; i--) {
 | 
			
		||||
				const simulatedGatewayDispatchData = {
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue