HTTP 入口とルート束ね
WebDataServer の中心です。ルート登録自体はここで完結し、チャット専用ルートだけが別サービスへ委譲されます。Wiki タブもここを経由して静的 wiki に到達します。
組み込みWebサーバーでランキングや統計をリアルタイムに表形式で表示するクラス。
com.example.rankingplugin.webweb/WebDataServer.javaclass組み込みWebサーバーでランキングや統計をリアルタイムに表形式で表示するクラス。 SparkJava と Gson を利用。
Web ダッシュボード全体の入口で、Spark のルート登録・短TTLキャッシュ・プレイヤー状態配信・チャット/ラグAPI・管理画面系の導線が一か所に集まっています。巨大なのは「画面描画」と「データ供給」を同時に担っているためです。
WebDataServersetupRoutescurrentMcidhandleGlobalChatSendstartStatePublisherstartEventMaintenanceshutdownWebDataServer の中心です。ルート登録自体はここで完結し、チャット専用ルートだけが別サービスへ委譲されます。Wiki タブもここを経由して静的 wiki に到達します。
ランキングや直近スコアの JSON をメモリ保持し、都度重い集計を避けています。Web 側の体感速度と DB 負荷の折衷点です。
Minecraft 本体スレッドからのみ安全に読める情報を拾い、Web 参照用テーブルへ間欠的に押し込みます。Bukkit API と DB の境界管理がここで重要になります。
ラグ解析、アクセスログ、イベント配信、Discord 起動通知までを束ねます。大きな責務の分割候補を見極めたいときはこの塊から切り出すのが自然です。
WebDataServersetupRoutesstartEventMaintenancestartStatePublishersendBootDigestToDiscord起動時はまず不足テーブルを揃え、その後でルートを束ねて公開し、最後に定期配信と保守タスクを点灯します。ルート公開より前に初期化が済んでいることが前提です。
currentMcidhandleGlobalChatSend投稿元を Cookie から解決し、短い全体クールダウンを通したうえで保存と転送を行います。セッション不整合や多重送信はこの流れを追うと見つけやすいです。
startStatePublisher重い部分を全部 async に寄せるのではなく、Bukkit API に触る瞬間だけ同期に戻しているのがポイントです。Main thread safe かどうかを壊すと最初にここで問題が出ます。
shutdown停止順序が逆転すると、閉じたプールに対する DB アクセスや、死んだ Web サービスへの書き込みが出やすくなります。終了時不具合はこの順序を確認してください。
このクラス内で直接見つかる主な Web ルート/項目名です。
SQL 文字列から抽出できた主要テーブルです。スキーマ変更時の確認用です。
| Signature | 説明 | 主要呼び出し |
|---|---|---|
public WebDataServer(int basePort,JavaPlugin plugin, DataSource ds, ScoreService scoreService, CurrencyService currencyService, OnlineStatusService onlineStatusService, ScoreManager scoreManager, String serverId, IpLinkService ipLinkService, JavaPlugin pluginr,DiscordNotifier discord) | 依存オブジェクトや初期状態を受け取り、このクラスの動作を開始できる状態へ組み立てます。 | max → getConfig → getLong → startWebCaches → getInt → getBoolean |
| Name | Visibility | Kind | 説明 |
|---|---|---|---|
| http | public | メソッド | http の主要処理を担当します。 |
| getOrNullInt | private | メソッド | 必要な状態を取得し、呼び出し側で利用しやすい形へ返します。 |
| getOrNullDouble | private | メソッド | 必要な状態を取得し、呼び出し側で利用しやすい形へ返します。 |
| WebDataServer | public | コンストラクタ | 依存オブジェクトや初期状態を受け取り、このクラスの動作を開始できる状態へ組み立てます。 |
| isPoolClosedException | private | メソッド | HikariPool の "has been closed" など、プールクローズ後の例外かどうか判定 |
| currentMcid | private | メソッド | ログインCookieからMCIDを引く。 |
| handleGlobalChatSend | private | メソッド | 入力やリクエストを受けて、検証・処理・応答までをまとめて担当します。 |
| startStatePublisher | private | メソッド | 初期化と各種登録を行い、機能を有効化します。 |
| ensurePlayerStateTable | private | メソッド | 必要なテーブル・状態・前提条件が揃っているかを確認し、不足分を補います。 |
| ensureAccessLogTable | private | メソッド | 必要なテーブル・状態・前提条件が揃っているかを確認し、不足分を補います。 |
| ensureDifficultyTable | private | メソッド | 必要なテーブル・状態・前提条件が揃っているかを確認し、不足分を補います。 |
| ensureStatusTableMemCols | private | メソッド | 必要なテーブル・状態・前提条件が揃っているかを確認し、不足分を補います。 |
| ensureAnimaTreeTable | private | メソッド | 必要なテーブル・状態・前提条件が揃っているかを確認し、不足分を補います。 |
| startEventMaintenance | private | メソッド | 初期化と各種登録を行い、機能を有効化します。 |
| ensureAdminTables | private | メソッド | 必要なテーブル・状態・前提条件が揃っているかを確認し、不足分を補います。 |
| ensureLevelingTablesForWeb | private | メソッド | 必要なテーブル・状態・前提条件が揃っているかを確認し、不足分を補います。 |
| ensureSlotStateTable | private | メソッド | 必要なテーブル・状態・前提条件が揃っているかを確認し、不足分を補います。 |
| getOrNullLong | private | メソッド | 必要な状態を取得し、呼び出し側で利用しやすい形へ返します。 |
| claimDelivery | private | メソッド | DB への問い合わせまたは更新処理を担当します。 |
| computeReducePercent | private | メソッド | computeReducePercent の主要処理を担当します。 |
| computeAttackPower | private | メソッド | computeAttackPower の主要処理を担当します。 |
| pollBingo5x5Flag | private | メソッド | DB への問い合わせまたは更新処理を担当します。 |
| parseTopRewards | private | メソッド | 入力テキストや設定値を解析して内部表現へ変換します。 |
| preview | private | メソッド | preview の主要処理を担当します。 |
| parseTop3FromRewardConfig | private | メソッド | 入力テキストや設定値を解析して内部表現へ変換します。 |
| sendBootDigestToDiscord | private | メソッド | DB への問い合わせまたは更新処理を担当します。 |
| loadXpPrefixIfNeeded | private | メソッド | 必要な状態を取得し、呼び出し側で利用しやすい形へ返します。 |
| totalXpOf | private | メソッド | 累計XPを返す。 |
| nextReqFor | private | メソッド | DB への問い合わせまたは更新処理を担当します。 |
| jsonQuote | private | メソッド | jsonQuote の主要処理を担当します。 |
| shutdown | public | メソッド | プラグイン無効化時に呼び出す |
| setupRoutes | private | メソッド | 初期化と各種登録を行い、機能を有効化します。 |
public static com.sun.net.httpserver.HttpServer http()http の主要処理を担当します。
なし
private static Integer getOrNullInt(ResultSet rs, String col, int def) throws SQLException必要な状態を取得し、呼び出し側で利用しやすい形へ返します。
ResultSet rsString colint defSQLException
private static Double getOrNullDouble(ResultSet rs, String col) throws SQLException必要な状態を取得し、呼び出し側で利用しやすい形へ返します。
ResultSet rsString colSQLException
public WebDataServer(int basePort,JavaPlugin plugin, DataSource ds, ScoreService scoreService, CurrencyService currencyService, OnlineStatusService onlineStatusService, ScoreManager scoreManager, String serverId, IpLinkService ipLinkService, JavaPlugin pluginr,DiscordNotifier discord)依存オブジェクトや初期状態を受け取り、このクラスの動作を開始できる状態へ組み立てます。
int basePortJavaPlugin pluginDataSource dsScoreService scoreServiceCurrencyService currencyServiceOnlineStatusService onlineStatusServiceScoreManager scoreManagerString serverIdIpLinkService ipLinkServiceJavaPlugin pluginrDiscordNotifier discordなし
private boolean isPoolClosedException(Throwable ex)HikariPool の "has been closed" など、プールクローズ後の例外かどうか判定
Throwable exなし
private String currentMcid(Request req)ログインCookieからMCIDを引く。
Request reqなし
private String handleGlobalChatSend(Request req, Response res)入力やリクエストを受けて、検証・処理・応答までをまとめて担当します。
Request reqResponse resなし
private void startStatePublisher()初期化と各種登録を行い、機能を有効化します。
なし
private void ensurePlayerStateTable()必要なテーブル・状態・前提条件が揃っているかを確認し、不足分を補います。
なし
private void ensureAccessLogTable()必要なテーブル・状態・前提条件が揃っているかを確認し、不足分を補います。
なし
private void ensureDifficultyTable()必要なテーブル・状態・前提条件が揃っているかを確認し、不足分を補います。
なし
private void ensureStatusTableMemCols()必要なテーブル・状態・前提条件が揃っているかを確認し、不足分を補います。
なし
private void ensureAnimaTreeTable()必要なテーブル・状態・前提条件が揃っているかを確認し、不足分を補います。
なし
private void startEventMaintenance()初期化と各種登録を行い、機能を有効化します。
なし
private void ensureAdminTables()必要なテーブル・状態・前提条件が揃っているかを確認し、不足分を補います。
なし
private void ensureLevelingTablesForWeb()必要なテーブル・状態・前提条件が揃っているかを確認し、不足分を補います。
なし
private void ensureSlotStateTable()必要なテーブル・状態・前提条件が揃っているかを確認し、不足分を補います。
なし
private static Long getOrNullLong(ResultSet rs, String col) throws SQLException必要な状態を取得し、呼び出し側で利用しやすい形へ返します。
ResultSet rsString colSQLException
private boolean claimDelivery(Connection c, int eventId, com.example.rankingplugin.discord.DiscordNotifier.Phase phase)DB への問い合わせまたは更新処理を担当します。
Connection cint eventIdcom.example.rankingplugin.discord.DiscordNotifier.Phase phaseなし
private double computeReducePercent(org.bukkit.entity.Player p)computeReducePercent の主要処理を担当します。
org.bukkit.entity.Player pなし
private double computeAttackPower(org.bukkit.entity.Player p)computeAttackPower の主要処理を担当します。
org.bukkit.entity.Player pなし
private void pollBingo5x5Flag()DB への問い合わせまたは更新処理を担当します。
なし
private Map<Integer, Long> parseTopRewards(String json)入力テキストや設定値を解析して内部表現へ変換します。
String jsonなし
private String preview(String s, int max)preview の主要処理を担当します。
String sint maxなし
private Map<Integer, Long> parseTop3FromRewardConfig(String rewardJson)入力テキストや設定値を解析して内部表現へ変換します。
String rewardJsonなし
private void sendBootDigestToDiscord()DB への問い合わせまたは更新処理を担当します。
なし
private void loadXpPrefixIfNeeded()必要な状態を取得し、呼び出し側で利用しやすい形へ返します。
なし
private long totalXpOf(int level, int currentXp)累計XPを返す。
int levelint currentXpなし
private Integer nextReqFor(int level)DB への問い合わせまたは更新処理を担当します。
int levelなし
private static String jsonQuote(String s)jsonQuote の主要処理を担当します。
String sなし
public void shutdown()プラグイン無効化時に呼び出す
なし
private void setupRoutes()初期化と各種登録を行い、機能を有効化します。
なし
WebDataServer → max → getConfig → getLong → startWebCaches → getInthandleGlobalChatSend → type → currentMcid → status → getConnection → prepareStatementsetupRoutes → before → ofNullable → headers → map → splitstartEventMaintenance → isCancelled → scheduleAtFixedRate → getConnection → now → plusHoursstartStatePublisher → getScheduler → runTaskTimerAsynchronously → callSyncMethod → getOnlinePlayers → getNameloadXpPrefixIfNeeded → getConnection → prepareStatement → executeQuery → next → getInt