Skip to content

Commit 84ce3e2

Browse files
committed
Use async for command processing
1 parent 9e85a67 commit 84ce3e2

File tree

3 files changed

+144
-91
lines changed

3 files changed

+144
-91
lines changed

build/scripts/commands.js

Lines changed: 134 additions & 78 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

src/commands.ts

Lines changed: 9 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -548,14 +548,14 @@ export function register(commands:Record<string, FishCommandData<string, any> |
548548
}
549549

550550
//Recursively resolve unresolved args (such as players that need to be determined through a menu)
551-
resolveArgsRecursive(output.processedArgs, output.unresolvedArgs, fishSender, () => {
551+
resolveArgsRecursive(output.processedArgs, output.unresolvedArgs, fishSender).then(async (resolvedArgs) => {
552552
//Run the command handler
553553
const usageData = fishSender.getUsageData(name);
554554
let failed = false;
555555
try {
556556
const args:FishCommandHandlerData<string, any> & FishCommandHandlerUtils = {
557557
rawArgs,
558-
args: output.processedArgs,
558+
args: resolvedArgs,
559559
sender: fishSender,
560560
data: data.data,
561561
outputFail: message => {outputFail(message, sender); failed = true;},
@@ -577,11 +577,11 @@ export function register(commands:Record<string, FishCommandData<string, any> |
577577
fishSender.tapInfo.commandName = name;
578578
fishSender.tapInfo.mode = mode;
579579
}
580-
fishSender.tapInfo.lastArgs = output.processedArgs;
580+
fishSender.tapInfo.lastArgs = resolvedArgs;
581581
},
582582
};
583583
data.requirements?.forEach(r => r(args));
584-
data.handler(args);
584+
await data.handler(args);
585585
//Update usage data
586586
if(!failed){
587587
usageData.lastUsedSuccessfully = globalUsageData[name].lastUsedSuccessfully = Date.now();
@@ -665,9 +665,9 @@ export function registerConsole(commands:Record<string, FishConsoleCommandData<s
665665
}
666666

667667
/** Recursively resolves args. This function is necessary to handle cases such as a command that accepts multiple players that all need to be selected through menus. */
668-
function resolveArgsRecursive(processedArgs: Record<string, FishCommandArgType>, unresolvedArgs:CommandArg[], sender:FishPlayer, callback:(args:Record<string, FishCommandArgType>) => void){
668+
async function resolveArgsRecursive(processedArgs: Record<string, FishCommandArgType>, unresolvedArgs:CommandArg[], sender:FishPlayer){
669669
if(unresolvedArgs.length == 0){
670-
callback(processedArgs);
670+
return processedArgs;
671671
} else {
672672
const argToResolve = unresolvedArgs.shift()!;
673673
let optionsList:mindustryPlayer[] = [];
@@ -676,18 +676,15 @@ function resolveArgsRecursive(processedArgs: Record<string, FishCommandArgType>,
676676
case "player": Groups.player.each(player => optionsList.push(player)); break;
677677
default: crash(`Unable to resolve arg of type ${argToResolve.type}`);
678678
}
679-
Menu.menu(`Select a player`, `Select a player for the argument "${argToResolve.name}"`, optionsList, sender, {
679+
const option = await Menu.menu(`Select a player`, `Select a player for the argument "${argToResolve.name}"`, optionsList, sender, {
680680
includeCancel: true,
681681
optionStringifier: player => Strings.stripColors(player.name).length >= 3 ?
682682
Strings.stripColors(player.name)
683683
: escapeStringColorsClient(player.name)
684-
}).then((option) => {
685-
processedArgs[argToResolve.name] = FishPlayer.get(option);
686-
resolveArgsRecursive(processedArgs, unresolvedArgs, sender, callback);
687684
});
688-
685+
processedArgs[argToResolve.name] = FishPlayer.get(option);
686+
return await resolveArgsRecursive(processedArgs, unresolvedArgs, sender);
689687
}
690-
691688
}
692689

693690
export function initialize(){

src/types.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -120,7 +120,7 @@ export type FishCommandHandlerUtils = {
120120
handleTaps(mode:TapHandleMode):void;
121121
};
122122
export type FishCommandHandler<ArgType extends string, StoredData> =
123-
(fish:FishCommandHandlerData<ArgType, StoredData> & FishCommandHandlerUtils) => unknown;
123+
(fish:FishCommandHandlerData<ArgType, StoredData> & FishCommandHandlerUtils) => void | Promise<void>;
124124

125125
export interface FishConsoleCommandRunner<ArgType extends string, StoredData> {
126126
(_:{

0 commit comments

Comments
 (0)