LoReport/docs/api.md
loki5512344 55df7d97b2 feat: major update v1.1.0 - improved documentation, configuration and compatibility
- Add comprehensive documentation in docs/ folder
- Update README.md with modern design and badges
- Improve configuration with new options (GUI, limits, notifications)
- Add support for Minecraft 1.19.2-1.21.4 and Java 17+
- Create GPL-3.0 license
- Add modrinth/ folder with project description for publishing
- Add CONTRIBUTING.md for contributors
- Update plugin.yml with aliases and better permissions
- Improve build.gradle.kts with better compatibility and encoding
- Update .gitignore for cleaner repository
2026-02-03 14:01:34 +01:00

7.9 KiB
Raw Permalink Blame History

API для разработчиков

Подключение к проекту

Maven

<repository>
    <id>codeberg</id>
    <url>https://codeberg.org/api/packages/loki5512344/maven</url>
</repository>

<dependency>
    <groupId>dev.loki</groupId>
    <artifactId>loreport</artifactId>
    <version>1.0.0</version>
    <scope>provided</scope>
</dependency>

Gradle

repositories {
    maven("https://codeberg.org/api/packages/loki5512344/maven")
}

dependencies {
    compileOnly("dev.loki:loreport:1.0.0")
}

Основные классы

LorepPlugin

Главный класс плагина, предоставляет доступ к основным компонентам.

LorepPlugin plugin = LorepPlugin.getInstance();
DatabaseManager db = plugin.getDatabaseManager();
ConfigManager config = plugin.getConfigManager();

DatabaseManager

Интерфейс для работы с базой данных репортов.

public interface DatabaseManager {
    void addReport(Report report);
    List<Report> getReports(String playerName);
    List<Report> getAllReports();
    int getReportCount(String playerName);
    boolean hasReported(String reporter, String reported);
    void initialize();
    void close();
}

Report

Класс представляющий репорт.

public class Report {
    private final String reporter;
    private final String reported;
    private final String reason;
    private final long timestamp;
    
    // Конструкторы и геттеры
}

События (Events)

ReportSubmitEvent

Вызывается при отправке нового репорта.

@EventHandler
public void onReportSubmit(ReportSubmitEvent event) {
    Player reporter = event.getReporter();
    String reported = event.getReported();
    String reason = event.getReason();
    
    // Ваша логика
    
    // Отменить репорт
    event.setCancelled(true);
}

ReportViewEvent

Вызывается при просмотре репортов через GUI.

@EventHandler
public void onReportView(ReportViewEvent event) {
    Player viewer = event.getViewer();
    List<Report> reports = event.getReports();
    
    // Ваша логика
}

Примеры использования

Добавление репорта программно

public void addCustomReport(String reporter, String reported, String reason) {
    LorepPlugin plugin = LorepPlugin.getInstance();
    DatabaseManager db = plugin.getDatabaseManager();
    
    Report report = new Report(reporter, reported, reason, System.currentTimeMillis());
    db.addReport(report);
    
    // Отправить в Discord если настроен
    DiscordWebhook webhook = plugin.getDiscordWebhook();
    if (webhook != null) {
        webhook.sendReport(report);
    }
}

Получение статистики игрока

public void showPlayerStats(Player admin, String targetPlayer) {
    LorepPlugin plugin = LorepPlugin.getInstance();
    DatabaseManager db = plugin.getDatabaseManager();
    
    List<Report> reports = db.getReports(targetPlayer);
    int count = reports.size();
    
    admin.sendMessage("У игрока " + targetPlayer + " " + count + " репортов");
    
    for (Report report : reports) {
        admin.sendMessage("- " + report.getReason() + " (от " + report.getReporter() + ")");
    }
}

Интеграция с системой наказаний

@EventHandler
public void onReportSubmit(ReportSubmitEvent event) {
    String reported = event.getReported();
    
    // Получаем количество репортов
    DatabaseManager db = LorepPlugin.getInstance().getDatabaseManager();
    int reportCount = db.getReportCount(reported);
    
    // Автоматические действия
    if (reportCount >= 5) {
        // Временный бан на 1 час
        Bukkit.dispatchCommand(Bukkit.getConsoleSender(), 
            "tempban " + reported + " 1h Множественные репорты");
    } else if (reportCount >= 3) {
        // Предупреждение
        Player player = Bukkit.getPlayer(reported);
        if (player != null) {
            player.sendMessage("§cВнимание! На вас поступают жалобы от других игроков.");
        }
    }
}

Кастомные команды

public class CustomReportCommand implements CommandExecutor {
    
    @Override
    public boolean onCommand(CommandSender sender, Command command, String label, String[] args) {
        if (!(sender instanceof Player)) return false;
        
        Player player = (Player) sender;
        LorepPlugin plugin = LorepPlugin.getInstance();
        
        if (args.length < 2) {
            player.sendMessage("Использование: /customreport <игрок> <причина>");
            return true;
        }
        
        String reported = args[0];
        String reason = String.join(" ", Arrays.copyOfRange(args, 1, args.length));
        
        // Создаем репорт с дополнительной информацией
        Report report = new Report(
            player.getName(), 
            reported, 
            "[CUSTOM] " + reason, 
            System.currentTimeMillis()
        );
        
        plugin.getDatabaseManager().addReport(report);
        player.sendMessage("§aКастомный репорт отправлен!");
        
        return true;
    }
}

Хуки для других плагинов

PlaceholderAPI

public class LorepPlaceholders extends PlaceholderExpansion {
    
    @Override
    public String getIdentifier() {
        return "loreport";
    }
    
    @Override
    public String getAuthor() {
        return "loki5512344";
    }
    
    @Override
    public String getVersion() {
        return "1.0.0";
    }
    
    @Override
    public String onPlaceholderRequest(Player player, String params) {
        if (player == null) return "";
        
        DatabaseManager db = LorepPlugin.getInstance().getDatabaseManager();
        
        switch (params) {
            case "reports_count":
                return String.valueOf(db.getReportCount(player.getName()));
            case "reports_total":
                return String.valueOf(db.getAllReports().size());
            default:
                return null;
        }
    }
}

DiscordSRV интеграция

@EventHandler
public void onReportSubmit(ReportSubmitEvent event) {
    // Отправляем в Discord через DiscordSRV
    String message = String.format(
        "🚨 **Новый репорт!**\n" +
        "**Отправитель:** %s\n" +
        "**Нарушитель:** %s\n" +
        "**Причина:** %s",
        event.getReporter().getName(),
        event.getReported(),
        event.getReason()
    );
    
    DiscordSRV.getPlugin().getMainTextChannel().sendMessage(message).queue();
}

Лучшие практики

  1. Всегда проверяйте доступность плагина:
if (!Bukkit.getPluginManager().isPluginEnabled("Loreport")) {
    // Плагин не загружен
    return;
}
  1. Используйте асинхронные операции для БД:
Bukkit.getScheduler().runTaskAsynchronously(yourPlugin, () -> {
    // Работа с базой данных
    List<Report> reports = db.getReports(playerName);
    
    Bukkit.getScheduler().runTask(yourPlugin, () -> {
        // Обновление UI в главном потоке
        updateGUI(reports);
    });
});
  1. Обрабатывайте исключения:
try {
    db.addReport(report);
} catch (Exception e) {
    getLogger().severe("Ошибка при добавлении репорта: " + e.getMessage());
}