Cleanup and refactoring

This commit is contained in:
Elias Müller 2023-12-10 00:22:14 +01:00
parent 0ea9738867
commit c059880ece
29 changed files with 140 additions and 120 deletions

View File

@ -7,10 +7,10 @@ import eu.mhsl.craftattack.spawn.appliances.event.command.EventCommand;
import eu.mhsl.craftattack.spawn.appliances.event.command.EventEndSessionCommand;
import eu.mhsl.craftattack.spawn.appliances.event.command.EventOpenSessionCommand;
import eu.mhsl.craftattack.spawn.appliances.event.command.MoveEventVillagerCommand;
import eu.mhsl.craftattack.spawn.util.DisplayVillager;
import eu.mhsl.craftattack.spawn.util.PluginMessage;
import eu.mhsl.craftattack.spawn.util.commonListeners.DismissInventoryOpenFromHolder;
import eu.mhsl.craftattack.spawn.util.commonListeners.PlayerInteractAtEntityEventListener;
import eu.mhsl.craftattack.spawn.util.entity.DisplayVillager;
import eu.mhsl.craftattack.spawn.util.server.PluginMessage;
import eu.mhsl.craftattack.spawn.util.listener.DismissInventoryOpenFromHolder;
import eu.mhsl.craftattack.spawn.util.listener.PlayerInteractAtEntityEventListener;
import net.kyori.adventure.text.Component;
import net.kyori.adventure.text.format.NamedTextColor;
import org.bukkit.entity.Player;

View File

