P2P-Develop/PeyangSuperbAntiCheat

View on GitHub
src/main/java/ml/peya/plugins/Utils/Utils.java

Summary

Maintainability
A
0 mins
Test Coverage
package ml.peya.plugins.Utils;

import net.md_5.bungee.api.chat.ClickEvent;
import net.md_5.bungee.api.chat.ComponentBuilder;
import net.md_5.bungee.api.chat.HoverEvent;
import net.md_5.bungee.api.chat.TextComponent;
import org.bukkit.Bukkit;
import org.bukkit.ChatColor;

import java.io.PrintWriter;
import java.io.StringWriter;
import java.util.HashMap;

import static ml.peya.plugins.Utils.MessageEngine.get;

/**
 * PSAC内でのみ使用するユーティリティ関数を集めたクラス。ほぼstatic。
 */
public class Utils
{

    /**
     * 権限持ってるやつが通知できる奴。
     *
     * @param id ID。
     */
    public static void adminNotification(String id)
    {
        Bukkit.getOnlinePlayers()
            .parallelStream()
            .filter(player -> player.hasPermission("psac.reportntf"))
            .forEachOrdered(player ->
            {
                player.sendMessage(get("report.submited"));
                player.spigot()
                    .sendMessage(new ComponentBuilder(get("report.click"))
                        .append("[" + ChatColor.YELLOW + ChatColor.BOLD + "CLICK" + ChatColor.WHITE + "]")
                        .event(new HoverEvent(HoverEvent.Action.SHOW_TEXT, new ComponentBuilder("/psac show " + id)
                            .color(net.md_5.bungee.api.ChatColor.AQUA)
                            .create()))
                        .event(new ClickEvent(ClickEvent.Action.RUN_COMMAND, "/psac show " + id))
                        .create());
            });
    }

    /**
     * 権限持ってるやつが通知できる奴のオーバーロード。
     *
     * @param name    PlayerName。
     * @param id      ID。
     * @param reasons 事由。
     */
    public static void adminNotification(String name, String id, String[] reasons)
    {
        Bukkit.getOnlinePlayers().parallelStream().filter(player -> player.hasPermission("psac.reportntf"))
            .forEachOrdered(player ->
            {
                HashMap<String, Object> map = new HashMap<>();
                map.put("name", name);
                map.put("reason", String.join(", ", reasons));
                TextComponent builder = new TextComponent(get("report.lynx.submited", map));
                builder.setClickEvent(new ClickEvent(ClickEvent.Action.RUN_COMMAND, "/psac show " + id));
                builder.setHoverEvent(new HoverEvent(
                    HoverEvent.Action.SHOW_TEXT,
                    new ComponentBuilder("/psac show " + id).color(net.md_5.bungee.api.ChatColor.AQUA).create()
                ));
                player.spigot()
                    .sendMessage(builder);
            });
    }

    /**
     * エラー起こっちゃったふえええぇぇっていう時の通知。adminにしか届かん。
     *
     * @param stacktrace 送り付けるスタックトレース。
     */
    public static void errorNotification(String stacktrace)
    {
        Bukkit.getOnlinePlayers()
            .parallelStream()
            .filter(player -> player.hasPermission("psac.error"))
            .forEachOrdered(player ->
            {
                player.sendMessage(ChatColor.GREEN + "[" +
                    ChatColor.BLUE + "PeyangSuperbAntiCheat" +
                    ChatColor.GREEN + "] " +
                    ChatColor.RED + "プレイヤーレポートで予期しないエラーが発生しました!");
                player.spigot()
                    .sendMessage(new ComponentBuilder(ChatColor.YELLOW + "カーソルを合わせて確認してください!")
                        .append("[" + ChatColor.YELLOW + ChatColor.BOLD + "カーソルを合わせる" + ChatColor.WHITE + "]")
                        .event(new HoverEvent(HoverEvent.Action.SHOW_TEXT, new ComponentBuilder(stacktrace
                            .replace("\r", "\n")
                            .replace("\t", "    ")).create()))
                        .create());
            });
    }

    /**
     * スタックトレースを...入手する?
     *
     * @param e   スタックトレース...らしい。
     * @param <T> ジェネリクスわーい
     * @return InnerExceptionみたいなの返すらしーよ!
     */
    public static <T extends Exception> String getStackTrace(T e)
    {
        StringWriter str = new StringWriter();
        PrintWriter w = new PrintWriter(str);
        e.printStackTrace(w);
        w.flush();
        return str.toString();
    }
}