Skip to content

Commit 58efffe

Browse files
author
BuildTools
committed
Try to fix the remaining issues.
1 parent efc6742 commit 58efffe

File tree

18 files changed

+282
-211
lines changed

18 files changed

+282
-211
lines changed

common/src/main/kotlin/me/scoretwo/fastscript/FastScript.kt

Lines changed: 24 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,9 +7,12 @@ import me.scoretwo.fastscript.config.SettingConfig
77
import me.scoretwo.fastscript.script.ScriptManager
88
import me.scoretwo.fastscript.utils.Utils
99
import me.scoretwo.fastscript.utils.sendMessage
10+
import me.scoretwo.utils.bukkit.configuration.yaml.patchs.getLowerCaseNode
1011
import me.scoretwo.utils.plugin.GlobalPlugin
1112
import me.scoretwo.utils.sender.GlobalPlayer
13+
import me.scoretwo.utils.sender.GlobalSender
1214
import me.scoretwo.utils.syntaxes.StreamUtils
15+
import net.md_5.bungee.api.ChatColor
1316
import java.io.File
1417

1518
class FastScript(val plugin: ScriptPlugin) {
@@ -101,4 +104,24 @@ class FastScript(val plugin: ScriptPlugin) {
101104
}
102105

103106
}
104-
lateinit var plugin: GlobalPlugin
107+
lateinit var plugin: GlobalPlugin
108+
109+
fun GlobalSender.sendMessage(formatHeader: FormatHeader, strings: Array<String>, colorIndex: Boolean = true) {
110+
strings.forEach {
111+
this.sendMessage(formatHeader, it, colorIndex)
112+
}
113+
}
114+
115+
fun GlobalSender.sendMessage(formatHeader: FormatHeader, string: String, colorIndex: Boolean = true) {
116+
if (colorIndex)
117+
this.sendMessage("${SettingConfig.instance.defaultLanguage.getString(SettingConfig.instance.defaultLanguage.getLowerCaseNode("format-header.${formatHeader.name.toLowerCase()}"))}${string}")
118+
else
119+
this.sendMessage(
120+
ChatColor.translateAlternateColorCodes('&',"${
121+
SettingConfig.instance.defaultLanguage.getString(
122+
SettingConfig.instance.defaultLanguage.getLowerCaseNode("format-header.${formatHeader.name.toLowerCase()}"))}${string}"))
123+
}
124+
125+
fun String.setPlaceholder(player: GlobalPlayer): String {
126+
return FastScript.instance.setPlaceholder(player, this)
127+
}
Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,25 @@
1+
package me.scoretwo.fastscript.addon.javascript
2+
3+
import me.scoretwo.fastscript.FastScript
4+
import me.scoretwo.fastscript.api.script.ConfigScriptOptions
5+
import me.scoretwo.fastscript.api.script.FileScript
6+
import me.scoretwo.fastscript.api.script.ScriptDescription
7+
import me.scoretwo.fastscript.plugin
8+
import java.io.File
9+
import javax.script.ScriptEngineManager
10+
11+
class JavaScript(
12+
description: ScriptDescription,
13+
val options: JavaScriptOptions,
14+
files: MutableList<File>
15+
): FileScript(description, options, files) {
16+
17+
val engine = ScriptEngineManager(plugin.pluginClassLoader).getEngineByName(options.engine)
18+
19+
init {
20+
21+
}
22+
23+
24+
25+
}
Lines changed: 41 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,41 @@
1+
package me.scoretwo.fastscript.addon.javascript
2+
3+
import me.scoretwo.fastscript.api.script.ConfigScriptOptions
4+
import me.scoretwo.utils.bukkit.configuration.yaml.file.YamlConfiguration
5+
import me.scoretwo.utils.bukkit.configuration.yaml.patchs.getLowerCaseNode
6+
import java.io.File
7+
8+
class JavaScriptOptions(file: File, section: YamlConfiguration): ConfigScriptOptions(file, section) {
9+
10+
val javaScriptSection = section.getConfigurationSection(section.getLowerCaseNode("JavaScript"))
11+
12+
val engine: String
13+
val includes = mutableMapOf<String, ScriptInclude>()
14+
15+
init {
16+
if (!section.contains(section.getLowerCaseNode("JavaScript"))) {
17+
section.set("JavaScript", defaultSection)
18+
}
19+
20+
engine = section.getString(section.getLowerCaseNode("javascript.engine"), "nashorn")
21+
22+
section.getConfigurationSection(section.getLowerCaseNode("includes")).getKeys(false).forEach { key ->
23+
includes[key] = ScriptInclude.fromSection(section.getConfigurationSection(section.getLowerCaseNode("includes.$key")))
24+
}
25+
26+
27+
}
28+
29+
}
30+
31+
val defaultSection = YamlConfiguration().also {
32+
it.set("Includes", YamlConfiguration().also {
33+
it.set("utils", YamlConfiguration().also {
34+
it.set("Type", "OBJECT")
35+
it.set("Object", YamlConfiguration().also {
36+
it.set("Class", "me.scoretwo.fastscript.api.utils.Utils")
37+
})
38+
})
39+
})
40+
it.set("Engine", "nashorn")
41+
}
Lines changed: 107 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,107 @@
1+
package me.scoretwo.fastscript.addon.javascript
2+
3+
import me.scoretwo.fastscript.addon.javascript.ScriptIncludeType.*
4+
import me.scoretwo.fastscript.addon.javascript.exception.IncludeFormatException
5+
import me.scoretwo.fastscript.addon.javascript.exception.TypeInferenceException
6+
import me.scoretwo.fastscript.api.format.FormatHeader
7+
import me.scoretwo.fastscript.plugin
8+
import me.scoretwo.fastscript.utils.sendMessage
9+
import me.scoretwo.utils.bukkit.configuration.yaml.ConfigurationSection
10+
import me.scoretwo.utils.bukkit.configuration.yaml.patchs.getLowerCaseNode
11+
import java.lang.reflect.Method
12+
13+
class ScriptInclude(
14+
type: ScriptIncludeType?,
15+
val obj: Pair<String, List<Any?>?>?,
16+
val met: Pair<String, List<Any?>?>?
17+
) {
18+
19+
val type: ScriptIncludeType
20+
21+
init {
22+
if (type == null) {
23+
if (hasObject() && hasObjectArgs())
24+
this.type = INIT
25+
else if (hasObject() && hasObjectArgs() && hasMethod())
26+
this.type = OBJECT
27+
else if (hasObject() && hasMethod())
28+
this.type = STATIC
29+
else
30+
throw TypeInferenceException("Don't to inference script's type")
31+
} else this.type = type
32+
}
33+
34+
fun get(script: JavaScript): Any? {
35+
obj ?: throw IncludeFormatException()
36+
met ?: throw IncludeFormatException()
37+
val clazz = findClass(script, obj.first) ?: throw ClassNotFoundException()
38+
when (type) {
39+
OBJECT -> {
40+
val method = clazz.getMethod(met.first)
41+
val constructor = clazz.getDeclaredConstructor()
42+
constructor.isAccessible = true
43+
return accessMethod(script, clazz.newInstance(), method)
44+
}
45+
INIT -> {
46+
return try {
47+
val constructor = clazz.getDeclaredConstructor()
48+
constructor.isAccessible = true
49+
constructor.newInstance(*obj.second!!.toTypedArray())
50+
} catch (e: Exception) {
51+
e.printStackTrace()
52+
plugin.server.console.sendMessage(FormatHeader.ERROR, "脚本 §c${script.description.name} §7执行初始化时发生错误, 错误如下:")
53+
plugin.server.console.sendMessage("§7${e.message}")
54+
null
55+
}
56+
}
57+
STATIC -> {
58+
val method = clazz.getMethod(met.first)
59+
return accessMethod(script, null, method)
60+
}
61+
}
62+
}
63+
64+
fun hasObject() = obj != null
65+
fun hasObjectArgs() = if (hasObject()) obj!!.second != null else false
66+
67+
fun hasMethod() = met != null
68+
fun hasMethodArgs() = if (hasMethod()) met!!.second != null else false
69+
70+
71+
fun findClass(script: JavaScript, target: String) = try {
72+
Class.forName(target)
73+
} catch (e: ClassNotFoundException) {
74+
e.printStackTrace()
75+
plugin.server.console.sendMessage(FormatHeader.ERROR, "脚本 §c${script.description.name} §7没有找到类 §c${target}§7, 错误如下:")
76+
plugin.server.console.sendMessage("§7${e.message}")
77+
null
78+
}
79+
80+
fun accessMethod(script: JavaScript, `object`: Any?, method: Method) = try {
81+
method.invoke(`object`, obj!!.second)
82+
} catch (e: Exception) {
83+
e.printStackTrace()
84+
plugin.server.console.sendMessage(FormatHeader.ERROR, "脚本 §c${script.description.name} §7访问方法 §c${method.name} §7时发生错误, 错误如下:")
85+
plugin.server.console.sendMessage("§7${e.message}")
86+
null
87+
}
88+
89+
companion object {
90+
91+
fun fromSection(section: ConfigurationSection): ScriptInclude {
92+
val type = ScriptIncludeType.valueOf(section.getString(section.getLowerCaseNode("type")))
93+
94+
val obj: Pair<String, List<Any?>?>?
95+
section.getConfigurationSection(section.getLowerCaseNode("object")).also {
96+
obj = Pair(it.getString(it.getLowerCaseNode("class")), it.getList(it.getLowerCaseNode("args")))
97+
}
98+
val met: Pair<String, List<Any?>?>?
99+
section.getConfigurationSection(section.getLowerCaseNode("method")).also {
100+
met = Pair(it.getString(it.getLowerCaseNode("name")), it.getList(it.getLowerCaseNode("args")))
101+
}
102+
return ScriptInclude(type, obj, met)
103+
}
104+
105+
}
106+
107+
}
Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
package me.scoretwo.fastscript.addon.javascript
2+
3+
enum class ScriptIncludeType {
4+
OBJECT,
5+
INIT,
6+
STATIC
7+
}
Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,4 @@
1+
package me.scoretwo.fastscript.addon.javascript.exception
2+
3+
class IncludeFormatException: Exception() {
4+
}
Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,4 @@
1+
package me.scoretwo.fastscript.addon.javascript.exception
2+
3+
class TypeInferenceException(message: String): Exception(message) {
4+
}

common/src/main/kotlin/me/scoretwo/fastscript/api/script/AbstractScript.kt

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,13 @@ package me.scoretwo.fastscript.api.script
22

33
import java.io.File
44

5-
abstract class AbstractScript(val description: ScriptDescription, val textScripts: MutableList<String> = mutableListOf("")) {
5+
abstract class AbstractScript (
6+
val description: ScriptDescription,
7+
options: ScriptOptions,
8+
val textScripts: MutableList<String> = mutableListOf("")
9+
10+
) {
11+
val meta = mutableMapOf<String, Any?>()
612

713

814
}
Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,22 @@
1+
package me.scoretwo.fastscript.api.script
2+
3+
import me.scoretwo.utils.bukkit.configuration.yaml.ConfigurationSection
4+
import me.scoretwo.utils.bukkit.configuration.yaml.file.YamlConfiguration
5+
import me.scoretwo.utils.bukkit.configuration.yaml.patchs.getLowerCaseNode
6+
import java.io.File
7+
8+
abstract class ConfigScriptOptions(val file: File, val config: YamlConfiguration): ScriptOptions {
9+
override val main: String = config.getString(config.getLowerCaseNode("main"))
10+
override val meta = mutableMapOf<String, String>().also { map ->
11+
config.getStringList(config.getLowerCaseNode("meta")).forEach {
12+
map[it.substringBefore(":")] = it.substringAfter(":")
13+
}
14+
}
15+
16+
val otherSection = mutableListOf<ConfigurationSection>().also { sections ->
17+
config.getKeys(false).forEach {
18+
if (!arrayOf("main", "meta").contains(it.toLowerCase())) sections.add(config.getConfigurationSection(it))
19+
}
20+
}
21+
22+
}

common/src/main/kotlin/me/scoretwo/fastscript/api/script/FileScript.kt

Lines changed: 22 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,12 +2,32 @@ package me.scoretwo.fastscript.api.script
22

33
import java.io.File
44

5-
open class FileScript(description: ScriptDescription, val files: MutableList<File>): AbstractScript(description) {
5+
open class FileScript(
6+
description: ScriptDescription,
7+
private val options: ConfigScriptOptions,
8+
val files: MutableList<File> = mutableListOf()
9+
): AbstractScript(description, options) {
610

711
init {
812
reload()
913
}
1014

11-
open fun reload() = files.forEachIndexed { i, file -> textScripts[i] = file.readText() }
15+
fun addFile(file: File) {
16+
files.add(file)
17+
reload()
18+
}
19+
20+
fun removeFile(file: File) {
21+
files.remove(file)
22+
}
23+
24+
open fun reload() {
25+
if (!options.file.exists()) {
26+
options.config.save(options.file)
27+
}
28+
29+
files.forEachIndexed { i, file -> textScripts[i] = file.readText() }
30+
31+
}
1232

1333
}

0 commit comments

Comments
 (0)