CMD #141
@ -23,15 +23,11 @@ import de.steamwar.sql.SchematicNode;
|
||||
import de.steamwar.sql.SteamwarUser;
|
||||
import org.bukkit.Bukkit;
|
||||
import org.bukkit.GameMode;
|
||||
import org.bukkit.command.Command;
|
||||
import org.bukkit.command.CommandMap;
|
||||
import org.bukkit.command.CommandSender;
|
||||
import org.bukkit.command.SimpleCommandMap;
|
||||
import org.bukkit.entity.Player;
|
||||
|
||||
import java.lang.annotation.Annotation;
|
||||
import java.lang.reflect.Array;
|
||||
import java.lang.reflect.Field;
|
||||
import java.lang.reflect.Method;
|
||||
import java.util.*;
|
||||
import java.util.function.BiFunction;
|
||||
@ -76,7 +72,7 @@ public class SWCommandUtils {
|
||||
if (s.length() < 1) {
|
||||
return Bukkit.getOnlinePlayers().stream().map(Player::getName).collect(Collectors.toList());
|
||||
}
|
||||
List<SteamwarUser> steamwarUsers = SteamwarUser.startsWithName(s);
|
||||
List<SteamwarUser> steamwarUsers = SteamwarUser.getByPrefix(s);
|
||||
return steamwarUsers.stream().map(SteamwarUser::getUserName).limit(40).collect(Collectors.toList());
|
||||
}));
|
||||
MAPPER_FUNCTIONS.put(SchematicNode.class.getTypeName(), new TypeMapper<SchematicNode>() {
|
||||
|
@ -26,6 +26,7 @@ import org.bukkit.entity.Player;
|
||||
import java.sql.ResultSet;
|
||||
import java.sql.SQLException;
|
||||
import java.util.*;
|
||||
import java.util.stream.Collectors;
|
||||
YoyoNow markierte diese Unterhaltung als gelöst
Veraltet
|
||||
|
||||
public class SteamwarUser {
|
||||
|
||||
@ -37,12 +38,14 @@ public class SteamwarUser {
|
||||
private static final Map<UUID, SteamwarUser> byUUID = new HashMap<>();
|
||||
private static final Map<String, SteamwarUser> byName = new HashMap<>();
|
||||
private static final Map<Integer, SteamwarUser> byId = new HashMap<>();
|
||||
private static final Map<String, List<SteamwarUser>> byPrefix = new HashMap<>();
|
||||
YoyoNow markierte diese Unterhaltung als gelöst
Veraltet
Lixfel
hat
Wie häufig wird byPrefix ausgeführt? Je nachdem (wenn das nur selten (auf ausdrückliche Useraktion/Befehl) hin passiert, sollten wir das nicht cachen. Zudem: Wird das auch schon mit 1 Buchstaben ausgeführt? Das wäre extrem ungeil, weil wir dann mehr oder weniger auf einmal 1/26 von derzeit 8000+ Usern laden (in etwa, oder wenn . oder % eingegeben werden, alle). Und das halten wir dann im RAM. Wie häufig wird byPrefix ausgeführt? Je nachdem (wenn das nur selten (auf ausdrückliche Useraktion/Befehl) hin passiert, sollten wir das nicht cachen.
Zudem: Wird das auch schon mit 1 Buchstaben ausgeführt? Das wäre extrem ungeil, weil wir dann mehr oder weniger auf einmal 1/26 von derzeit 8000+ Usern laden (in etwa, oder wenn . oder % eingegeben werden, alle). Und das halten wir dann im RAM.
YoyoNow
hat
Stimme ich zu und siehe unten. Stimme ich zu und siehe unten.
|
||||
|
||||
static{
|
||||
Bukkit.getScheduler().runTaskTimer(Core.getInstance(), () -> {
|
||||
byId.clear();
|
||||
byName.clear();
|
||||
byUUID.clear();
|
||||
byPrefix.clear();
|
||||
}, 72000, 72000);
|
||||
}
|
||||
|
||||
@ -94,14 +97,26 @@ public class SteamwarUser {
|
||||
return bedrock;
|
||||
}
|
||||
|
||||
public static List<SteamwarUser> startsWithName(String userName){
|
||||
return startWithName.select(rs -> {
|
||||
List<SteamwarUser> steamwarUsers = new ArrayList<>();
|
||||
while (rs.next()) {
|
||||
steamwarUsers.add(new SteamwarUser(rs));
|
||||
}
|
||||
return steamwarUsers;
|
||||
}, userName.toLowerCase() + "%");
|
||||
public static List<SteamwarUser> getByPrefix(String userName){
|
||||
YoyoNow markierte diese Unterhaltung als gelöst
Veraltet
Lixfel
hat
Bitte hier unbedingt ausgibige Filterung (., %, zu kurze userNames) einbauen, damit unsere DB nicht so extensiv gequeriet wird. Falls du diese Funktion für Tab-Completion einbaust: Generell bei Tab-Completion nur die User anbieten, die derzeit auf dem selben Server sind. Der Rest wird deutlich seltener gebraucht und würde nur die Datenbank (und Userverbindung) zuspammen. Wir würden auch dadurch einem User verraten, welche User alles schon mal bei uns waren (und welche nicht). Bitte hier unbedingt ausgibige Filterung (., %, zu kurze userNames) einbauen, damit unsere DB nicht so extensiv gequeriet wird.
Falls du diese Funktion für Tab-Completion einbaust: Generell bei Tab-Completion nur die User anbieten, die derzeit auf dem selben Server sind. Der Rest wird deutlich seltener gebraucht und würde nur die Datenbank (und Userverbindung) zuspammen. Wir würden auch dadurch einem User verraten, welche User alles schon mal bei uns waren (und welche nicht).
YoyoNow
hat
Wie unten schon gesagt, würde ich ganz gerne alle User die gerade auf dem Bungee sind tabCompleten und nicht nur die die auf dem Server selber sind, dafür gibt es Player. Wie unten schon gesagt, würde ich ganz gerne alle User die gerade auf dem Bungee sind tabCompleten und nicht nur die die auf dem Server selber sind, dafür gibt es Player.
|
||||
if (userName.length() < 2) {
|
||||
return new ArrayList<>();
|
||||
}
|
||||
List<SteamwarUser> users = byPrefix.get(userName.toLowerCase().substring(0, 1));
|
||||
YoyoNow markierte diese Unterhaltung als gelöst
Veraltet
Lixfel
hat
Warum nur nach dem ersten Buchstaben suchen? Warum nur nach dem ersten Buchstaben suchen?
|
||||
if (users == null) {
|
||||
users = startWithName.select(rs -> {
|
||||
List<SteamwarUser> steamwarUsers = new ArrayList<>();
|
||||
while (rs.next()) {
|
||||
String name = rs.getString("UserName");
|
||||
if (byName.containsKey(name)) {
|
||||
steamwarUsers.add(byName.get(name));
|
||||
} else {
|
||||
steamwarUsers.add(new SteamwarUser(rs));
|
||||
}
|
||||
}
|
||||
return steamwarUsers;
|
||||
YoyoNow markierte diese Unterhaltung als gelöst
Veraltet
Lixfel
hat
Wenn das nur der erste Buchstabe ist, ist das dann bei längeren anderen Suchqueries nicht falsch, da zunächst nur mit längerem Suchquery geladen wird? Wenn das nur der erste Buchstabe ist, ist das dann bei längeren anderen Suchqueries nicht falsch, da zunächst nur mit längerem Suchquery geladen wird?
YoyoNow
hat
Ich mache danach noch ein sort darauf selber, deswegen immer nur den ersten. Ich würde gerne nur die die gerade Online sind nehmen, aber wie komme ich an ALLE die auf dem Bungee sind vom Server aus? Ich mache danach noch ein sort darauf selber, deswegen immer nur den ersten. Ich würde gerne nur die die gerade Online sind nehmen, aber wie komme ich an ALLE die auf dem Bungee sind vom Server aus?
Lixfel
hat
Gar nicht, deshalb Limitation auf die, die mit auf dem selben Spigotserver sind (du dürftest auf dem Spigot ja auch nur Befehle haben, welche sich nur auf Leute auf dem selben Spigot beziehen - daher würde das meiner Meinung nach ausreichen) Gar nicht, deshalb Limitation auf die, die mit auf dem selben Spigotserver sind (du dürftest auf dem Spigot ja auch nur Befehle haben, welche sich nur auf Leute auf dem selben Spigot beziehen - daher würde das meiner Meinung nach ausreichen)
|
||||
}, userName.toLowerCase() + "%");
|
||||
}
|
||||
return users.stream().filter(user -> user.getUserName().toLowerCase().startsWith(userName.toLowerCase())).collect(Collectors.toList());
|
||||
}
|
||||
|
||||
public static SteamwarUser get(String userName){
|
||||
|
Du und deine Import-Sauberkeit ;).