Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
14 changes: 13 additions & 1 deletion build.gradle.kts
Original file line number Diff line number Diff line change
Expand Up @@ -45,6 +45,18 @@ configure<BukkitPluginDescription> {
permission = "op"
usage = "/dev <reload>"
}
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
}
}
}

Expand All @@ -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 {
Expand Down
32 changes: 29 additions & 3 deletions src/main/kotlin/com/github/ringoame196_s_mcPlugin/Main.kt
Original file line number Diff line number Diff line change
@@ -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()
}
}
}
91 changes: 91 additions & 0 deletions src/main/kotlin/com/github/ringoame196_s_mcPlugin/PluginManager.kt
Original file line number Diff line number Diff line change
@@ -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<String>()

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)
}
}
}
Original file line number Diff line number Diff line change
@@ -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
}
}
Original file line number Diff line number Diff line change
@@ -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)
}
)
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -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<out String>): Boolean {
return true
}
Expand Down
Original file line number Diff line number Diff line change
@@ -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<out String>): 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<out String>): MutableList<String>? {
return when (args.size) {
1 -> mutableListOf("[プラグイン名]")
else -> mutableListOf()
}
}
}
2 changes: 2 additions & 0 deletions src/main/resources/config.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,2 @@
Port: 25585
ReloadCommand : "pluginmanager reload @pluginName"