Skip to content

Commit 5b92a61

Browse files
committed
Test: Plugin
1 parent 8b60754 commit 5b92a61

File tree

5 files changed

+60
-3
lines changed

5 files changed

+60
-3
lines changed

build.gradle.kts

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -98,9 +98,7 @@ allprojects {
9898
}
9999

100100
java {
101-
// Uncomment these lines when the plugin system is ready
102-
// withSourcesJar()
103-
// withJavadocJar()
101+
withSourcesJar()
104102

105103
sourceCompatibility = JavaVersion.VERSION_17
106104
targetCompatibility = JavaVersion.VERSION_17

common/src/main/kotlin/com/lambda/core/Loader.kt

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,11 +8,13 @@ import com.lambda.gui.impl.clickgui.GuiConfigurable
88
import com.lambda.interaction.PlayerPacketManager
99
import com.lambda.interaction.RotationManager
1010
import com.lambda.module.ModuleRegistry
11+
import com.lambda.plugin.PluginRegistry
1112
import com.lambda.util.Communication.ascii
1213
import kotlin.system.measureTimeMillis
1314

1415
object Loader {
1516
private val loadables = listOf(
17+
PluginRegistry,
1618
ModuleRegistry,
1719
CommandManager,
1820
RotationManager,
Lines changed: 40 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,40 @@
1+
package com.lambda.plugin
2+
3+
import com.lambda.Lambda
4+
import com.lambda.Lambda.LOG
5+
import com.lambda.core.Loadable
6+
import com.lambda.plugin.api.Plugin
7+
import com.lambda.util.Communication.warn
8+
import com.lambda.util.FolderRegister.createIfNotExists
9+
import com.lambda.util.FolderRegister.listRecursive
10+
import com.lambda.util.FolderRegister.plugins
11+
import java.io.File
12+
import java.net.URLClassLoader
13+
import java.util.jar.JarFile
14+
15+
object PluginRegistry : Loadable {
16+
private fun loadPlugin(file: File) {
17+
val loader = URLClassLoader(arrayOf(file.toURI().toURL()))
18+
val manifest = JarFile(file).manifest
19+
val mainClass = manifest.mainAttributes.getValue("Main-Class")
20+
21+
val clazz = loader.loadClass(mainClass)
22+
val isObject = clazz.declaredFields.any { it.name == "INSTANCE" }
23+
val instance = if (isObject) clazz.getDeclaredField("INSTANCE").get(null)
24+
else clazz.getDeclaredConstructor().newInstance()
25+
26+
if (instance is Plugin) instance.load()
27+
else LOG.warn("Plugin $file is not a valid plugin")
28+
}
29+
30+
override fun load(): String {
31+
plugins.createIfNotExists()
32+
33+
val plugins = plugins.listRecursive()
34+
plugins.forEach { file ->
35+
loadPlugin(file)
36+
}
37+
38+
return "Loaded ${plugins.count()} plugins"
39+
}
40+
}
Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
1+
package com.lambda.plugin.api
2+
3+
import com.lambda.util.Nameable
4+
5+
abstract class Plugin(
6+
override val name: String,
7+
val description: String,
8+
val version: String,
9+
val author: List<String>,
10+
val dependencies: List<String>? = null,
11+
val softDependencies: List<String>? = null,
12+
val loadBefore: List<String>? = null,
13+
val loadAfter: List<String>? = null,
14+
) : Nameable {
15+
abstract fun load()
16+
}

common/src/main/kotlin/com/lambda/util/FolderRegister.kt

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,7 @@ object FolderRegister {
2121
val config: File = File(lambda, "config")
2222
val packetLogs: File = File(lambda, "packet-log")
2323
val replay: File = File(lambda, "replay")
24+
val plugins: File = File(lambda, "plugins")
2425

2526
fun File.createIfNotExists() {
2627
if (!exists()) { mkdirs() }

0 commit comments

Comments
 (0)