Attempted to fix UUIDs ending up in World aliases #549

This commit is contained in:
Rsl1122 2018-04-02 11:07:39 +03:00
parent b1ae7c53c7
commit 84eeda66b2
6 changed files with 113 additions and 117 deletions

View File

@ -27,23 +27,27 @@ public class GamemodeChangeListener implements Listener {
* @param event Fired Event.
*/
@EventHandler(priority = EventPriority.MONITOR)
public void onGamemodeChange(PlayerGameModeChangeEvent event) {
public void onGameModeChange(PlayerGameModeChangeEvent event) {
if (event.isCancelled()) {
return;
}
try {
Player p = event.getPlayer();
UUID uuid = p.getUniqueId();
long time = MiscUtils.getTime();
String gameMode = event.getNewGameMode().name();
String worldName = p.getWorld().getName();
new WorldAliasSettings().addWorld(worldName);
Optional<Session> cachedSession = SessionCache.getCachedSession(uuid);
cachedSession.ifPresent(session -> session.changeState(worldName, gameMode, time));
actOnEvent(event);
} catch (Exception e) {
Log.toLog(this.getClass(), e);
}
}
private void actOnEvent(PlayerGameModeChangeEvent event) {
Player player = event.getPlayer();
UUID uuid = player.getUniqueId();
long time = MiscUtils.getTime();
String gameMode = event.getNewGameMode().name();
String worldName = player.getWorld().getName();
WorldAliasSettings.addWorld(worldName);
Optional<Session> cachedSession = SessionCache.getCachedSession(uuid);
cachedSession.ifPresent(session -> session.changeState(worldName, gameMode, time));
}
}

View File

@ -19,19 +19,24 @@ public class WorldChangeListener implements Listener {
@EventHandler(priority = EventPriority.MONITOR)
public void onWorldChange(PlayerChangedWorldEvent event) {
try {
Player p = event.getPlayer();
String worldName = p.getWorld().getName();
UUID uuid = p.getUniqueId();
String gameMode = p.getGameMode().name();
long time = MiscUtils.getTime();
new WorldAliasSettings().addWorld(worldName);
Optional<Session> cachedSession = SessionCache.getCachedSession(uuid);
cachedSession.ifPresent(session -> session.changeState(worldName, gameMode, time));
actOnEvent(event);
} catch (Exception e) {
Log.toLog(this.getClass(), e);
}
}
private void actOnEvent(PlayerChangedWorldEvent event) {
long time = MiscUtils.getTime();
Player player = event.getPlayer();
UUID uuid = player.getUniqueId();
String worldName = player.getWorld().getName();
String gameMode = player.getGameMode().name();
WorldAliasSettings.addWorld(worldName);
Optional<Session> cachedSession = SessionCache.getCachedSession(uuid);
cachedSession.ifPresent(session -> session.changeState(worldName, gameMode, time));
}
}

View File

@ -22,12 +22,16 @@ import java.util.Map;
*/
public class WorldAliasSettings {
private WorldAliasSettings() {
/* Hide Constructor */
}
/**
* Used to get all World aliases in the config
*
* @return Map: Original name, Alias
*/
public Map<String, String> getAliases() {
public static Map<String, String> getAliases() {
ConfigNode aliasSect = getAliasSection();
Map<String, String> aliasMap = new HashMap<>();
@ -37,7 +41,7 @@ public class WorldAliasSettings {
return aliasMap;
}
private ConfigNode getAliasSection() {
private static ConfigNode getAliasSection() {
Config config = ConfigSystem.getConfig();
return config.getConfigNode(Settings.WORLD_ALIASES.getPath());
}
@ -49,7 +53,7 @@ public class WorldAliasSettings {
*
* @param world World name
*/
public void addWorld(String world) {
public static void addWorld(String world) {
ConfigNode aliasSect = getAliasSection();
String previousValue = aliasSect.getConfigNode(world).getValue();
@ -59,19 +63,9 @@ public class WorldAliasSettings {
try {
aliasSect.save();
} catch (IOException e) {
Log.toLog(this.getClass(), e);
Log.toLog(WorldAliasSettings.class, e);
}
});
}
}
/**
* Used to get alias of a single world.
*
* @param world World name.
* @return Alias.
*/
public String getAlias(String world) {
return getAliasSection().getString(world);
}
}

View File

@ -4,6 +4,9 @@ import com.djrapitops.plan.data.PlayerProfile;
import com.djrapitops.plan.data.calculation.ActivityIndex;
import com.djrapitops.plan.data.container.Session;
import com.djrapitops.plan.data.container.StickyData;
import com.djrapitops.plan.data.time.GMTimes;
import com.djrapitops.plan.data.time.WorldTimes;
import com.djrapitops.plan.system.settings.WorldAliasSettings;
import com.djrapitops.plugin.api.TimeAmount;
import java.util.*;
@ -226,4 +229,59 @@ public class AnalysisUtils {
}
return activityData;
}
public static Map<String, Long> getPlaytimePerAlias(WorldTimes worldTimes) {
// WorldTimes Map<String, GMTimes>
Map<String, Long> playtimePerWorld = worldTimes.getWorldTimes()
.entrySet().stream()
.collect(Collectors.toMap(
Map.Entry::getKey,
entry -> entry.getValue().getTotal() // GMTimes.getTotal
));
Map<String, String> aliases = WorldAliasSettings.getAliases();
Map<String, Long> playtimePerAlias = new HashMap<>();
for (Map.Entry<String, Long> entry : playtimePerWorld.entrySet()) {
String worldName = entry.getKey();
long playtime = entry.getValue();
if (!aliases.containsKey(worldName)) {
aliases.put(worldName, worldName);
WorldAliasSettings.addWorld(worldName);
}
String alias = aliases.get(worldName);
playtimePerAlias.put(alias, playtimePerAlias.getOrDefault(alias, 0L) + playtime);
}
return playtimePerAlias;
}
public static Map<String, GMTimes> getGMTimesPerAlias(WorldTimes worldTimes) {
Map<String, String> aliases = WorldAliasSettings.getAliases();
Map<String, GMTimes> gmTimesPerAlias = new HashMap<>();
String[] gms = GMTimes.getGMKeyArray();
for (Map.Entry<String, GMTimes> entry : worldTimes.getWorldTimes().entrySet()) {
String worldName = entry.getKey();
GMTimes gmTimes = entry.getValue();
if (!aliases.containsKey(worldName)) {
aliases.put(worldName, worldName);
WorldAliasSettings.addWorld(worldName);
}
String alias = aliases.get(worldName);
GMTimes aliasGMTimes = gmTimesPerAlias.getOrDefault(alias, new GMTimes());
for (String gm : gms) {
aliasGMTimes.addTime(gm, gmTimes.getTime(gm));
}
gmTimesPerAlias.put(alias, aliasGMTimes);
}
return gmTimesPerAlias;
}
}

View File

@ -3,13 +3,15 @@ package com.djrapitops.plan.utilities.html.graphs.pie;
import com.djrapitops.plan.data.time.GMTimes;
import com.djrapitops.plan.data.time.WorldTimes;
import com.djrapitops.plan.system.settings.Settings;
import com.djrapitops.plan.system.settings.WorldAliasSettings;
import com.djrapitops.plan.system.settings.theme.Theme;
import com.djrapitops.plan.system.settings.theme.ThemeVal;
import com.djrapitops.plan.utilities.analysis.AnalysisUtils;
import com.djrapitops.plan.utilities.comparators.PieSliceComparator;
import java.util.*;
import java.util.stream.Collectors;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import java.util.Map;
public class WorldPie extends AbstractPieChartWithDrilldown {
@ -27,13 +29,9 @@ public class WorldPie extends AbstractPieChartWithDrilldown {
private static List<PieSlice> turnIntoSlices(WorldTimes worldTimes) {
String[] colors = Theme.getValue(ThemeVal.GRAPH_WORLD_PIE).split(", ");
int colLenght = colors.length;
int colLength = colors.length;
// WorldTimes Map<String, GMTimes> (GMTimes.getTotal)
Map<String, Long> playtimePerWorld = worldTimes.getWorldTimes().entrySet().stream()
.collect(Collectors.toMap(Map.Entry::getKey, entry -> entry.getValue().getTotal()));
Map<String, Long> playtimePerAlias = transformToAliases(playtimePerWorld);
Map<String, Long> playtimePerAlias = AnalysisUtils.getPlaytimePerAlias(worldTimes);
List<String> worlds = new ArrayList<>(playtimePerAlias.keySet());
Collections.sort(worlds);
@ -43,7 +41,7 @@ public class WorldPie extends AbstractPieChartWithDrilldown {
for (String alias : worlds) {
Long value = playtimePerAlias.getOrDefault(alias, 0L);
if (value != 0L) {
slices.add(new PieSlice(alias, value, colors[i % colLenght], true));
slices.add(new PieSlice(alias, value, colors[i % colLength], true));
}
i++;
}
@ -51,46 +49,17 @@ public class WorldPie extends AbstractPieChartWithDrilldown {
return slices;
}
private static Map<String, Long> transformToAliases(Map<String, Long> playtimePerWorld) {
WorldAliasSettings aliasSettings = new WorldAliasSettings();
Map<String, String> aliases = aliasSettings.getAliases();
return transformToAliases(playtimePerWorld, aliases);
}
// TODO Move to another class
public static Map<String, Long> transformToAliases(Map<String, Long> playtimePerWorld, Map<String, String> aliases) {
// TODO Optimization is possible (WorldAliasSettings)
WorldAliasSettings aliasSettings = new WorldAliasSettings();
Map<String, Long> playtimePerAlias = new HashMap<>();
for (Map.Entry<String, Long> entry : playtimePerWorld.entrySet()) {
String worldName = entry.getKey();
long playtime = entry.getValue();
if (!aliases.containsKey(worldName)) {
aliases.put(worldName, worldName);
aliasSettings.addWorld(worldName);
}
String alias = aliases.get(worldName);
playtimePerAlias.put(alias, playtimePerAlias.getOrDefault(alias, 0L) + playtime);
}
return playtimePerAlias;
}
@Override
public String toHighChartsDrilldown() {
StringBuilder drilldownBuilder = new StringBuilder();
int i = 0;
Map<String, GMTimes> gmTimesMap = worldTimes.getWorldTimes();
if (gmTimesMap.isEmpty()) {
Map<String, GMTimes> gmTimesAliasMap = AnalysisUtils.getGMTimesPerAlias(worldTimes);
if (gmTimesAliasMap.isEmpty()) {
return "[]";
}
Map<String, GMTimes> gmTimesAliasMap = transformToGMAliases(gmTimesMap);
int size = gmTimesAliasMap.size();
int size = gmTimesMap.size();
drilldownBuilder.append("[");
for (Map.Entry<String, GMTimes> worldAlias : gmTimesAliasMap.entrySet()) {
drilldownBuilder.append("{name:'").append(worldAlias.getKey())
@ -109,35 +78,6 @@ public class WorldPie extends AbstractPieChartWithDrilldown {
return drilldownBuilder.toString();
}
private Map<String, GMTimes> transformToGMAliases(Map<String, GMTimes> gmTimesMap) {
// TODO Optimization is possible (WorldAliasSettings)
WorldAliasSettings aliasSettings = new WorldAliasSettings();
Map<String, String> aliases = aliasSettings.getAliases();
Map<String, GMTimes> gmTimesPerAlias = new HashMap<>();
String[] gms = GMTimes.getGMKeyArray();
for (Map.Entry<String, GMTimes> entry : gmTimesMap.entrySet()) {
String worldName = entry.getKey();
GMTimes gmTimes = entry.getValue();
if (!aliases.containsKey(worldName)) {
aliases.put(worldName, worldName);
aliasSettings.addWorld(worldName);
}
String alias = aliases.get(worldName);
GMTimes aliasGMTimes = gmTimesPerAlias.getOrDefault(alias, new GMTimes());
for (String gm : gms) {
aliasGMTimes.addTime(gm, gmTimes.getTime(gm));
}
gmTimesPerAlias.put(alias, aliasGMTimes);
}
return gmTimesPerAlias;
}
private void appendGMTimesForWorld(StringBuilder drilldownBuilder, Map.Entry<String, GMTimes> world) {
Map<String, Long> gmTimes = world.getValue().getTimes();
int smallSize = gmTimes.size();

View File

@ -12,12 +12,11 @@ import com.djrapitops.plan.system.cache.SessionCache;
import com.djrapitops.plan.system.settings.Settings;
import com.djrapitops.plan.system.settings.WorldAliasSettings;
import com.djrapitops.plan.utilities.FormatUtils;
import com.djrapitops.plan.utilities.analysis.AnalysisUtils;
import com.djrapitops.plan.utilities.comparators.SessionStartComparator;
import com.djrapitops.plan.utilities.html.Html;
import com.djrapitops.plan.utilities.html.graphs.pie.WorldPie;
import java.util.*;
import java.util.stream.Collectors;
/**
* Utility for creating HTML {@code <table>}-element with Sessions inside it.
@ -55,7 +54,6 @@ public class SessionsTableCreator {
Set<String> recentLoginsNames = new HashSet<>();
Map<Long, UUID> uuidBySessionStart = new HashMap<>();
for (Map.Entry<UUID, Session> entry : SessionCache.getActiveSessions().entrySet()) {
uuidBySessionStart.put(entry.getValue().getSessionStart(), entry.getKey());
@ -108,18 +106,15 @@ public class SessionsTableCreator {
}
public static String getLongestWorldPlayed(Session session) {
WorldAliasSettings aliasSettings = new WorldAliasSettings();
Map<String, String> aliases = aliasSettings.getAliases();
Map<String, String> aliases = WorldAliasSettings.getAliases();
if (session.getSessionEnd() == -1) {
return "Current: " + aliases.get(session.getWorldTimes().getCurrentWorld());
}
Map<String, Long> playtimePerWorld = session.getWorldTimes().getWorldTimes().entrySet().stream()
.collect(Collectors.toMap(Map.Entry::getKey, entry -> entry.getValue().getTotal()));
Map<String, Long> playtimePerAlias = WorldPie.transformToAliases(playtimePerWorld, aliases);
WorldTimes worldTimes = session.getWorldTimes();
Map<String, Long> playtimePerAlias = AnalysisUtils.getPlaytimePerAlias(worldTimes);
long total = worldTimes.getTotal();
long longest = 0;
String theWorld = "-";
for (Map.Entry<String, Long> entry : playtimePerAlias.entrySet()) {