@ -1,10 +1,7 @@
package eu.mhsl.craftattack.spawn.appliances.playerlimit;
import eu.mhsl.craftattack.spawn.Main;
import eu.mhsl.craftattack.spawn.appliance.Appliance;
import eu.mhsl.craftattack.spawn.appliance.ApplianceCommand;
import eu.mhsl.craftattack.spawn.appliances.playerlimit.command.SetPlayerLimitCommand;
import eu.mhsl.craftattack.spawn.appliances.playerlimit.listener.PlayerJoinLimiterListener;
import eu.mhsl.craftattack.spawn.config.Configuration;
import org.bukkit.Bukkit;
import org.bukkit.event.Listener;
@ -34,7 +31,7 @@ public class PlayerLimit extends Appliance {
@Override
protected @NotNull List<Listener> eventHandlers() {
return List.of(
new PlayerJoinLimiterListener()
new PlayerLimiterListener()
);
}

View File

@ -0,0 +1,24 @@
package eu.mhsl.craftattack.spawn.appliances.playerlimit;
import eu.mhsl.craftattack.spawn.appliance.ApplianceListener;
import eu.mhsl.craftattack.spawn.util.text.DisconnectInfo;
import org.bukkit.Bukkit;
import org.bukkit.event.EventHandler;
import org.bukkit.event.player.AsyncPlayerPreLoginEvent;
public class PlayerLimiterListener extends ApplianceListener<PlayerLimit> {
@EventHandler
public void onLogin(AsyncPlayerPreLoginEvent playerPreLoginEvent) {
playerPreLoginEvent.kickMessage(
new DisconnectInfo(
"Hohe Serverauslastung",
"Der Server ist momentan an seiner Kapazitätsgrenze angelangt!",
"Bitte versuche es zu einem späteren Zeitpunkt erneut.",
playerPreLoginEvent.getUniqueId()
).getComponent()
);
if(Bukkit.getOnlinePlayers().size() >= getAppliance().getLimit())
playerPreLoginEvent.setLoginResult(AsyncPlayerPreLoginEvent.Result.KICK_FULL);
}
}

View File

@ -1,4 +1,4 @@
package eu.mhsl.craftattack.spawn.appliances.playerlimit.command;
package eu.mhsl.craftattack.spawn.appliances.playerlimit;
import eu.mhsl.craftattack.spawn.appliance.ApplianceCommand;
import eu.mhsl.craftattack.spawn.appliances.playerlimit.PlayerLimit;

View File

@ -1,18 +0,0 @@
package eu.mhsl.craftattack.spawn.appliances.playerlimit.listener;
import eu.mhsl.craftattack.spawn.appliance.ApplianceListener;
import eu.mhsl.craftattack.spawn.appliances.playerlimit.PlayerLimit;
import net.kyori.adventure.text.Component;
import net.kyori.adventure.text.format.NamedTextColor;
import org.bukkit.Bukkit;
import org.bukkit.event.EventHandler;
import org.bukkit.event.player.AsyncPlayerPreLoginEvent;
import org.bukkit.event.player.PlayerLoginEvent;
public class PlayerJoinLimiterListener extends ApplianceListener<PlayerLimit> {
@EventHandler
public void onLogin(PlayerLoginEvent playerPreLoginEvent) {
playerPreLoginEvent.kickMessage(Component.text("Der Server ist derzeit voll! Versuche es bitte später erneut.", NamedTextColor.RED));
if(Bukkit.getOnlinePlayers().size() >= getAppliance().getLimit()) playerPreLoginEvent.setResult(PlayerLoginEvent.Result.KICK_FULL);
}
}

View File

@ -7,9 +7,9 @@ import eu.mhsl.craftattack.spawn.appliances.projectStart.command.ProjectStartCom
import eu.mhsl.craftattack.spawn.appliances.projectStart.command.ProjectStartResetCommand;
import eu.mhsl.craftattack.spawn.appliances.projectStart.listener.PlayerInvincibleListener;
import eu.mhsl.craftattack.spawn.config.Configuration;
import eu.mhsl.craftattack.spawn.util.BlockCycle;
import eu.mhsl.craftattack.spawn.util.ComponentUtil;
import eu.mhsl.craftattack.spawn.util.Countdown;
import eu.mhsl.craftattack.spawn.util.world.BlockCycle;
import eu.mhsl.craftattack.spawn.util.text.ComponentUtil;
import eu.mhsl.craftattack.spawn.util.text.Countdown;
import eu.mhsl.craftattack.spawn.util.IteratorUtil;
import net.kyori.adventure.sound.Sound;
import net.kyori.adventure.text.Component;

View File

@ -3,7 +3,6 @@ package eu.mhsl.craftattack.spawn.appliances.report;
import com.google.gson.Gson;
import eu.mhsl.craftattack.spawn.appliance.Appliance;
import eu.mhsl.craftattack.spawn.appliance.ApplianceCommand;
import eu.mhsl.craftattack.spawn.appliances.report.command.ReportCommand;
import net.kyori.adventure.text.Component;
import net.kyori.adventure.text.event.ClickEvent;
import net.kyori.adventure.text.event.HoverEvent;
@ -75,7 +74,7 @@ public class Report extends Appliance {
this.printResultMessage(issuer, httpResponse);
} catch (IOException | InterruptedException e) {
issuer.sendMessage(
Component.text("Internal server error: " + e.getMessage()).color(NamedTextColor.RED)
Component.text("Internal server description: " + e.getMessage()).color(NamedTextColor.RED)
);
throw new RuntimeException(e);
}

View File

@ -1,4 +1,4 @@
package eu.mhsl.craftattack.spawn.appliances.report.command;
package eu.mhsl.craftattack.spawn.appliances.report;
import eu.mhsl.craftattack.spawn.appliance.ApplianceCommand;
import eu.mhsl.craftattack.spawn.appliances.report.Report;

View File

@ -4,7 +4,8 @@ import eu.mhsl.craftattack.spawn.appliance.Appliance;
import eu.mhsl.craftattack.spawn.appliance.ApplianceCommand;
import eu.mhsl.craftattack.spawn.appliances.restart.command.CancelRestartCommand;
import eu.mhsl.craftattack.spawn.appliances.restart.command.ScheduleRestartCommand;
import eu.mhsl.craftattack.spawn.util.Countdown;
import eu.mhsl.craftattack.spawn.util.text.Countdown;
import eu.mhsl.craftattack.spawn.util.text.DisconnectInfo;
import eu.mhsl.craftattack.spawn.util.IteratorUtil;
import net.kyori.adventure.text.Component;
import net.kyori.adventure.text.format.NamedTextColor;
@ -49,16 +50,13 @@ public class Restart extends Appliance {
}
private void onDone() {
IteratorUtil.onlinePlayers(player -> {
player.kick(
Component.text()
.appendNewline().appendNewline()
.append(Component.text("Serverneustart", NamedTextColor.DARK_RED)).appendNewline().appendNewline()
.append(Component.text("Wir sind gleich wieder online!", NamedTextColor.GOLD)).appendNewline()
.append(Component.text("Verbinde Dich dann erneut.", NamedTextColor.GRAY)).appendNewline()
.build()
);
});
IteratorUtil.onlinePlayers(
player -> new DisconnectInfo(
"Serverneustart",
"Wir sind gleich wieder online!",
"Verbinde Dich dann erneut.",
player.getUniqueId()
).applyKick(player));
Bukkit.shutdown();
}

View File

@ -3,8 +3,9 @@ package eu.mhsl.craftattack.spawn.appliances.tablist;
import eu.mhsl.craftattack.spawn.Main;
import eu.mhsl.craftattack.spawn.appliance.Appliance;
import eu.mhsl.craftattack.spawn.appliances.report.Report;
import eu.mhsl.craftattack.spawn.util.ComponentUtil;
import eu.mhsl.craftattack.spawn.util.RainbowComponent;
import eu.mhsl.craftattack.spawn.util.text.ComponentUtil;
import eu.mhsl.craftattack.spawn.util.IteratorUtil;
import eu.mhsl.craftattack.spawn.util.text.RainbowComponent;
import net.kyori.adventure.text.Component;
import net.kyori.adventure.text.format.NamedTextColor;
import net.kyori.adventure.util.Ticks;
@ -18,13 +19,16 @@ import java.util.List;
public class Tablist extends Appliance {
private final int refreshRate = Ticks.TICKS_PER_SECOND * 3;
private final RainbowComponent serverName = new RainbowComponent(" CraftAttack 6 ", 7, 3);
private final Component hostName = Component.text("mhsl.eu").color(NamedTextColor.GOLD);
@Override
public void onEnable() {
Runnable updateAll = () -> Bukkit.getOnlinePlayers().forEach(this::update);
Bukkit.getScheduler().runTaskTimerAsynchronously(Main.instance(), updateAll, refreshRate, refreshRate);
Bukkit.getScheduler().runTaskTimerAsynchronously(
Main.instance(),
() -> IteratorUtil.onlinePlayers(this::update),
refreshRate,
refreshRate
);
}
public void update(Player player) {
@ -32,23 +36,17 @@ public class Tablist extends Appliance {
updateFooter(player);
}
public void updateHeader(Player player) {
private void updateHeader(Player player) {
player.sendPlayerListHeader(
Component.newline()
.append(serverName.getRainbowState())
.appendNewline()
.append(hostName)
.appendNewline()
.appendNewline()
.append(ComponentUtil.getFormattedMSPT())
.appendNewline()
.appendNewline()
.append(ComponentUtil.getFormattedPing(player))
.appendNewline()
.append(serverName.getRainbowState()).appendNewline()
.append(Component.text("mhsl.eu", NamedTextColor.GOLD)).appendNewline().appendNewline()
.append(ComponentUtil.getFormattedMSPT()).appendNewline().appendNewline()
.append(ComponentUtil.getFormattedPing(player)).appendNewline()
);
}
public void updateFooter(Player player) {
private void updateFooter(Player player) {
player.sendPlayerListFooter(Report.helpText());
}

View File

@ -1,12 +1,16 @@
package eu.mhsl.craftattack.spawn.appliances.titleClear;
import eu.mhsl.craftattack.spawn.appliance.Appliance;
import org.bukkit.entity.Player;
import org.bukkit.event.Listener;
import org.jetbrains.annotations.NotNull;
import java.util.List;
public class TitleClear extends Appliance {
public void clearTitle(Player player) {
player.clearTitle();
}
@Override
protected @NotNull List<Listener> eventHandlers() {
return List.of(

View File

@ -7,6 +7,6 @@ import org.bukkit.event.player.PlayerJoinEvent;
public class TitleClearListener extends ApplianceListener<TitleClear> {
@EventHandler
public void onPlayerJoin(PlayerJoinEvent event) {
event.getPlayer().resetTitle();
getAppliance().clearTitle(event.getPlayer());
}
}

View File

@ -1,18 +0,0 @@
package eu.mhsl.craftattack.spawn.appliances.whitelist;
import java.util.UUID;
public class LoginException extends Exception {
public String title;
public String error;
public UUID user;
public String solution;
public LoginException(String title, String error, UUID user, String solution) {
super(error);
this.title = title;
this.error = error;
this.user = user;
this.solution = solution;
}
}

View File

@ -1,8 +1,7 @@
package eu.mhsl.craftattack.spawn.appliances.whitelist;
import eu.mhsl.craftattack.spawn.appliance.ApplianceListener;
import net.kyori.adventure.text.Component;
import net.kyori.adventure.text.format.NamedTextColor;
import eu.mhsl.craftattack.spawn.util.text.DisconnectInfo;
import org.bukkit.event.EventHandler;
import org.bukkit.event.player.AsyncPlayerPreLoginEvent;
@ -11,16 +10,10 @@ public class PlayerJoinListener extends ApplianceListener<Whitelist> {
public void preLoginEvent(AsyncPlayerPreLoginEvent preLoginEvent) {
try {
getAppliance().login(preLoginEvent);
} catch (LoginException e) {
} catch (DisconnectInfo.Throwable e) {
preLoginEvent.disallow(
AsyncPlayerPreLoginEvent.Result.KICK_WHITELIST,
Component.text()
.appendNewline().appendNewline()
.append(Component.text(e.title, NamedTextColor.DARK_RED)).appendNewline()
.append(Component.text(e.error, NamedTextColor.RED)).appendNewline().appendNewline()
.append(Component.text(e.solution, NamedTextColor.GRAY)).appendNewline().appendNewline()
.append(Component.text(e.user.toString(), NamedTextColor.DARK_GRAY)).appendNewline()
.build()
e.getDisconnectScreen().getComponent()
);
}
}

View File

@ -2,6 +2,7 @@ package eu.mhsl.craftattack.spawn.appliances.whitelist;
import com.google.gson.Gson;
import eu.mhsl.craftattack.spawn.appliance.Appliance;
import eu.mhsl.craftattack.spawn.util.text.DisconnectInfo;
import org.apache.http.client.utils.URIBuilder;
import org.bukkit.event.Listener;
import org.bukkit.event.player.AsyncPlayerPreLoginEvent;
@ -26,31 +27,31 @@ public class Whitelist extends Appliance {
super("whitelist");
}
public void login(AsyncPlayerPreLoginEvent login) throws LoginException {
public void login(AsyncPlayerPreLoginEvent login) throws DisconnectInfo.Throwable {
try {
UserData data = this.fetchUserData(login.getUniqueId());
if(!data.username.equalsIgnoreCase(login.getName()))
throw new LoginException(
throw new DisconnectInfo.Throwable(
"Nutzername geändert",
String.format("Der Name '%s' stimmt nicht mit '%s' überein.", data.username, login.getName()),
login.getUniqueId(),
"Bitte kontaktiere einen Admin, um Deine Anmeldedaten zu aktualisieren!"
"Bitte kontaktiere einen Admin, um Deine Anmeldedaten zu aktualisieren!",
login.getUniqueId()
);
} catch (LoginException e) {
} catch (DisconnectInfo.Throwable e) {
throw e;
} catch (Exception e) {
throw new LoginException(
throw new DisconnectInfo.Throwable(
"Interner Serverfehler",
"Deine Zugangsdaten konnten nicht abgerufen werden.",
login.getUniqueId(),
"Versuche es später erneut oder kontaktiere einen Admin!"
"Versuche es später erneut oder kontaktiere einen Admin!",
login.getUniqueId()
);
}
}
private UserData fetchUserData(UUID uuid) throws LoginException {
private UserData fetchUserData(UUID uuid) throws DisconnectInfo.Throwable {
URIBuilder uriBuilder = new URIBuilder(apiEndpoint);
uriBuilder.addParameter("uuid", uuid.toString());
@ -65,11 +66,11 @@ public class Whitelist extends Appliance {
HttpResponse<String> httpResponse = client.send(httpRequest, HttpResponse.BodyHandlers.ofString());
if(httpResponse.statusCode() == 400)
throw new LoginException(
throw new DisconnectInfo.Throwable(
"Nicht angemeldet",
"Du bist derzeit nicht als Teilnehmer des CraftAttack-Projektes registriert!",
uuid,
"Melde Dich bei einem Admin für eine nachträgliche Anmeldung."
"Melde Dich bei einem Admin für eine nachträgliche Anmeldung.",
uuid
);
return new Gson().fromJson(httpResponse.body(), UserData.class);

View File

@ -1,4 +1,4 @@
package eu.mhsl.craftattack.spawn.appliances.worldmuseum.command;
package eu.mhsl.craftattack.spawn.appliances.worldmuseum;
import eu.mhsl.craftattack.spawn.appliance.ApplianceCommand;
import eu.mhsl.craftattack.spawn.appliances.worldmuseum.WorldMuseum;

View File

@ -2,11 +2,10 @@ package eu.mhsl.craftattack.spawn.appliances.worldmuseum;
import eu.mhsl.craftattack.spawn.appliance.Appliance;
import eu.mhsl.craftattack.spawn.appliance.ApplianceCommand;
import eu.mhsl.craftattack.spawn.appliances.worldmuseum.command.MoveWorldMuseumVillagerCommand;
import eu.mhsl.craftattack.spawn.util.DisplayVillager;
import eu.mhsl.craftattack.spawn.util.PluginMessage;
import eu.mhsl.craftattack.spawn.util.commonListeners.DismissInventoryOpenFromHolder;
import eu.mhsl.craftattack.spawn.util.commonListeners.PlayerInteractAtEntityEventListener;
import eu.mhsl.craftattack.spawn.util.entity.DisplayVillager;
import eu.mhsl.craftattack.spawn.util.server.PluginMessage;
import eu.mhsl.craftattack.spawn.util.listener.DismissInventoryOpenFromHolder;
import eu.mhsl.craftattack.spawn.util.listener.PlayerInteractAtEntityEventListener;
import net.kyori.adventure.text.Component;
import net.kyori.adventure.text.format.NamedTextColor;
import org.bukkit.Bukkit;

View File

@ -1,7 +1,8 @@
package eu.mhsl.craftattack.spawn.util;
package eu.mhsl.craftattack.spawn.util.entity;
import eu.mhsl.craftattack.spawn.config.ConfigUtil;
import eu.mhsl.craftattack.spawn.config.Configuration;
import eu.mhsl.craftattack.spawn.util.world.ChunkUtils;
import org.bukkit.Location;
import org.bukkit.configuration.ConfigurationSection;
import org.bukkit.entity.EntityType;

View File

@ -1,4 +1,4 @@
package eu.mhsl.craftattack.spawn.util.commonListeners;
package eu.mhsl.craftattack.spawn.util.listener;
import org.bukkit.entity.Entity;
import org.bukkit.event.EventHandler;

View File

@ -1,4 +1,4 @@
package eu.mhsl.craftattack.spawn.util.commonListeners;
package eu.mhsl.craftattack.spawn.util.listener;
import org.bukkit.event.EventHandler;
import org.bukkit.event.Listener;

View File

@ -1,4 +1,4 @@
package eu.mhsl.craftattack.spawn.util;
package eu.mhsl.craftattack.spawn.util.server;
import org.bukkit.entity.Player;
import org.geysermc.floodgate.api.FloodgateApi;

View File

@ -1,4 +1,4 @@
package eu.mhsl.craftattack.spawn.util;
package eu.mhsl.craftattack.spawn.util.server;
import com.google.common.io.ByteArrayDataOutput;
import com.google.common.io.ByteStreams;

View File

@ -1,5 +1,6 @@
package eu.mhsl.craftattack.spawn.util;
package eu.mhsl.craftattack.spawn.util.text;
import eu.mhsl.craftattack.spawn.util.NumberUtil;
import net.kyori.adventure.text.format.TextColor;
import java.awt.*;

View File

@ -1,4 +1,4 @@
package eu.mhsl.craftattack.spawn.util;
package eu.mhsl.craftattack.spawn.util.text;
import net.kyori.adventure.text.Component;
import net.kyori.adventure.text.format.NamedTextColor;

View File

@ -1,4 +1,4 @@
package eu.mhsl.craftattack.spawn.util;
package eu.mhsl.craftattack.spawn.util.text;
import eu.mhsl.craftattack.spawn.Main;
import net.kyori.adventure.text.Component;

View File

@ -0,0 +1,41 @@
package eu.mhsl.craftattack.spawn.util.text;
import net.kyori.adventure.text.Component;
import net.kyori.adventure.text.format.NamedTextColor;
import org.bukkit.entity.Player;
import java.util.UUID;
public record DisconnectInfo(String error, String description, String help, UUID user) {
public void applyKick(Player player) {
player.kick(this.getComponent());
}
public Component getComponent() {
return Component.text()
.appendNewline().appendNewline()
.append(Component.text(this.error, NamedTextColor.DARK_RED)).appendNewline()
.append(Component.text(this.description, NamedTextColor.RED)).appendNewline().appendNewline()
.append(Component.text(this.help, NamedTextColor.GRAY)).appendNewline().appendNewline()
.append(Component.text(this.user.toString(), NamedTextColor.DARK_GRAY)).appendNewline()
.build();
}
public static class Throwable extends Exception {
public String error;
public String description;
public String help;
public UUID user;
public Throwable(String error, String description, String help, UUID user) {
super(description);
this.error = error;
this.description = description;
this.help = help;
this.user = user;
}
public DisconnectInfo getDisconnectScreen() {
return new DisconnectInfo(this.error, this.description, this.help, this.user);
}
}
}

View File

@ -1,4 +1,4 @@
package eu.mhsl.craftattack.spawn.util;
package eu.mhsl.craftattack.spawn.util.text;
import net.kyori.adventure.text.Component;
import net.kyori.adventure.text.format.TextColor;

View File

@ -1,4 +1,4 @@
package eu.mhsl.craftattack.spawn.util;
package eu.mhsl.craftattack.spawn.util.world;
import org.bukkit.Location;
import org.bukkit.Material;

View File

@ -1,4 +1,4 @@
package eu.mhsl.craftattack.spawn.util;
package eu.mhsl.craftattack.spawn.util.world;
import org.bukkit.Chunk;
import org.bukkit.Location;