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) {
406437Local<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){}
526545Local<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!" )
0 commit comments