Fabric Mod Sender Integration. Mod itself is not final #307
@ -19,10 +19,9 @@
|
||||
|
||||
package de.steamwar.bungeecore.listeners.mods;
|
||||
|
||||
import com.google.gson.JsonArray;
|
||||
import com.google.gson.JsonObject;
|
||||
import com.google.gson.JsonParser;
|
||||
import com.google.gson.*;
|
||||
import de.steamwar.bungeecore.BungeeCore;
|
||||
import de.steamwar.bungeecore.Message;
|
||||
import de.steamwar.bungeecore.Storage;
|
||||
import de.steamwar.bungeecore.listeners.BasicListener;
|
||||
import de.steamwar.bungeecore.sql.Mod;
|
||||
@ -34,6 +33,7 @@ import net.md_5.bungee.api.event.PluginMessageEvent;
|
||||
import net.md_5.bungee.event.EventHandler;
|
||||
|
||||
import java.nio.charset.StandardCharsets;
|
||||
import java.nio.charset.UnsupportedCharsetException;
|
||||
import java.sql.Timestamp;
|
||||
zOnlyKroks markierte diese Unterhaltung als gelöst
Veraltet
|
||||
import java.time.Instant;
|
||||
import java.util.*;
|
||||
@ -41,8 +41,7 @@ import java.util.logging.Level;
|
||||
|
||||
zOnlyKroks markierte diese Unterhaltung als gelöst
Lixfel
hat
Ich glaube, das disconnecten musst du nicht mehr von Hand machen (kannst ja mal im LabymodHandler oder Forge1.12Handler nachschauen (Forge 1.13+ ist da etwas spezieller weil in LOGIN) Ich glaube, das disconnecten musst du nicht mehr von Hand machen (kannst ja mal im LabymodHandler oder Forge1.12Handler nachschauen (Forge 1.13+ ist da etwas spezieller weil in LOGIN)
|
||||
public class Fabric extends BasicListener {
|
||||
zOnlyKroks markierte diese Unterhaltung als gelöst
Veraltet
Lixfel
hat
Sollten die Mods einwandfrei sein, sollte der Spieler auf eine Whitelist kommen, dass er auch Arenenserver betreten kann (siehe ModLoaderBlocker). Dazu am Besten den Spieler eine Message senden á'la "Deine Mods wurden überprüft, du darfst Arenen betreten". Sollten die Mods einwandfrei sein, sollte der Spieler auf eine Whitelist kommen, dass er auch Arenenserver betreten kann (siehe ModLoaderBlocker). Dazu am Besten den Spieler eine Message senden á'la "Deine Mods wurden überprüft, du darfst Arenen betreten".
|
||||
|
||||
private final List<String> neededMods = new LinkedList<>();
|
||||
public static final Set<ProxiedPlayer> checkedPlayers = new HashSet();
|
||||
private final Set<String> neededMods = new HashSet<>();
|
||||
zOnlyKroks markierte diese Unterhaltung als gelöst
Veraltet
Lixfel
hat
Warum ist das eine LinkedList? Wäre der korrekte Datentyp hier nicht ein Set? Warum ist das eine LinkedList? Wäre der korrekte Datentyp hier nicht ein Set?
|
||||
|
||||
{
|
||||
neededMods.add("java");
|
||||
@ -61,6 +60,7 @@ public class Fabric extends BasicListener {
|
||||
}
|
||||
|
||||
ProxiedPlayer player = (ProxiedPlayer) e.getSender();
|
||||
SteamwarUser user = SteamwarUser.get(player.getUniqueId());
|
||||
|
||||
List<Mod> mods = new LinkedList<>();
|
||||
|
||||
@ -69,41 +69,46 @@ public class Fabric extends BasicListener {
|
||||
|
||||
data = Arrays.copyOfRange(data,varInt.length, data.length);
|
||||
Lixfel markierte diese Unterhaltung als gelöst
Veraltet
Lixfel
hat
Du könntest das Packet prinzipiell vereinfachen, indem du den String ohne Länge vorher schickst. Der String wäre dann das gesamte Packet. Ansonsten würde ich mir wünschen, dass du überprüfst, dass der VarInt tatsächlich die Länge des restlichen Packets enthält (und falls Fehler Bann), derzeit nutzt du ja den VarInt gar nicht. Du könntest das Packet prinzipiell vereinfachen, indem du den String ohne Länge vorher schickst. Der String wäre dann das gesamte Packet. Ansonsten würde ich mir wünschen, dass du überprüfst, dass der VarInt tatsächlich die Länge des restlichen Packets enthält (und falls Fehler Bann), derzeit nutzt du ja den VarInt gar nicht.
zOnlyKroks
hat
1 teres kann ich nicht tun, da dieser varint von minecraft direkt angepappt wird. zweites kann ich machen. 1 teres kann ich nicht tun, da dieser varint von minecraft direkt angepappt wird. zweites kann ich machen.
|
||||
|
||||
String dataString = new String(data, StandardCharsets.UTF_8);
|
||||
if(data.length != varInt.length + varInt.value) {
|
||||
zOnlyKroks markierte diese Unterhaltung als gelöst
Veraltet
Lixfel
hat
Hier kann eine CharsetException oder ähnliches auftreten, in dem Fall wurde (offensichtlich) auch am fabricmodsender herumgepfuscht. Hier kann eine CharsetException oder ähnliches auftreten, in dem Fall wurde (offensichtlich) auch am fabricmodsender herumgepfuscht.
|
||||
banPlayer(user,player);
|
||||
}
|
||||
|
||||
String dataString = "";
|
||||
|
||||
try{
|
||||
zOnlyKroks markierte diese Unterhaltung als gelöst
Veraltet
Lixfel
hat
Kannst du hier nicht for(X modIdentifier : array) machen? Kannst du hier nicht for(X modIdentifier : array) machen?
|
||||
dataString = new String(data, StandardCharsets.UTF_8);
|
||||
}catch (UnsupportedCharsetException exception) {
|
||||
banPlayer(user, player);
|
||||
}
|
||||
|
||||
JsonArray array = new JsonArray();
|
||||
|
||||
zOnlyKroks markierte diese Unterhaltung als gelöst
Veraltet
Lixfel
hat
Das würde ich mir einmal Multilingual mit Message.parse(Prefixless?)() wünschen. Das würde ich mir einmal Multilingual mit Message.parse(Prefixless?)() wünschen.
|
||||
try {
|
||||
JsonArray array = new JsonParser().parse(dataString).getAsJsonArray();
|
||||
|
||||
for(int i = 0; i < array.size(); i++) {
|
||||
mods.add(Mod.get(array.get(i).getAsString(), Mod.Platform.FABRIC));
|
||||
}
|
||||
|
||||
boolean isSorted = isSortedAlphabetically(mods);
|
||||
|
||||
if(!isSorted) {
|
||||
SteamwarUser user = SteamwarUser.get(player.getUniqueId());
|
||||
user.punish(Punishment.PunishmentType.Ban, Timestamp.from(Instant.now()), "§7Du hast probiert den FabricModSender zu umgehen!", 0, true);
|
||||
BungeeCore.log(Level.SEVERE, user.getUserName() + " " + user.getId() + " wurde automatisch gebannt, da er den FabricModSender editiert hatte.");
|
||||
return;
|
||||
}
|
||||
|
||||
if(!modsAreAbsent(mods)) {
|
||||
SteamwarUser user = SteamwarUser.get(player.getUniqueId());
|
||||
user.punish(Punishment.PunishmentType.Ban, Timestamp.from(Instant.now()), "§7Du hast probiert den FabricModSender zu umgehen!", 0, true);
|
||||
BungeeCore.log(Level.SEVERE, user.getUserName() + " " + user.getId() + " wurde automatisch gebannt, da er den FabricModSender editiert hatte.");
|
||||
return;
|
||||
}
|
||||
|
||||
if(Utils.handleMods(player,mods)) checkedPlayers.add(player);
|
||||
}catch (Exception ex) {
|
||||
ex.printStackTrace();
|
||||
player.disconnect("§7Mod Verification failed! Contact a Developer");
|
||||
array = new JsonParser().parse(dataString).getAsJsonArray();
|
||||
}catch (JsonSyntaxException exception) {
|
||||
banPlayer(user, player);
|
||||
}
|
||||
}
|
||||
|
||||
@EventHandler
|
||||
public void onDisconnect(PlayerDisconnectEvent e){
|
||||
checkedPlayers.remove(e.getPlayer());
|
||||
for(JsonElement mod : array) {
|
||||
mods.add(Mod.get(mod.getAsString(), Mod.Platform.FABRIC));
|
||||
zOnlyKroks markierte diese Unterhaltung als gelöst
Veraltet
Lixfel
hat
Diese drei Codezeilen hast du doppelt drin, daher würde ich mir wünschen, dass du die in eine Funktion auslagerst. Diese drei Codezeilen hast du doppelt drin, daher würde ich mir wünschen, dass du die in eine Funktion auslagerst.
|
||||
}
|
||||
|
||||
boolean isSorted = isSortedAlphabetically(mods);
|
||||
|
||||
zOnlyKroks markierte diese Unterhaltung als gelöst
Veraltet
Lixfel
hat
Du solltest lieber den Spieler aus den Storage.fabricPlayers entfernen (und den Spieler darüber informieren, dass die Mods geprüft wurden und er deshalb auf Arenen darf). Das derzeitige System hat das Problem, sobald ein softreload gemacht wird, können geprüfte Spieler eben nicht mehr auf Arenen. Du solltest lieber den Spieler aus den Storage.fabricPlayers entfernen (und den Spieler darüber informieren, dass die Mods geprüft wurden und er deshalb auf Arenen darf). Das derzeitige System hat das Problem, sobald ein softreload gemacht wird, können geprüfte Spieler eben nicht mehr auf Arenen.
|
||||
if(!isSorted) {
|
||||
zOnlyKroks markierte diese Unterhaltung als gelöst
Veraltet
Lixfel
hat
Das Try-Catch gefällt mir gar nicht. Mir ist bewusst, dass beim JsonParser Fehler fliegen können, in dem Fall solltest du aber nur den JsonParser try-catchen und falls das auftritt auch wieder bannen. Das Try-Catch gefällt mir gar nicht. Mir ist bewusst, dass beim JsonParser Fehler fliegen können, in dem Fall solltest du aber nur den JsonParser try-catchen und falls das auftritt auch wieder bannen.
|
||||
banPlayer(user, player);
|
||||
return;
|
||||
}
|
||||
|
||||
if(!modsAreAbsent(mods)) {
|
||||
banPlayer(user, player);
|
||||
return;
|
||||
}
|
||||
|
||||
if(Utils.handleMods(player,mods)) {
|
||||
Storage.fabricPlayers.remove(player);
|
||||
Message.send("MODIFICATION_CHECK_SUCCESS", player);
|
||||
}
|
||||
}
|
||||
|
||||
private boolean isSortedAlphabetically(List<Mod> mods) {
|
||||
@ -124,4 +129,13 @@ public class Fabric extends BasicListener {
|
||||
.distinct()
|
||||
.count() == neededMods.size();
|
||||
}
|
||||
zOnlyKroks markierte diese Unterhaltung als gelöst
Lixfel
hat
Distinct darf hier nicht nötig sein! Distinct darf hier nicht nötig sein!
|
||||
|
||||
public void banPlayer(SteamwarUser user, ProxiedPlayer player) {
|
||||
user.punish(Punishment.PunishmentType.Ban,
|
||||
Timestamp.from(Instant.now()),
|
||||
Message.parse("MODIFICATION_BAN_MESSAGE", player),
|
||||
0,
|
||||
true);
|
||||
BungeeCore.log(Level.SEVERE, user.getUserName() + " " + user.getId() + Message.parse("MODIFICATION_BAN_LOG", player));
|
||||
}
|
||||
zOnlyKroks markierte diese Unterhaltung als gelöst
Veraltet
Lixfel
hat
Hier den String nicht mehr zusammenaddieren (Message.parse-Ergebnis enthält ja schon alles) Hier den String nicht mehr zusammenaddieren (Message.parse-Ergebnis enthält ja schon alles)
|
||||
}
|
||||
zOnlyKroks markierte diese Unterhaltung als gelöst
Lixfel
hat
Änderung siehe BungeeCore.properties, Message.parse(..., player, user.getUserName(), user.getId()) Änderung siehe BungeeCore.properties, Message.parse(..., player, user.getUserName(), user.getId())
|
||||
|
@ -73,7 +73,7 @@ public class ModLoaderBlocker extends BasicListener {
|
||||
}
|
||||
|
||||
public static boolean isFabric(ProxiedPlayer player) {
|
||||
return Storage.fabricPlayers.contains(player) && !Fabric.checkedPlayers.contains(player);
|
||||
return Storage.fabricPlayers.contains(player);
|
||||
}
|
||||
|
||||
public static void addServer(String server) {
|
||||
|
@ -583,3 +583,8 @@ RANK_UNPLACED=§eunplatziert
|
||||
RANK_PLACED=§e{0}§8. §7mit §e{1} §7Elo§8.
|
||||
RANK_EMBLEM=§eEmblem§8: {0}
|
||||
RANK_NEEDED_FIGHTS_LEFT={0} §8(§7noch §e{1}§7 Kämpfe nötig§8)
|
||||
|
||||
#Fabric Mod Sender
|
||||
MODIFICATION_BAN_MESSAGE = "Du hast probiert den FabricModSender zu umgehen / zu modifizieren!"
|
||||
zOnlyKroks markierte diese Unterhaltung als gelöst
Veraltet
Lixfel
hat
Immer noch: "" entfernen! Und in der Zeile drunter das leerzeichen Immer noch: "" entfernen! Und in der Zeile drunter das leerzeichen
|
||||
MODIFICATION_BAN_LOG = " hat probiert den Fabric Mod Sender zu editieren / umzugehen!"
|
||||
zOnlyKroks markierte diese Unterhaltung als gelöst
Veraltet
Lixfel
hat
Keine Leerzeichen um das =. Keine " um den String herum. Statt dem " hat" solltest du "{0} {1} hat" verwenden (dann übergibst du das noch als Parameter und überlässt die Formatierung dem MessageSystem. Keine Leerzeichen um das =. Keine " um den String herum. Statt dem " hat" solltest du "{0} {1} hat" verwenden (dann übergibst du das noch als Parameter und überlässt die Formatierung dem MessageSystem.
|
||||
MODIFICATION_CHECK_SUCCESS = "§eDeine Mods wurden geprüft und du darfst nun auf Arenen joinen!"
|
||||
|
Das bitte zu Anfang prüfen (und ggf. verwerfen), wenn das Packet vom Subserver kommt, ist das ja uninteressant für uns.