送信前プレビューと GUI 制御
GUI から入力を受け、チャット確認や看板入力など複数 UI をまたいで送信直前状態を保持します。
Player Report Service に関するサービス層・業務処理を担当します。
com.example.rankingplugin.reportreport/PlayerReportService.javaclassクラス直前の Javadoc は見つかりませんでした。ソースとメソッド構成から責務を補完しています。
通報 GUI、チャット確認、DB 永続化、Discord 通知、管理者解決、荒らし通報者への制裁まで一連の運用フローがここに集中しています。プレイヤー運営系の根幹です。
ensureTablesbindDiscordListeneropenReportGuistartReportPreviewsubmitReportresolveReportdeleteReportByAdminapplyTrollPenaltyeditReportMessagesGUI から入力を受け、チャット確認や看板入力など複数 UI をまたいで送信直前状態を保持します。
通報本体を DB に保存し、Discord 側へ配送したメッセージを delivery として追跡します。あとから解決済みに書き換える前提の設計です。
解決、削除、荒らし認定という三種類の結果を DB・Discord・報告者通知へ反映します。
クールダウン、開いている通報数上限、荒らし strike 数、BAN までの閾値といった運用ルールをこのクラスが直接持っています。
openReportGuistartReportPreviewonReportConfirmChatsubmitReportinsertReportdeliverToAdminssaveDeliverysendSubmissionSuccessMessageゲーム内入力を一度 pending 状態に置き、明示確認後にだけ送信するため、誤送信とスパムを抑えています。
bindDiscordListenerresolveReporteditReportMessagesnotifyReporterResolvedDiscord 側操作が主導で、結果は DB と Discord 埋め込み双方に反映されます。ボタンだけ変わって DB が変わらない問題はこの流れを確認します。
applyTrollPenaltysnapshotOpenReportsByReporterincrementPenaltyscheduleBanReporterupdateDiscordMessagesTrollnotifyReporterPenalized単一通報ではなく、必要に応じて同一報告者の未解決分へ波及する点が重要です。誤制裁を避けるには snapshot 系の対象範囲を読む必要があります。
SQL 文字列から抽出できた主要テーブルです。スキーマ変更時の確認用です。
| Signature | 説明 | 主要呼び出し |
|---|---|---|
public PlayerReportService(RankingPlugin plugin, DataSource ds, String serverId) | 依存オブジェクトや初期状態を受け取り、このクラスの動作を開始できる状態へ組み立てます。 | 主要呼び出しなし |
| Name | Visibility | Kind | 説明 |
|---|---|---|---|
| PlayerReportService | public | コンストラクタ | 依存オブジェクトや初期状態を受け取り、このクラスの動作を開始できる状態へ組み立てます。 |
| ensureTables | public | メソッド | 必要なテーブル・状態・前提条件が揃っているかを確認し、不足分を補います。 |
| bindDiscordListener | public | メソッド | bindDiscordListener の主要処理を担当します。 |
| sendReportInfo | public | メソッド | sendReportInfo の主要処理を担当します。 |
| openReportGui | public | メソッド | openReportGui の主要処理を担当します。 |
| startReportPreview | public | メソッド | 初期化と各種登録を行い、機能を有効化します。 |
| sendPreviewMessage | private | メソッド | sendPreviewMessage の主要処理を担当します。 |
| sendPreviewReminder | private | メソッド | sendPreviewReminder の主要処理を担当します。 |
| sendSubmissionSuccessMessage | private | メソッド | sendSubmissionSuccessMessage の主要処理を担当します。 |
| onReportConfirmChat | public | イベント処理 | イベント発生時の分岐と後続処理を担当します。 |
| onQuit | public | イベント処理 | イベント発生時の分岐と後続処理を担当します。 |
| onReportGuiClick | public | イベント処理 | イベント発生時の分岐と後続処理を担当します。 |
| onReportGuiSignChange | public | イベント処理 | イベント発生時の分岐と後続処理を担当します。 |
| onReportGuiClose | public | イベント処理 | イベント発生時の分岐と後続処理を担当します。 |
| submitReport | private | メソッド | submitReport の主要処理を担当します。 |
| getServerDisplayName | private | メソッド | 必要な状態を取得し、呼び出し側で利用しやすい形へ返します。 |
| deliverToAdmins | private | メソッド | deliverToAdmins の主要処理を担当します。 |
| resolveReport | private | メソッド | DB への問い合わせまたは更新処理を担当します。 |
| deleteReportByAdmin | private | メソッド | 対象データや登録状態を削除・解除します。 |
| applyTrollPenalty | private | メソッド | applyTrollPenalty の主要処理を担当します。 |
| notifyReporterResolved | private | メソッド | notifyReporterResolved の主要処理を担当します。 |
| notifyReporterDeleted | private | メソッド | notifyReporterDeleted の主要処理を担当します。 |
| notifyReporterPenalized | private | メソッド | notifyReporterPenalized の主要処理を担当します。 |
| scheduleBanReporter | private | メソッド | scheduleBanReporter の主要処理を担当します。 |
| updateDiscordMessagesResolved | private | メソッド | 状態を永続化または更新し、最新状態へ反映します。 |
| updateDiscordMessagesDeleted | private | メソッド | 状態を永続化または更新し、最新状態へ反映します。 |
| updateDiscordMessagesTroll | private | メソッド | 状態を永続化または更新し、最新状態へ反映します。 |
| editReportMessages | private | メソッド | editReportMessages の主要処理を担当します。 |
| buildOpenEmbed | private | メソッド | 表示用または出力用のデータを組み立てます。 |
| buildResolvedEmbed | private | メソッド | 表示用または出力用のデータを組み立てます。 |
| buildDeletedEmbed | private | メソッド | 表示用または出力用のデータを組み立てます。 |
| buildTrollPenaltyEmbed | private | メソッド | 表示用または出力用のデータを組み立てます。 |
| baseEmbed | private | メソッド | baseEmbed の主要処理を担当します。 |
| insertReport | private | メソッド | 状態を永続化または更新し、最新状態へ反映します。 |
| deleteReport | private | メソッド | 対象データや登録状態を削除・解除します。 |
| saveDelivery | private | メソッド | 状態を永続化または更新し、最新状態へ反映します。 |
| findReport | private | メソッド | 必要な状態を取得し、呼び出し側で利用しやすい形へ返します。 |
| findOpenReportsByReporter | private | メソッド | 必要な状態を取得し、呼び出し側で利用しやすい形へ返します。 |
| snapshotOpenReportsByReporter | private | メソッド | snapshotOpenReportsByReporter の主要処理を担当します。 |
| snapshotReport | private | メソッド | snapshotReport の主要処理を担当します。 |
| findDeliveries | private | メソッド | 必要な状態を取得し、呼び出し側で利用しやすい形へ返します。 |
| countOpenReports | public | メソッド | DB への問い合わせまたは更新処理を担当します。 |
| getCooldownRemainingMillis | private | メソッド | 必要な状態を取得し、呼び出し側で利用しやすい形へ返します。 |
| getPenaltyState | private | メソッド | 必要な状態を取得し、呼び出し側で利用しやすい形へ返します。 |
| incrementPenalty | private | メソッド | DB への問い合わせまたは更新処理を担当します。 |
| mapReport | private | メソッド | mapReport の主要処理を担当します。 |
| isEnabled | public | メソッド | 条件判定を行い、後続処理の分岐に使える真偽値を返します。 |
| getMaxOpenPerPlayer | private | メソッド | 必要な状態を取得し、呼び出し側で利用しやすい形へ返します。 |
| getCooldownMillis | private | メソッド | 必要な状態を取得し、呼び出し側で利用しやすい形へ返します。 |
| getConfirmTimeoutMillis | private | メソッド | 必要な状態を取得し、呼び出し側で利用しやすい形へ返します。 |
| getTrollPenaltyHours | private | メソッド | 必要な状態を取得し、呼び出し側で利用しやすい形へ返します。 |
| getTrollBlockMillis | private | メソッド | 必要な状態を取得し、呼び出し側で利用しやすい形へ返します。 |
| getBanAfterTrollStrikes | private | メソッド | 必要な状態を取得し、呼び出し側で利用しやすい形へ返します。 |
| isDeleteOpenReportsOnTroll | private | メソッド | 条件判定を行い、後続処理の分岐に使える真偽値を返します。 |
| getTrollBanReason | private | メソッド | 必要な状態を取得し、呼び出し側で利用しやすい形へ返します。 |
| getAdminDiscordIds | private | メソッド | 必要な状態を取得し、呼び出し側で利用しやすい形へ返します。 |
| isAdminUser | private | メソッド | 条件判定を行い、後続処理の分岐に使える真偽値を返します。 |
| isOk | private | メソッド | 条件判定を行い、後続処理の分岐に使える真偽値を返します。 |
| isCancel | private | メソッド | 条件判定を行い、後続処理の分岐に使える真偽値を返します。 |
| resolveButtonId | private | メソッド | resolveButtonId の主要処理を担当します。 |
| deleteButtonId | private | メソッド | 対象データや登録状態を削除・解除します。 |
| trollButtonId | private | メソッド | trollButtonId の主要処理を担当します。 |
| resolveModalId | private | メソッド | resolveModalId の主要処理を担当します。 |
| sanitizeTitle | private | メソッド | sanitizeTitle の主要処理を担当します。 |
| sanitizeBody | private | メソッド | sanitizeBody の主要処理を担当します。 |
| sanitizeResolutionComment | private | メソッド | sanitizeResolutionComment の主要処理を担当します。 |
| clipField | private | メソッド | clipField の主要処理を担当します。 |
| clipForDb | private | メソッド | clipForDb の主要処理を担当します。 |
| formatSeconds | private | メソッド | formatSeconds の主要処理を担当します。 |
| formatTs | private | メソッド | formatTs の主要処理を担当します。 |
| formatRemaining | private | メソッド | formatRemaining の主要処理を担当します。 |
| formatInstantOrDash | private | メソッド | formatInstantOrDash の主要処理を担当します。 |
| parseId | private | メソッド | 入力テキストや設定値を解析して内部表現へ変換します。 |
| buildResolveModal | private | メソッド | 表示用または出力用のデータを組み立てます。 |
public PlayerReportService(RankingPlugin plugin, DataSource ds, String serverId)依存オブジェクトや初期状態を受け取り、このクラスの動作を開始できる状態へ組み立てます。
RankingPlugin pluginDataSource dsString serverIdなし
public void ensureTables()必要なテーブル・状態・前提条件が揃っているかを確認し、不足分を補います。
なし
public void bindDiscordListener()bindDiscordListener の主要処理を担当します。
なし
public void sendReportInfo(Player player)sendReportInfo の主要処理を担当します。
Player playerなし
public void openReportGui(Player player)openReportGui の主要処理を担当します。
Player playerなし
public void startReportPreview(Player player, String categoryInput, String title, String body)初期化と各種登録を行い、機能を有効化します。
Player playerString categoryInputString titleString bodyなし
private void sendPreviewMessage(Player player, PendingConfirmation pending, long openCount, int maxOpen)sendPreviewMessage の主要処理を担当します。
Player playerPendingConfirmation pendinglong openCountint maxOpenなし
private void sendPreviewReminder(Player player, PendingConfirmation pending, long openCount, int maxOpen)sendPreviewReminder の主要処理を担当します。
Player playerPendingConfirmation pendinglong openCountint maxOpenなし
private void sendSubmissionSuccessMessage(Player player, SubmissionResult result)sendSubmissionSuccessMessage の主要処理を担当します。
Player playerSubmissionResult resultなし
public void onReportConfirmChat(AsyncPlayerChatEvent event)イベント発生時の分岐と後続処理を担当します。
AsyncPlayerChatEvent eventなし
public void onQuit(PlayerQuitEvent event)イベント発生時の分岐と後続処理を担当します。
PlayerQuitEvent eventなし
public void onReportGuiClick(InventoryClickEvent event)イベント発生時の分岐と後続処理を担当します。
InventoryClickEvent eventなし
public void onReportGuiSignChange(SignChangeEvent event)イベント発生時の分岐と後続処理を担当します。
SignChangeEvent eventなし
public void onReportGuiClose(InventoryCloseEvent event)イベント発生時の分岐と後続処理を担当します。
InventoryCloseEvent eventなし
private SubmissionResult submitReport(UUID reporterUuid, String reporterName, PendingConfirmation pending)submitReport の主要処理を担当します。
UUID reporterUuidString reporterNamePendingConfirmation pendingなし
private String getServerDisplayName()必要な状態を取得し、呼び出し側で利用しやすい形へ返します。
なし
private int deliverToAdmins(JDA jda, ReportRow row, List<String> adminIds)deliverToAdmins の主要処理を担当します。
JDA jdaReportRow rowList<String> adminIdsなし
private synchronized ActionResult resolveReport(long reportId, User resolver, String resolutionComment)DB への問い合わせまたは更新処理を担当します。
long reportIdUser resolverString resolutionCommentなし
private synchronized ActionResult deleteReportByAdmin(long reportId, User resolver)対象データや登録状態を削除・解除します。
long reportIdUser resolverなし
private synchronized TrollActionResult applyTrollPenalty(long reportId, User resolver)applyTrollPenalty の主要処理を担当します。
long reportIdUser resolverなし
private void notifyReporterResolved(ReportRow row)notifyReporterResolved の主要処理を担当します。
ReportRow rowなし
private void notifyReporterDeleted(ReportRow row, String deletedBy)notifyReporterDeleted の主要処理を担当します。
ReportRow rowString deletedByなし
private void notifyReporterPenalized(ReportRow row, PenaltyState penalty, int removedReports)notifyReporterPenalized の主要処理を担当します。
ReportRow rowPenaltyState penaltyint removedReportsなし
private void scheduleBanReporter(ReportRow row, String resolverName)scheduleBanReporter の主要処理を担当します。
ReportRow rowString resolverNameなし
private void updateDiscordMessagesResolved(ReportRow row)状態を永続化または更新し、最新状態へ反映します。
ReportRow rowなし
private void updateDiscordMessagesDeleted(ReportSnapshot snapshot, String deletedBy)状態を永続化または更新し、最新状態へ反映します。
ReportSnapshot snapshotString deletedByなし
private void updateDiscordMessagesTroll(ReportSnapshot snapshot, String actedBy, PenaltyState penalty)状態を永続化または更新し、最新状態へ反映します。
ReportSnapshot snapshotString actedByPenaltyState penaltyなし
private void editReportMessages(List<DeliveryRow> deliveries, EmbedBuilder embed, Button disabledButton)editReportMessages の主要処理を担当します。
List<DeliveryRow> deliveriesEmbedBuilder embedButton disabledButtonなし
private EmbedBuilder buildOpenEmbed(ReportRow row)表示用または出力用のデータを組み立てます。
ReportRow rowなし
private EmbedBuilder buildResolvedEmbed(ReportRow row)表示用または出力用のデータを組み立てます。
ReportRow rowなし
private EmbedBuilder buildDeletedEmbed(ReportRow row, String deletedBy)表示用または出力用のデータを組み立てます。
ReportRow rowString deletedByなし
private EmbedBuilder buildTrollPenaltyEmbed(ReportRow row, String actedBy, PenaltyState penalty)表示用または出力用のデータを組み立てます。
ReportRow rowString actedByPenaltyState penaltyなし
private EmbedBuilder baseEmbed(ReportRow row)baseEmbed の主要処理を担当します。
ReportRow rowなし
private long insertReport(UUID reporterUuid, String reporterName, PendingConfirmation pending)状態を永続化または更新し、最新状態へ反映します。
UUID reporterUuidString reporterNamePendingConfirmation pendingなし
private void deleteReport(long reportId)対象データや登録状態を削除・解除します。
long reportIdなし
private void saveDelivery(long reportId, String discordUserId, String privateChannelId, String messageId)状態を永続化または更新し、最新状態へ反映します。
long reportIdString discordUserIdString privateChannelIdString messageIdなし
private Optional<ReportRow> findReport(long reportId)必要な状態を取得し、呼び出し側で利用しやすい形へ返します。
long reportIdなし
private List<ReportRow> findOpenReportsByReporter(String reporterUuid)必要な状態を取得し、呼び出し側で利用しやすい形へ返します。
String reporterUuidなし
private List<ReportSnapshot> snapshotOpenReportsByReporter(String reporterUuid)snapshotOpenReportsByReporter の主要処理を担当します。
String reporterUuidなし
private ReportSnapshot snapshotReport(ReportRow row)snapshotReport の主要処理を担当します。
ReportRow rowなし
private List<DeliveryRow> findDeliveries(long reportId)必要な状態を取得し、呼び出し側で利用しやすい形へ返します。
long reportIdなし
public long countOpenReports(UUID reporterUuid)DB への問い合わせまたは更新処理を担当します。
UUID reporterUuidなし
private long getCooldownRemainingMillis(UUID reporterUuid)必要な状態を取得し、呼び出し側で利用しやすい形へ返します。
UUID reporterUuidなし
private PenaltyState getPenaltyState(UUID reporterUuid)必要な状態を取得し、呼び出し側で利用しやすい形へ返します。
UUID reporterUuidなし
private PenaltyState incrementPenalty(String reporterUuid, String reporterName, User resolver, String reason)DB への問い合わせまたは更新処理を担当します。
String reporterUuidString reporterNameUser resolverString reasonなし
private ReportRow mapReport(ResultSet rs) throws SQLExceptionmapReport の主要処理を担当します。
ResultSet rsSQLException
public boolean isEnabled()条件判定を行い、後続処理の分岐に使える真偽値を返します。
なし
private int getMaxOpenPerPlayer()必要な状態を取得し、呼び出し側で利用しやすい形へ返します。
なし
private long getCooldownMillis()必要な状態を取得し、呼び出し側で利用しやすい形へ返します。
なし
private long getConfirmTimeoutMillis()必要な状態を取得し、呼び出し側で利用しやすい形へ返します。
なし
private long getTrollPenaltyHours()必要な状態を取得し、呼び出し側で利用しやすい形へ返します。
なし
private long getTrollBlockMillis()必要な状態を取得し、呼び出し側で利用しやすい形へ返します。
なし
private int getBanAfterTrollStrikes()必要な状態を取得し、呼び出し側で利用しやすい形へ返します。
なし
private boolean isDeleteOpenReportsOnTroll()条件判定を行い、後続処理の分岐に使える真偽値を返します。
なし
private String getTrollBanReason()必要な状態を取得し、呼び出し側で利用しやすい形へ返します。
なし
private List<String> getAdminDiscordIds()必要な状態を取得し、呼び出し側で利用しやすい形へ返します。
なし
private boolean isAdminUser(String discordUserId)条件判定を行い、後続処理の分岐に使える真偽値を返します。
String discordUserIdなし
private boolean isOk(String normalized)条件判定を行い、後続処理の分岐に使える真偽値を返します。
String normalizedなし
private boolean isCancel(String normalized)条件判定を行い、後続処理の分岐に使える真偽値を返します。
String normalizedなし
private String resolveButtonId(long reportId)resolveButtonId の主要処理を担当します。
long reportIdなし
private String deleteButtonId(long reportId)対象データや登録状態を削除・解除します。
long reportIdなし
private String trollButtonId(long reportId)trollButtonId の主要処理を担当します。
long reportIdなし
private String resolveModalId(long reportId)resolveModalId の主要処理を担当します。
long reportIdなし
private String sanitizeTitle(String title)sanitizeTitle の主要処理を担当します。
String titleなし
private String sanitizeBody(String body)sanitizeBody の主要処理を担当します。
String bodyなし
private String sanitizeResolutionComment(String body)sanitizeResolutionComment の主要処理を担当します。
String bodyなし
private String clipField(String s, int maxLen)clipField の主要処理を担当します。
String sint maxLenなし
private String clipForDb(String s, int maxLen)clipForDb の主要処理を担当します。
String sint maxLenなし
private long formatSeconds(long millis)formatSeconds の主要処理を担当します。
long millisなし
private String formatTs(Instant instant)formatTs の主要処理を担当します。
Instant instantなし
private String formatRemaining(long millis)formatRemaining の主要処理を担当します。
long millisなし
private String formatInstantOrDash(Instant instant)formatInstantOrDash の主要処理を担当します。
Instant instantなし
private Long parseId(String customId, String prefix)入力テキストや設定値を解析して内部表現へ変換します。
String customIdString prefixなし
private Modal buildResolveModal(long reportId)表示用または出力用のデータを組み立てます。
long reportIdなし
onReportConfirmChat → getPlayer → getUniqueId → isExpired → remove → setCancelledonQuit → getPlayer → getUniqueId → removeonReportGuiClick → getWhoClicked → handleInventoryClickonReportGuiClose → getPlayer → handleInventoryCloseonReportGuiSignChange → getPlayer → handleSignChange