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
20 changes: 20 additions & 0 deletions src/main/kotlin/com/pool25m/logtime/PlayerStatsService.kt
Original file line number Diff line number Diff line change
Expand Up @@ -29,6 +29,26 @@ class PlayerStatsService {
}.sortedByDescending { it.playTicks } // 正確な時間でソート
}

/*
* 指定したプレイヤー名のプレイ時間を取得する
*/
fun getPlayerStats(playerName: String): PlayerRankData? {
val offlinePlayer = Bukkit.getOfflinePlayer(playerName)

// プレイヤーが存在しない、またはログインしたことがない場合
if (!offlinePlayer.hasPlayedBefore()) {
return null
}

val playTicks = offlinePlayer.getStatistic(Statistic.PLAY_ONE_MINUTE).toLong()

return PlayerRankData(
playerName = offlinePlayer.name ?: playerName,
playTicks = playTicks,
formattedPlayTime = formatPlayTimeFromTicks(playTicks),
)
}

private fun formatPlayTimeFromTicks(ticks: Long): String {
val millis = ticks * 50 // 1 tick = 50ms
val hours = TimeUnit.MILLISECONDS.toHours(millis)
Expand Down
49 changes: 46 additions & 3 deletions src/main/kotlin/com/pool25m/logtime/RankingCommand.kt
Original file line number Diff line number Diff line change
Expand Up @@ -13,19 +13,62 @@ class RankingCommand(
label: String,
args: Array<out String>,
): Boolean {
when {
args.isEmpty() -> {
// 引数なし:ランキング表示
showRanking(sender)
}
args.size == 1 -> {
val arg = args[0]
if (arg.lowercase() == "help") {
showHelp(sender)
} else {
// プレイヤー名として処理
showPlayerStats(sender, arg)
}
}
else -> {
sender.sendMessage("使用方法: /logtime [プレイヤー名|help]")
}
}

return true
}

private fun showRanking(sender: CommandSender) {
val rankedList = playerStatsService.getPlayerRankings()

if (rankedList.isEmpty()) {
sender.sendMessage("No players found.")
return true
sender.sendMessage("プレイヤーが見つかりませんでした。")
return
}

sender.sendMessage("--- 総プレイ時間ランキング ---")
rankedList.forEachIndexed { index, rankData ->
val rank = index + 1
sender.sendMessage("$rank. ${rankData.playerName} - ${rankData.formattedPlayTime}")
}
}

return true
private fun showPlayerStats(
sender: CommandSender,
playerName: String,
) {
val playerStats = playerStatsService.getPlayerStats(playerName)

if (playerStats == null) {
sender.sendMessage("プレイヤー「$playerName」が見つかりませんでした。")
return
}

sender.sendMessage("--- ${playerStats.playerName}のプレイ時間 ---")
sender.sendMessage("総プレイ時間: ${playerStats.formattedPlayTime}")
}

private fun showHelp(sender: CommandSender) {
sender.sendMessage("--- LogTime コマンドヘルプ ---")
sender.sendMessage("/logtime - 全プレイヤーのプレイ時間ランキングを表示")
sender.sendMessage("/logtime <プレイヤー名> - 指定プレイヤーのプレイ時間を表示")
sender.sendMessage("/logtime help - このヘルプを表示")
}
}
6 changes: 3 additions & 3 deletions src/main/resources/plugin.yml
Original file line number Diff line number Diff line change
@@ -1,10 +1,10 @@
name: LogTime
version: 1.0.0
version: 1.1.0
main: com.pool25m.logtime.LogTimePlugin
api-version: "1.21"
api-version: "1.21.8"
author: 25MPOOL

commands:
logtime:
description: プレイヤーのログイン時間のランキングを表示します。
usage: "/logtime <type|help>"
usage: "/logtime [プレイヤー名|help]"