Skip to content

Commit 5c98955

Browse files
committed
feat: implementing registerPlugin for old plugins
1 parent 1daf092 commit 5c98955

File tree

2 files changed

+141
-37
lines changed

2 files changed

+141
-37
lines changed

src/legacy/api/LlAPI.cpp

Lines changed: 141 additions & 36 deletions
Original file line numberDiff line numberDiff line change
@@ -3,11 +3,10 @@
33
#include "api/APIHelp.h"
44
#include "engine/GlobalShareData.h"
55
#include "ll/api/Versions.h"
6-
#include "ll/api/mod/Mod.h"
7-
#include "ll/api/mod/ModManager.h"
86
#include "ll/api/mod/ModManagerRegistry.h"
97
#include "ll/api/utils/SystemUtils.h"
10-
#include "lse/PluginManager.h"
8+
#include "ll/api/data/Version.h"
9+
#include "ll/api/reflection/Serialization.h"
1110

1211
#include <string>
1312

@@ -41,7 +40,7 @@ ClassDefine<void> LlClassBuilder = defineClass("ll")
4140

4241
// For Compatibility
4342
.function("version", &LlClass::version)
44-
.function("versionStatus", &LlClass::getVersionStatusFunction)
43+
.function("versionStatus", &LlClass::getVersionStatus)
4544
.function("scriptEngineVersion", &LlClass::getScriptEngineVersionFunction)
4645

4746
.build();
@@ -58,17 +57,17 @@ Local<Value> LlClass::getLanguage() {
5857
try {
5958
return String::newString(ll::sys_utils::getSystemLocaleCode());
6059
}
61-
CATCH("Fail in LLSEGetLanguage")
60+
CATCH("Fail in getLanguage")
6261
}
6362

6463
Local<Value> LlClass::isWine() {
6564
try {
6665
return Boolean::newBoolean(ll::sys_utils::isWine());
6766
}
68-
CATCH("Fail in LLSEIsWine")
67+
CATCH("Fail in isWine")
6968
}
7069

