src/main/java/ml/peya/plugins/Utils/TextBuilder.java
package ml.peya.plugins.Utils;
import ml.peya.plugins.Enum.EnumCheatType;
import ml.peya.plugins.Enum.EnumSeverity;
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.ChatColor;
import org.bukkit.command.CommandSender;
import org.bukkit.entity.Player;
import java.math.BigDecimal;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;
import java.util.HashMap;
import java.util.stream.Collectors;
import static ml.peya.plugins.Utils.MessageEngine.get;
import static ml.peya.plugins.Utils.MessageEngine.pair;
import static ml.peya.plugins.Variables.config;
/**
* チャット送信とかに使用するやつを組み立てます。MessageEngineのフロントエンドみたいな。
*/
public class TextBuilder
{
/**
* ボタン類をなんとなく組み立ててくれます。
*
* @param bind なんこれ
* @param button ボタン...?
* @return 完成後
*/
private static TextComponent getPrevNextButton(int bind, String button)
{
TextComponent nextBtn = new TextComponent(ChatColor.GREEN + "(" +
ChatColor.AQUA + button +
ChatColor.GREEN + ")");
nextBtn.setClickEvent(new ClickEvent(ClickEvent.Action.RUN_COMMAND, "/psac view " + bind));
nextBtn.setHoverEvent(new HoverEvent(HoverEvent.Action.SHOW_TEXT, new ComponentBuilder(get("book.words.next"))
.create()));
return nextBtn;
}
/**
* 上のメソッドを分けたやつ。
*
* @param next ボタン
* @return 完成後
*/
public static TextComponent getNextButton(int next)
{
return getPrevNextButton(next, "=>");
}
/**
* 上のメソッドを分けたやつ2nd。
*
* @param previous ボタン
* @return 完成後
*/
public static TextComponent getPrevButton(int previous)
{
return getPrevNextButton(previous, "<=");
}
/**
* 多すぎだろJavadoc書く人の気持ちにもなれよごrrr(ry
*
* @param id 管理ID。
* @param uuid プレイヤーUUID。
* @param issueById 報告した人管理ID。
* @param issueByUuid 報告した人のUUID。
* @param dateInt UNIX時間。
* @param types 判定タイプ。
* @param sender イベントsender。
*/
public static void showText(String id, String uuid, String issueById, String issueByUuid, BigDecimal dateInt, ArrayList<EnumCheatType> types, CommandSender sender)
{
ComponentBuilder hover = new ComponentBuilder(get("book.clickable"));
sender.spigot()
.sendMessage(new ComponentBuilder(" " + get("book.text.issueBy", pair("id", issueById)))
.event(new HoverEvent(HoverEvent.Action.SHOW_TEXT, hover.create()))
.event(new ClickEvent(ClickEvent.Action.SUGGEST_COMMAND, issueByUuid))
.create());
sender.spigot()
.sendMessage(new ComponentBuilder(" " + get("book.text.issueTo", pair("id", id)))
.event(new HoverEvent(HoverEvent.Action.SHOW_TEXT, hover.create()))
.event(new ClickEvent(ClickEvent.Action.SUGGEST_COMMAND, uuid))
.create());
sender.sendMessage(" " + get("book.text.dateTime", pair("time", new SimpleDateFormat("yyyy/MM/dd hh:mm:ss")
.format(new Date(dateInt.longValue())))));
sender.sendMessage(" " + get("book.text.reason", pair("reason", types.parallelStream()
.map(type -> " " + type.getText() + "\n")
.collect(Collectors.joining()))));
HashMap<String, Object> serv = new HashMap<>();
serv.put("color", SeverityLevels.getSeverity(types)
.getColor());
serv.put("level", SeverityLevels.getSeverity(types)
.getText());
sender.sendMessage(get("book.text.severity", serv));
}
/**
* viewした際のライン
*
* @param id プレイヤーID。
* @param issueById 報告した人管理ID。
* @param types 判定タイプ。
* @param mngid 管理ID2。
* @param sender イベントsender。
* @return 完成後。
*/
public static ComponentBuilder getLine(String id, String issueById, ArrayList<EnumCheatType> types, String mngid, CommandSender sender)
{
EnumSeverity severity = SeverityLevels.getSeverity(types);
ComponentBuilder b = new ComponentBuilder("")
.append(ChatColor.GREEN + id)
.append(" ")
.append(ChatColor.BLUE + issueById)
.append(" ")
.append(severity.getText())
.color(severity.getColor())
.event(new ClickEvent(ClickEvent.Action.RUN_COMMAND, "/psac show " + mngid))
.event(new HoverEvent(HoverEvent.Action.SHOW_TEXT, new ComponentBuilder(get("book.click.openAbout"))
.create()))
.append(" ");
if (sender instanceof Player && sender.hasPermission("psac.drop"))
{
b.append(get("book.click.delete"))
.event(new ClickEvent(ClickEvent.Action.RUN_COMMAND, "/psac drop " + mngid))
.event(new HoverEvent(HoverEvent.Action.SHOW_TEXT, new ComponentBuilder(get("book.click.deleteReport"))
.create()));
}
else
b.append(ChatColor.YELLOW + mngid);
return b;
}
/**
* 謎にオーバーロード。
*
* @param prefix [PSAC]ってやつ。
* @param value 値...?
* @return かーんせーい!
*/
public static String getLine(String prefix, String value)
{
return ChatColor.AQUA + prefix + ChatColor.WHITE + ":" + ChatColor.GREEN + value;
}
/**
* レベル返す。
*
* @param severity レベル。
* @return レベル返す。
*/
public static String getSeverityLevel(EnumSeverity severity)
{
final String prefix = ChatColor.YELLOW + "Level " + severity.getColor();
switch (severity)
{
case FINE:
return prefix + "1";
case FINER:
return prefix + "2";
case FINEST:
return prefix + "3";
case NORMAL:
return prefix + "4";
case PRIORITY:
return prefix + ChatColor.BOLD + "5";
case REQUIRE_FAST:
return prefix + ChatColor.BOLD + "6";
case SEVERE:
return prefix + ChatColor.BOLD + "7";
default:
return prefix + ChatColor.GRAY + "Unknown";
}
}
/**
* ボタンゲットする。
*
* @param prev 前に戻るボタン
* @param next 次に進むボタン
* @param prevFlag ボタン使える?
* @param nextFlag ボタン使える2nd?
* @return 完成後。
*/
public static ComponentBuilder getNextPrevButtonText(TextComponent prev, TextComponent next, boolean prevFlag, boolean nextFlag)
{
TextComponent uBar = new TextComponent("-----");
uBar.setColor(net.md_5.bungee.api.ChatColor.AQUA);
return new ComponentBuilder(prevFlag ? prev: uBar)
.append("------------------------")
.color(net.md_5.bungee.api.ChatColor.AQUA)
.append(nextFlag ? next: uBar);
}
/**
* メッセージ変換する。
*
* @return 変換後。
*/
public static ComponentBuilder getBroadCastWdDetectionText()
{
return new ComponentBuilder(get("kick.broadcastWd"));
}
/**
* 上のオーバーロード。
*
* @param player 罪を犯しかけたプレイヤー。
* @return メッセージを結果として組み立てたやつ。
*/
public static ComponentBuilder getBroadCastWdDetectionText(Player player)
{
HashMap<String, Object> map = new HashMap<>();
map.put("name", player.getName());
map.put("uuid", player.getUniqueId()
.toString());
return getBroadCastWdDetectionText()
.event(new HoverEvent(HoverEvent.Action.SHOW_TEXT, new ComponentBuilder(get("kick.broadcastAdmin", map))
.create()));
}
/**
* 通常テスト時の最終結果を組み立てる。
*
* @param name プレイヤー名。
* @param VL 算出されたVL。
* @param kickVL VLキック基準値。
* @return 組み立てたやつ。
*/
public static ComponentBuilder textTestRep(String name, int VL, int kickVL)
{
if (config.getBoolean("message.lynx"))
return new ComponentBuilder(get("message.auraCheck.bot.lynx", pair("hit", VL)));
return new ComponentBuilder(get("base.prefix") + "\n")
.append(get("message.auraCheck.result.prefix", pair("name", name)))
.append("\n")
.append(get("message.auraCheck.result.vl", pair("vl", String.valueOf(VL))))
.append("\n")
.append(get("message.auraCheck.result.vlGraph"))
.append("\n")
.append(OptGraphGenerator.genGraph(VL, kickVL))
.append("\n")
.append(get("message.auraCheck.result.result", pair("result", VL >= kickVL ? get("message.auraCheck.result.words.kick"): get("message.auraCheck.result.words.ok"))));
}
/**
* AuraPanicBotの結果を組み立てる。
*
* @param name PlayerName
* @param vl そのまんま
* @return 完成後。
*/
public static ComponentBuilder textPanicRep(String name, int vl)
{
if (config.getBoolean("message.lynx"))
return new ComponentBuilder("");
return new ComponentBuilder(get("base.prefix"))
.append("\n")
.append(get("message.auraCheck.result.prefix", pair("name", name)))
.append("\n")
.append(get("message.auraCheck.result.vl", pair("vl", String.valueOf(vl))));
}
}