@@ -2,39 +2,88 @@ package me.scoretwo.fastscript.api.script
22
33import me.scoretwo.fastscript.FastScript
44import 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
58import me.scoretwo.fastscript.api.utils.process.ProcessResult
69import me.scoretwo.fastscript.api.utils.process.ProcessResultType
710import me.scoretwo.fastscript.plugin
811import me.scoretwo.fastscript.sendMessage
912import me.scoretwo.fastscript.settings
1013import me.scoretwo.utils.bukkit.configuration.yaml.ConfigurationSection
1114import me.scoretwo.utils.bukkit.configuration.yaml.patchs.getLowerCaseNode
15+ import me.scoretwo.utils.sender.GlobalSender
16+ import me.scoretwo.utils.syntaxes.save
1217import java.io.File
1318
1419class 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}
0 commit comments