71-
auto LlClass::isDebugMode() -> Local<Value> {
70+
Local<Value> LlClass::isDebugMode() {
7271
#ifdef NDEBUG
7372
return Boolean::newBoolean(false);
7473
#else
@@ -80,49 +79,167 @@ Local<Value> LlClass::isRelease() {
8079
try {
8180
return Boolean::newBoolean(!ll::getLoaderVersion().preRelease.has_value());
8281
}
83-
CATCH("Fail in LLSEIsRelease")
82+
CATCH("Fail in isRelease")
8483
}
8584

8685
Local<Value> LlClass::isBeta() {
8786
try {
8887
return Boolean::newBoolean(ll::getLoaderVersion().preRelease.has_value());
8988
}
90-
CATCH("Fail in LLSEIsBeta")
89+
CATCH("Fail in isBeta")
9190
}
9291

93-
Local<Value> LlClass::isDev() { return Boolean::newBoolean(false); }
92+
Local<Value> LlClass::isDev() {
93+
try {
94+
return Boolean::newBoolean(ll::getLoaderVersion().to_string().find("+") != std::string::npos);
95+
}
96+
CATCH("Fail in isDev");
97+
}
9498

9599
Local<Value> LlClass::getMajorVersion() {
96100
try {
97101
return Number::newNumber(ll::getLoaderVersion().major);
98102
}
99-
CATCH("Fail in LLSEGetMajorVersion")
103+
CATCH("Fail in getMajorVersion")
100104
}
101105

102106
Local<Value> LlClass::getMinorVersion() {
103107
try {
104108
return Number::newNumber(ll::getLoaderVersion().minor);
105109
}
106-
CATCH("Fail in LLSEGetMinorVersion")
110+
CATCH("Fail in getMinorVersion")
107111
}
108112

109113
Local<Value> LlClass::getRevisionVersion() {
110114
try {
111115
return Number::newNumber(ll::getLoaderVersion().patch);
112116
}
113-
CATCH("Fail in LLSEGetRevisionVersion")
117+
CATCH("Fail in getRevisionVersion")
114118
}
115119

116120
Local<Value> LlClass::getScriptEngineVersion() {
117121
try {
118122
return String::newString(EngineScope::currentEngine()->getEngineVersion());
119123
}
120-
CATCH("Fail in LLSEGetScriptEngineVerison")
124+
CATCH("Fail in getScriptEngineVersion")
125+
}
126+
127+
Local<Value> LlClass::getVersionStatus() {
128+
if (ll::getLoaderVersion().to_string().find("+") != std::string::npos) {
129+
return Number::newNumber(0);
130+
} else if (ll::getLoaderVersion().preRelease.has_value()) {
131+
return Number::newNumber(1);
132+
} else {
133+
return Number::newNumber(2);
134+
}
121135
}
122136

123-
Local<Value> LlClass::getVersionStatus() { return Number::newNumber(0); }
137+
Local<Value> LlClass::registerPlugin(const Arguments& args) {
138+
CHECK_ARGS_COUNT(args, 1);
139+
CHECK_ARG_TYPE(args[0], ValueKind::kString);
140+
if (args.size() >= 2) CHECK_ARG_TYPE(args[1], ValueKind::kString);
141+
// if (args.size() >= 3)
142+
// CHECK_ARG_TYPE(args[2], ValueKind::kObject);
143+
if (args.size() >= 4) CHECK_ARG_TYPE(args[3], ValueKind::kObject);
144+
145+
try {
146+
std::string desc = args.size() >= 2 ? args[1].asString().toString() : "";
147+
148+
ll::data::Version ver = ll::data::Version(1, 0, 0);
149+
if (args.size() >= 3) {
150+
if (args[2].isArray()) { // like [1,0,0].
151+
Local<Array> verInfo = args[2].asArray();
152+
if (verInfo.size() >= 1) {
153+
Local<Value> major = verInfo.get(0);
154+
if (major.isNumber()) ver.major = major.asNumber().toInt32();
155+
}
156+
if (verInfo.size() >= 2) {
157+
Local<Value> minor = verInfo.get(1);
158+
if (minor.isNumber()) ver.minor = minor.asNumber().toInt32();
159+
}
160+
if (verInfo.size() >= 3) {
161+
Local<Value> revision = verInfo.get(2);
162+
if (revision.isNumber()) ver.patch = revision.asNumber().toInt32();
163+
}
164+
if (verInfo.size() >= 4) { // script: Version Enum.
165+
Local<Value> status = verInfo.get(3);
166+
if (status.isNumber()) {
167+
switch (status.asNumber().toInt32()) {
168+
case 0:
169+
ver.preRelease->from_string("dev");
170+
break;
171+
case 1:
172+
ver.preRelease->from_string("beta");
173+
break;
174+
default:
175+
break;
176+
}
177+
}
178+
}
179+
} else if (args[2].isObject()) { // like { major: 1, minor:0, revision:0 }
180+
Local<Object> verInfo = args[2].asObject();
181+
if (verInfo.has("major")) {
182+
Local<Value> major = verInfo.get("major");
183+
if (major.isNumber()) ver.major = major.asNumber().toInt32();
184+
}
185+
if (verInfo.has("minor")) {
186+
Local<Value> minor = verInfo.get("minor");
187+
if (minor.isNumber()) ver.minor = minor.asNumber().toInt32();
188+
}
189+
if (verInfo.has("revision")) {
190+
Local<Value> revision = verInfo.get("revision");
191+
if (revision.isNumber()) ver.patch = revision.asNumber().toInt32();
192+
}
193+
if (verInfo.has("status")) {
194+
Local<Value> status = verInfo.get("status");
195+
if (status.isNumber()) {
196+
switch (status.asNumber().toInt32()) {
197+
case 0:
198+
ver.preRelease->from_string("dev");
199+
break;
200+
case 1:
201+
ver.preRelease->from_string("beta");
202+
break;
203+
default:
204+
break;
205+
}
206+
}
207+
}
208+
} else {
209+
LOG_WRONG_ARG_TYPE();
210+
return Boolean::newBoolean(false);
211+
}
212+
}
213+
214+
if (getEngineOwnData()->plugin->getManifest().version.value_or(ll::data::Version(0, 0, 0)) != ver) {
215+
auto newManifest = getEngineOwnData()->plugin->getManifest();
216+
newManifest.description = desc;
217+
newManifest.version = ver;
218+
if (args.size() >= 4) {
219+
Local<Object> otherInfo = args[3].asObject();
220+
auto keys = otherInfo.getKeyNames();
221+
if (!newManifest.extraInfo) {
222+
newManifest.extraInfo = ll::SmallDenseMap<std::string, std::string>();
223+
}
224+
for (auto& key : keys) {
225+
if (ll::string_utils::toLowerCase(key) == "author") {
226+
newManifest.author = otherInfo.get(key).asString().toString();
227+
continue;
228+
}
229+
newManifest.extraInfo->insert({key, otherInfo.get(key).asString().toString()});
230+
}
231+
}
232+
ll::file_utils::writeFile(
233+
getEngineOwnData()->plugin->getModDir() / "manifest.json",
234+
ll::reflection::serialize<nlohmann::ordered_json>(newManifest)->dump(4)
235+
);
236+
}
237+
238+
return Boolean::newBoolean(true);
239+
}
240+
CATCH("Fail in registerPlugin");
241+
}
124242

125-
Local<Value> LlClass::registerPlugin(const Arguments&) { return Boolean::newBoolean(true); }
126243
Local<Value> LlClass::getPluginInfo(const Arguments& args) {
127244
try {
128245
auto plugin = lse::LegacyScriptEngine::getInstance().getManager().getMod(args[0].asString().toString());
@@ -154,13 +271,13 @@ Local<Value> LlClass::getPluginInfo(const Arguments& args) {
154271
}
155272
return {};
156273
}
157-
CATCH("Fail in LLAPI");
274+
CATCH("Fail in getPluginInfo");
158275
}
159276
Local<Value> LlClass::versionString(const Arguments&) {
160277
try {
161278
return String::newString(ll::getLoaderVersion().to_string());
162279
}
163-
CATCH("Fail in LLSEGetVersionString!")
280+
CATCH("Fail in versionString!")
164281
}
165282

166283
Local<Value> LlClass::requireVersion(const Arguments&) { return Boolean::newBoolean(true); }
@@ -202,7 +319,7 @@ Local<Value> LlClass::getAllPluginInfo(const Arguments&) {
202319
}
203320
return plugins;
204321
}
205-
CATCH("Fail in LLAPI");
322+
CATCH("Fail in getAllPluginInfo");
206323
}
207324

