118 lines
		
	
	
		
			3.8 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
			
		
		
	
	
			118 lines
		
	
	
		
			3.8 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
| // @ts-check
 | |
| 
 | |
| // Discord library internals type beat
 | |
| 
 | |
| const DiscordTypes = require("discord-api-types/v10")
 | |
| const passthrough = require("../passthrough")
 | |
| const { sync } = passthrough
 | |
| 
 | |
| const utils = {
 | |
| 	/**
 | |
| 	 * @param {import("./discord-client")} client
 | |
| 	 * @param {import("cloudstorm").IGatewayMessage} message
 | |
| 	 */
 | |
| 	async onPacket(client, message) {
 | |
| 		// 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")
 | |
| 
 | |
| 		// Client internals, keep track of the state we need
 | |
| 		if (message.t === "READY") {
 | |
| 			if (client.ready) return
 | |
| 			client.ready = true
 | |
| 			client.user = message.d.user
 | |
| 			client.application = message.d.application
 | |
| 			console.log(`Discord logged in as ${client.user.username}#${client.user.discriminator} (${client.user.id})`)
 | |
| 
 | |
| 
 | |
| 		} else if (message.t === "GUILD_CREATE") {
 | |
| 			client.guilds.set(message.d.id, message.d)
 | |
| 			const arr = []
 | |
| 			client.guildChannelMap.set(message.d.id, arr)
 | |
| 			for (const channel of message.d.channels || []) {
 | |
| 				// @ts-ignore
 | |
| 				channel.guild_id = message.d.id
 | |
| 				arr.push(channel.id)
 | |
| 				client.channels.set(channel.id, channel)
 | |
| 			}
 | |
| 			for (const thread of message.d.threads || []) {
 | |
| 				// @ts-ignore
 | |
| 				thread.guild_id = message.d.id
 | |
| 				arr.push(thread.id)
 | |
| 				client.channels.set(thread.id, thread)
 | |
| 			}
 | |
| 			eventDispatcher.checkMissedMessages(client, message.d)
 | |
| 
 | |
| 
 | |
| 		} else if (message.t === "THREAD_CREATE") {
 | |
| 			client.channels.set(message.d.id, message.d)
 | |
| 
 | |
| 
 | |
| 		} else if (message.t === "CHANNEL_UPDATE" || message.t === "THREAD_UPDATE") {
 | |
| 			client.channels.set(message.d.id, message.d)
 | |
| 
 | |
| 
 | |
| 		} else if (message.t === "GUILD_DELETE") {
 | |
| 			client.guilds.delete(message.d.id)
 | |
| 			const channels = client.guildChannelMap.get(message.d.id)
 | |
| 			if (channels) {
 | |
| 				for (const id of channels) client.channels.delete(id)
 | |
| 			}
 | |
| 			client.guildChannelMap.delete(message.d.id)
 | |
| 
 | |
| 
 | |
| 		} else if (message.t === "CHANNEL_CREATE" || message.t === "CHANNEL_DELETE") {
 | |
| 			if (message.t === "CHANNEL_CREATE") {
 | |
| 				client.channels.set(message.d.id, message.d)
 | |
| 				if (message.d["guild_id"]) { // obj[prop] notation can be used to access a property without typescript complaining that it doesn't exist on all values something can have
 | |
| 					const channels = client.guildChannelMap.get(message.d["guild_id"])
 | |
| 					if (channels && !channels.includes(message.d.id)) channels.push(message.d.id)
 | |
| 				}
 | |
| 			} else {
 | |
| 				client.channels.delete(message.d.id)
 | |
| 				if (message.d["guild_id"]) {
 | |
| 					const channels = client.guildChannelMap.get(message.d["guild_id"])
 | |
| 					if (channels) {
 | |
| 						const previous = channels.indexOf(message.d.id)
 | |
| 						if (previous !== -1) channels.splice(previous, 1)
 | |
| 					}
 | |
| 				}
 | |
| 			}
 | |
| 		}
 | |
| 
 | |
| 		// Event dispatcher for OOYE bridge operations
 | |
| 		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 === "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 === "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_DELETE") {
 | |
| 				await eventDispatcher.onMessageDelete(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)
 | |
| 		}
 | |
| 	}
 | |
| }
 | |
| 
 | |
| module.exports = utils
 | 
