SteamWar/BungeeCore
Archiviert
13
2

Fabric Mod Sender Integration. Mod itself is not final #307

Zusammengeführt
Lixfel hat 12 Commits von fabric_mod_sender nach master 2022-03-26 10:01:51 +01:00 zusammengeführt
4 geänderte Dateien mit 151 neuen und 1 gelöschten Zeilen

Datei anzeigen

@ -67,6 +67,7 @@ public class BungeeCore extends Plugin {
@Override
public void onEnable(){
getProxy().registerChannel("sw:bridge");
getProxy().registerChannel("fabricmodsender:mods");
setInstance(this);
loadConfig();
@ -83,6 +84,7 @@ public class BungeeCore extends Plugin {
new ModLoaderBlocker();
new WorldDownloader();
new BrandListener();
new Fabric();
new Node.LocalNode();
//new Node.RemoteNode("lx");

Datei anzeigen

@ -0,0 +1,142 @@
/*
zOnlyKroks markierte diese Unterhaltung als gelöst Veraltet
Veraltet
Review

License-Header.

License-Header.
This file is a part of the SteamWar software.
Copyright (C) 2020 SteamWar.de-Serverteam
This program is free software: you can redistribute it and/or modify
it under the terms of the GNU Affero General Public License as published by
the Free Software Foundation, either version 3 of the License, or
(at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU Affero General Public License for more details.
You should have received a copy of the GNU Affero General Public License
along with this program. If not, see <https://www.gnu.org/licenses/>.
*/
package de.steamwar.bungeecore.listeners.mods;
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;
import de.steamwar.bungeecore.sql.Punishment;
import de.steamwar.bungeecore.sql.SteamwarUser;
zOnlyKroks markierte diese Unterhaltung als gelöst Veraltet
Veraltet
Review

Das Stringhandling schaut mir ziemlich Spanisch aus, ist das hier ein sehr primitiver JSON-Parser?

Das Stringhandling schaut mir ziemlich Spanisch aus, ist das hier ein sehr primitiver JSON-Parser?
import net.md_5.bungee.api.connection.ProxiedPlayer;
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;
import java.time.Instant;
zOnlyKroks markierte diese Unterhaltung als gelöst Veraltet
Veraltet
Review

Das bitte zu Anfang prüfen (und ggf. verwerfen), wenn das Packet vom Subserver kommt, ist das ja uninteressant für uns.

Das bitte zu Anfang prüfen (und ggf. verwerfen), wenn das Packet vom Subserver kommt, ist das ja uninteressant für uns.
import java.util.*;
import java.util.logging.Level;
public class Fabric extends BasicListener {
zOnlyKroks markierte diese Unterhaltung als gelöst
Review

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)
zOnlyKroks markierte diese Unterhaltung als gelöst Veraltet
Veraltet
Review

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 Set<String> neededMods = new HashSet<>();
zOnlyKroks markierte diese Unterhaltung als gelöst Veraltet
Veraltet
Review

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");
neededMods.add("minecraft");
neededMods.add("fabricloader");
neededMods.add("steamwarmodsender");
}
@EventHandler
public void onPluginMessageEvent(PluginMessageEvent e){
if(!e.getTag().equals("fabricmodsender:mods"))
return;
if (!(e.getSender() instanceof ProxiedPlayer)) {
return;
}
ProxiedPlayer player = (ProxiedPlayer) e.getSender();
SteamwarUser user = SteamwarUser.get(player.getUniqueId());
List<Mod> mods = new LinkedList<>();
byte[] data = e.getData();
Utils.VarInt varInt = Utils.readVarInt(data,0);
if(data.length != varInt.length + varInt.value) {
banPlayer(user,player);
Lixfel markierte diese Unterhaltung als gelöst Veraltet
Veraltet
Review

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.
Veraltet
Review

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.
return;
}
zOnlyKroks markierte diese Unterhaltung als gelöst Veraltet
Veraltet
Review

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.
data = Arrays.copyOfRange(data,varInt.length, data.length);
String dataString;
try{
zOnlyKroks markierte diese Unterhaltung als gelöst Veraltet
Veraltet
Review

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);
return;
}
JsonArray array;
zOnlyKroks markierte diese Unterhaltung als gelöst Veraltet
Veraltet
Review

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 {
array = new JsonParser().parse(dataString).getAsJsonArray();
}catch (JsonSyntaxException exception) {
banPlayer(user, player);
return;
}
zOnlyKroks markierte diese Unterhaltung als gelöst Veraltet
Veraltet
Review

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.
for(JsonElement mod : array) {
mods.add(Mod.get(mod.getAsString(), Mod.Platform.FABRIC));
}
zOnlyKroks markierte diese Unterhaltung als gelöst Veraltet
Veraltet
Review

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.
boolean isSorted = isSortedAlphabetically(mods);
zOnlyKroks markierte diese Unterhaltung als gelöst Veraltet
Veraltet
Review

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.
if(!isSorted) {
banPlayer(user, player);
return;
}
if(!neededModsContained(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) {
boolean isSorted = true;
for(int i = 0; i < mods.size() - 1; i++) {
if(mods.get(i).getModName().compareToIgnoreCase(mods.get(i + 1).getModName()) > 0) {
isSorted = false;
break;
}
}
return isSorted;
}
private boolean neededModsContained(List<Mod> mods) {
zOnlyKroks markierte diese Unterhaltung als gelöst Veraltet
Veraltet
Review

Der Methodenname ist irreführend, denn der zurückgegebene Boolean ist ja, dass kein Mod fehlt.

Der Methodenname ist irreführend, denn der zurückgegebene Boolean ist ja, dass kein Mod fehlt.
return mods.stream()
.map(Mod::getModName)
.filter(neededMods::contains)
.count() == neededMods.size();
zOnlyKroks markierte diese Unterhaltung als gelöst
Review

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, user.getUserName(), user.getId()),
0,
true);
BungeeCore.log(Level.SEVERE,Message.parse("MODIFICATION_BAN_LOG", player, user.getUserName()));
zOnlyKroks markierte diese Unterhaltung als gelöst Veraltet
Veraltet
Review

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
Review

Änderung siehe BungeeCore.properties, Message.parse(..., player, user.getUserName(), user.getId())

Änderung siehe BungeeCore.properties, Message.parse(..., player, user.getUserName(), user.getId())
}

Datei anzeigen

@ -61,7 +61,8 @@ public class Mod {
public enum Platform{
FORGE(0),
LABYMOD(1);
LABYMOD(1),
FABRIC(2);
Platform(int value){
this.value = value;

Datei anzeigen

@ -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
Veraltet
Review

Immer noch: "" entfernen! Und in der Zeile drunter das leerzeichen

Immer noch: "" entfernen! Und in der Zeile drunter das leerzeichen
MODIFICATION_BAN_LOG={0} hat probiert den Fabric Mod Sender zu editieren / umzugehen!
zOnlyKroks markierte diese Unterhaltung als gelöst Veraltet
Veraltet
Review

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!