diff --git a/.classpath b/.classpath new file mode 100644 index 0000000..961b063 --- /dev/null +++ b/.classpath @@ -0,0 +1,25 @@ + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/.gitignore b/.gitignore index 87fe2e4..a0f26f2 100644 --- a/.gitignore +++ b/.gitignore @@ -39,3 +39,6 @@ plugins/Loreport/ # Test data .jqwik-database + +# Compiled output +bin/ diff --git a/.project b/.project new file mode 100644 index 0000000..41b0c64 --- /dev/null +++ b/.project @@ -0,0 +1,34 @@ + + + lorep-LoReport + Project LoReport created by Buildship. + + + + + org.eclipse.jdt.core.javabuilder + + + + + org.eclipse.buildship.core.gradleprojectbuilder + + + + + + org.eclipse.jdt.core.javanature + org.eclipse.buildship.core.gradleprojectnature + + + + 1783809993368 + + 30 + + org.eclipse.core.resources.regexFilterMatcher + node_modules|\.git|__CREATED_BY_JAVA_LANGUAGE_SERVER__ + + + + diff --git a/.settings/org.eclipse.buildship.core.prefs b/.settings/org.eclipse.buildship.core.prefs new file mode 100644 index 0000000..f7f3856 --- /dev/null +++ b/.settings/org.eclipse.buildship.core.prefs @@ -0,0 +1,13 @@ +arguments=--init-script /home/loki/.cache/opencode/bin/jdtls/config_linux/org.eclipse.osgi/57/0/.cp/gradle/init/init.gradle +auto.sync=false +build.scans.enabled=false +connection.gradle.distribution=GRADLE_DISTRIBUTION(WRAPPER) +connection.project.dir= +eclipse.preferences.version=1 +gradle.user.home= +java.home=/usr/lib/jvm/java-21-openjdk +jvm.arguments= +offline.mode=false +override.workspace.settings=true +show.console.view=true +show.executions.view=true diff --git a/bin/main/config.yml b/bin/main/config.yml deleted file mode 100644 index 32e65d9..0000000 --- a/bin/main/config.yml +++ /dev/null @@ -1,66 +0,0 @@ -# Discord Webhook URL для уведомлений -webhook-url: "" - -# Настройки базы данных -database: - # Тип БД: sqlite или postgresql - type: "sqlite" - - # Настройки SQLite - sqlite: - file: "reports.db" - - # Настройки PostgreSQL - postgresql: - host: "localhost" - port: 5432 - database: "loreport" - username: "loreport" - password: "password" - pool-size: 10 - -# Настройки GUI -gui: - # Количество репортов на странице - reports-per-page: 45 - # Автообновление GUI (в тиках, 20 тиков = 1 секунда) - auto-refresh: 100 - # Показывать головы игроков в GUI - show-player-heads: true - -# Ограничения -limits: - # Максимальная длина причины репорта - max-reason-length: 100 - # Кулдаун между репортами (в секундах) - report-cooldown: 30 - # Максимум репортов на одного игрока от одного отправителя - max-reports-per-player: 3 - -# Уведомления -notifications: - # Уведомлять администраторов о новых репортах - notify-admins: true - # Звук уведомления для администраторов - admin-notification-sound: "BLOCK_NOTE_BLOCK_PLING" - # Уведомлять игрока о принятии репорта - notify-reporter: true - -# Сообщения -messages: - report-sent: "&aРепорт успешно отправлен!" - already-reported: "&cВы уже отправляли репорт на этого игрока!" - self-report: "&cВы не можете отправить репорт на себя!" - player-not-found: "&cИгрок не найден!" - no-permission: "&cУ вас нет прав на эту команду!" - usage: "&eИспользование: /report <ник> <причина>" - no-reports: "&eУ этого игрока нет репортов." - stats-header: "&6=== Статистика репортов: %player% ===" - stats-count: "&eВсего репортов: &f%count%" - stats-last-online: "&eПоследний онлайн: &f%time%" - stats-report-entry: "&7- %reason% &8(%time% назад)" - gui-title: "Репорты - Страница %page%" - cooldown: "&cПодождите %time% секунд перед следующим репортом!" - reason-too-long: "&cПричина слишком длинная! Максимум %max% символов." - max-reports-reached: "&cВы уже отправили максимальное количество репортов на этого игрока!" - admin-notification: "&6[Loreport] &eНовый репорт от &f%reporter% &eна &f%reported%: &7%reason%" diff --git a/bin/main/plugin.yml b/bin/main/plugin.yml deleted file mode 100644 index 85cd693..0000000 --- a/bin/main/plugin.yml +++ /dev/null @@ -1,28 +0,0 @@ -name: Loreport -version: ${version} -main: dev.loki.lorep.LorepPlugin -api-version: '1.19' -author: loki5512344 -description: Modern player report system with Discord integration and GUI -website: https://codeberg.org/loki5512344/Loreport - -commands: - report: - description: Report a player or manage reports - usage: /report | /report gui | /report stats - permission: lorep.report - aliases: [rep, reports] - -permissions: - lorep.report: - description: Allows players to report other players - default: true - lorep.admin: - description: Allows access to admin commands (gui, stats) - default: op - lorep.*: - description: Gives access to all Loreport permissions - default: false - children: - lorep.report: true - lorep.admin: true diff --git a/build.gradle.kts b/build.gradle.kts index f2ee8f9..97ce7a3 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -1,6 +1,7 @@ plugins { java id("com.gradleup.shadow") version "9.0.0-beta4" + checkstyle } group = "dev.loki" @@ -67,3 +68,18 @@ tasks { options.release.set(21) } } + +checkstyle { + toolVersion = "10.21.4" + configFile = file("config/checkstyle/checkstyle.xml") + isIgnoreFailures = false + maxErrors = 0 + maxWarnings = 0 +} + +tasks.withType().configureEach { + reports { + xml.required.set(true) + html.required.set(true) + } +} diff --git a/config/checkstyle/checkstyle.xml b/config/checkstyle/checkstyle.xml new file mode 100644 index 0000000..a3a9089 --- /dev/null +++ b/config/checkstyle/checkstyle.xml @@ -0,0 +1,89 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/gradlew b/gradlew old mode 100644 new mode 100755 diff --git a/src/main/java/dev/loki/lorep/command/ReportCommand.java b/src/main/java/dev/loki/lorep/command/ReportCommand.java index 9637a1e..ee61ac5 100644 --- a/src/main/java/dev/loki/lorep/command/ReportCommand.java +++ b/src/main/java/dev/loki/lorep/command/ReportCommand.java @@ -138,8 +138,12 @@ public class ReportCommand implements CommandExecutor, TabCompleter { String input = args[0].toLowerCase(); if (sender.hasPermission("lorep.admin")) { - if ("gui".startsWith(input)) completions.add("gui"); - if ("stats".startsWith(input)) completions.add("stats"); + if ("gui".startsWith(input)) { + completions.add("gui"); + } + if ("stats".startsWith(input)) { + completions.add("stats"); + } } // Add online player names diff --git a/src/main/java/dev/loki/lorep/database/PostgreSQLDatabaseManager.java b/src/main/java/dev/loki/lorep/database/PostgreSQLDatabaseManager.java index ed27071..b9d90cc 100644 --- a/src/main/java/dev/loki/lorep/database/PostgreSQLDatabaseManager.java +++ b/src/main/java/dev/loki/lorep/database/PostgreSQLDatabaseManager.java @@ -3,7 +3,11 @@ package dev.loki.lorep.database; import com.zaxxer.hikari.HikariConfig; import com.zaxxer.hikari.HikariDataSource; -import java.sql.*; +import java.sql.Connection; +import java.sql.PreparedStatement; +import java.sql.ResultSet; +import java.sql.SQLException; +import java.sql.Statement; import java.time.Instant; import java.util.ArrayList; import java.util.List; diff --git a/src/main/java/dev/loki/lorep/database/SQLiteDatabaseManager.java b/src/main/java/dev/loki/lorep/database/SQLiteDatabaseManager.java index fc348a0..dcd315d 100644 --- a/src/main/java/dev/loki/lorep/database/SQLiteDatabaseManager.java +++ b/src/main/java/dev/loki/lorep/database/SQLiteDatabaseManager.java @@ -1,7 +1,12 @@ package dev.loki.lorep.database; import java.io.File; -import java.sql.*; +import java.sql.Connection; +import java.sql.DriverManager; +import java.sql.PreparedStatement; +import java.sql.ResultSet; +import java.sql.SQLException; +import java.sql.Statement; import java.time.Instant; import java.util.ArrayList; import java.util.List; diff --git a/src/main/java/dev/loki/lorep/util/MessageUtil.java b/src/main/java/dev/loki/lorep/util/MessageUtil.java index 60411d0..290097f 100644 --- a/src/main/java/dev/loki/lorep/util/MessageUtil.java +++ b/src/main/java/dev/loki/lorep/util/MessageUtil.java @@ -5,7 +5,9 @@ import org.bukkit.command.CommandSender; import org.bukkit.entity.Player; public class MessageUtil { - + + private MessageUtil() {} + private static final String PREFIX = "§8[§clorep§8] §r"; public static String colorize(String message) { diff --git a/src/main/java/dev/loki/lorep/util/PaginationUtil.java b/src/main/java/dev/loki/lorep/util/PaginationUtil.java index d02c549..c1a472d 100644 --- a/src/main/java/dev/loki/lorep/util/PaginationUtil.java +++ b/src/main/java/dev/loki/lorep/util/PaginationUtil.java @@ -1,12 +1,16 @@ package dev.loki.lorep.util; public class PaginationUtil { - + + private PaginationUtil() {} + public static int calculateTotalPages(int totalItems, int pageSize) { if (pageSize <= 0) { throw new IllegalArgumentException("pageSize must be positive"); } - if (totalItems <= 0) return 1; + if (totalItems <= 0) { + return 1; + } return (int) Math.ceil((double) totalItems / pageSize); } diff --git a/src/main/java/dev/loki/lorep/util/TimeUtil.java b/src/main/java/dev/loki/lorep/util/TimeUtil.java index edd2d12..989b3e5 100644 --- a/src/main/java/dev/loki/lorep/util/TimeUtil.java +++ b/src/main/java/dev/loki/lorep/util/TimeUtil.java @@ -5,6 +5,8 @@ import java.time.Instant; public class TimeUtil { + private TimeUtil() {} + private static final long SECONDS_PER_MINUTE = 60; private static final long MINUTES_PER_HOUR = 60; private static final long HOURS_PER_DAY = 24; diff --git a/src/main/java/dev/loki/lorep/webhook/DiscordWebhook.java b/src/main/java/dev/loki/lorep/webhook/DiscordWebhook.java index dbf32c3..c0e2aa0 100644 --- a/src/main/java/dev/loki/lorep/webhook/DiscordWebhook.java +++ b/src/main/java/dev/loki/lorep/webhook/DiscordWebhook.java @@ -1,7 +1,13 @@ package dev.loki.lorep.webhook; import dev.loki.lorep.database.Report; -import okhttp3.*; +import okhttp3.Call; +import okhttp3.Callback; +import okhttp3.MediaType; +import okhttp3.OkHttpClient; +import okhttp3.Request; +import okhttp3.RequestBody; +import okhttp3.Response; import java.io.IOException; import java.time.ZoneId; @@ -81,7 +87,9 @@ public class DiscordWebhook { } private String escapeJson(String text) { - if (text == null) return ""; + if (text == null) { + return ""; + } return text .replace("\\", "\\\\") .replace("\"", "\\\"")