Skip to content

Commit cca5dbb

Browse files
committed
refactor: add missing option for CommandAPI
fix: fix overload
1 parent 62bc297 commit cca5dbb

File tree

2 files changed

+75
-56
lines changed

2 files changed

+75
-56
lines changed

src/legacy/api/CommandAPI.cpp

Lines changed: 74 additions & 56 deletions
Original file line numberDiff line numberDiff line change
@@ -41,6 +41,7 @@
4141
#include "ll/api/command/runtime/RuntimeOverload.h"
4242
#include "ll/api/command/runtime/RuntimeEnum.h"
4343
#include "ll/api/command/runtime/RuntimeCommand.h"
44+
#include "ll/api/service/GamingStatus.h"
4445

4546
#include <string>
4647
#include <vector>
@@ -231,7 +232,8 @@ Local<Value> McClass::newCommand(const Arguments& args) {
231232
CHECK_ARG_TYPE(args[1], ValueKind::kString);
232233

233234
try {
234-
auto name = args[0].asString().toString();
235+
auto name = args[0].asString().toString();
236+
235237
auto registry = ll::service::getCommandRegistry();
236238
if (registry) {
237239
auto instance = registry->findCommand(name);
@@ -316,6 +318,35 @@ Local<Value> CommandClass::setEnum(const Arguments& args) {
316318
CATCH("Fail in setEnum!")
317319
}
318320

321+
void onExecute(CommandOrigin const& origin, CommandOutput& output, RuntimeCommand const& runtime) {
322+
std::string commandName = runtime.getCommandName();
323+
if (localShareData->commandCallbacks.find(commandName) == localShareData->commandCallbacks.end()) {
324+
lse::getSelfPluginInstance().getLogger().warn(
325+
"Command {} failed to execute, is the plugin unloaded?"_tr(commandName)
326+
);
327+
return;
328+
}
329+
EngineScope enter(localShareData->commandCallbacks[commandName].fromEngine);
330+
try {
331+
Local<Object> args = Object::newObject();
332+
auto cmd = CommandClass::newCommand(commandName);
333+
auto ori = CommandOriginClass::newCommandOrigin(&origin);
334+
auto outp = CommandOutputClass::newCommandOutput(&output);
335+
336+
auto& registeredCommands = getEngineOwnData()->plugin->registeredCommands;
337+
if (registeredCommands.find(commandName) == registeredCommands.end()) {
338+
lse::getSelfPluginInstance().getLogger().warn("Could not find {} in registered commands."_tr(commandName));
339+
return;
340+
}
341+
for (std::string& name : registeredCommands[commandName]) {
342+
auto& param = runtime[name];
343+
args.set(name, convertResult(param, origin, output));
344+
}
345+
localShareData->commandCallbacks[commandName].func.get().call({}, cmd, ori, outp, args);
346+
}
347+
CATCH_WITHOUT_RETURN("Fail in executing command \"" + commandName + "\"!")
348+
}
349+
319350
// name, type, optional, description, identifier, option
320351
// name, type, description, identifier, option
321352
// name, type, optional, description, option
@@ -330,7 +361,7 @@ Local<Value> CommandClass::newParameter(const Arguments& args) {
330361
bool optional = false;
331362
std::string identifier = "";
332363
size_t index = 2;
333-
CommandParameterOption option = (CommandParameterOption)0;
364+
CommandParameterOption option = CommandParameterOption::None;
334365
if (args.size() > index && args[index].isBoolean()) optional = args[index++].asBoolean().value();
335366
if (args.size() > index && args[index].isString()) enumName = args[index++].asString().toString();
336367
if (args.size() > index && args[index].isString()) identifier = args[index++].asString().toString();
@@ -358,14 +389,14 @@ Local<Value> CommandClass::mandatory(const Arguments& args) {
358389
std::string enumName = "";
359390
std::string identifier = "";
360391
size_t index = 2;
361-
CommandParameterOption option = (CommandParameterOption)0;
392+
CommandParameterOption option = CommandParameterOption::None;
362393
if (args.size() > index && args[index].isString()) enumName = args[index++].asString().toString();
363394
if (args.size() > index && args[index].isString()) identifier = args[index++].asString().toString();
364395
if (args.size() > index && args[index].isNumber())
365396
option = (CommandParameterOption)args[index++].asNumber().toInt32();
366397
if (index != args.size()) throw std::runtime_error("Error Argument in newParameter");
367398

368-
paramMaps[name] = {type, false, enumName}; // Stores the parameter name for overload use
399+
paramMaps[name] = {type, false, enumName, option}; // Stores the parameter name for overload use
369400
getEngineOwnData()->plugin->registeredCommands[commandName].push_back(name
370401
); // Stores the parameter name for onExecute use
371402

@@ -385,14 +416,14 @@ Local<Value> CommandClass::optional(const Arguments& args) {
385416
std::string enumName = "";
386417
std::string identifier = "";
387418
size_t index = 2;
388-
CommandParameterOption option = (CommandParameterOption)0;
419+
CommandParameterOption option = CommandParameterOption::None;
389420
if (args.size() > index && args[index].isString()) enumName = args[index++].asString().toString();
390421
if (args.size() > index && args[index].isString()) identifier = args[index++].asString().toString();
391422
if (args.size() > index && args[index].isNumber())
392423
option = (CommandParameterOption)args[index++].asNumber().toInt32();
393424
if (index != args.size()) throw std::runtime_error("Error Argument in newParameter");
394425

395-
paramMaps[name] = {type, true, enumName}; // Stores the parameter name for overload use
426+
paramMaps[name] = {type, true, enumName, option}; // Stores the parameter name for overload use
396427
getEngineOwnData()->plugin->registeredCommands[commandName].push_back(name
397428
); // Stores the parameter name for onExecute use
398429

@@ -406,6 +437,7 @@ Local<Value> CommandClass::optional(const Arguments& args) {
406437
Local<Value> CommandClass::addOverload(const Arguments& args) {
407438
try {
408439
if (args.size() == 0) return Boolean::newBoolean(true);
440+
auto cmd = get().runtimeOverload(getEngineOwnData()->plugin);
409441
if (args[0].isNumber()) {
410442
for (int i = 0; i < args.size(); ++i) {
411443
CHECK_ARG_TYPE(args[i], ValueKind::kNumber);
@@ -414,16 +446,20 @@ Local<Value> CommandClass::addOverload(const Arguments& args) {
414446
ParamInfo& param = paramMaps[paramName];
415447
if (param.optional) {
416448
if (param.type == ParamKind::Kind::Enum) {
417-
auto& overload = get()
418-
.runtimeOverload(getEngineOwnData()->plugin)
419-
.optional(paramName, param.type, param.enumName);
449+
cmd.optional(paramName, param.type, param.enumName).option(param.option);
450+
} else {
451+
cmd.optional(paramName, param.type).option(param.option);
452+
}
453+
} else {
454+
if (param.type == ParamKind::Kind::Enum) {
455+
cmd.required(paramName, param.type, param.enumName).option(param.option);
420456
} else {
421-
auto& overload =
422-
get().runtimeOverload(getEngineOwnData()->plugin).optional(paramName, param.type);
457+
cmd.required(paramName, param.type).option(param.option);
423458
}
424459
}
425460
}
426461
}
462+
cmd.execute(onExecute);
427463
return Boolean::newBoolean(true);
428464
} else if (args[0].isString()) {
429465
for (int i = 0; i < args.size(); ++i) {
@@ -433,16 +469,20 @@ Local<Value> CommandClass::addOverload(const Arguments& args) {
433469
ParamInfo& param = paramMaps[paramName];
434470
if (param.optional) {
435471
if (param.type == ParamKind::Kind::Enum) {
436-
auto& overload = get()
437-
.runtimeOverload(getEngineOwnData()->plugin)
438-
.optional(paramName, param.type, param.enumName);
472+
cmd.optional(paramName, param.type, param.enumName).option(param.option);
439473
} else {
440-
auto& overload =
441-
get().runtimeOverload(getEngineOwnData()->plugin).optional(paramName, param.type);
474+
cmd.optional(paramName, param.type).option(param.option);
475+
}
476+
} else {
477+
if (param.type == ParamKind::Kind::Enum) {
478+
cmd.required(paramName, param.type, param.enumName).option(param.option);
479+
} else {
480+
cmd.required(paramName, param.type).option(param.option);
442481
}
443482
}
444483
}
445484
}
485+
cmd.execute(onExecute);
446486
return Boolean::newBoolean(true);
447487
} else if (args[0].isArray()) {
448488
auto arr = args[0].asArray();
@@ -455,16 +495,20 @@ Local<Value> CommandClass::addOverload(const Arguments& args) {
455495
ParamInfo& param = paramMaps[paramName];
456496
if (param.optional) {
457497
if (param.type == ParamKind::Kind::Enum) {
458-
auto& overload = get()
459-
.runtimeOverload(getEngineOwnData()->plugin)
460-
.optional(paramName, param.type, param.enumName);
498+
cmd.optional(paramName, param.type, param.enumName).option(param.option);
461499
} else {
462-
auto& overload =
463-
get().runtimeOverload(getEngineOwnData()->plugin).optional(paramName, param.type);
500+
cmd.optional(paramName, param.type).option(param.option);
501+
}
502+
} else {
503+
if (param.type == ParamKind::Kind::Enum) {
504+
cmd.required(paramName, param.type, param.enumName).option(param.option);
505+
} else {
506+
cmd.required(paramName, param.type).option(param.option);
464507
}
465508
}
466509
}
467510
}
511+
cmd.execute(onExecute);
468512
return Boolean::newBoolean(true);
469513
} else if (arr.get(0).isString()) {
470514
for (int i = 0; i < arr.size(); ++i) {
@@ -474,16 +518,20 @@ Local<Value> CommandClass::addOverload(const Arguments& args) {
474518
ParamInfo& param = paramMaps[paramName];
475519
if (param.optional) {
476520
if (param.type == ParamKind::Kind::Enum) {
477-
auto& overload = get()
478-
.runtimeOverload(getEngineOwnData()->plugin)
479-
.optional(paramName, param.type, param.enumName);
521+
cmd.optional(paramName, param.type, param.enumName).option(param.option);
480522
} else {
481-
auto& overload =
482-
get().runtimeOverload(getEngineOwnData()->plugin).optional(paramName, param.type);
523+
cmd.optional(paramName, param.type).option(param.option);
524+
}
525+
} else {
526+
if (param.type == ParamKind::Kind::Enum) {
527+
cmd.required(paramName, param.type, param.enumName).option(param.option);
528+
} else {
529+
cmd.required(paramName, param.type).option(param.option);
483530
}
484531
}
485532
}
486533
}
534+
cmd.execute(onExecute);
487535
return Boolean::newBoolean(true);
488536
}
489537
}
@@ -493,35 +541,6 @@ Local<Value> CommandClass::addOverload(const Arguments& args) {
493541
CATCH("Fail in addOverload!")
494542
}
495543

496-
void onExecute(CommandOrigin const& origin, CommandOutput& output, RuntimeCommand const& runtime) {
497-
std::string commandName = runtime.getCommandName();
498-
if (localShareData->commandCallbacks.find(commandName) == localShareData->commandCallbacks.end()) {
499-
lse::getSelfPluginInstance().getLogger().warn(
500-
"Command {} failed to execute, is the plugin unloaded?"_tr(commandName)
501-
);
502-
return;
503-
}
504-
EngineScope enter(localShareData->commandCallbacks[commandName].fromEngine);
505-
try {
506-
Local<Object> args = Object::newObject();
507-
auto cmd = CommandClass::newCommand(commandName);
508-
auto ori = CommandOriginClass::newCommandOrigin(&origin);
509-
auto outp = CommandOutputClass::newCommandOutput(&output);
510-
511-
auto& registeredCommands = getEngineOwnData()->plugin->registeredCommands;
512-
if (registeredCommands.find(commandName) == registeredCommands.end()) {
513-
lse::getSelfPluginInstance().getLogger().warn("Could not find {} in registered commands."_tr(commandName));
514-
return;
515-
}
516-
for (std::string& name : registeredCommands[commandName]) {
517-
auto& param = runtime[name];
518-
args.set(name, convertResult(param, origin, output));
519-
}
520-
localShareData->commandCallbacks[commandName].func.get().call({}, cmd, ori, outp, args);
521-
}
522-
CATCH_WITHOUT_RETURN("Fail in executing command \"" + commandName + "\"!")
523-
}
524-
525544
// function (command, origin, output, results){}
526545
Local<Value> CommandClass::setCallback(const Arguments& args) {
527546
CHECK_ARGS_COUNT(args, 1);
@@ -531,7 +550,6 @@ Local<Value> CommandClass::setCallback(const Arguments& args) {
531550
auto& command = get();
532551
localShareData
533552
->commandCallbacks[commandName] = {EngineScope::currentEngine(), 0, script::Global<Function>(func)};
534-
get().runtimeOverload(getEngineOwnData()->plugin).execute(onExecute);
535553
return Boolean::newBoolean(true);
536554
}
537555
CATCH("Fail in setCallback!")

src/legacy/api/CommandAPI.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,7 @@ struct ParamInfo {
2222
ll::command::ParamKind::Kind type;
2323
bool optional;
2424
std::string enumName;
25+
CommandParameterOption option;
2526
};
2627

2728
class CommandClass : public ScriptClass {

0 commit comments

Comments
 (0)