start adding command handlers
This commit is contained in:
		
							parent
							
								
									40c3ef8e83
								
							
						
					
					
						commit
						c56e92ccfb
					
				
					 3 changed files with 89 additions and 1 deletions
				
			
		
							
								
								
									
										81
									
								
								d2m/discord-command-handler.js
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										81
									
								
								d2m/discord-command-handler.js
									
										
									
									
									
										Normal file
									
								
							| 
						 | 
					@ -0,0 +1,81 @@
 | 
				
			||||||
 | 
					// @ts-check
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					const assert = require("assert").strict
 | 
				
			||||||
 | 
					const util = require("util")
 | 
				
			||||||
 | 
					const DiscordTypes = require("discord-api-types/v10")
 | 
				
			||||||
 | 
					const {discord, sync, db} = require("../passthrough")
 | 
				
			||||||
 | 
					/** @type {import("../matrix/api")}) */
 | 
				
			||||||
 | 
					const api = sync.require("../matrix/api")
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					const prefix = "/"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/**
 | 
				
			||||||
 | 
					 * @callback CommandExecute
 | 
				
			||||||
 | 
					 * @param {DiscordTypes.GatewayMessageCreateDispatchData} message
 | 
				
			||||||
 | 
					 * @param {DiscordTypes.APIGuildTextChannel} channel
 | 
				
			||||||
 | 
					 * @param {DiscordTypes.APIGuild} guild
 | 
				
			||||||
 | 
					 * @param {any} [ctx]
 | 
				
			||||||
 | 
					 */
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/**
 | 
				
			||||||
 | 
					 * @typedef Command
 | 
				
			||||||
 | 
					 * @property {string[]} aliases
 | 
				
			||||||
 | 
					 * @property {(message: DiscordTypes.GatewayMessageCreateDispatchData, channel: DiscordTypes.APIGuildTextChannel, guild: DiscordTypes.APIGuild) => Promise<any>} execute
 | 
				
			||||||
 | 
					 */
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/** @param {CommandExecute} execute */
 | 
				
			||||||
 | 
					function replyctx(execute) {
 | 
				
			||||||
 | 
						/** @type {CommandExecute} */
 | 
				
			||||||
 | 
						return function(message, channel, guild, ctx = {}) {
 | 
				
			||||||
 | 
							ctx.message_reference = {
 | 
				
			||||||
 | 
								message_id: message.id,
 | 
				
			||||||
 | 
								channel_id: channel.id,
 | 
				
			||||||
 | 
								guild_id: guild.id,
 | 
				
			||||||
 | 
								fail_if_not_exists: false
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
							return execute(message, channel, guild, ctx)
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/** @type {Command[]} */
 | 
				
			||||||
 | 
					const commands = [{
 | 
				
			||||||
 | 
						aliases: ["icon", "avatar", "roomicon", "roomavatar", "channelicon", "channelavatar"],
 | 
				
			||||||
 | 
						execute: replyctx(
 | 
				
			||||||
 | 
							async (message, channel, guild, ctx) => {
 | 
				
			||||||
 | 
								const roomID = db.prepare("SELECT room_id FROM channel_room WHERE channel_id = ?").pluck().get(channel.id)
 | 
				
			||||||
 | 
								if (!roomID) return discord.snow.channel.createMessage(channel.id, {
 | 
				
			||||||
 | 
									...ctx,
 | 
				
			||||||
 | 
									content: "This channel isn't bridged to the other side."
 | 
				
			||||||
 | 
								})
 | 
				
			||||||
 | 
								const avatarEvent = await api.getStateEvent(roomID, "m.room.avatar", "")
 | 
				
			||||||
 | 
								const avatarURL = avatarEvent?.url
 | 
				
			||||||
 | 
								return discord.snow.channel.createMessage(channel.id, {
 | 
				
			||||||
 | 
									...ctx,
 | 
				
			||||||
 | 
									content: `Current room avatar: ${avatarURL}`
 | 
				
			||||||
 | 
								})
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
						)
 | 
				
			||||||
 | 
					}, {
 | 
				
			||||||
 | 
						aliases: ["invite"],
 | 
				
			||||||
 | 
						execute: replyctx(
 | 
				
			||||||
 | 
							async (message, channel, guild, ctx) => {
 | 
				
			||||||
 | 
								discord.snow.channel.createMessage(channel.id, {
 | 
				
			||||||
 | 
									...ctx,
 | 
				
			||||||
 | 
									content: "This command isn't implemented yet."
 | 
				
			||||||
 | 
								})
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
						)
 | 
				
			||||||
 | 
					}]
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/** @type {CommandExecute} */
 | 
				
			||||||
 | 
					async function execute(message, channel, guild) {
 | 
				
			||||||
 | 
						if (!message.content.startsWith(prefix)) return
 | 
				
			||||||
 | 
						const words = message.content.split(" ")
 | 
				
			||||||
 | 
						const commandName = words[0]
 | 
				
			||||||
 | 
						const command = commands.find(c => c.aliases.includes(commandName))
 | 
				
			||||||
 | 
						if (!command) return
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						await command.execute(message, channel, guild)
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					module.exports.execute = execute
 | 
				
			||||||
| 
						 | 
					@ -18,6 +18,8 @@ const createRoom = sync.require("./actions/create-room")
 | 
				
			||||||
const createSpace = sync.require("./actions/create-space")
 | 
					const createSpace = sync.require("./actions/create-space")
 | 
				
			||||||
/** @type {import("../matrix/api")}) */
 | 
					/** @type {import("../matrix/api")}) */
 | 
				
			||||||
const api = sync.require("../matrix/api")
 | 
					const api = sync.require("../matrix/api")
 | 
				
			||||||
 | 
					/** @type {import("./discord-command-handler")}) */
 | 
				
			||||||
 | 
					const discordCommandHandler = sync.require("./discord-command-handler")
 | 
				
			||||||
 | 
					
 | 
				
			||||||
let lastReportedEvent = 0
 | 
					let lastReportedEvent = 0
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -156,7 +158,11 @@ module.exports = {
 | 
				
			||||||
		if (!channel.guild_id) return // Nothing we can do in direct messages.
 | 
							if (!channel.guild_id) return // Nothing we can do in direct messages.
 | 
				
			||||||
		const guild = client.guilds.get(channel.guild_id)
 | 
							const guild = client.guilds.get(channel.guild_id)
 | 
				
			||||||
		if (!isGuildAllowed(guild.id)) return
 | 
							if (!isGuildAllowed(guild.id)) return
 | 
				
			||||||
		await sendMessage.sendMessage(message, guild)
 | 
					
 | 
				
			||||||
 | 
							await Promise.all([
 | 
				
			||||||
 | 
								sendMessage.sendMessage(message, guild),
 | 
				
			||||||
 | 
								discordCommandHandler.execute(message, channel, guild)
 | 
				
			||||||
 | 
							])
 | 
				
			||||||
	},
 | 
						},
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	/**
 | 
						/**
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -190,6 +190,7 @@ module.exports.inviteToRoom = inviteToRoom
 | 
				
			||||||
module.exports.leaveRoom = leaveRoom
 | 
					module.exports.leaveRoom = leaveRoom
 | 
				
			||||||
module.exports.getEvent = getEvent
 | 
					module.exports.getEvent = getEvent
 | 
				
			||||||
module.exports.getAllState = getAllState
 | 
					module.exports.getAllState = getAllState
 | 
				
			||||||
 | 
					module.exports.getStateEvent = getStateEvent
 | 
				
			||||||
module.exports.getJoinedMembers = getJoinedMembers
 | 
					module.exports.getJoinedMembers = getJoinedMembers
 | 
				
			||||||
module.exports.sendState = sendState
 | 
					module.exports.sendState = sendState
 | 
				
			||||||
module.exports.sendEvent = sendEvent
 | 
					module.exports.sendEvent = sendEvent
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue