Skip to content

Commit

Permalink
feat: complete ThirdPartyAware plugin disabling
Browse files Browse the repository at this point in the history
  • Loading branch information
DevSrSouza committed Jun 25, 2023
1 parent 33d798e commit 14874b9
Show file tree
Hide file tree
Showing 3 changed files with 36 additions and 12 deletions.
Original file line number Diff line number Diff line change
@@ -1,36 +1,59 @@
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

/**
* 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<T : PluginDisableAware> {

public abstract val factory: (plugin: Plugin) -> T

private val instances: WeakHashMap<Plugin, T> = WeakHashMap()
private val listeners: WeakHashMap<Plugin, Listener> = 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<Plugin> {
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)
}
}
}
7 changes: 0 additions & 7 deletions build.gradle.kts
Original file line number Diff line number Diff line change
Expand Up @@ -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/")
}
}
8 changes: 8 additions & 0 deletions settings.gradle.kts
Original file line number Diff line number Diff line change
Expand Up @@ -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")
Expand Down

0 comments on commit 14874b9

Please sign in to comment.