P2P-Develop/PeyangSuperbAntiCheat

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

Summary

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

import ml.peya.plugins.PeyangSuperbAntiCheat;
import ml.peya.plugins.Variables;
import org.apache.commons.lang3.tuple.Pair;
import org.bukkit.ChatColor;
import org.bukkit.configuration.file.YamlConfiguration;

import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.nio.charset.StandardCharsets;
import java.util.HashMap;
import java.util.stream.Collectors;
import java.util.stream.Stream;

/**
 * メッセージテンプレートを管理するクラス。
 * message.ymlのメッセージデータをパースして取得しやすくする。
 */
public class MessageEngine
{
    /**
     * コンフィグ
     */
    private static YamlConfiguration config;

    /**
     * 初期化確認
     */
    private static boolean isInitialized = false;

    /**
     * 初期化
     */
    public static void initialize()
    {
        String lang = PeyangSuperbAntiCheat.getPlugin().getConfig().getString("lang").toLowerCase();

        if (lang.equals("ja_jp") || lang.equals("ja-jp") || lang.equals("jp") || lang.equals("japanese"))
            lang = "ja";
        else if (lang.equals("en_us") || lang.equals("en-us") || lang.equals("en_uk") || lang.equals("en-uk") || lang.equals("english"))
            lang = "en";
        else
        {
            lang = "en";

            Variables.logger.warning("Specified language '" + lang + "' not found, changing to fallback language 'en'");
        }

        try (InputStreamReader reader = new InputStreamReader(PeyangSuperbAntiCheat.class.getResourceAsStream(
            "/" + lang + ".yml"), StandardCharsets.UTF_8))
        {
            config = YamlConfiguration.loadConfiguration(new BufferedReader(reader));
        }
        catch (Exception e)
        {
            e.printStackTrace();
            isInitialized = false;
        }

        isInitialized = true;
    }

    /**
     * %%name%%などカラーコード以外に関係する動的な参照データをハッシュマップとして結びつける。
     *
     * @param path 動的データタイプ。
     * @param obj  結びつけるオブジェクト。
     *             get(String, HashMap)との併用で使用する。
     * @return 結びつけたハッシュマップ。
     */
    public static HashMap<String, Object> pair(String path, Object obj)
    {
        HashMap<String, Object> map = new HashMap<>();

        map.put(path, obj);
        return map;
    }

    public static String get(String key)
    {
        return get(key, new HashMap<>());
    }

    /**
     * メッセージテンプレートのキーに対してテンプレートを返すメソッド。こいつとhshを共用する。
     *
     * @param key    参照するメッセージテンプレート。
     * @param format hsh()するやつ。
     * @return 参照できたやつ。
     */
    public static String get(String key, HashMap<String, Object> format)
    {
        if (!isInitialized)
        {
            initialize();
            return get(key, format);
        }

        return format((String) config.getValues(true).get(key), format);
    }

    /**
     * フォーマットしたいよぉふえぇっていう時にうってつけ
     *
     * @param text   Before
     * @param format After
     * @return AFTER^2
     */
    public static String format(String text, HashMap<String, Object> format)
    {
        HashMap<String, ChatColor> map = getColor();

        String replaced = text;

        for (String key : map.keySet())
            replaced = replaced.replace(key, map.get(key).toString());

        for (String key : format.keySet())
            replaced = replaced.replace("%%" + key + "%%", String.valueOf(format.get(key)));

        return replaced;
    }

    /**
     * 特定の文字セットをEnumのChatColorに変更するためのリストをマップとして返すやつ。
     *
     * @return 変換した後のはっしゅまっぷ。
     */
    private static HashMap<String, ChatColor> getColor()
    {
        return Stream.of(
            Pair.of("%%black%%", ChatColor.BLACK),
            Pair.of("%%dark_blue%%", ChatColor.DARK_BLUE),
            Pair.of("%%dark_green%%", ChatColor.DARK_GREEN),
            Pair.of("%%dark_aqua%%", ChatColor.DARK_AQUA),
            Pair.of("%%dark_red%%", ChatColor.DARK_RED),
            Pair.of("%%dark_purple%%", ChatColor.DARK_PURPLE),

            Pair.of("%%gold%%", ChatColor.GOLD),
            Pair.of("%%gray%%", ChatColor.GRAY),
            Pair.of("%%blue%%", ChatColor.BLUE),
            Pair.of("%%green%%", ChatColor.GREEN),
            Pair.of("%%aqua%%", ChatColor.AQUA),
            Pair.of("%%red%%", ChatColor.RED),
            Pair.of("%%light_purple%%", ChatColor.LIGHT_PURPLE),
            Pair.of("%%yellow%%", ChatColor.YELLOW),
            Pair.of("%%white%%", ChatColor.WHITE),

            Pair.of("%%obfuscated%%", ChatColor.MAGIC),
            Pair.of("%%bold%%", ChatColor.BOLD),
            Pair.of("%%strikethrough%%", ChatColor.STRIKETHROUGH),
            Pair.of("%%italic%%", ChatColor.ITALIC),
            Pair.of("%%reset%%", ChatColor.RESET)
        ).collect(Collectors.toMap(Pair::getLeft, Pair::getRight, (a, b) -> b, HashMap::new));
    }
}