Ban System Rework #150
@ -28,27 +28,36 @@ import net.md_5.bungee.api.chat.HoverEvent;
|
||||
import net.md_5.bungee.api.chat.TextComponent;
|
||||
import net.md_5.bungee.api.connection.ProxiedPlayer;
|
||||
|
||||
import java.text.ChoiceFormat;
|
||||
import java.text.MessageFormat;
|
||||
import java.util.Locale;
|
||||
import java.util.ResourceBundle;
|
||||
import java.util.function.Function;
|
||||
|
||||
public class Message {
|
||||
private Message(){}
|
||||
|
||||
public static TextComponent parseToComponent(String message, boolean prefixed, CommandSender sender, Object... params){
|
||||
return new TextComponent(TextComponent.fromLegacyText(parse(message, prefixed, sender, params)));
|
||||
public static TextComponent parseToComponent(String message, boolean prefixed, CommandSender sender, int[] useFormatter, Object... params){
|
||||
|
||||
return new TextComponent(TextComponent.fromLegacyText(parse(message, prefixed, sender, useFormatter, params)));
|
||||
}
|
||||
|
||||
public static String parsePrefixed(String message, CommandSender sender, int[] useFormatter, Object... params){
|
||||
return parse(message, true, sender, useFormatter, params);
|
||||
}
|
||||
|
||||
public static String parsePrefixed(String message, CommandSender sender, Object... params){
|
||||
return parse(message, true, sender, params);
|
||||
return parse(message, true, sender, new int[0], params);
|
||||
}
|
||||
|
||||
|
||||
public static String parse(String message, CommandSender sender, int[] useFormatter, Object... params){
|
||||
return parse(message, false, sender, useFormatter, params);
|
||||
}
|
||||
|
||||
public static String parse(String message, CommandSender sender, Object... params){
|
||||
return parse(message, false, sender, params);
|
||||
return parse(message, false, sender, new int[0], params);
|
||||
}
|
||||
|
||||
private static String parse(String message, boolean prefixed, CommandSender sender,Object... params){
|
||||
private static String parse(String message, boolean prefixed, CommandSender sender, int[] useFormatter, Object... params){
|
||||
Locale locale;
|
||||
if(sender instanceof ProxiedPlayer)
|
||||
locale = ((ProxiedPlayer)sender).getLocale();
|
||||
@ -61,7 +70,11 @@ public class Message {
|
||||
pattern = resourceBundle.getObject("PREFIX") + " ";
|
||||
pattern += (String)resourceBundle.getObject(message);
|
||||
|
||||
return new MessageFormat(pattern, locale).format(params);
|
||||
MessageFormat format = new MessageFormat(pattern, locale);
|
||||
for (int i : useFormatter) {
|
||||
params[i] = new MessageFormat((String) resourceBundle.getObject((String) params[i]), locale).format(params);
|
||||
}
|
||||
return format.format(params);
|
||||
}
|
||||
|
||||
public static void send(String message, CommandSender sender, Object... params){
|
||||
@ -80,6 +93,10 @@ public class Message {
|
||||
send(message, false, sender, type, null, null, params);
|
||||
}
|
||||
|
||||
public static void sendPrefixless(String message, CommandSender sender, ChatMessageType type, int[] useFormatter, Object... params) {
|
||||
Lixfel
hat
Hier genauso Hier genauso
|
||||
send(message, false, sender, type, null, null, useFormatter, params);
|
||||
}
|
||||
|
||||
public static void send(String message, CommandSender sender, String onHover, ClickEvent onClick, Object... params){
|
||||
send(message, true, sender, ChatMessageType.SYSTEM, onHover, onClick, params);
|
||||
}
|
||||
@ -88,10 +105,10 @@ public class Message {
|
||||
send(message, false, sender, ChatMessageType.SYSTEM, onHover, onClick, params);
|
||||
}
|
||||
|
||||
public static void send(String message, boolean prefixed, CommandSender sender, ChatMessageType type, String onHover, ClickEvent onClick, Object... params){
|
||||
public static void send(String message, boolean prefixed, CommandSender sender, ChatMessageType type, String onHover, ClickEvent onClick, int[] useFormatter, Object... params){
|
||||
Lixfel
hat
Hier auch. Hier auch.
|
||||
if(type == ChatMessageType.CHAT && sender instanceof ProxiedPlayer && ((ProxiedPlayer)sender).getChatMode() != ProxiedPlayer.ChatMode.SHOWN)
|
||||
return;
|
||||
TextComponent msg = parseToComponent(message, prefixed, sender, params);
|
||||
TextComponent msg = parseToComponent(message, prefixed, sender, useFormatter, params);
|
||||
if(onHover != null)
|
||||
msg.setHoverEvent(new HoverEvent(HoverEvent.Action.SHOW_TEXT, TextComponent.fromLegacyText(onHover)));
|
||||
if(onClick != null)
|
||||
@ -102,9 +119,13 @@ public class Message {
|
||||
sender.sendMessage(msg);
|
||||
}
|
||||
|
||||
public static void send(String message, boolean prefixed, CommandSender sender, ChatMessageType type, String onHover, ClickEvent onClick, Object... params){
|
||||
send(message, prefixed, sender, type, onHover, onClick, new int[0], params);
|
||||
}
|
||||
|
||||
public static void broadcast(String message, String onHover, ClickEvent onClick, Object... params){
|
||||
for(ProxiedPlayer player : ProxyServer.getInstance().getPlayers())
|
||||
send(message, player, parse(onHover, false, player), onClick, params);
|
||||
send(message, player, parse(onHover, false, player, new int[0]), onClick, params);
|
||||
}
|
||||
|
||||
public static void broadcast(String message, Object... params){
|
||||
@ -120,18 +141,18 @@ public class Message {
|
||||
}
|
||||
}
|
||||
|
||||
public static void team(String message, Function<ProxiedPlayer, Object>... params){
|
||||
team(message, ChatMessageType.SYSTEM, params);
|
||||
public static void team(String message, Object... params){
|
||||
team(message, ChatMessageType.SYSTEM, new int[0], params);
|
||||
}
|
||||
|
||||
public static void team(String message, ChatMessageType type, Function<ProxiedPlayer, Object>... params){
|
||||
public static void team(String message, int[] useChoice, Object... params){
|
||||
team(message, ChatMessageType.SYSTEM, useChoice, params);
|
||||
}
|
||||
|
||||
public static void team(String message, ChatMessageType type, int[] useFormatter, Object... params){
|
||||
Lixfel
hat
Arrrg. Arrrg.
|
||||
for(ProxiedPlayer player : ProxyServer.getInstance().getPlayers()){
|
||||
if(player.getGroups().contains(ConnectionListener.TEAM_GROUP)) {
|
||||
Object[] objects = new Object[params.length];
|
||||
for (int i = 0; i < params.length; i++) {
|
||||
objects[i] = params[i].apply(player);
|
||||
}
|
||||
sendPrefixless(message, player, type, objects);
|
||||
sendPrefixless(message, player, type, useFormatter, params);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -27,7 +27,6 @@ import java.sql.Timestamp;
|
||||
import java.text.ParseException;
|
||||
import java.text.SimpleDateFormat;
|
||||
import java.time.Instant;
|
||||
import java.time.format.DateTimeFormatter;
|
||||
import java.util.Date;
|
||||
|
||||
public class BanCommand extends BasicCommand {
|
||||
@ -57,8 +56,7 @@ public class BanCommand extends BasicCommand {
|
||||
}
|
||||
String msg = banReason.toString();
|
||||
target.ban(banTime, msg, SteamwarUser.get(sender.getName()).getId(), args[1].equalsIgnoreCase("perma"));
|
||||
Lixfel
hat
Wenn du das ganze Team benachrichtigst, brauchst du nicht mehr den Spieler persönlich zu benachrichtigen. Wenn du das ganze Team benachrichtigst, brauchst du nicht mehr den Spieler persönlich zu benachrichtigen.
|
||||
Message.team("BAN_TEAM_BANNED", target.getUserName(), sender.getName(),
|
||||
(args[1].equalsIgnoreCase("perma")?Message.parse("BAN_PERMA", sender):Message.parse("BAN_UNTIL", sender) + banTime.toLocalDateTime().format(DateTimeFormatter.ofPattern(Message.parse("TIMEFORMAT", sender)))), msg);
|
||||
Message.team("BAN_TEAM_BANNED", new int[]{2}, target.getUserName(), sender.getName(), (args[1].equalsIgnoreCase("perma")?"BAN_PERMA":"BAN_UNTIL"), msg, banTime);
|
||||
Lixfel
hat
In internen Messages musst du nicht die Person colorcoden. In internen Messages musst du nicht die Person colorcoden.
Lixfel
hat
Ok, das gefällt mir doch nicht so ganz mit dem IntArray etc. Evtl. wäre es eleganter, man macht da etwas a la new Message(...equals() ? "BAN_PERMA": "BAN_UNTIL") und wenn das object eine Message ist, (welche sich einfach nur zu merken Braucht, welchen String sie hat, ggf. auch noch parameter) und dann diese Message parst und den String entsprechend einfügt. Ok, das gefällt mir doch nicht so ganz mit dem IntArray etc. Evtl. wäre es eleganter, man macht da etwas a la new Message(...equals() ? "BAN_PERMA": "BAN_UNTIL") und wenn das object eine Message ist, (welche sich einfach nur zu merken Braucht, welchen String sie hat, ggf. auch noch parameter) und dann diese Message parst und den String entsprechend einfügt.
|
||||
}
|
||||
Lixfel
hat
Bitte erst die Aktion ausführen, dann die Aktion verkünden (im Fehlerfall kein Fehlannouncement). Bitte erst die Aktion ausführen, dann die Aktion verkünden (im Fehlerfall kein Fehlannouncement).
|
||||
|
||||
public static Timestamp parseTime(CommandSender sender, String arg){
|
||||
|
@ -24,7 +24,6 @@ import de.steamwar.bungeecore.sql.SteamwarUser;
|
||||
import net.md_5.bungee.api.CommandSender;
|
||||
|
||||
import java.sql.Timestamp;
|
||||
import java.time.format.DateTimeFormatter;
|
||||
|
||||
public class MuteCommand extends BasicCommand {
|
||||
|
||||
@ -53,7 +52,6 @@ public class MuteCommand extends BasicCommand {
|
||||
}
|
||||
String msg = muteReason.toString();
|
||||
target.mute(muteTime, msg, SteamwarUser.get(sender.getName()).getId(), args[1].equalsIgnoreCase("perma"));
|
||||
Message.team("MUTE_TEAM_MUTED", player -> target.getUserName(), player -> sender.getName(),
|
||||
player -> (args[1].equalsIgnoreCase("perma")?Message.parse("BAN_PERMA", player):Message.parse("BAN_UNTIL", player) + muteTime.toLocalDateTime().format(DateTimeFormatter.ofPattern(Message.parse("TIMEFORMAT", player)))), player -> msg);
|
||||
Message.team("MUTE_TEAM_MUTED", target.getUserName(), new int[]{2}, sender.getName(), (args[1].equalsIgnoreCase("perma")?"BAN_PERMA":"BAN_UNTIL"), msg, muteTime);
|
||||
Lixfel
hat
Hier genauso. Hier genauso.
|
||||
}
|
||||
Lixfel
hat
Hier genauso. Hier genauso.
|
||||
}
|
||||
|
@ -20,6 +20,7 @@
|
||||
package de.steamwar.bungeecore.commands;
|
||||
|
||||
import de.steamwar.bungeecore.BungeeCore;
|
||||
import de.steamwar.bungeecore.Message;
|
||||
import de.steamwar.bungeecore.sql.Punishment;
|
||||
import de.steamwar.bungeecore.sql.SteamwarUser;
|
||||
import de.steamwar.bungeecore.sql.Team;
|
||||
@ -28,6 +29,7 @@ import net.md_5.bungee.api.chat.ClickEvent;
|
||||
import net.md_5.bungee.api.connection.ProxiedPlayer;
|
||||
|
||||
import java.text.DecimalFormat;
|
||||
import java.time.format.DateTimeFormatter;
|
||||
|
||||
public class WhoisCommand extends BasicCommand {
|
||||
public WhoisCommand(){
|
||||
@ -74,7 +76,7 @@ public class WhoisCommand extends BasicCommand {
|
||||
BungeeCore.send(player, "§7Strafen: ");
|
||||
for (Punishment punishment : Punishment.getAllPunishmentsOfPlayer(user.getId())) {
|
||||
Lixfel
hat
Wenn wir die Mute & Bannsachen schon Multilingual haben, sollten wir auch das Multilingual machen. Um das Timestamp-Formatting müsste sich dann glaube ich auch das ML-Framework kümmern. Wenn wir die Mute & Bannsachen schon Multilingual haben, sollten wir auch das Multilingual machen. Um das Timestamp-Formatting müsste sich dann glaube ich auch das ML-Framework kümmern.
Chaoscaot
hat
Dafür wurden wir dann ein Cache wo wir die Sprache speichern könnten, weil sonst müsste man dies von dem gemacht, der den Spieler bannt Dafür wurden wir dann ein Cache wo wir die Sprache speichern könnten, weil sonst müsste man dies von dem gemacht, der den Spieler bannt
Lixfel
hat
Hier in dem Fall ist das Ziel klar player. Und player hat eine Sprache. Den Cache bräuchten wir wenn für den BanListener, aber nicht hier. Daher kann das schon mit umgezogen werden. Hier in dem Fall ist das Ziel klar player. Und player hat eine Sprache. Den Cache bräuchten wir wenn für den BanListener, aber nicht hier. Daher kann das schon mit umgezogen werden.
|
||||
BungeeCore.send(player, "§7" + SteamwarUser.get(punishment.getPunisher()).getUserName() + "§8» §f§l" + punishment.getType().name() + ": §e"
|
||||
Lixfel
hat
Da kannste aber auch mal aufs Multilinguale-System zurückgreifen Da kannste aber auch mal aufs Multilinguale-System zurückgreifen
|
||||
+ punishment.getStartTime().toLocalDateTime().format(BungeeCore.DATE_FORMAT) + " - " + (punishment.isPerma()?"Perma":punishment.getEndTime().toLocalDateTime().format(BungeeCore.DATE_FORMAT)) + " §c" + punishment.getReason());
|
||||
+ punishment.getStartTime().toLocalDateTime().format(DateTimeFormatter.ofPattern(Message.parse("TIMEFORMAT", player))) + " - " + (punishment.isPerma()?"Perma":punishment.getEndTime().toLocalDateTime().format(DateTimeFormatter.ofPattern(Message.parse("TIMEFORMAT", player)))) + " §c" + punishment.getReason());
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -70,7 +70,7 @@ public class BanListener extends BasicListener {
|
||||
for(BannedUserIPs banned : ips) {
|
||||
SteamwarUser bannedUser = SteamwarUser.get(banned.getUserID());
|
||||
potentialBan.append(Message.parse("BAN_AVOIDING_LIST", target, bannedUser.getUserName(),
|
||||
banned.getTimestamp().toLocalDateTime().format(BungeeCore.DATE_FORMAT)));
|
||||
banned.getTimestamp().toLocalDateTime().format(DateTimeFormatter.ofPattern(Message.parse("TIMEFORMAT", target)))));
|
||||
}
|
||||
|
||||
TextComponent msg = new TextComponent(potentialBan.toString());
|
||||
|
@ -134,11 +134,11 @@ public class Punishment {
|
||||
this.endTime = newUpdate;
|
||||
Lixfel
hat
Schreib doch nur name(), dann kannst du beim Type-Getten auch einfach valueOf() machen. Schreib doch nur name(), dann kannst du beim Type-Getten auch einfach valueOf() machen.
|
||||
}
|
||||
|
||||
public String getBantime(Timestamp endTime, boolean perma, ProxiedPlayer player) {
|
||||
public String getBantime(Timestamp endTime, boolean perma) {
|
||||
if(perma)
|
||||
Lixfel
hat
Siehe toDb() Siehe toDb()
|
||||
return Message.parse("BAN_PERMA", player);
|
||||
return "Permanent";
|
||||
else
|
||||
return endTime.toLocalDateTime().format(DateTimeFormatter.ofPattern(Message.parse("TIMEFORMAT", player)));
|
||||
return endTime.toLocalDateTime().format(DateTimeFormatter.ofPattern("dd.MM.yyyy HH:mm"));
|
||||
}
|
||||
|
||||
public enum PunishmentType {
|
||||
|
@ -96,7 +96,7 @@ USAGE_IGNORE=§8/§7ignore §8[§eSpieler§8]
|
||||
#Various commands
|
||||
ALERT=§f{0}
|
||||
|
||||
BAN_TEAM_BANNED=§c {0} wurde von {1} {2} gebannt. §f§lGrund: §f{3}
|
||||
BAN_TEAM_BANNED=§c{0} wurde von {1} {2} gebannt. §f§lGrund: §f{3}
|
||||
BANNED_MESSAGE_PERMA=§cDu bist permanent gebannt. §r§lGrund§r: §c{0}
|
||||
BANNED_MESSAGE_UNTIL=Du bist bis zum {0} gebannt. §r§lGrund§r: §c{1}
|
||||
MUTE_TEAM_MUTED=§c {0} wurde von {1} {2} gemuted. §f§lGrund: §f{3}
|
||||
@ -105,7 +105,7 @@ MUTED_MESSAGE_UNTIL=Du bist bis zum {0} gemuted. §r§lGrund§r: §c{1}
|
||||
BAN_CHANGED={0} verändert von {1} von {2} auf {3} wegen {4}
|
||||
BAN_INVALID_TIME=§cUngültige Zeitangabe.
|
||||
BAN_PERMA=Permanent
|
||||
BAN_UNTIL=bis zum
|
||||
BAN_UNTIL=bis zum {4}
|
||||
BAN_AVOIDING_ALERT=§cMögliche Bannumgehung durch §r{0}§c: §c
|
||||
BAN_AVOIDING_LIST={0} §e{1} §c
|
||||
Lixfel
hat
Da brauchen wir kein spezielles Präfix. Und so schön du dir das gedacht hast: Die eckigen Klammern machens irgendwie wieder hässlich. ;) (Persönliche Meinung) Da brauchen wir kein spezielles Präfix. Und so schön du dir das gedacht hast: Die eckigen Klammern machens irgendwie wieder hässlich. ;) (Persönliche Meinung)
|
||||
BAN_AVOIDING_BAN_HOVER=§cBanne Spieler wegen Bannumgehung
|
||||
|
Ich würde mir da wenn wünschen (weil das eine API-Funktion ist), dass es die alte Funktion weiterhin gibt und dazu eine neue mit den neuen Aufrufparametern (damit das System nicht umständlich für Sonderfälle ist). Und dass dann entsprechend die alte Funktion verwendet wird, soweit der Formatter nicht benötigt wird.