async whitelist check

This commit is contained in:
Elias Müller 2024-12-25 21:09:42 +01:00
parent 0e3a54a1b9
commit e36256d5be
8 changed files with 61 additions and 64 deletions

View File

@ -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<Listener> listeners() {
return List.of(new AdminMarkerListener());
}
}

View File

@ -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<AdminMarker> {
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());
}
}

View File

@ -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<ChatMessages> {
);
}
@EventHandler
@EventHandler(priority = EventPriority.HIGH)
public void onPlayerJoin(PlayerJoinEvent event) {
event.joinMessage(null);
IteratorUtil.onlinePlayers(player -> {

View File

@ -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<Listener> listeners() {
return List.of(new AdminMarkerListener());
}
}

View File

@ -6,7 +6,7 @@ import org.bukkit.event.EventPriority;
import org.bukkit.event.player.PlayerJoinEvent;
public class DisplayNameUpdateListener extends ApplianceListener<DisplayName> {
@EventHandler(priority = EventPriority.LOWEST)
@EventHandler(priority = EventPriority.LOW)
public void onJoin(PlayerJoinEvent event) {
this.getAppliance().update(event.getPlayer());
}

View File

@ -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,

View File

@ -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<Whitelist> {
@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());
}
}
}

View File

@ -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<UUID, WhitelistRepository.UserData> 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);
}