diff --git a/Server/commands/join.js b/Server/commands/join.js index cb0f493..b693719 100644 --- a/Server/commands/join.js +++ b/Server/commands/join.js @@ -1,7 +1,7 @@ // Modules -const { customSlashCommandBuilder } = require('../utilities/customSlashCommandBuilder'); +const { SlashCommandBuilder } = require('discord.js'); const { DebugBuilder } = require("../utilities/debugBuilder"); -const { getMembersInRole, getAllClientIds } = require("../utilities/utils"); +const { getMembersInRole, getAllClientIds, filterAutocompleteValues } = require("../utilities/utils"); const { requestOptions, sendHttpRequest } = require("../utilities/httpRequests"); const { getOnlineNodes, updateNodeInfo, addNodeConnection, getConnectionByNodeId } = require("../utilities/mysqlHandler"); @@ -88,15 +88,42 @@ async function joinServerWrapper(presetName, channelId, clientIdsUsed) { exports.joinServerWrapper = joinServerWrapper; module.exports = { - data: new customSlashCommandBuilder() + data: new SlashCommandBuilder() .setName('join') .setDescription('Join the channel you are in with the preset you choose') - .addAllSystemPresetOptions(), + .addStringOption(option => + option.setName("preset") + .setDescription("The preset you would like to listen to") + .setAutocomplete(true) + .setRequired(true)), example: "join", isPrivileged: false, requiresTokens: false, defaultTokenUsage: 0, deferInitialReply: true, + async autocomplete(interaction) { + const nodeObjects = await new Promise((recordResolve, recordReject) => { + getOnlineNodes((nodeRows) => { + recordResolve(nodeRows); + }); + }); + log.DEBUG("Node objects: ", nodeObjects); + var presetsAvailable = []; + for (const nodeObject of nodeObjects) { + log.DEBUG("Node object: ", nodeObject); + for (const presetName in nodeObject.nearbySystems) presetsAvailable.push(nodeObject.nearbySystems[presetName]); + } + + log.DEBUG("All Presets available: ", presetsAvailable); + + // Remove duplicates + options = [...new Set(presetsAvailable)]; + log.DEBUG("DeDuped Presets available: ", options); + + // Filter the results to what the user is entering + filterAutocompleteValues(interaction, options); + + }, async execute(interaction) { try{ const guildId = interaction.guild.id; diff --git a/Server/commands/leave.js b/Server/commands/leave.js index 0d9a28c..c5ad0b2 100644 --- a/Server/commands/leave.js +++ b/Server/commands/leave.js @@ -1,13 +1,12 @@ // Modules -const { customSlashCommandBuilder } = require('../utilities/customSlashCommandBuilder'); +const { SlashCommandBuilder } = require('discord.js'); const { DebugBuilder } = require("../utilities/debugBuilder"); -const { getAllClientIds, getKeyByArrayValue } = require("../utilities/utils"); +const { getAllClientIds, getKeyByArrayValue, filterAutocompleteValues } = require("../utilities/utils"); const { requestOptions, sendHttpRequest } = require("../utilities/httpRequests"); -const { checkNodeConnectionByClientId, removeNodeConnectionByNodeId, updateNodeInfo, getConnectedNodes, getAllConnections } = require('../utilities/mysqlHandler'); +const { checkNodeConnectionByClientId, removeNodeConnectionByNodeId, getAllConnections } = require('../utilities/mysqlHandler'); // Global Vars const log = new DebugBuilder("server", "leave"); -const logAC = new DebugBuilder("server", "leave_autocorrect"); async function leaveServerWrapper(clientIdObject) { if (!clientIdObject.clientId || !clientIdObject.name) return log.ERROR("Tried to leave server without client ID and/or Name"); @@ -34,7 +33,7 @@ async function leaveServerWrapper(clientIdObject) { exports.leaveServerWrapper = leaveServerWrapper; module.exports = { - data: new customSlashCommandBuilder() + data: new SlashCommandBuilder() .setName('leave') .setDescription('Disconnect a bot from the server') .addStringOption(option => @@ -47,18 +46,13 @@ module.exports = { requiresTokens: false, defaultTokenUsage: 0, deferInitialReply: true, - async autocomplete(interaction) { - const focusedValue = interaction.options.getFocused(); + async autocomplete(interaction) { const connections = await getAllConnections(); - const filtered = connections.filter(conn => String(conn.clientObject.name).startsWith(focusedValue)).map(conn => conn.clientObject.name); - logAC.DEBUG("Focused Value: ", focusedValue, connections, filtered); - await interaction.respond( - filtered.map(option => ({ name: option, value: option })), - ); + const options = connections.map(conn => conn.clientObject.name); + await filterAutocompleteValues(interaction, options); }, async execute(interaction) { - try{ - const guildId = interaction.guild.id; + try{ const botName = interaction.options.getString('bot'); log.DEBUG("Bot Name: ", botName) const clinetIds = await getAllClientIds(); diff --git a/Server/utilities/customSlashCommandBuilder.js b/Server/utilities/customSlashCommandBuilder.js deleted file mode 100644 index 6de2ffa..0000000 --- a/Server/utilities/customSlashCommandBuilder.js +++ /dev/null @@ -1,46 +0,0 @@ -const { SlashCommandBuilder, SlashCommandStringOption } = require('discord.js'); -const { DebugBuilder } = require("../utilities/debugBuilder"); -const { BufferToJson } = require("../utilities/utils"); -const log = new DebugBuilder("server", "customSlashCommandBuilder"); - -const { getAllNodes, getAllNodesSync } = require("../utilities/mysqlHandler"); - -exports.customSlashCommandBuilder = class customSlashCommandBuilder extends SlashCommandBuilder { - constructor() { - super(); - } - - async addAllSystemPresetOptions() { - const nodeObjects = await new Promise((recordResolve, recordReject) => { - getAllNodes((nodeRows) => { - recordResolve(nodeRows); - }); - }); - log.DEBUG("Node objects: ", nodeObjects); - var presetsAvailable = []; - for (const nodeObject of nodeObjects) { - log.DEBUG("Node object: ", nodeObject); - for (const presetName in nodeObject.nearbySystems) presetsAvailable.push(nodeObject.nearbySystems[presetName]); - } - - log.DEBUG("All Presets available: ", presetsAvailable); - - // Remove duplicates - presetsAvailable = [...new Set(presetsAvailable)]; - log.DEBUG("DeDuped Presets available: ", presetsAvailable); - - this.addStringOption(option => option.setName("preset").setRequired(true).setDescription("The channels")); - for (const preset of presetsAvailable){ - log.DEBUG("Preset: ", preset); - this.options[0].addChoices({ - 'name': String(preset), - 'value': String(preset) - }); - } - log.DEBUG("Preset Options: ", this); - - return this; - } - -} - diff --git a/Server/utilities/utils.js b/Server/utilities/utils.js index 259c7cb..2acef73 100644 --- a/Server/utilities/utils.js +++ b/Server/utilities/utils.js @@ -3,6 +3,7 @@ const { DebugBuilder } = require("../utilities/debugBuilder"); const { clientObject } = require("./recordHelper"); const { readFileSync } = require('fs'); const log = new DebugBuilder("server", "utils"); +const logAC = new DebugBuilder("server", "command-autocorrect"); const path = require('path'); // Convert a JSON object to a buffer for the DB @@ -116,4 +117,20 @@ exports.getClientObjectByClientID = (clientId) => { } } return undefined +} + + +exports.filterAutocompleteValues = async (interaction, options) => { + // Get the command used + const command = interaction.command; + + // Find values that start with what the user is entering + const focusedValue = interaction.options.getFocused(); + const filtered = options.filter(preset => preset.startsWith(focusedValue)); + + // Give the query response to the user + logAC.DEBUG("Focused Value: ", command, focusedValue, options, filtered); + await interaction.respond( + filtered.map(option => ({ name: option, value: option })), + ); } \ No newline at end of file