Skip to content

Commit a47547c

Browse files
committed
Script framework update.
1 parent 6cbf0be commit a47547c

File tree

18 files changed

+325
-183
lines changed

18 files changed

+325
-183
lines changed

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

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@ import me.scoretwo.fastscript.api.expansion.ExpansionManager
44
import me.scoretwo.fastscript.api.format.FormatHeader
55
import me.scoretwo.fastscript.api.language.LanguageManager
66
import me.scoretwo.fastscript.api.plugin.ScriptPlugin
7-
import me.scoretwo.fastscript.api.script.Script
7+
import me.scoretwo.fastscript.api.script.custom.CustomScript
88
import me.scoretwo.fastscript.command.FSCommandNexus
99
import me.scoretwo.fastscript.config.SettingConfig
1010
import me.scoretwo.fastscript.api.script.ScriptManager
@@ -106,7 +106,7 @@ class FastScript(val plugin: ScriptPlugin) {
106106
var debug = false
107107

108108
lateinit var plugin: ScriptPlugin
109-
val scripts = mutableListOf<Script>()
109+
val scripts = mutableListOf<CustomScript>()
110110

111111
lateinit var settings: SettingConfig
112112
lateinit var languages: LanguageManager

FastScript-common/src/main/kotlin/me/scoretwo/fastscript/api/expansion/ExpansionManager.kt

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -35,14 +35,22 @@ class ExpansionManager {
3535
expansions.remove(expansion)
3636
}
3737

38-
fun getExpansion(name: String): FastScriptExpansion? {
38+
fun getExpansionByName(name: String): FastScriptExpansion? {
3939
for (expansion in expansions) {
4040
if (expansion.name == name)
4141
return expansion
4242
}
4343
return null
4444
}
4545

46+
fun getExpansionBySign(sign: String): FastScriptExpansion? {
47+
for (expansion in expansions) {
48+
if (expansion.sign == sign)
49+
return expansion
50+
}
51+
return null
52+
}
53+
4654
@Synchronized
4755
fun reload() {
4856
val startTime = System.currentTimeMillis()
Lines changed: 5 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,6 @@
11
package me.scoretwo.fastscript.api.expansion
22

33
import me.scoretwo.fastscript.api.script.Script
4-
import me.scoretwo.fastscript.scripts
54
import me.scoretwo.utils.sender.GlobalSender
65

76
abstract class FastScriptExpansion {
@@ -10,15 +9,13 @@ abstract class FastScriptExpansion {
109
abstract val sign: String
1110
abstract val fileSuffix: String
1211

13-
abstract fun convertScriptProcessor(script: Script): Boolean
12+
abstract val needEval: Boolean
13+
abstract fun eval(script: Script, sender: GlobalSender): Any?
14+
abstract fun eval(text: String, sender: GlobalSender): Any?
15+
abstract fun execute(script: Script, sender: GlobalSender, main: String = script.option.main, args: Array<Any?> = arrayOf()): Any?
16+
abstract fun execute(text: String, sender: GlobalSender, main: String = "main", args: Array<Any?> = arrayOf()): Any?
1417

1518
// abstract fun eval(script: Script, sender: GlobalSender): Any?
1619

1720
// abstract fun execute(script: Script, sender: GlobalSender, main: String, args: Array<Any?>): Any?
18-
19-
fun getHookedScripts() = mutableListOf<Script>().also { list ->
20-
scripts.forEach {
21-
if (it.scriptProcessor.containsKey(sign)) list.add(it)
22-
}
23-
}
2421
}
Lines changed: 24 additions & 44 deletions
Original file line numberDiff line numberDiff line change
@@ -1,56 +1,36 @@
11
package me.scoretwo.fastscript.api.script
22

33
import me.scoretwo.fastscript.FastScript
4+
import me.scoretwo.fastscript.api.expansion.FastScriptExpansion
45
import me.scoretwo.utils.sender.GlobalSender
5-
import java.io.File
66

7-
open class Script(
7+
/**
8+
* @author Scre2
9+
* @date 2021/2/8 13:33
10+
*
11+
* @project FastScript
12+
*/
13+
abstract class Script(
814
val description: ScriptDescription,
9-
val options: ScriptOptions,
10-
var scriptFiles: MutableList<File> = mutableListOf()
15+
val option: ScriptOption,
16+
// sign, text
17+
var texts : MutableMap<String, String> = mutableMapOf()
1118
) {
1219

1320
val name = description.name
1421

15-
// sign, processor
16-
val scriptProcessor = mutableMapOf<String, ScriptProcessor>()
17-
// sign, mergedText
18-
val mergedTexts = mutableMapOf<String, StringBuilder>()
19-
20-
open fun eval(sign: String, sender: GlobalSender): Any? {
21-
if (!scriptProcessor.containsKey(sign)) {
22-
return null
23-
}
24-
return scriptProcessor[sign]!!.eval(sender)
25-
}
26-
open fun execute(sign: String, sender: GlobalSender, main: String = options.main, args: Array<Any?> = arrayOf()): Any? {
27-
if (!scriptProcessor.containsKey(sign)) {
28-
return null
29-
}
30-
return scriptProcessor[sign]!!.execute(sender, main, args)
31-
}
32-
33-
open fun reload() {
34-
if (!options.file.exists()) {
35-
options.config.save(options.file)
36-
}
37-
}
38-
39-
fun mergeToTexts() {
40-
mergedTexts.clear()
41-
FastScript.instance.expansionManager.expansions.forEach {
42-
mergeToText(it.sign)
43-
}
44-
}
45-
46-
fun mergeToText(sign: String) {
47-
mergedTexts[sign] = StringBuilder().also {
48-
scriptFiles.forEach { file ->
49-
if (file.exists() && file.name.endsWith(".$sign")) {
50-
it.append(file.readText()).append("\n")
51-
}
52-
} }
53-
54-
}
22+
val bindExpansions get() =
23+
mutableListOf<FastScriptExpansion>().also { expansions -> texts.keys.forEach { expansions.add(FastScript.instance.expansionManager.getExpansionBySign(it) ?: return@forEach) } }
5524

25+
open fun eval(sign: String, sender: GlobalSender): Any? =
26+
eval(FastScript.instance.expansionManager.getExpansionBySign(sign), sender)
27+
28+
fun eval(expansion: FastScriptExpansion?, sender: GlobalSender): Any? =
29+
expansion?.eval(this, sender)
30+
31+
open fun execute(sign: String, sender: GlobalSender, main: String = option.main, args: Array<Any?> = arrayOf()): Any? =
32+
execute(FastScript.instance.expansionManager.getExpansionBySign(sign), sender, main, args)
33+
34+
fun execute(expansion: FastScriptExpansion?, sender: GlobalSender, main: String = option.main, args: Array<Any?> = arrayOf()): Any? =
35+
expansion?.execute(this, sender, main, args)
5636
}

FastScript-common/src/main/kotlin/me/scoretwo/fastscript/api/script/ScriptManager.kt

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

33
import me.scoretwo.fastscript.FastScript
44
import me.scoretwo.fastscript.api.format.FormatHeader
5+
import me.scoretwo.fastscript.api.script.custom.ConfigScriptOption
6+
import me.scoretwo.fastscript.api.script.custom.CustomScript
7+
import me.scoretwo.fastscript.api.script.temp.TempScript
58
import me.scoretwo.fastscript.api.utils.process.ProcessResult
69
import me.scoretwo.fastscript.api.utils.process.ProcessResultType
710
import me.scoretwo.fastscript.plugin
811
import me.scoretwo.fastscript.sendMessage
912
import me.scoretwo.fastscript.settings
1013
import me.scoretwo.utils.bukkit.configuration.yaml.ConfigurationSection
1114
import me.scoretwo.utils.bukkit.configuration.yaml.patchs.getLowerCaseNode
15+
import me.scoretwo.utils.sender.GlobalSender
16+
import me.scoretwo.utils.syntaxes.save
1217
import java.io.File
1318

1419
class ScriptManager {
1520

1621
val folders = mutableListOf(File(plugin.dataFolder, "scripts"))
1722

18-
val scripts = mutableMapOf<String, Script>()
23+
val scripts = mutableMapOf<String, CustomScript>()
24+
25+
init {
26+
if (!folders[0].exists()) {
27+
"""
28+
function main() {
29+
sender.sendMessage("&athis is demo.")
30+
}
31+
""".trimIndent().save(File(folders[0], "example.js"))
32+
}
33+
}
34+
35+
val tempScripts = mutableMapOf<String, TempScript>()
1936

2037
fun getScript(name: String) = scripts[name]
2138

39+
private fun loadGeneralScript(scriptFile: File): Pair<CustomScript?, ProcessResult> {
40+
val scriptName = scriptFile.name.substringAfterLast(".")
41+
scriptFile.parentFile.listFiles()?.forEach {
42+
if (it.name == "$scriptName.yml") {
43+
return Pair(null, ProcessResult(ProcessResultType.OTHER, "script option file exists!"))
44+
}
45+
}
46+
47+
val file = let {
48+
FastScript.instance.expansionManager.expansions.forEach { expansion ->
49+
if (!scriptFile.endsWith(expansion.fileSuffix))
50+
return@forEach
51+
52+
return@let scriptFile
53+
}
54+
}
55+
val script = CustomScript(
56+
object : ScriptDescription {
57+
override val name: String = scriptName
58+
override val main: String = "main"
59+
override val version: String? = null
60+
override val description: String? = null
61+
override val authors: Array<String> = arrayOf("FastScript")
62+
63+
},
64+
object : ConfigScriptOption() {
65+
66+
}
67+
)
68+
69+
}
70+
2271
/**
2372
* 仅接受文件后缀为yml的文件或者可用的脚本文件夹才能被处理
2473
*/
25-
private fun loadScript(file: File): Pair<Script?, ProcessResult> {
74+
private fun loadScript(file: File): Pair<CustomScript?, ProcessResult> {
2675
if (file.name.contains(" ")) return Pair(null, ProcessResult(ProcessResultType.FAILED, "File name cannot contain spaces!"))
2776
if (file.isDirectory) {
2877
return loadFromFolderScript(file)
2978
}
3079

3180
val scriptName = if (file.name.endsWith(".yml"))
32-
file.name.substringBeforeLast(".")
81+
file.name.substringAfterLast(".")
3382
else
34-
return Pair(null, ProcessResult(ProcessResultType.OTHER, "The file does not belong to the script, skip reading!"))
83+
return loadGeneralScript(file)
3584

36-
val options = ScriptOptions(file)
37-
val script = Script(ScriptDescription.fromSection(options.config), options)
85+
val options = ConfigScriptOption(file)
86+
val script = CustomScript(ScriptDescription.fromSection(options.config), options)
3887

3988
script.scriptFiles = mutableListOf<File>().also { files ->
4089
FastScript.instance.expansionManager.expansions.forEach { expansion ->
@@ -45,16 +94,19 @@ class ScriptManager {
4594
}
4695
}
4796

48-
script.scriptProcessor.forEach {
49-
if (it.value.needEval)
50-
script.eval(it.key, plugin.server.console)
97+
script.texts.keys.forEach { sign ->
98+
val expansion = FastScript.instance.expansionManager.getExpansionBySign(sign) ?: return@forEach
99+
100+
if (expansion.needEval) {
101+
expansion.eval(sign, plugin.server.console)
102+
}
51103
}
52104

53105
scripts[file.name.substringBeforeLast(".")] = script
54106
return Pair(script, ProcessResult(ProcessResultType.SUCCESS))
55107
}
56108

57-
private fun loadFromFolderScript(folder: File): Pair<Script?, ProcessResult> {
109+
private fun loadFromFolderScript(folder: File): Pair<CustomScript?, ProcessResult> {
58110
val optionsFiles = arrayOf("option.yml", "${folder.name}.yml", "setting.yml")
59111

60112
val optionsFile: File = optionsFiles.let {
@@ -65,20 +117,21 @@ class ScriptManager {
65117

66118
return Pair(null, ProcessResult(ProcessResultType.FAILED, "Option file not found in ${folder.name}."))
67119
}
68-
val options = ScriptOptions(optionsFile)
69-
val script = Script(ScriptDescription.fromSection(options.config), options)
120+
val options = ConfigScriptOption(optionsFile)
121+
val script = CustomScript(ScriptDescription.fromSection(options.config), options)
70122

71123
script.scriptFiles = mutableListOf<File>().also { files ->
72124
folder.listFiles()?.forEach { file ->
73-
script.scriptProcessor.forEach {
74-
if (file.endsWith(it.value.expansion.fileSuffix)) files.add(file)
125+
script.bindExpansions.forEach {
126+
if (file.endsWith(it.fileSuffix))
127+
files.add(file)
75128
}
76129
}
77130
}
78131

79-
script.scriptProcessor.forEach {
80-
if (it.value.needEval)
81-
script.eval(it.key, plugin.server.console)
132+
script.bindExpansions.forEach {
133+
if (it.needEval)
134+
script.eval(it.sign, plugin.server.console)
82135
}
83136

84137
scripts[folder.name] = script
@@ -95,17 +148,14 @@ class ScriptManager {
95148
@Synchronized
96149
fun loadScripts() {
97150
val startTime = System.currentTimeMillis()
98-
scripts.clear()
99-
folders[0].mkdirs()
100-
folders[0].listFiles()?.forEach { loadScript(it) }
101-
102151
var total = 0
103152
var success = 0
104153
var fail = 0
154+
scripts.clear()
105155

106-
settings.getStringList(settings.getLowerCaseNode("load-script-files")).forEach {
107-
val file = File(it)
156+
folders.addAll(mutableListOf<File>().also { files -> settings.getStringList(settings.getLowerCaseNode("load-script-files")).forEach { files.add(File(it)) } })
108157

158+
folders.forEach { file ->
109159
if (file.isDirectory && file.exists()) file.listFiles()?.forEach {
110160
loadScript(it).also {
111161
total++
@@ -127,7 +177,10 @@ class ScriptManager {
127177
section.isString(section.getLowerCaseNode("main"))
128178

129179

180+
fun eval(script: CustomScript, sign: String, sender: GlobalSender) =
181+
script.eval(sign, sender)
130182

131-
183+
fun execute(script: CustomScript, sign: String, sender: GlobalSender, main: String = script.configOption.main, args: Array<Any?> = arrayOf()) =
184+
script.execute(sign, sender, main, args)
132185

133186
}
Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
package me.scoretwo.fastscript.api.script
2+
3+
/**
4+
* @author Score2
5+
* @date 2021/2/8 13:28
6+
*
7+
* @project FastScript
8+
*/
9+
interface ScriptOption {
10+
11+
val main: String
12+
val meta: MutableMap<String, String>
13+
14+
}

FastScript-common/src/main/kotlin/me/scoretwo/fastscript/api/script/ScriptProcessor.kt

Lines changed: 0 additions & 12 deletions
This file was deleted.

FastScript-common/src/main/kotlin/me/scoretwo/fastscript/api/script/ScriptOptions.kt renamed to FastScript-common/src/main/kotlin/me/scoretwo/fastscript/api/script/custom/ConfigScriptOption.kt

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,14 +1,15 @@
1-
package me.scoretwo.fastscript.api.script
1+
package me.scoretwo.fastscript.api.script.custom
22

3+
import me.scoretwo.fastscript.api.script.ScriptOption
34
import me.scoretwo.utils.bukkit.configuration.yaml.ConfigurationSection
45
import me.scoretwo.utils.bukkit.configuration.yaml.file.YamlConfiguration
56
import me.scoretwo.utils.bukkit.configuration.yaml.patchs.getLowerCaseNode
67
import me.scoretwo.utils.bukkit.configuration.yaml.patchs.loadConfiguration
78
import java.io.File
89

9-
open class ScriptOptions(val file: File, val config: YamlConfiguration = file.loadConfiguration()) {
10-
val main: String = config.getString(config.getLowerCaseNode("main"))
11-
open val meta = mutableMapOf<String, String>().also { map ->
10+
open class ConfigScriptOption(val file: File, val config: YamlConfiguration = file.loadConfiguration()): ScriptOption {
11+
override val main: String = config.getString(config.getLowerCaseNode("main"))
12+
override val meta = mutableMapOf<String, String>().also { map ->
1213
config.getStringList(config.getLowerCaseNode("meta")).forEach {
1314
map[it.substringBefore(":")] = it.substringAfter(":")
1415
}

0 commit comments

Comments
 (0)