Ranked #306
@ -20,8 +20,6 @@
|
||||
package de.steamwar.bungeecore.sql;
|
||||
|
||||
import de.steamwar.bungeecore.ArenaMode;
|
||||
import lombok.AllArgsConstructor;
|
||||
import lombok.EqualsAndHashCode;
|
||||
|
||||
import java.util.HashMap;
|
||||
import java.util.Map;
|
||||
@ -33,17 +31,10 @@ public class UserElo {
|
||||
|
||||
public static final int ELO_DEFAULT = 1000;
|
||||
|
||||
private static final Map<Key, Optional<Integer>> userEloCache = new HashMap<>();
|
||||
private static final Map<String, Map<Integer, Optional<Integer>>> gameModeUserEloCache = new HashMap<>();
|
||||
YoyoNow markierte diese Unterhaltung als gelöst
Veraltet
|
||||
private static final Map<String, Integer> maxEloCache = new HashMap<>();
|
||||
private static final Map<Integer, String> emblemCache = new HashMap<>();
|
||||
|
||||
@AllArgsConstructor
|
||||
@EqualsAndHashCode
|
||||
private static class Key {
|
||||
private final int userId;
|
||||
private final String gameMode;
|
||||
}
|
||||
|
||||
private static final Statement elo = new Statement("SELECT UserElo FROM Elo WHERE UserID = ? AND GameMode = ? AND Season = ?");
|
||||
private static final Statement setElo = new Statement("UPDATE UserELo SET Elo = ? WHERE Season = ? AND UserID = ? AND GameMode = ?");
|
||||
private static final Statement place = new Statement("SELECT COUNT(*) AS Place FROM UserElo WHERE GameMode = ? AND Elo > ? AND Season = ?");
|
||||
@ -51,8 +42,9 @@ public class UserElo {
|
||||
private static final Statement fightsOfSeason = new Statement("SELECT COUNT(*) AS Fights FROM FightPlayer INNER JOIN Fight F on FightPlayer.FightID = F.FightID WHERE UserID = ? AND GameMode = ? AND UNIX_TIMESTAMP(StartTime) + Duration >= UNIX_TIMESTAMP(?)");
|
||||
|
||||
public static Optional<Integer> getElo(int userID, String gameMode) {
|
||||
Lixfel markierte diese Unterhaltung als gelöst
Veraltet
Lixfel
hat
Mach es doch wie in der SchemElo und gib die Default-Elo zurück, wenn es keine gibt... Falls du eine Funktion brauchst, wo es relevant ist, ob überhaupt eine exisitiert, dann habe das doch als 2 verschiedene Funktionen. Damit würde dann z.B. der FightEndsHandler nichts mehr von der Default-Elo wissen müssen Mach es doch wie in der SchemElo und gib die Default-Elo zurück, wenn es keine gibt... Falls du eine Funktion brauchst, wo es relevant ist, ob überhaupt eine exisitiert, dann habe das doch als 2 verschiedene Funktionen. Damit würde dann z.B. der FightEndsHandler nichts mehr von der Default-Elo wissen müssen
YoyoNow
hat
Ist das so in Ordnung wie ich das gemacht habe? Ist das so in Ordnung wie ich das gemacht habe?
|
||||
Key key = new Key(userID, gameMode);
|
||||
return userEloCache.computeIfAbsent(key, k -> {
|
||||
return gameModeUserEloCache.computeIfAbsent(gameMode, gm -> {
|
||||
return new HashMap<>();
|
||||
}).computeIfAbsent(userID, uid -> {
|
||||
return elo.select(rs -> {
|
||||
if (rs.next())
|
||||
return Optional.of(rs.getInt("Elo"));
|
||||
YoyoNow markierte diese Unterhaltung als gelöst
Veraltet
Lixfel
hat
Du clearst den Cache eh schon stündlich, das ist häufig genug auch für Seasonänderungen. Du clearst den Cache eh schon stündlich, das ist häufig genug auch für Seasonänderungen.
|
||||
@ -81,8 +73,7 @@ public class UserElo {
|
||||
|
||||
public static void setElo(int userId, String gameMode, int elo) {
|
||||
emblemCache.remove(userId);
|
||||
Key key = new Key(userId, gameMode);
|
||||
userEloCache.put(key, Optional.of(elo));
|
||||
gameModeUserEloCache.computeIfAbsent(gameMode, gm -> new HashMap<>()).put(userId, Optional.of(elo));
|
||||
maxEloCache.compute(gameMode, (gm, max) -> {
|
||||
if (max == null || max < elo) {
|
||||
emblemCache.clear();
|
||||
@ -140,7 +131,7 @@ public class UserElo {
|
||||
}
|
||||
|
||||
public static void clearCache() {
|
||||
userEloCache.clear();
|
||||
gameModeUserEloCache.clear();
|
||||
maxEloCache.clear();
|
||||
emblemCache.clear();
|
||||
YoyoNow markierte diese Unterhaltung als gelöst
Veraltet
Lixfel
hat
. .
|
||||
}
|
||||
|
In neuem Issue referenzieren
Einen Benutzer sperren
Da lieber eine Map<Map<>>, das bläst sich dann weniger auf.
Wie meinst du das genau?
HashMaps brauchen zur Kollisionsvermeidung immer Freiraum. Je kleiner die HashMaps bleiben, desto besser.
Würdest du dann GameMode UserId oder UserId GameMode als reihenfolge wählen?
Definitiv Map<GameMode, Map<User, >>