diff --git a/architecture/src/main/kotlin/br/com/devsrsouza/kotlinbukkitapi/architecture/ThirdPartyAware.kt b/architecture/src/main/kotlin/br/com/devsrsouza/kotlinbukkitapi/architecture/ThirdPartyAware.kt index a455b74..fba742d 100644 --- a/architecture/src/main/kotlin/br/com/devsrsouza/kotlinbukkitapi/architecture/ThirdPartyAware.kt +++ b/architecture/src/main/kotlin/br/com/devsrsouza/kotlinbukkitapi/architecture/ThirdPartyAware.kt @@ -1,7 +1,10 @@ package br.com.devsrsouza.kotlinbukkitapi.architecture import br.com.devsrsouza.kotlinbukkitapi.architecture.extensions.WithPlugin +import org.bukkit.Bukkit import org.bukkit.event.EventHandler +import org.bukkit.event.HandlerList +import org.bukkit.event.Listener import org.bukkit.event.server.PluginDisableEvent import org.bukkit.plugin.Plugin import java.util.WeakHashMap @@ -9,28 +12,48 @@ import java.util.WeakHashMap /** * A holder for all instance of a class [T] that is bound a specific plugin. * It unregister when the plugin is disable. - * TODO: plugin disable support */ public abstract class PluginDisableAwareController { public abstract val factory: (plugin: Plugin) -> T private val instances: WeakHashMap = WeakHashMap() + private val listeners: WeakHashMap = WeakHashMap() public fun get(plugin: Plugin): T { - return instances.getOrPut(plugin) { factory(plugin) } + return instances.getOrPut(plugin) { + listeners.put( + plugin, + DisableListener(plugin, ::disable).apply { + Bukkit.getServer().pluginManager.registerEvents(this, plugin) + }, + ) + factory(plugin) + } } public fun ensureInitialized(plugin: Plugin) { get(plugin) } - @EventHandler - public fun pluginDisableEvent(event: PluginDisableEvent) { - // todo: + private fun disable(plugin: Plugin) { + instances.remove(plugin)?.onDisable() + listeners.remove(plugin)?.also(HandlerList::unregisterAll) } } public interface PluginDisableAware : WithPlugin { public fun onDisable() } + +private class DisableListener( + val plugin: Plugin, + val onDisable: (Plugin) -> Unit, +) : Listener { + @EventHandler + public fun pluginDisableEvent(event: PluginDisableEvent) { + if (event.plugin.name == plugin.name) { + onDisable(plugin) + } + } +} diff --git a/build.gradle.kts b/build.gradle.kts index 226d2b5..daaa5d7 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -4,10 +4,3 @@ plugins { alias(libs.plugins.dependencyGraph) alias(libs.plugins.maven) apply false } - -subprojects { - repositories { - mavenCentral() - maven("https://repo.papermc.io/repository/maven-public/") - } -} \ No newline at end of file diff --git a/settings.gradle.kts b/settings.gradle.kts index eaa571c..70c0fc0 100644 --- a/settings.gradle.kts +++ b/settings.gradle.kts @@ -8,6 +8,14 @@ pluginManagement { } } +dependencyResolutionManagement { + repositoriesMode.set(RepositoriesMode.FAIL_ON_PROJECT_REPOS) + repositories { + mavenCentral() + maven("https://repo.papermc.io/repository/maven-public/") + } +} + rootProject.name = "KotlinBukkitAPI" include(":utility")