208325
// For Compatibility
@@ -215,7 +332,7 @@ Local<Value> LlClass::listPlugins(const Arguments&) {
215332
}
216333
return plugins;
217334
}
218-
CATCH("Fail in LLAPI");
335+
CATCH("Fail in listPlugins");
219336
}
220337

221338
Local<Value> LlClass::require(const Arguments&) { return Boolean::newBoolean(true); }
@@ -226,12 +343,9 @@ Local<Value> LlClass::eval(const Arguments& args) {
226343
try {
227344
return EngineScope::currentEngine()->eval(args[0].asString().toString());
228345
}
229-
CATCH("Fail in LLSEEval!")
346+
CATCH("Fail in eval!")
230347
}
231348

232-
// For Compatibility
233-
Local<Value> LlClass::getVersionStatusFunction(const Arguments&) { return Number::newNumber(0); }
234-
235349
// For Compatibility
236350
Local<Value> LlClass::version(const Arguments&) {
237351
try {
@@ -241,25 +355,16 @@ Local<Value> LlClass::version(const Arguments&) {
241355
ver.set("revision", ll::getLoaderVersion().patch);
242356
ver.set("isBeta", !ll::getLoaderVersion().preRelease.has_value());
243357
ver.set("isRelease", ll::getLoaderVersion().preRelease.has_value());
244-
ver.set("isDev", false);
358+
ver.set("isDev", ll::getLoaderVersion().to_string().find("+") != std::string::npos);
245359
return ver;
246360
}
247-
CATCH("Fail in LLSEGetVersion!")
248-
}
249-
250-
// For Compatibility
251-
Local<Value> LlClass::isDebugModeFunction(const Arguments&) {
252-
#ifdef LEGACYSCRIPTENGINE_DEBUG
253-
return Boolean::newBoolean(true);
254-
#else
255-
return Boolean::newBoolean(false);
256-
#endif
361+
CATCH("Fail in version!")
257362
}
258363

259364
// For Compatibility
260365
Local<Value> LlClass::getScriptEngineVersionFunction(const Arguments&) {
261366
try {
262367
return String::newString(EngineScope::currentEngine()->getEngineVersion());
263368
}
264-
CATCH("Fail in LLSEGetScriptEngineVerison")
369+
CATCH("Fail in getScriptEngineVersion")
265370
}

src/legacy/api/LlAPI.h

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -34,7 +34,6 @@ class LlClass {
3434

3535
// For Compatibility
3636
static Local<Value> version(const Arguments& args);
37-
static Local<Value> getVersionStatusFunction(const Arguments& args);
3837
static Local<Value> isDebugModeFunction(const Arguments& args);
3938
static Local<Value> getScriptEngineVersionFunction(const Arguments& args);
4039
};

0 commit comments

Comments
 (0)