diff --git a/src/main/java/eu/mhsl/craftattack/spawn/appliances/adminMarker/AdminMarker.java b/src/main/java/eu/mhsl/craftattack/spawn/appliances/adminMarker/AdminMarker.java index 6a36841..9f2b085 100644 --- a/src/main/java/eu/mhsl/craftattack/spawn/appliances/adminMarker/AdminMarker.java +++ b/src/main/java/eu/mhsl/craftattack/spawn/appliances/adminMarker/AdminMarker.java @@ -4,10 +4,6 @@ import eu.mhsl.craftattack.spawn.appliance.Appliance; import net.kyori.adventure.text.format.TextColor; import org.bukkit.Color; import org.bukkit.entity.Player; -import org.bukkit.event.Listener; -import org.jetbrains.annotations.NotNull; - -import java.util.List; public class AdminMarker extends Appliance { public TextColor getPlayerColor(Player player) { @@ -15,10 +11,4 @@ public class AdminMarker extends Appliance { return TextColor.color(Color.AQUA.asRGB()); // TODO read permission from config return TextColor.color(Color.WHITE.asRGB()); } - - @Override - @NotNull - protected List listeners() { - return List.of(new AdminMarkerListener()); - } } diff --git a/src/main/java/eu/mhsl/craftattack/spawn/appliances/adminMarker/AdminMarkerListener.java b/src/main/java/eu/mhsl/craftattack/spawn/appliances/adminMarker/AdminMarkerListener.java deleted file mode 100644 index 9d07ca7..0000000 --- a/src/main/java/eu/mhsl/craftattack/spawn/appliances/adminMarker/AdminMarkerListener.java +++ /dev/null @@ -1,14 +0,0 @@ -package eu.mhsl.craftattack.spawn.appliances.adminMarker; - -import eu.mhsl.craftattack.spawn.appliance.ApplianceListener; -import net.kyori.adventure.text.format.TextColor; -import org.bukkit.Color; -import org.bukkit.entity.Player; - -public class AdminMarkerListener extends ApplianceListener { - private TextColor getPlayerColor(Player player) { - if(player.hasPermission("chatcolor")) - return TextColor.color(Color.AQUA.asRGB()); // TODO read permission from config - return TextColor.color(Color.WHITE.asRGB()); - } -} diff --git a/src/main/java/eu/mhsl/craftattack/spawn/appliances/chatMessages/ChatMessagesListener.java b/src/main/java/eu/mhsl/craftattack/spawn/appliances/chatMessages/ChatMessagesListener.java index 240e604..43ac7fc 100644 --- a/src/main/java/eu/mhsl/craftattack/spawn/appliances/chatMessages/ChatMessagesListener.java +++ b/src/main/java/eu/mhsl/craftattack/spawn/appliances/chatMessages/ChatMessagesListener.java @@ -9,6 +9,7 @@ import net.kyori.adventure.text.format.NamedTextColor; import net.kyori.adventure.text.format.TextColor; import org.bukkit.Color; import org.bukkit.event.EventHandler; +import org.bukkit.event.EventPriority; import org.bukkit.event.entity.PlayerDeathEvent; import org.bukkit.event.player.PlayerJoinEvent; import org.bukkit.event.player.PlayerQuitEvent; @@ -27,7 +28,7 @@ public class ChatMessagesListener extends ApplianceListener { ); } - @EventHandler + @EventHandler(priority = EventPriority.HIGH) public void onPlayerJoin(PlayerJoinEvent event) { event.joinMessage(null); IteratorUtil.onlinePlayers(player -> { diff --git a/src/main/java/eu/mhsl/craftattack/spawn/appliances/displayName/DisplayName.java b/src/main/java/eu/mhsl/craftattack/spawn/appliances/displayName/DisplayName.java index 2afb064..727cc18 100644 --- a/src/main/java/eu/mhsl/craftattack/spawn/appliances/displayName/DisplayName.java +++ b/src/main/java/eu/mhsl/craftattack/spawn/appliances/displayName/DisplayName.java @@ -3,7 +3,6 @@ package eu.mhsl.craftattack.spawn.appliances.displayName; import eu.mhsl.craftattack.spawn.Main; import eu.mhsl.craftattack.spawn.appliance.Appliance; import eu.mhsl.craftattack.spawn.appliances.adminMarker.AdminMarker; -import eu.mhsl.craftattack.spawn.appliances.adminMarker.AdminMarkerListener; import eu.mhsl.craftattack.spawn.appliances.afkTag.AfkTag; import eu.mhsl.craftattack.spawn.appliances.outlawed.Outlawed; import eu.mhsl.craftattack.spawn.appliances.sleepTag.SleepTag; @@ -17,8 +16,6 @@ import net.kyori.adventure.text.event.HoverEvent; import net.kyori.adventure.text.format.NamedTextColor; import net.kyori.adventure.text.format.TextColor; import org.bukkit.entity.Player; -import org.bukkit.event.Listener; -import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; import java.util.List; @@ -74,10 +71,4 @@ public class DisplayName extends Appliance { Main.instance().getLogger().log(Level.SEVERE, e, e::getMessage); } } - - @Override - @NotNull - protected List listeners() { - return List.of(new AdminMarkerListener()); - } } diff --git a/src/main/java/eu/mhsl/craftattack/spawn/appliances/displayName/DisplayNameUpdateListener.java b/src/main/java/eu/mhsl/craftattack/spawn/appliances/displayName/DisplayNameUpdateListener.java index 5df3e35..4d75209 100644 --- a/src/main/java/eu/mhsl/craftattack/spawn/appliances/displayName/DisplayNameUpdateListener.java +++ b/src/main/java/eu/mhsl/craftattack/spawn/appliances/displayName/DisplayNameUpdateListener.java @@ -6,7 +6,7 @@ import org.bukkit.event.EventPriority; import org.bukkit.event.player.PlayerJoinEvent; public class DisplayNameUpdateListener extends ApplianceListener { - @EventHandler(priority = EventPriority.LOWEST) + @EventHandler(priority = EventPriority.LOW) public void onJoin(PlayerJoinEvent event) { this.getAppliance().update(event.getPlayer()); } diff --git a/src/main/java/eu/mhsl/craftattack/spawn/appliances/outlawed/Outlawed.java b/src/main/java/eu/mhsl/craftattack/spawn/appliances/outlawed/Outlawed.java index 40d9bb4..82d833c 100644 --- a/src/main/java/eu/mhsl/craftattack/spawn/appliances/outlawed/Outlawed.java +++ b/src/main/java/eu/mhsl/craftattack/spawn/appliances/outlawed/Outlawed.java @@ -38,9 +38,9 @@ public class Outlawed extends Appliance implements DisplayName.Prefixed { if(!player.isOnline()) return; if(status != Status.FORCED) return; try { - this.queryAppliance(Whitelist.class).integrityCheck(player); + this.queryAppliance(Whitelist.class).fullIntegrityCheck(player); } catch(DisconnectInfo.Throwable e) { - Bukkit.getScheduler().runTask(Main.instance(), () -> e.getDisconnectScreen().applyKick(player)); + e.getDisconnectScreen().applyKick(player); } }), 20 * 60, diff --git a/src/main/java/eu/mhsl/craftattack/spawn/appliances/whitelist/PlayerJoinListener.java b/src/main/java/eu/mhsl/craftattack/spawn/appliances/whitelist/PlayerJoinListener.java index f084330..98ea1f2 100644 --- a/src/main/java/eu/mhsl/craftattack/spawn/appliances/whitelist/PlayerJoinListener.java +++ b/src/main/java/eu/mhsl/craftattack/spawn/appliances/whitelist/PlayerJoinListener.java @@ -3,18 +3,28 @@ package eu.mhsl.craftattack.spawn.appliances.whitelist; import eu.mhsl.craftattack.spawn.appliance.ApplianceListener; import eu.mhsl.craftattack.spawn.util.text.DisconnectInfo; import org.bukkit.event.EventHandler; -import org.bukkit.event.player.PlayerLoginEvent; +import org.bukkit.event.player.AsyncPlayerPreLoginEvent; +import org.bukkit.event.player.PlayerJoinEvent; public class PlayerJoinListener extends ApplianceListener { @EventHandler - public void preLoginEvent(PlayerLoginEvent preLoginEvent) { + public void preLoginEvent(AsyncPlayerPreLoginEvent event) { try { - this.getAppliance().integrityCheck(preLoginEvent.getPlayer()); + this.getAppliance().integrityCheck(event.getUniqueId(), event.getName()); } catch(DisconnectInfo.Throwable e) { - preLoginEvent.disallow( - PlayerLoginEvent.Result.KICK_WHITELIST, + event.disallow( + AsyncPlayerPreLoginEvent.Result.KICK_WHITELIST, e.getDisconnectScreen().getComponent() ); } } + + @EventHandler + public void joinEvent(PlayerJoinEvent event) { + try { + this.getAppliance().lateIntegrityCheck(event.getPlayer()); + } catch(DisconnectInfo.Throwable e) { + e.getDisconnectScreen().applyKick(event.getPlayer()); + } + } } diff --git a/src/main/java/eu/mhsl/craftattack/spawn/appliances/whitelist/Whitelist.java b/src/main/java/eu/mhsl/craftattack/spawn/appliances/whitelist/Whitelist.java index d6b69fd..a8d2c56 100644 --- a/src/main/java/eu/mhsl/craftattack/spawn/appliances/whitelist/Whitelist.java +++ b/src/main/java/eu/mhsl/craftattack/spawn/appliances/whitelist/Whitelist.java @@ -13,29 +13,63 @@ import org.bukkit.Bukkit; import org.bukkit.entity.Player; import org.bukkit.event.Listener; import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; import java.time.Instant; import java.time.ZoneOffset; import java.time.format.DateTimeFormatter; import java.time.temporal.ChronoUnit; import java.util.Date; +import java.util.HashMap; import java.util.List; import java.util.UUID; import java.util.logging.Level; public class Whitelist extends Appliance { + private final HashMap userData = new HashMap<>(); public Whitelist() { super("whitelist"); } - public void integrityCheck(Player player) throws DisconnectInfo.Throwable { + public void fullIntegrityCheck(Player player) throws DisconnectInfo.Throwable { + this.integrityCheck(player.getUniqueId(), player.getName()); + this.lateIntegrityCheck(player); + } + + public void lateIntegrityCheck(Player player) throws DisconnectInfo.Throwable { + @Nullable WhitelistRepository.UserData user = this.userData.get(player.getUniqueId()); + if(user == null) { + throw new DisconnectInfo.Throwable( + "Nutzerdaten nicht geladen", + "Deine Nutzerdaten sind noch nicht bereit!", + "warte einige Sekunden und versuche es erneut. Falls es weiterhin nicht funktioniert kontaktiere einen Admin!", + player.getUniqueId() + ); + } + this.queryAppliance(Outlawed.class).updateForcedStatus(player, this.timestampRelevant(user.outlawed_until())); + + String purePlayerName = Floodgate.isBedrock(player) + ? Floodgate.getBedrockPlayer(player).getUsername() + : player.getName(); + + if(!user.username().trim().equalsIgnoreCase(purePlayerName)) + throw new DisconnectInfo.Throwable( + "Nutzername geändert", + String.format("Der Name '%s' stimmt nicht mit '%s' überein.", user.username(), player.getName()), + "Bitte kontaktiere einen Admin, um Deine Anmeldedaten zu aktualisieren!", + player.getUniqueId() + ); + } + + public void integrityCheck(UUID uuid, String name) throws DisconnectInfo.Throwable { try { - Main.instance().getLogger().info(String.format("Running integrityCheck for %s", player.getName())); + Main.instance().getLogger().info(String.format("Running integrityCheck for %s", name)); boolean overrideCheck = this.localConfig().getBoolean("overrideIntegrityCheck", false); WhitelistRepository.UserData user = overrideCheck - ? new WhitelistRepository.UserData(player.getUniqueId(), player.getName(), "", "", 0L, 0L) - : this.fetchUserData(player.getUniqueId()); + ? new WhitelistRepository.UserData(uuid, name, "", "", 0L, 0L) + : this.fetchUserData(uuid); + this.userData.put(uuid, user); Main.logger().info(String.format("got userdata %s", user.toString())); if(this.timestampRelevant(user.banned_until())) { @@ -50,24 +84,9 @@ public class Whitelist extends Appliance { "Du wurdest vom Server gebannt.", String.format("Dein Bann läuft am %s um %s ab!", dateFormat.format(bannedDate), timeFormat.format(bannedDate)), "Wende dich an einen Admin für weitere Informationen.", - player.getUniqueId() + uuid ); } - - this.queryAppliance(Outlawed.class).updateForcedStatus(player, this.timestampRelevant(user.outlawed_until())); - - String purePlayerName = Floodgate.isBedrock(player) - ? Floodgate.getBedrockPlayer(player).getUsername() - : player.getName(); - - if(!user.username().trim().equalsIgnoreCase(purePlayerName)) - throw new DisconnectInfo.Throwable( - "Nutzername geändert", - String.format("Der Name '%s' stimmt nicht mit '%s' überein.", user.username(), player.getName()), - "Bitte kontaktiere einen Admin, um Deine Anmeldedaten zu aktualisieren!", - player.getUniqueId() - ); - } catch(DisconnectInfo.Throwable e) { throw e; } catch(Exception e) { @@ -76,7 +95,7 @@ public class Whitelist extends Appliance { "Interner Serverfehler", "Deine Anmeldedaten konnten nicht abgerufen/ überprüft werden.", "Versuche es später erneut oder kontaktiere einen Admin!", - player.getUniqueId() + uuid ); } } @@ -111,7 +130,7 @@ public class Whitelist extends Appliance { Player player = Bukkit.getPlayer(user.user); if(player != null) { try { - this.integrityCheck(player); + this.fullIntegrityCheck(player); } catch(DisconnectInfo.Throwable e) { e.getDisconnectScreen().applyKick(player); }