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
9 changes: 9 additions & 0 deletions .devcontainer/Dockerfile
Original file line number Diff line number Diff line change
@@ -1 +1,10 @@
FROM mcr.microsoft.com/devcontainers/java:21

RUN apt-get update && apt-get install -y \
maven \
&& apt-get clean \
&& rm -rf /var/lib/apt/lists/*

# .m2ディレクトリの権限を vscode に設定
RUN mkdir -p /home/vscode/.m2/repository \
&& chown -R vscode /home/vscode/.m2
2 changes: 1 addition & 1 deletion .devcontainer/devcontainer.json
Original file line number Diff line number Diff line change
Expand Up @@ -11,5 +11,5 @@
]
}
},
"postCreateCommand": "mvn dependency:go-offline"
"shutdownAction": "none"
}
1 change: 1 addition & 0 deletions .gitignore
Original file line number Diff line number Diff line change
@@ -1,2 +1,3 @@
# Maven
target/
dependency-reduced-pom.xml
14 changes: 13 additions & 1 deletion Makefile
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
# Minecraft LogTime Plugin - 開発用Makefile

.PHONY: help build start stop clean logs test reload
.PHONY: help build start stop clean logs test reload dev-rebuild dev-logs

# デフォルトターゲット
help:
Expand All @@ -12,6 +12,8 @@ help:
@echo " make logs - Paper サーバーのログを表示"
@echo " make test - テストを実行"
@echo " make reload - プラグインをリビルドしてサーバー再起動"
@echo " make dev-rebuild - 開発用コマンド: プラグインをリビルドしてサーバー再起動"
@echo " make dev-logs - 開発用コマンド: Paper サーバーのログを表示"

# プラグインをビルド
build:
Expand Down Expand Up @@ -55,3 +57,13 @@ init:
docker-compose build
make build
@echo "初期化完了!'make start' でサーバーを起動できます。"

# 開発用コマンド
dev-rebuild:
docker-compose build paper
docker-compose restart paper
@echo "Plugin reloaded!"

# 開発用コマンド
dev-logs:
docker-compose logs -f paper
6 changes: 2 additions & 4 deletions docker-compose.yml
Original file line number Diff line number Diff line change
Expand Up @@ -12,14 +12,12 @@ services:
build:
context: .
dockerfile: ./paper/Dockerfile
container_name: mc-plugin-paper
target: runtime
ports:
- "25565:25565"
volumes:
- ./target:/server/plugins
- paper_data:/server
depends_on:
- dev
- ./target:/server/plugins

volumes:
paper_data:
Expand Down
19 changes: 8 additions & 11 deletions paper/Dockerfile
Original file line number Diff line number Diff line change
@@ -1,20 +1,17 @@
# === ビルド用ステージ ===
FROM debian:stable-slim AS builder

ARG MC_VERSION="1.21"
ARG BUILD_NUMBER="130"

# === Paperサーバーダウンロード用ステージ ===
FROM debian:stable-slim AS server-builder
ARG MC_VERSION="1.21.8"
ARG BUILD_NUMBER="53"
RUN apt-get update && apt-get install -y wget && rm -rf /var/lib/apt/lists/*
RUN wget -O paper.jar "https://api.papermc.io/v2/projects/paper/versions/${MC_VERSION}/builds/${BUILD_NUMBER}/downloads/paper-${MC_VERSION}-${BUILD_NUMBER}.jar"

# === 起動用ステージ ===
FROM eclipse-temurin:21-jre-jammy

# === 実行用ステージ ===
FROM eclipse-temurin:21-jre-jammy AS runtime
WORKDIR /server

COPY --from=builder /paper.jar .
# Paperサーバーをコピー
COPY --from=server-builder /paper.jar .
COPY paper/eula.txt .

EXPOSE 25565

CMD ["java", "-Xms1G", "-Xmx1G", "-jar", "paper.jar", "--nogui"]
37 changes: 37 additions & 0 deletions pom.xml
Original file line number Diff line number Diff line change
Expand Up @@ -79,6 +79,43 @@
</execution>
</executions>
</plugin>

<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-shade-plugin</artifactId>
<version>3.4.1</version>
<executions>
<execution>
<phase>package</phase>
<goals>
<goal>shade</goal>
</goals>
<configuration>
<artifactSet>
<includes>
<include>org.jetbrains.kotlin:kotlin-stdlib</include>
</includes>
</artifactSet>
<transformers>
<transformer implementation="org.apache.maven.plugins.shade.resource.ManifestResourceTransformer">
<mainClass>com.pool25m.logtime.LogTimePlugin</mainClass>
</transformer>
</transformers>
<finalName>${project.artifactId}-${project.version}</finalName>
<filters>
<filter>
<artifact>*:*</artifact>
<excludes>
<exclude>META-INF/*.SF</exclude>
<exclude>META-INF/*.DSA</exclude>
<exclude>META-INF/*.RSA</exclude>
</excludes>
</filter>
</filters>
</configuration>
</execution>
</executions>
</plugin>
</plugins>
</build>
</project>
5 changes: 3 additions & 2 deletions src/main/kotlin/com/pool25m/logtime/LogTimePlugin.kt
Original file line number Diff line number Diff line change
Expand Up @@ -4,9 +4,10 @@ import org.bukkit.plugin.java.JavaPlugin

class LogTimePlugin : JavaPlugin() {
override fun onEnable() {
logger.info("LogTime Plugin has been enabled!")
val playerStatsService = PlayerStatsService()
getCommand("ranking")?.setExecutor(RankingCommand(playerStatsService))

getCommand("ranking")?.setExecutor(RankingCommand())
logger.info("LogTime Plugin has been enabled!")
}

override fun onDisable() {
Expand Down
44 changes: 44 additions & 0 deletions src/main/kotlin/com/pool25m/logtime/PlayerStatsService.kt
Original file line number Diff line number Diff line change
@@ -0,0 +1,44 @@
package com.pool25m.logtime

import org.bukkit.Bukkit
import org.bukkit.Statistic
import java.util.concurrent.TimeUnit

data class PlayerRankData(
val playerName: String,
val playTicks: Long,
val formattedPlayTime: String,
)

class PlayerStatsService {
/**
* サーバーにログインしたことのある全プレイヤーの総プレイ時間ランキングを取得する
*/
fun getPlayerRankings(): List<PlayerRankData> {
return Bukkit
.getOfflinePlayers()
.map { player ->
val playTicks = player.getStatistic(Statistic.PLAY_ONE_MINUTE).toLong()

PlayerRankData(
// OfflinePlayer の場合は name が null になる可能性がある
playerName = player.name ?: "Unknown Player",
playTicks = playTicks,
formattedPlayTime = formatPlayTimeFromTicks(playTicks),
)
}.sortedByDescending { it.playTicks } // 正確な時間でソート
}

