Skip to content

Commit

Permalink
Merge branch 'develop' into build-linux
Browse files Browse the repository at this point in the history
  • Loading branch information
engsr6982 committed Dec 20, 2024
2 parents 0c77923 + 1015cbb commit 5cf9716
Show file tree
Hide file tree
Showing 12 changed files with 388 additions and 156 deletions.
179 changes: 56 additions & 123 deletions src/Engine/EngineData.h
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@
#include "Entry.h"
#include "Loader/JavaScriptPlugin.h"
#include "Utils/Convert.h"
#include "Utils/StringUtils.h"
#include "Utils/Using.h"
#include "endstone/command/command.h"
#include "endstone/permissions/permission.h"
Expand All @@ -13,7 +14,28 @@
#include <optional>
#include <utility>
#include <vector>

#define TRY_PARSE_MACRO(NAME, KEY, TYPE, SCRIPT_TYPE, DEFAULT) \
TYPE tryParse##NAME() { \
try { \
if (mRegisterInfo.isEmpty()) return DEFAULT; \
auto obj = mRegisterInfo.get(); \
if (obj.has(KEY) && !obj.get(KEY).isNull()) { \
return ConvertFromScriptX<TYPE>(obj.get(KEY).as##SCRIPT_TYPE()); \
} \
} catch (...) { \
Entry::getInstance()->getLogger().error("Failed to parse " #KEY " from " + mFileName); \
} \
return DEFAULT; \
}

#define CALL_PLUGIN_MACRO(NAME, KEY) \
void call##NAME() { \
if (mRegisterInfo.isEmpty()) return; \
auto obj = mRegisterInfo.get(); \
if (obj.has(KEY) && obj.get(KEY).isFunction()) { \
obj.get(KEY).asFunction().call(); \
} \
}

