diff --git a/build.gradle.kts b/build.gradle.kts index 1790b29..9a90df4 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -45,6 +45,18 @@ configure { permission = "op" usage = "/dev " } + register("pluginupdate") { + description = "AutomaticCreatingPluginUpdate用コマンド" + usage = "/pluginupdate <プラグイン名>" + permission = "automatic_creating_plugin_update.op" + } + } + + permissions{ + register("automatic_creating_plugin_update.op") { + description = "itemBag giveを使うための権限" + default = BukkitPluginDescription.Permission.Default.OP // TRUE, FALSE, OP or NOT_OP + } } } @@ -70,7 +82,7 @@ tasks.named("build") { } doLast { val port = 25585 - val ip = "192.168.0.21" + val ip = "ringoame-server" val apiUrl = "http://$ip:$port/plugin?name=${project.name}" try { diff --git a/src/main/kotlin/com/github/ringoame196_s_mcPlugin/Main.kt b/src/main/kotlin/com/github/ringoame196_s_mcPlugin/Main.kt index 4fe6c54..af6a571 100644 --- a/src/main/kotlin/com/github/ringoame196_s_mcPlugin/Main.kt +++ b/src/main/kotlin/com/github/ringoame196_s_mcPlugin/Main.kt @@ -1,18 +1,44 @@ package com.github.ringoame196_s_mcPlugin -import com.github.ringoame196_s_mcPlugin.commands.Command +import com.github.ringoame196_s_mcPlugin.commands.DevCommand +import com.github.ringoame196_s_mcPlugin.commands.PluginUpdateCommand import com.github.ringoame196_s_mcPlugin.events.Events import com.github.ringoame196_s_mcPlugin.team.TeamMonitorTask import org.bukkit.plugin.java.JavaPlugin class Main : JavaPlugin() { private val plugin = this + lateinit var reloadManagementServer: ReloadManagementServer override fun onEnable() { super.onEnable() + + plugin.saveDefaultConfig() // configファイル生成 + server.pluginManager.registerEvents(Events(), plugin) - val command = getCommand("dev") - command!!.setExecutor(Command()) + // コマンド + val devCommand = getCommand("dev") + devCommand!!.setExecutor(DevCommand()) + val command = getCommand("pluginupdate") + command!!.setExecutor(PluginUpdateCommand()) + + // チーム表示関係 TeamMonitorTask().runTaskTimer(this, 0L, 20L) // 20 tick(= 約1秒)ごとに実行 + + // reloadManagementServer関係 + val config = plugin.config + val port = config.getInt("Port") + reloadManagementServer = ReloadManagementServer(plugin) + reloadManagementServer.start(port) + // プラグインリロード関係 + val reloadCommand = config.getString("ReloadCommand") ?: "pluginmanager reload @pluginName" + PluginManager.setup(plugin, reloadCommand) + } + + override fun onDisable() { + super.onDisable() + if (::reloadManagementServer.isInitialized) { + reloadManagementServer.stop() + } } } diff --git a/src/main/kotlin/com/github/ringoame196_s_mcPlugin/PluginManager.kt b/src/main/kotlin/com/github/ringoame196_s_mcPlugin/PluginManager.kt new file mode 100644 index 0000000..5ac6098 --- /dev/null +++ b/src/main/kotlin/com/github/ringoame196_s_mcPlugin/PluginManager.kt @@ -0,0 +1,91 @@ +package com.github.ringoame196_s_mcPlugin + +import net.md_5.bungee.api.chat.ClickEvent +import net.md_5.bungee.api.chat.ComponentBuilder +import net.md_5.bungee.api.chat.HoverEvent +import net.md_5.bungee.api.chat.TextComponent +import org.bukkit.Bukkit +import org.bukkit.ChatColor +import org.bukkit.command.CommandSender +import org.bukkit.plugin.Plugin + +object PluginManager { + lateinit var plugin: Plugin + lateinit var reloadCommand: String + lateinit var developPluginName: String + private var reloadablePlugin = mutableSetOf() + + fun setup(plugin: Plugin, reloadCommand: String) { + this.plugin = plugin + this.reloadCommand = reloadCommand + this.developPluginName = plugin.name + } + + fun addReloadPlugin(pluginName: String) { + reloadablePlugin.add(pluginName) + + val message = "${ChatColor.YELLOW}[$developPluginName]${pluginName}を自動リロードしました" + sendOpMessage(message) + } + + fun createReloadMessage(pluginName: String): TextComponent { + val command = "/pluginupdate $pluginName" + + // メインメッセージ部分 + val mainMessage = TextComponent("${ChatColor.YELLOW}[$developPluginName] プラグイン名($pluginName) ") + // クリック可能なリロード部分 + val reloadComponent = TextComponent("${ChatColor.AQUA}[リロード]") + // ホバーテキストを設定 + reloadComponent.hoverEvent = HoverEvent(HoverEvent.Action.SHOW_TEXT, ComponentBuilder("クリックしてプラグインをリロードします").create()) + // クリック時にコマンド実行 + reloadComponent.clickEvent = ClickEvent(ClickEvent.Action.RUN_COMMAND, command) + // メインメッセージにリロード部分を追加 + mainMessage.addExtra(reloadComponent) + return mainMessage + } + + fun reloadPlugin(sender: CommandSender, pluginName: String) { + if (reloadablePlugin.contains(pluginName)) { + reloadablePlugin.remove(pluginName) + val command = reloadCommand.replace("@pluginName", pluginName) + Bukkit.dispatchCommand(sender, command) + } else { + val message = "${ChatColor.RED}既にリロードされています" + sender.sendMessage(message) + } + } + + fun autoReload(pluginName: String) { + val sender = Bukkit.getConsoleSender() + Bukkit.getScheduler().runTask( + plugin, + Runnable { + reloadPlugin(sender, pluginName) + } + ) + } + + fun acquisitionPlugin(pluginName: String): Plugin? { // プラグインがあるか確認 + return Bukkit.getPluginManager().getPlugin(pluginName) + } + + fun sendOpMessage(message: TextComponent) { + // メッセージをOPプレイヤーに送信 + for (player in Bukkit.getOnlinePlayers()) { + if (!player.isOp) { + continue + } + player.spigot().sendMessage(message) + } + } + + fun sendOpMessage(message: String) { + // メッセージをOPプレイヤーに送信 + for (player in Bukkit.getOnlinePlayers()) { + if (!player.isOp) { + continue + } + player.sendMessage(message) + } + } +} diff --git a/src/main/kotlin/com/github/ringoame196_s_mcPlugin/ReloadManagementServer.kt b/src/main/kotlin/com/github/ringoame196_s_mcPlugin/ReloadManagementServer.kt new file mode 100644 index 0000000..8ff6622 --- /dev/null +++ b/src/main/kotlin/com/github/ringoame196_s_mcPlugin/ReloadManagementServer.kt @@ -0,0 +1,27 @@ +package com.github.ringoame196_s_mcPlugin + +import com.sun.net.httpserver.HttpServer +import org.bukkit.Bukkit +import org.bukkit.plugin.Plugin + +class ReloadManagementServer(private val plugin: Plugin) { + private var server: HttpServer? = null + private val developPluginName = plugin.name + + fun start(port: Int) { + if (checkServer()) { + Bukkit.getLogger().severe("[$developPluginName] setup() was not called") + return + } + ReloadManagementServerManager.create(port, plugin).start() + } + fun stop() { + if (!checkServer()) return + server?.stop(1) // サーバーを止める + Bukkit.getLogger().info("[$developPluginName] Server stopped") + } + + private fun checkServer(): Boolean { + return server != null + } +} diff --git a/src/main/kotlin/com/github/ringoame196_s_mcPlugin/ReloadManagementServerManager.kt b/src/main/kotlin/com/github/ringoame196_s_mcPlugin/ReloadManagementServerManager.kt new file mode 100644 index 0000000..9387724 --- /dev/null +++ b/src/main/kotlin/com/github/ringoame196_s_mcPlugin/ReloadManagementServerManager.kt @@ -0,0 +1,57 @@ +package com.github.ringoame196_s_mcPlugin + +import com.sun.net.httpserver.HttpServer +import org.bukkit.Bukkit +import org.bukkit.plugin.Plugin +import java.io.OutputStream +import java.net.InetSocketAddress + +object ReloadManagementServerManager { + fun create(port: Int, plugin: Plugin): HttpServer { + val server = HttpServer.create(InetSocketAddress(port), 0) + server.createContext("/plugin") { exchange -> + val response = handlePluginRequest( + plugin, + exchange.requestURI.query + ) + + // webサイトの内容を書き換える + exchange.sendResponseHeaders(200, response.length.toLong()) + exchange.responseBody.use { os: OutputStream -> + os.write(response.toByteArray()) + } + } + return server + } + + fun handlePluginRequest(plugin: Plugin, query: String?): String { + val pluginName = getPluginName(query) ?: return "invalidQuery" + + val reloadPlugin = PluginManager.acquisitionPlugin(pluginName) + ?: return "pluginNotFound" + + runReload(plugin, reloadPlugin.name) + return "Reload $pluginName" + } + + private fun getPluginName(query: String?): String? { + if (query == null) return null + + return query.split("&").firstNotNullOfOrNull { + val (key, value) = it.split("=", limit = 2) + when (key) { + "plugin", "name" -> value + else -> null + } + } + } + + private fun runReload(plugin: Plugin, targetPlugin: String) { + Bukkit.getScheduler().runTask( + plugin, + Runnable { + PluginManager.addReloadPlugin(targetPlugin) + } + ) + } +} diff --git a/src/main/kotlin/com/github/ringoame196_s_mcPlugin/commands/Command.kt b/src/main/kotlin/com/github/ringoame196_s_mcPlugin/commands/DevCommand.kt similarity index 91% rename from src/main/kotlin/com/github/ringoame196_s_mcPlugin/commands/Command.kt rename to src/main/kotlin/com/github/ringoame196_s_mcPlugin/commands/DevCommand.kt index 34ad8e7..c99c897 100644 --- a/src/main/kotlin/com/github/ringoame196_s_mcPlugin/commands/Command.kt +++ b/src/main/kotlin/com/github/ringoame196_s_mcPlugin/commands/DevCommand.kt @@ -5,7 +5,7 @@ import org.bukkit.command.CommandExecutor import org.bukkit.command.CommandSender import org.bukkit.command.TabCompleter -class Command : CommandExecutor, TabCompleter { +class DevCommand : CommandExecutor, TabCompleter { override fun onCommand(sender: CommandSender, command: Command, label: String, args: Array): Boolean { return true } diff --git a/src/main/kotlin/com/github/ringoame196_s_mcPlugin/commands/PluginUpdateCommand.kt b/src/main/kotlin/com/github/ringoame196_s_mcPlugin/commands/PluginUpdateCommand.kt new file mode 100644 index 0000000..b32b320 --- /dev/null +++ b/src/main/kotlin/com/github/ringoame196_s_mcPlugin/commands/PluginUpdateCommand.kt @@ -0,0 +1,25 @@ +package com.github.ringoame196_s_mcPlugin.commands + +import com.github.ringoame196_s_mcPlugin.PluginManager +import org.bukkit.command.Command +import org.bukkit.command.CommandExecutor +import org.bukkit.command.CommandSender +import org.bukkit.command.TabCompleter + +class PluginUpdateCommand() : CommandExecutor, TabCompleter { + override fun onCommand(sender: CommandSender, command: Command, label: String, args: Array): Boolean { + if (args.isEmpty()) return false + + val pluginName = args[0] + PluginManager.reloadPlugin(sender, pluginName) + + return true + } + + override fun onTabComplete(commandSender: CommandSender, command: Command, label: String, args: Array): MutableList? { + return when (args.size) { + 1 -> mutableListOf("[プラグイン名]") + else -> mutableListOf() + } + } +} diff --git a/src/main/resources/config.yml b/src/main/resources/config.yml new file mode 100644 index 0000000..92f5087 --- /dev/null +++ b/src/main/resources/config.yml @@ -0,0 +1,2 @@ +Port: 25585 +ReloadCommand : "pluginmanager reload @pluginName" \ No newline at end of file