private fun formatPlayTimeFromTicks(ticks: Long): String {
val millis = ticks * 50 // 1 tick = 50ms
val hours = TimeUnit.MILLISECONDS.toHours(millis)
val minutes = TimeUnit.MILLISECONDS.toMinutes(millis) % 60
val seconds = TimeUnit.MILLISECONDS.toSeconds(millis) % 60

return buildString {
if (hours > 0) append("${hours}h ")
if (minutes > 0) append("${minutes}m ")
append("${seconds}s")
}.ifEmpty { "0s" }
}
}
17 changes: 15 additions & 2 deletions src/main/kotlin/com/pool25m/logtime/RankingCommand.kt
Original file line number Diff line number Diff line change
Expand Up @@ -4,14 +4,27 @@ import org.bukkit.command.Command
import org.bukkit.command.CommandExecutor
import org.bukkit.command.CommandSender

class RankingCommand : CommandExecutor {
class RankingCommand(
private val playerStatsService: PlayerStatsService,
) : CommandExecutor {
override fun onCommand(
sender: CommandSender,
command: Command,
label: String,
args: Array<out String>,
): Boolean {
sender.sendMessage("LogTime plugin is working!")
val rankedList = playerStatsService.getPlayerRankings()

if (rankedList.isEmpty()) {
sender.sendMessage("No players found.")
return true
}

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

return true
}
Expand Down