fix: autocomplete in nested form (#97)

Co-authored-by: Evo <85353424+EvolutionX-10@users.noreply.github.com>
This commit is contained in:
Jacob Nguyen
2022-08-02 13:51:31 -05:00
committed by GitHub
parent b6ea3da23f
commit 70d7bdb8c5
4 changed files with 112 additions and 81 deletions

152
package-lock.json generated
View File

@@ -1,15 +1,15 @@
{
"name": "@sern/handler",
"version": "1.1.7-beta",
"version": "1.1.8-beta",
"lockfileVersion": 2,
"requires": true,
"packages": {
"": {
"name": "@sern/handler",
"version": "1.1.7-beta",
"version": "1.1.8-beta",
"license": "MIT",
"dependencies": {
"discord.js": "^14.0.3",
"discord.js": "^14.1.2",
"rxjs": "^7.5.6",
"ts-pattern": "^4.0.2",
"ts-results": "^3.3.0"
@@ -23,12 +23,12 @@
}
},
"node_modules/@discordjs/builders": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/@discordjs/builders/-/builders-1.0.0.tgz",
"integrity": "sha512-8y91ZfpOHubiGJu5tVyGI9tQCEyHZDTeqUWVcJd0dq7B96xIf84S0L4fwmD1k9zTe1eqEFSk0gc7BpY+FKn7Ww==",
"version": "1.1.0",
"resolved": "https://registry.npmjs.org/@discordjs/builders/-/builders-1.1.0.tgz",
"integrity": "sha512-EO8TSltiIc9Z1wE854wAFvv5AccqEtvjFmao9PPoxQhRaJ0hEb7FwWRTCA1jGg4ZWI3hcp4m+RET5ufZQz3rOg==",
"dependencies": {
"@sapphire/shapeshift": "^3.5.1",
"discord-api-types": "^0.36.2",
"discord-api-types": "^0.36.3",
"fast-deep-equal": "^3.1.3",
"ts-mixer": "^6.0.1",
"tslib": "^2.4.0"
@@ -38,25 +38,25 @@
}
},
"node_modules/@discordjs/collection": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/@discordjs/collection/-/collection-1.0.0.tgz",
"integrity": "sha512-nAxDQYE5dNAzEGQ7HU20sujDsG5vLowUKCEqZkKUIlrXERZFTt/60zKUj/g4+AVCGeq+pXC5hivMaNtiC+PY5Q==",
"version": "1.0.1",
"resolved": "https://registry.npmjs.org/@discordjs/collection/-/collection-1.0.1.tgz",
"integrity": "sha512-5V/wswzR3r2RVYXLxxg4TvrAnBhVCNgHTXhC+OUtLoriJ072rPMHo+Iw1SS1vrCckp8Es40XM411+WkNRPaXFw==",
"engines": {
"node": ">=16.9.0"
}
},
"node_modules/@discordjs/rest": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/@discordjs/rest/-/rest-1.0.0.tgz",
"integrity": "sha512-uDAvnE0P2a8axMdD4C51EGjvCRQ2HZk2Yxf6vHWZgIqG87D8DGKMPwmquIxrrB07MjV+rwci2ObU+mGhGP+bJg==",
"version": "1.0.1",
"resolved": "https://registry.npmjs.org/@discordjs/rest/-/rest-1.0.1.tgz",
"integrity": "sha512-w08CTKVzzYYvKxEjXKOs9AdS7KQ1J502TrPfF8eCZ2lF6AfKuMP/32YgDakiwIyYTDjEQS/v0nKLSFcncHRMtg==",
"dependencies": {
"@discordjs/collection": "^1.0.0",
"@discordjs/collection": "^1.0.1",
"@sapphire/async-queue": "^1.3.2",
"@sapphire/snowflake": "^3.2.2",
"discord-api-types": "^0.36.2",
"file-type": "^17.1.2",
"discord-api-types": "^0.36.3",
"file-type": "^17.1.4",
"tslib": "^2.4.0",
"undici": "^5.7.0"
"undici": "^5.8.0"
},
"engines": {
"node": ">=16.9.0"
@@ -584,16 +584,16 @@
"integrity": "sha512-bz/NDyG0KBo/tY14vSkrwQ/n3HKPf87a0WFW/1M9+tXYK+vp5Z5EksawfCWo2zkAc6o7CClc0eff1Pjrqznlwg=="
},
"node_modules/discord.js": {
"version": "14.0.3",
"resolved": "https://registry.npmjs.org/discord.js/-/discord.js-14.0.3.tgz",
"integrity": "sha512-wH/VQl4CqN8/+dcXEtYis1iurqxGlDpEe0O4CqH5FGqZGIjVpTdtK0STXXx7bVNX8MT/0GvLZLkmO/5gLDWZVg==",
"version": "14.1.2",
"resolved": "https://registry.npmjs.org/discord.js/-/discord.js-14.1.2.tgz",
"integrity": "sha512-apdWNLkjAkeEnuNpB8H6rS/4OgrXQlSAjuuzeodjCOdIXy3OwOjD314V/HiSttcAlr9+r3ONhaT5qvbDad5SIg==",
"dependencies": {
"@discordjs/builders": "^1.0.0",
"@discordjs/collection": "^1.0.0",
"@discordjs/rest": "^1.0.0",
"@discordjs/builders": "^1.1.0",
"@discordjs/collection": "^1.0.1",
"@discordjs/rest": "^1.0.1",
"@sapphire/snowflake": "^3.2.2",
"@types/ws": "^8.5.3",
"discord-api-types": "^0.36.2",
"discord-api-types": "^0.36.3",
"fast-deep-equal": "^3.1.3",
"lodash.snakecase": "^4.1.1",
"tslib": "^2.4.0",
@@ -892,12 +892,12 @@
}
},
"node_modules/file-type": {
"version": "17.1.3",
"resolved": "https://registry.npmjs.org/file-type/-/file-type-17.1.3.tgz",
"integrity": "sha512-MFVSozBIhvnx2dkxlf+010Xqn6+ojlMUT9LXQiPNoOijgRtXNMghWdGK0u2o1RoCqzHoVsw65IL8ZBcQ4MhIrw==",
"version": "17.1.5",
"resolved": "https://registry.npmjs.org/file-type/-/file-type-17.1.5.tgz",
"integrity": "sha512-GMZRKCpcCQgqV0L/8ZqlMZ5lLzH2GLYnAwnqen6fr8b0CHzQPP+R/vXHBOsa0m/R74gCZP3sQDpu6fUeIvyFEQ==",
"dependencies": {
"readable-web-to-node-stream": "^3.0.2",
"strtok3": "^7.0.0-alpha.7",
"strtok3": "^7.0.0-alpha.9",
"token-types": "^5.0.0-alpha.2"
},
"engines": {
@@ -1307,11 +1307,11 @@
}
},
"node_modules/peek-readable": {
"version": "5.0.0-alpha.5",
"resolved": "https://registry.npmjs.org/peek-readable/-/peek-readable-5.0.0-alpha.5.tgz",
"integrity": "sha512-pJohF/tDwV3ntnT5+EkUo4E700q/j/OCDuPxtM+5/kFGjyOai/sK4/We4Cy1MB2OiTQliWU5DxPvYIKQAdPqAA==",
"version": "5.0.0",
"resolved": "https://registry.npmjs.org/peek-readable/-/peek-readable-5.0.0.tgz",
"integrity": "sha512-YtCKvLUOvwtMGmrniQPdO7MwPjgkFBtFIrmfSbYmYuq3tKDV/mcfAhBth1+C3ru7uXIZasc/pHnb+YDYNkkj4A==",
"engines": {
"node": "^12.20.0 || ^14.13.1 || >=16.0.0"
"node": ">=14.16"
},
"funding": {
"type": "github",
@@ -1585,15 +1585,15 @@
}
},
"node_modules/strtok3": {
"version": "7.0.0-alpha.8",
"resolved": "https://registry.npmjs.org/strtok3/-/strtok3-7.0.0-alpha.8.tgz",
"integrity": "sha512-u+k19v+rTxBjGYxncRQjGvZYwYvEd0uP3D+uHKe/s4WB1eXS5ZwpZsTlBu5xSS4zEd89mTXECXg6WW3FSeV8cA==",
"version": "7.0.0",
"resolved": "https://registry.npmjs.org/strtok3/-/strtok3-7.0.0.tgz",
"integrity": "sha512-pQ+V+nYQdC5H3Q7qBZAz/MO6lwGhoC2gOAjuouGf/VO0m7vQRh8QNMl2Uf6SwAtzZ9bOw3UIeBukEGNJl5dtXQ==",
"dependencies": {
"@tokenizer/token": "^0.3.0",
"peek-readable": "^5.0.0-alpha.5"
"peek-readable": "^5.0.0"
},
"engines": {
"node": "^12.20.0 || ^14.13.1 || >=16.0.0"
"node": ">=14.16"
},
"funding": {
"type": "github",
@@ -1631,15 +1631,15 @@
}
},
"node_modules/token-types": {
"version": "5.0.0-alpha.2",
"resolved": "https://registry.npmjs.org/token-types/-/token-types-5.0.0-alpha.2.tgz",
"integrity": "sha512-EsG9UxAW4M6VATrEEjhPFTKEUi1OiJqTUMIZOGBN49fGxYjZB36k0p7to3HZSmWRoHm1QfZgrg3e02fpqAt5fQ==",
"version": "5.0.0",
"resolved": "https://registry.npmjs.org/token-types/-/token-types-5.0.0.tgz",
"integrity": "sha512-cza79xW1bo4pa6/AAZoOaZTlgNCgG3oCG7LQiGrfRFVl+XZvqiyc0+ncvlz+3XDIDNf9WcaT3Hcy6n/e1Tuc9A==",
"dependencies": {
"@tokenizer/token": "^0.3.0",
"ieee754": "^1.2.1"
},
"engines": {
"node": "^12.20.0 || ^14.13.1 || >=16.0.0"
"node": ">=14.16"
},
"funding": {
"type": "github",
@@ -1811,34 +1811,34 @@
},
"dependencies": {
"@discordjs/builders": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/@discordjs/builders/-/builders-1.0.0.tgz",
"integrity": "sha512-8y91ZfpOHubiGJu5tVyGI9tQCEyHZDTeqUWVcJd0dq7B96xIf84S0L4fwmD1k9zTe1eqEFSk0gc7BpY+FKn7Ww==",
"version": "1.1.0",
"resolved": "https://registry.npmjs.org/@discordjs/builders/-/builders-1.1.0.tgz",
"integrity": "sha512-EO8TSltiIc9Z1wE854wAFvv5AccqEtvjFmao9PPoxQhRaJ0hEb7FwWRTCA1jGg4ZWI3hcp4m+RET5ufZQz3rOg==",
"requires": {
"@sapphire/shapeshift": "^3.5.1",
"discord-api-types": "^0.36.2",
"discord-api-types": "^0.36.3",
"fast-deep-equal": "^3.1.3",
"ts-mixer": "^6.0.1",
"tslib": "^2.4.0"
}
},
"@discordjs/collection": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/@discordjs/collection/-/collection-1.0.0.tgz",
"integrity": "sha512-nAxDQYE5dNAzEGQ7HU20sujDsG5vLowUKCEqZkKUIlrXERZFTt/60zKUj/g4+AVCGeq+pXC5hivMaNtiC+PY5Q=="
"version": "1.0.1",
"resolved": "https://registry.npmjs.org/@discordjs/collection/-/collection-1.0.1.tgz",
"integrity": "sha512-5V/wswzR3r2RVYXLxxg4TvrAnBhVCNgHTXhC+OUtLoriJ072rPMHo+Iw1SS1vrCckp8Es40XM411+WkNRPaXFw=="
},
"@discordjs/rest": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/@discordjs/rest/-/rest-1.0.0.tgz",
"integrity": "sha512-uDAvnE0P2a8axMdD4C51EGjvCRQ2HZk2Yxf6vHWZgIqG87D8DGKMPwmquIxrrB07MjV+rwci2ObU+mGhGP+bJg==",
"version": "1.0.1",
"resolved": "https://registry.npmjs.org/@discordjs/rest/-/rest-1.0.1.tgz",
"integrity": "sha512-w08CTKVzzYYvKxEjXKOs9AdS7KQ1J502TrPfF8eCZ2lF6AfKuMP/32YgDakiwIyYTDjEQS/v0nKLSFcncHRMtg==",
"requires": {
"@discordjs/collection": "^1.0.0",
"@discordjs/collection": "^1.0.1",
"@sapphire/async-queue": "^1.3.2",
"@sapphire/snowflake": "^3.2.2",
"discord-api-types": "^0.36.2",
"file-type": "^17.1.2",
"discord-api-types": "^0.36.3",
"file-type": "^17.1.4",
"tslib": "^2.4.0",
"undici": "^5.7.0"
"undici": "^5.8.0"
}
},
"@eslint/eslintrc": {
@@ -2194,16 +2194,16 @@
"integrity": "sha512-bz/NDyG0KBo/tY14vSkrwQ/n3HKPf87a0WFW/1M9+tXYK+vp5Z5EksawfCWo2zkAc6o7CClc0eff1Pjrqznlwg=="
},
"discord.js": {
"version": "14.0.3",
"resolved": "https://registry.npmjs.org/discord.js/-/discord.js-14.0.3.tgz",
"integrity": "sha512-wH/VQl4CqN8/+dcXEtYis1iurqxGlDpEe0O4CqH5FGqZGIjVpTdtK0STXXx7bVNX8MT/0GvLZLkmO/5gLDWZVg==",
"version": "14.1.2",
"resolved": "https://registry.npmjs.org/discord.js/-/discord.js-14.1.2.tgz",
"integrity": "sha512-apdWNLkjAkeEnuNpB8H6rS/4OgrXQlSAjuuzeodjCOdIXy3OwOjD314V/HiSttcAlr9+r3ONhaT5qvbDad5SIg==",
"requires": {
"@discordjs/builders": "^1.0.0",
"@discordjs/collection": "^1.0.0",
"@discordjs/rest": "^1.0.0",
"@discordjs/builders": "^1.1.0",
"@discordjs/collection": "^1.0.1",
"@discordjs/rest": "^1.0.1",
"@sapphire/snowflake": "^3.2.2",
"@types/ws": "^8.5.3",
"discord-api-types": "^0.36.2",
"discord-api-types": "^0.36.3",
"fast-deep-equal": "^3.1.3",
"lodash.snakecase": "^4.1.1",
"tslib": "^2.4.0",
@@ -2437,12 +2437,12 @@
}
},
"file-type": {
"version": "17.1.3",
"resolved": "https://registry.npmjs.org/file-type/-/file-type-17.1.3.tgz",
"integrity": "sha512-MFVSozBIhvnx2dkxlf+010Xqn6+ojlMUT9LXQiPNoOijgRtXNMghWdGK0u2o1RoCqzHoVsw65IL8ZBcQ4MhIrw==",
"version": "17.1.5",
"resolved": "https://registry.npmjs.org/file-type/-/file-type-17.1.5.tgz",
"integrity": "sha512-GMZRKCpcCQgqV0L/8ZqlMZ5lLzH2GLYnAwnqen6fr8b0CHzQPP+R/vXHBOsa0m/R74gCZP3sQDpu6fUeIvyFEQ==",
"requires": {
"readable-web-to-node-stream": "^3.0.2",
"strtok3": "^7.0.0-alpha.7",
"strtok3": "^7.0.0-alpha.9",
"token-types": "^5.0.0-alpha.2"
}
},
@@ -2748,9 +2748,9 @@
"dev": true
},
"peek-readable": {
"version": "5.0.0-alpha.5",
"resolved": "https://registry.npmjs.org/peek-readable/-/peek-readable-5.0.0-alpha.5.tgz",
"integrity": "sha512-pJohF/tDwV3ntnT5+EkUo4E700q/j/OCDuPxtM+5/kFGjyOai/sK4/We4Cy1MB2OiTQliWU5DxPvYIKQAdPqAA=="
"version": "5.0.0",
"resolved": "https://registry.npmjs.org/peek-readable/-/peek-readable-5.0.0.tgz",
"integrity": "sha512-YtCKvLUOvwtMGmrniQPdO7MwPjgkFBtFIrmfSbYmYuq3tKDV/mcfAhBth1+C3ru7uXIZasc/pHnb+YDYNkkj4A=="
},
"picomatch": {
"version": "2.3.1",
@@ -2903,12 +2903,12 @@
"dev": true
},
"strtok3": {
"version": "7.0.0-alpha.8",
"resolved": "https://registry.npmjs.org/strtok3/-/strtok3-7.0.0-alpha.8.tgz",
"integrity": "sha512-u+k19v+rTxBjGYxncRQjGvZYwYvEd0uP3D+uHKe/s4WB1eXS5ZwpZsTlBu5xSS4zEd89mTXECXg6WW3FSeV8cA==",
"version": "7.0.0",
"resolved": "https://registry.npmjs.org/strtok3/-/strtok3-7.0.0.tgz",
"integrity": "sha512-pQ+V+nYQdC5H3Q7qBZAz/MO6lwGhoC2gOAjuouGf/VO0m7vQRh8QNMl2Uf6SwAtzZ9bOw3UIeBukEGNJl5dtXQ==",
"requires": {
"@tokenizer/token": "^0.3.0",
"peek-readable": "^5.0.0-alpha.5"
"peek-readable": "^5.0.0"
}
},
"supports-color": {
@@ -2936,9 +2936,9 @@
}
},
"token-types": {
"version": "5.0.0-alpha.2",
"resolved": "https://registry.npmjs.org/token-types/-/token-types-5.0.0-alpha.2.tgz",
"integrity": "sha512-EsG9UxAW4M6VATrEEjhPFTKEUi1OiJqTUMIZOGBN49fGxYjZB36k0p7to3HZSmWRoHm1QfZgrg3e02fpqAt5fQ==",
"version": "5.0.0",
"resolved": "https://registry.npmjs.org/token-types/-/token-types-5.0.0.tgz",
"integrity": "sha512-cza79xW1bo4pa6/AAZoOaZTlgNCgG3oCG7LQiGrfRFVl+XZvqiyc0+ncvlz+3XDIDNf9WcaT3Hcy6n/e1Tuc9A==",
"requires": {
"@tokenizer/token": "^0.3.0",
"ieee754": "^1.2.1"

View File

@@ -1,6 +1,6 @@
{
"name": "@sern/handler",
"version": "1.1.7-beta",
"version": "1.1.8-beta",
"description": "A customizable, batteries-included, powerful discord.js framework to automate and streamline bot development.",
"main": "dist/index.js",
"scripts": {
@@ -21,7 +21,7 @@
"author": "SernDevs",
"license": "MIT",
"dependencies": {
"discord.js": "^14.0.3",
"discord.js": "^14.1.2",
"rxjs": "^7.5.6",
"ts-pattern": "^4.0.2",
"ts-results": "^3.3.0"

View File

@@ -23,6 +23,7 @@ import type {
} from 'discord.js';
import { isAutocomplete } from '../utilities/predicates';
import { SernError } from '../structures/errors';
import treeSearch from '../utilities/treeSearch';
export function applicationCommandDispatcher(interaction: Interaction) {
if (isAutocomplete(interaction)) {
@@ -41,10 +42,9 @@ export function applicationCommandDispatcher(interaction: Interaction) {
}
export function dispatchAutocomplete(interaction: AutocompleteInteraction) {
const choice = interaction.options.getFocused(true);
return (mod: BothCommand | SlashCommand) => {
const selectedOption = mod.options?.find(o => o.autocomplete && o.name === choice.name);
if (selectedOption !== undefined && selectedOption.autocomplete) {
const selectedOption = treeSearch(interaction, mod.options);
if (selectedOption !== undefined) {
return {
mod,
execute: () => selectedOption.command.execute(interaction),

View File

@@ -0,0 +1,31 @@
import type { SernOptionsData } from '../structures/module';
import { ApplicationCommandOptionType, AutocompleteInteraction } from 'discord.js';
export default function treeSearch(iAutocomplete: AutocompleteInteraction, options: SernOptionsData[] | undefined) {
if(options === undefined) return undefined;
const _options = options.slice(); // required to prevent direct mutation of options
while ( _options.length > 0 ) {
const cur = _options.pop()!;
switch ( cur.type ) {
case ApplicationCommandOptionType.Subcommand : {
for ( const option of cur.options ?? [] ) {
_options.push(option);
}
} break;
case ApplicationCommandOptionType.SubcommandGroup : {
for (const command of cur.options ?? []) {
_options.push(command);
}
} break;
default : {
if(cur.autocomplete) {
const choice = iAutocomplete.options.getFocused(true);
if(cur.name === choice.name && cur.autocomplete) {
return cur;
}
return undefined;
}
} break;
}
}
}