namespace jse {

Expand All @@ -29,135 +51,42 @@ struct EngineData {
explicit EngineData(uint64_t engineID) : mEngineId(engineID) {}

public:
void callOnLoad() {
auto obj = mRegisterInfo.get();
if (obj.has("onLoad")) {
auto func = obj.get("onLoad");
if (func.isFunction()) {
func.asFunction().call();
return;
}
}
Entry::getInstance()->getLogger().error("Plugin '{}' does not register onLoad function", this->mFileName);
}
CALL_PLUGIN_MACRO(OnLoad, "onLoad");

void callOnEnable() {
auto obj = mRegisterInfo.get();
if (obj.has("onEnable")) {
auto func = obj.get("onEnable");
if (func.isFunction()) {
func.asFunction().call();
return;
}
}
Entry::getInstance()->getLogger().error("Plugin '{}' does not register onEnable function", this->mFileName);
}
CALL_PLUGIN_MACRO(OnEnable, "onEnable");

void callOnDisable() {
auto obj = mRegisterInfo.get();
if (obj.has("onDisable")) {
auto func = obj.get("onDisable");
if (func.isFunction()) {
func.asFunction().call();
return;
}
}
Entry::getInstance()->getLogger().error("Plugin '{}' does not register onDisable function", this->mFileName);
}
CALL_PLUGIN_MACRO(OnDisable, "onDisable");

public:
string tryParseName() {
auto obj = mRegisterInfo.get();
if (obj.has("name")) {
return obj.get("name").asString().toString();
}
return this->mFileName;
}
string tryParseVersion() {
auto obj = mRegisterInfo.get();
if (obj.has("version")) {
return obj.get("version").asString().toString();
}
return "0.0.0";
}
string tryParseDescription() {
auto obj = mRegisterInfo.get();
if (obj.has("description")) {
return obj.get("description").asString().toString();
}
return "";
}
endstone::PluginLoadOrder tryParseLoad() {
auto obj = mRegisterInfo.get();
return obj.has("load") && obj.get("load").isNumber()
? endstone::PluginLoadOrder(obj.get("load").asNumber().toInt64())
: endstone::PluginLoadOrder::PostWorld;
}
std::vector<string> tryParseAuthors() {
auto obj = mRegisterInfo.get();
if (obj.has("authors")) {
return ConvertFromScriptX<std::vector<string>>(obj.get("authors").asArray());
}
return {};
}
std::vector<string> tryParseContributors() {
auto obj = mRegisterInfo.get();
if (obj.has("contributors")) {
return ConvertFromScriptX<std::vector<string>>(obj.get("contributors").asArray());
}
return {};
}
string tryParseWebsite() {
auto obj = mRegisterInfo.get();
if (obj.has("website")) {
return obj.get("website").asString().toString();
}
return "";
}
string tryParsePrefix() {
auto obj = mRegisterInfo.get();
if (obj.has("prefix")) {
return obj.get("prefix").asString().toString();
}
return "";
}
std::vector<string> tryParseProvides() {
auto obj = mRegisterInfo.get();
if (obj.has("provides")) {
return ConvertFromScriptX<std::vector<string>>(obj.get("provides").asArray());
}
return {};
}
std::vector<string> tryParseDepend() {
auto obj = mRegisterInfo.get();
if (obj.has("depend")) {
return ConvertFromScriptX<std::vector<string>>(obj.get("depend").asArray());
}
return {};
}
std::vector<string> tryParseSoftDepend() {
auto obj = mRegisterInfo.get();
if (obj.has("soft_depend")) {
return ConvertFromScriptX<std::vector<string>>(obj.get("soft_depend").asArray());
}
return {};
}
std::vector<string> tryParseLoadBefore() {
auto obj = mRegisterInfo.get();
if (obj.has("load_before")) {
return ConvertFromScriptX<std::vector<string>>(obj.get("load_before").asArray());
}
return {};
}
endstone::PermissionDefault tryParseDefaultPermission() {
auto obj = mRegisterInfo.get();
return obj.has("default_permission") && obj.get("default_permission").isNumber()
? endstone::PermissionDefault(obj.get("default_permission").asNumber().toInt64())
: endstone::PermissionDefault::Operator;
}
TRY_PARSE_MACRO(
Name,
"name",
string,
String,
ll::string_utils::toSnakeCase(this->mFileName.substr(0, this->mFileName.find_last_of(".")))
);
TRY_PARSE_MACRO(Version, "version", string, String, "0.0.0");
TRY_PARSE_MACRO(Description, "description", string, String, "");
TRY_PARSE_MACRO(Load, "load", endstone::PluginLoadOrder, Number, endstone::PluginLoadOrder::PostWorld);
TRY_PARSE_MACRO(Authors, "authors", std::vector<string>, Array, {});
TRY_PARSE_MACRO(Contributors, "contributors", std::vector<string>, Array, {});
TRY_PARSE_MACRO(Website, "website", string, String, "");
TRY_PARSE_MACRO(Prefix, "prefix", string, String, "");
TRY_PARSE_MACRO(Provides, "provides", std::vector<string>, Array, {});
TRY_PARSE_MACRO(Depend, "depend", std::vector<string>, Array, {});
TRY_PARSE_MACRO(SoftDepend, "soft_depend", std::vector<string>, Array, {});
TRY_PARSE_MACRO(LoadBefore, "load_before", std::vector<string>, Array, {});
TRY_PARSE_MACRO(
DefaultPermission,
"default_permission",
endstone::PermissionDefault,
Number,
endstone::PermissionDefault::Operator
);

public:
void tryParseCommands(JsPluginDescriptionBuilder& jbuilder) {
if (mRegisterInfo.isEmpty()) return;
auto obj = mRegisterInfo.get();
if (!obj.has("commands")) {
return;
Expand Down Expand Up @@ -196,6 +125,7 @@ struct EngineData {


void tryParsePermissions(JsPluginDescriptionBuilder& jbuilder) {
if (mRegisterInfo.isEmpty()) return;
auto obj = mRegisterInfo.get();
if (!obj.has("permissions")) {
return;
Expand Down Expand Up @@ -227,5 +157,8 @@ struct EngineData {

#define GET_ENGINE_DATA(engine) engine->getData<EngineData>()

#undef TRY_PARSE_MACRO

#undef CALL_PLUGIN_MACRO

} // namespace jse
2 changes: 2 additions & 0 deletions src/Engine/EngineManager.cc
Original file line number Diff line number Diff line change
@@ -1,6 +1,8 @@
#include "EngineManager.h"
#include "BindAPI.h"
#include "EngineData.h"
#include "Utils/Convert.h"
#include <unordered_map>

namespace jse {
EngineManager& EngineManager::getInstance() {
Expand Down
1 change: 1 addition & 0 deletions src/Loader/JavaScriptPluginLoader.cc
Original file line number Diff line number Diff line change
Expand Up @@ -67,6 +67,7 @@ endstone::Plugin* JavaScriptPluginLoader::loadPlugin(std::string file) {
return nullptr;
}

#undef LOAD_CATCH

std::vector<std::string> JavaScriptPluginLoader::filterPlugins(const fs::path& directory) {
std::vector<std::string> plugins;
Expand Down
2 changes: 1 addition & 1 deletion src/Utils/Convert.h
Original file line number Diff line number Diff line change
Expand Up @@ -14,7 +14,7 @@ namespace jse {
// int、double、float -> Number
// bool -> Boolean
// std::vector<T> -> Array<T>
// std::unordered_map<std::string, V> -> Object<string, V>
// std::unordered_map<K, V> -> Object<string, V>
// enum<T> -> Number
namespace ConvertCppToScriptX {

Expand Down
Loading

0 comments on commit 5cf9716

Please sign in to comment.