SteamWar/BungeeCore
Archiviert
13
2

ModCommand #445

Zusammengeführt
Lixfel hat 21 Commits von ModCommand nach master 2023-02-14 09:13:46 +01:00 zusammengeführt
10 geänderte Dateien mit 232 neuen und 42 gelöschten Zeilen

Datei anzeigen

@ -164,6 +164,8 @@ public class BungeeCore extends Plugin {
new CalendarCommand();
new CalendarListener();
zOnlyKroks markierte diese Unterhaltung als gelöst Veraltet
Veraltet
Review

Wird das CommandFramework nicht anders initialisiert?

Wird das CommandFramework nicht anders initialisiert?
Veraltet
Review

nein. und es funktioniert so

nein. und es funktioniert so
new ModCommand();
// Punishment Commands:
new PunishmentCommand("ban", Punishment.PunishmentType.Ban);
new PunishmentCommand("mute", Punishment.PunishmentType.Mute);

Datei anzeigen

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

Fehlender License-Header

Fehlender License-Header
This file is a part of the SteamWar software.
Copyright (C) 2023 SteamWar.de-Serverteam
zOnlyKroks markierte diese Unterhaltung als gelöst Veraltet
Veraltet
Review

Du kannst dein Template auch mal Updaten :D

Du kannst dein Template auch mal Updaten :D
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
zOnlyKroks markierte diese Unterhaltung als gelöst Veraltet
Veraltet
Review

Der Modname ist nicht eindeutig (Modloader spielt auch noch eine Rolle)

Der Modname ist nicht eindeutig (Modloader spielt auch noch eine Rolle)
along with this program. If not, see <https://www.gnu.org/licenses/>.
*/
zOnlyKroks markierte diese Unterhaltung als gelöst Veraltet
Veraltet
Review

Bitte wenn direkt korrekt mit allem drum und dran im SQL-Modul als Mod-Klasse machen. Allgemein gerade schwieriger Zeitpunkt, weil das auch irgendwann demnächst in den CommonCore kommt.

Bitte wenn direkt korrekt mit allem drum und dran im SQL-Modul als Mod-Klasse machen. Allgemein gerade schwieriger Zeitpunkt, weil das auch irgendwann demnächst in den CommonCore kommt.
Veraltet
Review

Wie meinst du das mi als Mod-Klasse? Würde ich interpretieren vom test her das ich die ganze klasse ins sql modul schiebe.

Wie meinst du das mi als Mod-Klasse? Würde ich interpretieren vom test her das ich die ganze klasse ins sql modul schiebe.
package de.steamwar.bungeecore.commands;
import de.steamwar.bungeecore.Message;
zOnlyKroks markierte diese Unterhaltung als gelöst Veraltet
Veraltet
Review

Bitte nur /classifymod, und die Berechtigung sollte eher an bungeecore.softreload gebunden werden. Wobei ich denke, dass das doch hier nicht korrekt ist mit dem CommandFramework, das arbeitet doch gar nicht mit diesen Berechtigungen?

Bitte nur /classifymod, und die Berechtigung sollte eher an bungeecore.softreload gebunden werden. Wobei ich denke, dass das doch hier nicht korrekt ist mit dem CommandFramework, das arbeitet doch gar nicht mit diesen Berechtigungen?
Veraltet
Review

werde ich bald testen

werde ich bald testen
import de.steamwar.bungeecore.inventory.SWInventory;
import de.steamwar.bungeecore.inventory.SWItem;
import de.steamwar.bungeecore.inventory.SWListInv;
import de.steamwar.bungeecore.inventory.SWStreamInv;
zOnlyKroks markierte diese Unterhaltung als gelöst Veraltet
Veraltet
Review

SQL-Statements gehören in das SQL-Package, da sollte es eine Mod-Klasse geben, da gehören die rein

SQL-Statements gehören in das SQL-Package, da sollte es eine Mod-Klasse geben, da gehören die rein
import de.steamwar.bungeecore.sql.*;
import de.steamwar.command.SWCommand;
import net.md_5.bungee.api.chat.ClickEvent;
zOnlyKroks markierte diese Unterhaltung als gelöst
Review

Das das dann der Filter für alle Nutzer zeitgleich angepasst/gesetzt wird, halte ich für ziemlich problematisch.

Das das dann der Filter für alle Nutzer zeitgleich angepasst/gesetzt wird, halte ich für ziemlich problematisch.
import net.md_5.bungee.api.connection.ProxiedPlayer;
zOnlyKroks markierte diese Unterhaltung als gelöst Veraltet
Veraltet
Review

Auch hier.

Auch hier.
zOnlyKroks markierte diese Unterhaltung als gelöst Veraltet
Veraltet
Review

Klammer hier unnötig.

Klammer hier unnötig.
import java.util.HashMap;
import java.util.Map;
import java.util.stream.Collectors;
zOnlyKroks markierte diese Unterhaltung als gelöst Veraltet
Veraltet
Review

Das Inventar im aktuellen Status ist etwas Fraglich, es zeigt einem alle Mods an (ca. 1700, 38 Seiten).

Es sollte nur die nicht-Klassifizierten anzeigen oder alle mit ein Paar Filter funktionen eg. Name, Klassifizierung

Das Inventar im aktuellen Status ist etwas Fraglich, es zeigt einem alle Mods an (ca. 1700, 38 Seiten). Es sollte nur die nicht-Klassifizierten anzeigen oder alle mit ein Paar Filter funktionen eg. Name, Klassifizierung
public class ModCommand extends SWCommand {
zOnlyKroks markierte diese Unterhaltung als gelöst Veraltet
Veraltet
Review

DebugCode

DebugCode
public ModCommand() {
zOnlyKroks markierte diese Unterhaltung als gelöst Veraltet
Veraltet
Review

Könnten wir diese Lambda-Funktion (mit nur dem Spieler und Mod als Argument) bitte der Lesbarkeit wegen in eine separate Methode auslagern?

Könnten wir diese Lambda-Funktion (mit nur dem Spieler und Mod als Argument) bitte der Lesbarkeit wegen in eine separate Methode auslagern?
super("mod", "bungeecore.softreload", "mods");
}
public static final Map<ProxiedPlayer,Mod.ModType> playerFilterType = new HashMap<>();
zOnlyKroks markierte diese Unterhaltung als gelöst Veraltet
Veraltet
Review

Nach dem Klassifizieren würde ich direkt wieder die Hauptgui öffnen (es ist unwahrscheinlich, dass man den gleichen Mod hintereinander mehrfach klassifizieren möchte)

Nach dem Klassifizieren würde ich direkt wieder die Hauptgui öffnen (es ist unwahrscheinlich, dass man den gleichen Mod hintereinander mehrfach klassifizieren möchte)
@Register
public void genericCommand(ProxiedPlayer p) {
playerFilterType.putIfAbsent(p,Mod.ModType.UNKLASSIFIED);
openGui(p);
}
zOnlyKroks markierte diese Unterhaltung als gelöst Veraltet
Veraltet
Review

Nach dem Komma (überall) sollte auch eine Leerzeichen hin, aber wenn dann nicht noch mischen.

Nach dem Komma (überall) sollte auch eine Leerzeichen hin, aber wenn dann nicht noch mischen.
zOnlyKroks markierte diese Unterhaltung als gelöst Veraltet
Veraltet
Review

Die Description braucht es nicht.

Die Description braucht es nicht.
private void openGui(ProxiedPlayer p) {
zOnlyKroks markierte diese Unterhaltung als gelöst Veraltet
Veraltet
Review

Funktionieren die Dinger auch pre-Flattinging (pre 1.13), vllt. Farbstoffe?

Funktionieren die Dinger auch pre-Flattinging (pre 1.13), vllt. Farbstoffe?
SWStreamInv<Mod> swStreamInv = new SWStreamInv<>(p,Message.parse("MOD_COMMAND_GUI_TITLE",p), (click, element) -> {
zOnlyKroks markierte diese Unterhaltung als gelöst Veraltet
Veraltet
Review

Namen an besten auch in die .properties Datei und keine Unterstriche als Leerzeichen

Namen an besten auch in die .properties Datei und keine Unterstriche als Leerzeichen
openClassificationGui(p,element);
},page -> {
Mod.ModType filtertype = playerFilterType.get(p);
zOnlyKroks markierte diese Unterhaltung als gelöst Veraltet
Veraltet
Review

Ich glaube, dafür gibt es schon eine Restriktionsmöglichkeit im CommandSystem, bitte die direkt dafür nutzen.

Ich glaube, dafür gibt es schon eine Restriktionsmöglichkeit im CommandSystem, bitte die direkt dafür nutzen.
Veraltet
Review

In dem Fall wird hier anders als in Zeile 50 die GUI nicht vorher geschlossen. Musst du testen/untersuchen, ob das gemacht werden sollte und beide Fälle nach Untersuchungsergebnis vereinheitlichen.

In dem Fall wird hier anders als in Zeile 50 die GUI nicht vorher geschlossen. Musst du testen/untersuchen, ob das gemacht werden sollte und beide Fälle nach Untersuchungsergebnis vereinheitlichen.
Veraltet
Review

Ich tue das in den anderen fällen weil es sich komisch verhalten hat. Hier tut es ohne probleme

Ich tue das in den anderen fällen weil es sich komisch verhalten hat. Hier tut es ohne probleme
return Mod.getAllModsFiltered(page,45, filtertype).stream().map(mod -> new SWListInv.SWListEntry<>(getModItem(mod),mod)).collect(Collectors.toList());
});
swStreamInv.addItem(52,new SWItem("NAME_TAG","Filter"), click -> {
swStreamInv.close();
openFilterGui(p);
});
swStreamInv.open();
}
public void updateAndCloseGui(Mod.ModType modType, Mod mod, SWInventory toClose, ProxiedPlayer p) {
mod.setModType(modType);
toClose.close();
openGui(p);
}
zOnlyKroks markierte diese Unterhaltung als gelöst Veraltet
Veraltet
Review

Bitte noch die Information hinzufügen, welcher Modloader.

Bitte noch die Information hinzufügen, welcher Modloader.
private void openFilterGui(ProxiedPlayer p) {
SWInventory inv = new SWInventory(p, 9, "Filter");
inv.addItem(1, new SWItem(Message.parse("MOD_UNCLASSIFIED",p),8), click -> playerFilterType.replace(p, Mod.ModType.UNKLASSIFIED));
inv.addItem(2, new SWItem(Message.parse("MOD_ALLOWED",p),2), click -> playerFilterType.replace(p, Mod.ModType.GREEN));
inv.addItem(3, new SWItem(Message.parse("MOD_FORBIDDEN",p), 11), click -> playerFilterType.replace(p, Mod.ModType.YELLOW));
inv.addItem(4, new SWItem(Message.parse("MOD_AUTOBAN",p),1), click -> playerFilterType.replace(p, Mod.ModType.RED));
inv.addItem(5, new SWItem(Message.parse("MOD_YT",p),13), click -> playerFilterType.replace(p, Mod.ModType.YOUTUBER_ONLY));
inv.addItem(8, new SWItem("ARROW", Message.parse("MOD_ITEM_BACK",p)), click -> {
inv.close();
openGui(p);
});
inv.open();
}
private void openClassificationGui(ProxiedPlayer p,Mod element) {
SWInventory swInventory = new SWInventory(p,9,Message.parse("MOD_COMMAND_CLASSICIATION_GUI",p));
swInventory.addItem(2, new SWItem(Message.parse("MOD_UNCLASSIFIED",p),8), (click1 -> updateAndCloseGui(Mod.ModType.UNKLASSIFIED,element,swInventory,p)));
swInventory.addItem(3, new SWItem(Message.parse("MOD_ALLOWED",p), 2), (click1 -> updateAndCloseGui(Mod.ModType.GREEN,element,swInventory,p)));
swInventory.addItem(4, new SWItem(Message.parse("MOD_FORBIDDEN",p), 11), (click1 -> updateAndCloseGui(Mod.ModType.YELLOW,element,swInventory,p)));
swInventory.addItem(5, new SWItem(Message.parse("MOD_AUTOBAN",p),1), (click1 -> updateAndCloseGui(Mod.ModType.RED,element,swInventory,p)));
swInventory.addItem(6, new SWItem(Message.parse("MOD_YT",p), 13), (click1 -> updateAndCloseGui(Mod.ModType.YOUTUBER_ONLY,element,swInventory,p)));
swInventory.addItem(8,new SWItem("ARROW",Message.parse("MOD_ITEM_BACK",p)), click1 -> {
swInventory.close();
openGui(p);
});
swInventory.open();
}
private SWItem getModItem(Mod modEntry) {
SWItem item = new SWItem("NAME_TAG", modEntry.getModName());
item.addLore(modEntry.getPlatform().name());
return item;
}
@Register(value = {"set"},description = "MOD_COMMAND_SET_USAGE")
public void set(ProxiedPlayer p,String modName,Mod.Platform platform,Mod.ModType newModType) {
Mod mod = Mod.get(modName, platform);
if(mod == null) {
Message.send("MOD_COMMAND_NOT_FOUND_IN_DATABASE",p,modName, platform.name());
return;
}
mod.setModType(newModType);
zOnlyKroks markierte diese Unterhaltung als gelöst Veraltet
Veraltet
Review

Hier sollten noch Klickbare Nachrichten zum einstufen hinzukommen

Hier sollten noch Klickbare Nachrichten zum einstufen hinzukommen
Message.send("MOD_CHANGED_TYPE",p,modName,platform.name(),newModType.name());
}
zOnlyKroks markierte diese Unterhaltung als gelöst Veraltet
Veraltet
Review

Kann auch durch Mod klasse ersetzt werden

Kann auch durch Mod klasse ersetzt werden
@Register(value = {"get"},description = "MOD_COMMAND_GET_USAGE")
public void get(ProxiedPlayer p,String modName,Mod.Platform platform) {
Mod mod = Mod.get(modName, platform);
if(mod == null) {
Message.send("MOD_COMMAND_NOT_FOUND_IN_DATABASE", p, modName, platform.name());
return;
}
Message.send("MOD_COMMAND_INFO", p, modName, platform.name(), mod.getModType().name());
}
@Register(value = {"next"})
public void next(ProxiedPlayer p) {
Mod mod = Mod.findFirstMod();
zOnlyKroks markierte diese Unterhaltung als gelöst Veraltet
Veraltet
Review

Wenn du das Mod-Object hast, weißt du schon, welcher Typ das ganze ist...

Wenn du das Mod-Object hast, weißt du schon, welcher Typ das ganze ist...
if(mod == null) {
Message.send("MOD_NO_MORE_UNCLASSIFIED_MODS",p);
return;
}
Message.send("MOD_FOUND_NEXT_MOD",p,"MOD_OPEN_GUI",new ClickEvent(ClickEvent.Action.RUN_COMMAND,""),mod.getModName(),mod.getPlatform().name());
}
}

Datei anzeigen

@ -27,6 +27,7 @@ import de.steamwar.bungeecore.bot.config.SteamwarDiscordBotConfig;
import de.steamwar.bungeecore.bot.util.DiscordRanks;
import de.steamwar.bungeecore.commands.ChallengeCommand;
import de.steamwar.bungeecore.commands.CheckCommand;
import de.steamwar.bungeecore.commands.ModCommand;
import de.steamwar.bungeecore.commands.MsgCommand;
import de.steamwar.bungeecore.listeners.mods.Utils;
import de.steamwar.bungeecore.sql.SteamwarUser;
@ -137,6 +138,7 @@ public class ConnectionListener extends BasicListener {
ChallengeCommand.remove(e.getPlayer());
MsgCommand.remove(e.getPlayer());
zOnlyKroks markierte diese Unterhaltung als gelöst Veraltet
Veraltet
Review

Das gibt einen MergeConflict mit deinem anderen Branch (nur schonmal vorneweg die Warnung)

Das gibt einen MergeConflict mit deinem anderen Branch (nur schonmal vorneweg die Warnung)
Utils.playerModMap.remove(e.getPlayer().getUniqueId());
ModCommand.playerFilterType.remove(e.getPlayer());
}
@EventHandler

Datei anzeigen

@ -119,7 +119,7 @@ public class Fabric extends BasicListener {
}
for(JsonElement mod : array) {
mods.add(Mod.get(mod.getAsString(), Mod.Platform.FABRIC));
mods.add(Mod.getOrCreate(mod.getAsString(), Mod.Platform.FABRIC));
}
if(!neededModsContained(mods)) {

Datei anzeigen

@ -26,9 +26,7 @@ import io.netty.channel.ChannelPipeline;
import net.md_5.bungee.api.chat.TextComponent;
import net.md_5.bungee.api.connection.PendingConnection;
import net.md_5.bungee.api.event.LoginEvent;
import net.md_5.bungee.api.event.ProxyPingEvent;
import net.md_5.bungee.connection.InitialHandler;
import net.md_5.bungee.event.EventHandler;
import net.md_5.bungee.netty.ChannelWrapper;
import net.md_5.bungee.netty.HandlerBoss;
import net.md_5.bungee.netty.PacketHandler;
@ -135,7 +133,7 @@ public class Forge extends BasicListener {
Utils.VarInt nameLength = Utils.readVarInt(data, pos);
pos += nameLength.length;
mods.add(Mod.get(new String(data, pos, nameLength.value), Mod.Platform.FORGE));
mods.add(Mod.getOrCreate(new String(data, pos, nameLength.value), Mod.Platform.FORGE));
pos += nameLength.value;
}

Datei anzeigen

@ -92,7 +92,7 @@ public class Forge12 extends BasicListener {
//Version information is unused
bytePos += 1 + data[bytePos];
mods.add(Mod.get(new String(name), Mod.Platform.FORGE));
mods.add(Mod.getOrCreate(new String(name), Mod.Platform.FORGE));
}
if (Utils.handleMods(p, mods)) {

Datei anzeigen

@ -67,7 +67,7 @@ public class LabyMod extends BasicListener {
try{
InfoPacket info = new InfoPacket(value.value);
for(InfoPacket.Addon addon : info.addons) {
mods.add(Mod.get(addon.name, Mod.Platform.LABYMOD));
mods.add(Mod.getOrCreate(addon.name, Mod.Platform.LABYMOD));
}
}catch(IOException e){
BungeeCore.log("Could not read JSON", e);

Datei anzeigen

@ -28,6 +28,6 @@ public class WorldDownloader extends BasicListener {
return;
event.setCancelled(true);
Utils.handleMods((ProxiedPlayer) sender, Lists.newArrayList(Mod.get("wdl", Mod.Platform.FORGE)));
Utils.handleMods((ProxiedPlayer) sender, Lists.newArrayList(Mod.getOrCreate("wdl", Mod.Platform.FORGE)));
}
}

Datei anzeigen

@ -21,11 +21,21 @@ package de.steamwar.bungeecore.sql;
import de.steamwar.sql.internal.Statement;
zOnlyKroks markierte diese Unterhaltung als gelöst Veraltet
Veraltet
Review

Unused imports bitte verwerfen.

Unused imports bitte verwerfen.
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
zOnlyKroks markierte diese Unterhaltung als gelöst Veraltet
Veraltet
Review

Nein, das bleibt definitiv private.

Nein, das bleibt definitiv private.
import java.util.List;
public class Mod {
private static final Statement get = new Statement("SELECT * FROM Mods WHERE ModName = ? AND Platform = ?");
private static final Statement insert = new Statement("INSERT INTO Mods (ModName, Platform) VALUES (?, ?)");
private static final Statement set = new Statement("UPDATE Mods Set ModType = ? WHERE ModName = ? AND Platform = ?");
zOnlyKroks markierte diese Unterhaltung als gelöst Veraltet
Veraltet
Review

Auch hier alle private. Das SQL-Zeugs bleibt in .sql. Du reichst dann wenn eine List<Mod> nach draußen, alles außerhalb hat nichts mit SQL am Hut.

Auch hier alle private. Das SQL-Zeugs bleibt in .sql. Du reichst dann wenn eine List\<Mod> nach draußen, alles außerhalb hat nichts mit SQL am Hut.
private static final Statement findFirst = new Statement("SELECT * FROM Mods WHERE ModType = 0 LIMIT 1");
private static final Statement getPageOfType = new Statement("SELECT * FROM Mods WHERE ModType = ? ORDER BY ModName DESC LIMIT ?, ?");
private final String modName;
private final Platform platform;
private final ModType modType;
@ -36,17 +46,48 @@ public class Mod {
this.modType = modType;
}
public static Mod get(String modName, Platform platform){
Mod mod = get.select(rs -> {
private Mod(ResultSet resultSet) throws SQLException {
this(resultSet.getString("ModName"), Mod.Platform.values()[resultSet.getInt("Platform")], ModType.values()[resultSet.getInt("ModType")]);
}
public static Mod get(String name, Platform platform) {
return get.select(rs -> {
if(rs.next())
return new Mod(modName, platform, ModType.valueOf(rs.getInt("ModType")));
return new Mod(rs);
return null;
}, modName, platform.value);
}, name, platform.ordinal());
}
public static Mod getOrCreate(String name, Platform platform) {
Mod mod = get(name, platform);
if(mod != null)
return mod;
Lixfel markierte diese Unterhaltung als gelöst Veraltet
Veraltet
Review

Die Methode dürfte nach den anderen Änderungen nicht mehr nötig sein.

Die Methode dürfte nach den anderen Änderungen nicht mehr nötig sein.
insert.update(modName, platform.value);
return new Mod(modName, platform, ModType.UNKLASSIFIED);
insert.update(name, platform.ordinal());
zOnlyKroks markierte diese Unterhaltung als gelöst Veraltet
Veraltet
Review

Hier wird ggf immer noch der Mod erstellt! Bitte benenne die andere Methode getOrCreate um, rufe diese hier nicht auf und nimm hier keinen int als Argument! Nutze dann stattdessen in getOrCreate diese get-Methode (keine Code duplication).

Hier wird ggf immer noch der Mod erstellt! Bitte benenne die andere Methode getOrCreate um, rufe diese hier nicht auf und nimm hier keinen int als Argument! Nutze dann stattdessen in getOrCreate diese get-Methode (keine Code duplication).
return new Mod(name, platform, ModType.UNKLASSIFIED);
}
zOnlyKroks markierte diese Unterhaltung als gelöst Veraltet
Veraltet
Review

Mach daraus doch bitte eine normale Member-Methode. (also getModType(){return modType;})

Mach daraus doch bitte eine normale Member-Methode. (also getModType(){return modType;})
public void setModType(Mod.ModType newModType) {
set.update(newModType.ordinal(), modName, platform.ordinal());
}
zOnlyKroks markierte diese Unterhaltung als gelöst Veraltet
Veraltet
Review

Bitte umbenennen in setModType und in Member-Funktion umwandeln (wie getModType)!

Bitte umbenennen in setModType und in Member-Funktion umwandeln (wie getModType)!
Veraltet
Review

Bitte modName und platform aus den Argumenten entfernen und von dieser Mod-Instanz verwenden.

Bitte modName und platform aus den Argumenten entfernen und von dieser Mod-Instanz verwenden.
public static List<Mod> getAllModsFiltered(int page,int elementsPerPage, Mod.ModType filter) {
return Mod.getPageOfType.select(rs -> {
List<Mod> f = new ArrayList<>();
Lixfel markierte diese Unterhaltung als gelöst Veraltet
Veraltet
Review

Schöner wäre (weil ansonsten doppelter Datenbankzugriff) wenn du die derzeitige get()-Methode umbennenen würdest in z.B. getOrCreate() und den eigentlichen get() Anteil der Methode in eine neue get()-Methode auslagerst, welche einfach null zurückliefert, wenn der Mod nicht existiert. (Weniger Codeduplication, weniger DB-Calls)

Schöner wäre (weil ansonsten doppelter Datenbankzugriff) wenn du die derzeitige get()-Methode umbennenen würdest in z.B. getOrCreate() und den eigentlichen get() Anteil der Methode in eine neue get()-Methode auslagerst, welche einfach null zurückliefert, wenn der Mod nicht existiert. (Weniger Codeduplication, weniger DB-Calls)
while(rs.next())
f.add(new Mod(rs));
return f;
},filter.ordinal(), page * elementsPerPage, elementsPerPage);
}
zOnlyKroks markierte diese Unterhaltung als gelöst Veraltet
Veraltet
Review

Die Methode braucht es nicht, schließlich sind Mod-Objects schon entsprechend geparst.

Die Methode braucht es nicht, schließlich sind Mod-Objects schon entsprechend geparst.
public static Mod findFirstMod() {
zOnlyKroks markierte diese Unterhaltung als gelöst Veraltet
Veraltet
Review

Es wäre evtl. geschickt, einen neuen Konstruktor, welcher ein ResultSet nimmt und SQLExceptions wirft zu machen.

Es wäre evtl. geschickt, einen neuen Konstruktor, welcher ein ResultSet nimmt und SQLExceptions wirft zu machen.
return findFirst.select(rs -> {
zOnlyKroks markierte diese Unterhaltung als gelöst Veraltet
Veraltet
Review

du kannst das new inlinen (also f.add(new Mod...))

du kannst das new inlinen (also f.add(new Mod...))
if(rs.next())
return new Mod(rs);
return null;
});
}
zOnlyKroks markierte diese Unterhaltung als gelöst Veraltet
Veraltet
Review

Statt filtered würde ich eher getAllModsOfType verwenden... (auch SQL-Statement so umbenennen)

Statt filtered würde ich eher getAllModsOfType verwenden... (auch SQL-Statement so umbenennen)
Veraltet
Review

damit würde ich aber permanent einen filter applien. wenn ich dies aber nicht möchte, brauch ich das statement ohne filter

damit würde ich aber permanent einen filter applien. wenn ich dies aber nicht möchte, brauch ich das statement ohne filter
Veraltet
Review

Was ja auch der Methodenname "ofType" impliziert. Damit ändert sich ja nichts am Methodeninhalt, nur statt filtered - ofType im Namen.

Was ja auch der Methodenname "ofType" impliziert. Damit ändert sich ja nichts am Methodeninhalt, nur statt filtered - ofType im Namen.
public String getModName() {
@ -62,40 +103,22 @@ public class Mod {
}
zOnlyKroks markierte diese Unterhaltung als gelöst Veraltet
Veraltet
Review

Gib hier doch einfach einen Mod zurück. Spart die obskuren apache-Imports und macht dir doch auch sonst das Leben einfacher, oder?

Gib hier doch einfach einen Mod zurück. Spart die obskuren apache-Imports und macht dir doch auch sonst das Leben einfacher, oder?
public enum Platform{
zOnlyKroks markierte diese Unterhaltung als gelöst Veraltet
Veraltet
Review

In Zeile 71 gibts so etwas ähnliches, wird auch oben genutzt anstatt getValue

In Zeile 71 gibts so etwas ähnliches, wird auch oben genutzt anstatt `getValue`
FORGE(0),
LABYMOD(1),
FABRIC(2);
Platform(int value){
this.value = value;
}
int value;
public int get() {
return value;
}
FORGE,
LABYMOD,
FABRIC
}
public enum ModType {
UNKLASSIFIED(0,"7"),
GREEN(1,"a"),
YELLOW(2,"e"),
RED(3,"c"),
YOUTUBER_ONLY(4,"6");
UNKLASSIFIED("7"),
zOnlyKroks markierte diese Unterhaltung als gelöst Veraltet
Veraltet
Review

Dann nicht mehr benötigt.

Dann nicht mehr benötigt.
GREEN("a"),
YELLOW("e"),
RED("c"),
YOUTUBER_ONLY("6");
static ModType valueOf(int value){
for(ModType mt : values()){
if(value == mt.value)
return mt;
}
throw new EnumConstantNotPresentException(ModType.class, Integer.toString(value));
}
ModType(int value,String colorcode){
this.value = value;
ModType(String colorcode) {
this.colorcode = colorcode;
}
int value;
String colorcode;
private final String colorcode;
public String getColorCode() {
return colorcode;

Datei anzeigen

@ -659,4 +659,22 @@ ADVENT_CALENDAR_TITLE=§eAdvent Calendar
ADVENT_CALENDAR_DAY=§7Day§8: §e{0}
ADVENT_CALENDAR_MESSAGE=§eDid you already open your advent calendar?
ADVENT_CALENDAR_MESSAGE_HOVER=§eClick to open!
ADVENT_CALENDAR_OPEN=§7You got §e{0} §7from the advent calendar!
ADVENT_CALENDAR_OPEN=§7You got §e{0} §7from the advent calendar!
#Mod Command
MOD_COMMAND_SET_USAGE=§7/mod set [mod name] [platform] [ModType 1-4]
MOD_COMMAND_GET_USAGE=§7/mod get [mod name] [platform]
MOD_CHANGED_TYPE=§7Successfully reclassified mod {0} on platform {1} to type {2}!
MOD_NO_MORE_UNCLASSIFIED_MODS=§7No more unclassified mods found in databank!
zOnlyKroks markierte diese Unterhaltung als gelöst Veraltet
Veraltet
Review

GUI-Titel sind die einzigen Fälle, wo kein Color-Coding stattfinden sollte.

GUI-Titel sind die einzigen Fälle, wo kein Color-Coding stattfinden sollte.
MOD_FOUND_NEXT_MOD=§7Next unclassified mod is {0} on platform {1}!
MOD_COMMAND_NOT_FOUND_IN_DATABASE=§7The Mod {0} on platform {1} was§c not §7found in the database!
MOD_COMMAND_INFO=§7The mod {0} on platform {1} is of the type {2}.
MOD_COMMAND_GUI_TITLE=Unclassified Mods
MOD_COMMAND_CLASSICIATION_GUI=Mod Type Changer
MOD_OPEN_GUI=§7Open Gui
MOD_UNCLASSIFIED=§7Unclassified
MOD_ALLOWED=§aAllowed
MOD_FORBIDDEN=§eForbidden
zOnlyKroks markierte diese Unterhaltung als gelöst Veraltet
Veraltet
Review

Color-Coding bei diesem Eintrag und den Vorhergehenden fehlend.

Und bitte auch eine deutsche Übersetzung!

Color-Coding bei diesem Eintrag und den Vorhergehenden fehlend. Und bitte auch eine deutsche Übersetzung!
Veraltet
Review

jap, die sind noch wip

jap, die sind noch wip
MOD_AUTOBAN=§cAutoban
MOD_YT=§5YT Only
MOD_ITEM_BACK=§7Back