mirror of
https://github.com/plan-player-analytics/Plan.git
synced 2025-02-03 22:11:52 +01:00
Display new player name as light green in kills tables
Affects issues: - Close #1262
This commit is contained in:
parent
fac196ed0d
commit
a4a1001a8d
@ -93,7 +93,7 @@ public class DeathEventListener implements Listener {
|
|||||||
}
|
}
|
||||||
|
|
||||||
private PlayerKill.Victim getVictim(Player victim) {
|
private PlayerKill.Victim getVictim(Player victim) {
|
||||||
return new PlayerKill.Victim(victim.getUniqueId(), victim.getName());
|
return new PlayerKill.Victim(victim.getUniqueId(), victim.getName(), victim.getFirstPlayed());
|
||||||
}
|
}
|
||||||
|
|
||||||
public Optional<Player> findKiller(Entity dead) {
|
public Optional<Player> findKiller(Entity dead) {
|
||||||
|
@ -60,6 +60,9 @@ public class PlayerKillMutator {
|
|||||||
killMap.put("serverUUID", server.getUuid().toString());
|
killMap.put("serverUUID", server.getUuid().toString());
|
||||||
killMap.put("serverName", server.getName());
|
killMap.put("serverName", server.getName());
|
||||||
killMap.put("weapon", kill.getWeapon());
|
killMap.put("weapon", kill.getWeapon());
|
||||||
|
long timeSinceRegister = kill.getDate() - kill.getVictim().getRegisterDate();
|
||||||
|
killMap.put("timeSinceRegisterMillis", timeSinceRegister);
|
||||||
|
killMap.put("timeSinceRegisterFormatted", formatters.secondLong().apply(timeSinceRegister));
|
||||||
return killMap;
|
return killMap;
|
||||||
}
|
}
|
||||||
);
|
);
|
||||||
|
@ -115,8 +115,33 @@ public class PlayerKill implements DateHolder {
|
|||||||
}
|
}
|
||||||
|
|
||||||
public static class Victim extends PlayerIdentifier {
|
public static class Victim extends PlayerIdentifier {
|
||||||
public Victim(UUID uuid, String name) {
|
private final long registerDate;
|
||||||
|
|
||||||
|
public Victim(UUID uuid, String name, long registerDate) {
|
||||||
super(uuid, name);
|
super(uuid, name);
|
||||||
|
this.registerDate = registerDate;
|
||||||
|
}
|
||||||
|
|
||||||
|
public Victim(UUID uuid, String name) {
|
||||||
|
this(uuid, name, 0L);
|
||||||
|
}
|
||||||
|
|
||||||
|
public long getRegisterDate() {
|
||||||
|
return registerDate;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean equals(Object o) {
|
||||||
|
if (this == o) return true;
|
||||||
|
if (o == null || getClass() != o.getClass()) return false;
|
||||||
|
if (!super.equals(o)) return false;
|
||||||
|
Victim victim = (Victim) o;
|
||||||
|
return getRegisterDate() == victim.getRegisterDate();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public int hashCode() {
|
||||||
|
return Objects.hash(super.hashCode(), getRegisterDate());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -166,6 +166,7 @@ public enum HtmlLang implements Lang {
|
|||||||
LABEL_3RD_WEAPON("html.label.thirdDeadliestWeapon", "3rd PvP Weapon"),
|
LABEL_3RD_WEAPON("html.label.thirdDeadliestWeapon", "3rd PvP Weapon"),
|
||||||
LABEL_AVG_KDR("html.label.averageKdr", "Average KDR"),
|
LABEL_AVG_KDR("html.label.averageKdr", "Average KDR"),
|
||||||
LABEL_PLAYER_KILLS("html.label.playerKills", "Player Kills"),
|
LABEL_PLAYER_KILLS("html.label.playerKills", "Player Kills"),
|
||||||
|
LABEL_PLAYER_KILLS_VICTIM_INDICATOR("html.label.playerKillsVictimIndicator", "Player was killed within 24h of first time they were seen (Time since registered: <>)."),
|
||||||
LABEL_AVG_MOB_KDR("html.label.averageMobKdr", "Average Mob KDR"),
|
LABEL_AVG_MOB_KDR("html.label.averageMobKdr", "Average Mob KDR"),
|
||||||
LABEL_MOB_KILLS("html.label.mobKills", "Mob Kills"),
|
LABEL_MOB_KILLS("html.label.mobKills", "Mob Kills"),
|
||||||
LABEL_MOB_DEATHS("html.label.mobDeaths", "Mob Caused Deaths"),
|
LABEL_MOB_DEATHS("html.label.mobDeaths", "Mob Caused Deaths"),
|
||||||
|
@ -55,6 +55,7 @@ public class KillQueries {
|
|||||||
KillsTable.VICTIM_UUID + ", " +
|
KillsTable.VICTIM_UUID + ", " +
|
||||||
KillsTable.SERVER_UUID + ", " +
|
KillsTable.SERVER_UUID + ", " +
|
||||||
"v." + UsersTable.USER_NAME + " as victim_name, " +
|
"v." + UsersTable.USER_NAME + " as victim_name, " +
|
||||||
|
"v." + UsersTable.REGISTERED + " as victim_" + UsersTable.REGISTERED + ", " +
|
||||||
"k." + UsersTable.USER_NAME + " as killer_name," +
|
"k." + UsersTable.USER_NAME + " as killer_name," +
|
||||||
KillsTable.DATE + ", " +
|
KillsTable.DATE + ", " +
|
||||||
KillsTable.WEAPON + ", " +
|
KillsTable.WEAPON + ", " +
|
||||||
@ -91,6 +92,7 @@ public class KillQueries {
|
|||||||
KillsTable.VICTIM_UUID + ", " +
|
KillsTable.VICTIM_UUID + ", " +
|
||||||
KillsTable.SERVER_UUID + ", " +
|
KillsTable.SERVER_UUID + ", " +
|
||||||
"v." + UsersTable.USER_NAME + " as victim_name, " +
|
"v." + UsersTable.USER_NAME + " as victim_name, " +
|
||||||
|
"v." + UsersTable.REGISTERED + " as victim_" + UsersTable.REGISTERED + ", " +
|
||||||
"k." + UsersTable.USER_NAME + " as killer_name," +
|
"k." + UsersTable.USER_NAME + " as killer_name," +
|
||||||
KillsTable.DATE + ", " +
|
KillsTable.DATE + ", " +
|
||||||
KillsTable.WEAPON + ", " +
|
KillsTable.WEAPON + ", " +
|
||||||
@ -126,6 +128,7 @@ public class KillQueries {
|
|||||||
KillsTable.VICTIM_UUID + ", " +
|
KillsTable.VICTIM_UUID + ", " +
|
||||||
KillsTable.SERVER_UUID + ", " +
|
KillsTable.SERVER_UUID + ", " +
|
||||||
"v." + UsersTable.USER_NAME + " as victim_name, " +
|
"v." + UsersTable.USER_NAME + " as victim_name, " +
|
||||||
|
"v." + UsersTable.REGISTERED + " as victim_" + UsersTable.REGISTERED + ", " +
|
||||||
"k." + UsersTable.USER_NAME + " as killer_name," +
|
"k." + UsersTable.USER_NAME + " as killer_name," +
|
||||||
KillsTable.DATE + ", " +
|
KillsTable.DATE + ", " +
|
||||||
KillsTable.WEAPON + ", " +
|
KillsTable.WEAPON + ", " +
|
||||||
@ -165,7 +168,7 @@ public class KillQueries {
|
|||||||
String weapon = set.getString(KillsTable.WEAPON);
|
String weapon = set.getString(KillsTable.WEAPON);
|
||||||
return Optional.of(new PlayerKill(
|
return Optional.of(new PlayerKill(
|
||||||
new PlayerKill.Killer(killer, killerName),
|
new PlayerKill.Killer(killer, killerName),
|
||||||
new PlayerKill.Victim(victim, victimName),
|
new PlayerKill.Victim(victim, victimName, set.getLong("victim_" + UsersTable.REGISTERED)),
|
||||||
new ServerIdentifier(ServerUUID.fromString(set.getString(KillsTable.SERVER_UUID)),
|
new ServerIdentifier(ServerUUID.fromString(set.getString(KillsTable.SERVER_UUID)),
|
||||||
Server.getIdentifiableName(set.getString("server_name"), set.getInt("server_id"))
|
Server.getIdentifiableName(set.getString("server_name"), set.getInt("server_id"))
|
||||||
), weapon, date
|
), weapon, date
|
||||||
|
@ -75,6 +75,7 @@ public class SessionQueries {
|
|||||||
KillsTable.KILLER_UUID + ',' +
|
KillsTable.KILLER_UUID + ',' +
|
||||||
KillsTable.VICTIM_UUID + ',' +
|
KillsTable.VICTIM_UUID + ',' +
|
||||||
"v." + UsersTable.USER_NAME + " as victim_name, " +
|
"v." + UsersTable.USER_NAME + " as victim_name, " +
|
||||||
|
"v." + UsersTable.REGISTERED + " as victim_" + UsersTable.REGISTERED + ", " +
|
||||||
"k." + UsersTable.USER_NAME + " as killer_name, " +
|
"k." + UsersTable.USER_NAME + " as killer_name, " +
|
||||||
KillsTable.DATE + ',' +
|
KillsTable.DATE + ',' +
|
||||||
KillsTable.WEAPON +
|
KillsTable.WEAPON +
|
||||||
@ -199,7 +200,8 @@ public class SessionQueries {
|
|||||||
);
|
);
|
||||||
PlayerKill.Victim victim = new PlayerKill.Victim(
|
PlayerKill.Victim victim = new PlayerKill.Victim(
|
||||||
UUID.fromString(set.getString(KillsTable.VICTIM_UUID)),
|
UUID.fromString(set.getString(KillsTable.VICTIM_UUID)),
|
||||||
victimName
|
victimName,
|
||||||
|
set.getLong("victim_" + UsersTable.REGISTERED)
|
||||||
);
|
);
|
||||||
ServerIdentifier serverIdentifier = new ServerIdentifier(serverUUID, serverName);
|
ServerIdentifier serverIdentifier = new ServerIdentifier(serverUUID, serverName);
|
||||||
String weapon = set.getString(KillsTable.WEAPON);
|
String weapon = set.getString(KillsTable.WEAPON);
|
||||||
|
@ -303,7 +303,7 @@ class PlayerJoinEventConsumerTest {
|
|||||||
|
|
||||||
File playerExportDir = config.getPageExportPath().resolve("player/" + TestConstants.PLAYER_ONE_UUID).toFile();
|
File playerExportDir = config.getPageExportPath().resolve("player/" + TestConstants.PLAYER_ONE_UUID).toFile();
|
||||||
Awaitility.await()
|
Awaitility.await()
|
||||||
.atMost(2, TimeUnit.SECONDS)
|
.atMost(5, TimeUnit.SECONDS)
|
||||||
.until(playerExportDir::exists);
|
.until(playerExportDir::exists);
|
||||||
|
|
||||||
assertTrue(playerExportDir.exists());
|
assertTrue(playerExportDir.exists());
|
||||||
|
@ -42,11 +42,11 @@ import com.djrapitops.plan.storage.database.transactions.commands.RemoveEverythi
|
|||||||
import com.djrapitops.plan.storage.database.transactions.events.PlayerRegisterTransaction;
|
import com.djrapitops.plan.storage.database.transactions.events.PlayerRegisterTransaction;
|
||||||
import com.djrapitops.plan.storage.database.transactions.events.StoreSessionTransaction;
|
import com.djrapitops.plan.storage.database.transactions.events.StoreSessionTransaction;
|
||||||
import com.djrapitops.plan.storage.database.transactions.events.StoreWorldNameTransaction;
|
import com.djrapitops.plan.storage.database.transactions.events.StoreWorldNameTransaction;
|
||||||
|
import com.fasterxml.jackson.databind.ObjectMapper;
|
||||||
|
import com.fasterxml.jackson.databind.node.ObjectNode;
|
||||||
import org.junit.jupiter.api.BeforeEach;
|
import org.junit.jupiter.api.BeforeEach;
|
||||||
import org.junit.jupiter.api.Disabled;
|
import org.junit.jupiter.api.Disabled;
|
||||||
import org.junit.jupiter.api.Test;
|
import org.junit.jupiter.api.Test;
|
||||||
import com.fasterxml.jackson.databind.ObjectMapper;
|
|
||||||
import com.fasterxml.jackson.databind.node.ObjectNode;
|
|
||||||
import utilities.OptionalAssert;
|
import utilities.OptionalAssert;
|
||||||
import utilities.RandomData;
|
import utilities.RandomData;
|
||||||
import utilities.TestConstants;
|
import utilities.TestConstants;
|
||||||
@ -191,8 +191,6 @@ public interface ExtensionsDatabaseTest extends DatabaseTestPreparer {
|
|||||||
assertEquals(1, tabs.size()); // No tab defined, should contain 1 tab
|
assertEquals(1, tabs.size()); // No tab defined, should contain 1 tab
|
||||||
ExtensionTabData tabData = tabs.get(0);
|
ExtensionTabData tabData = tabs.get(0);
|
||||||
|
|
||||||
System.out.println(tabData.getValueOrder());
|
|
||||||
|
|
||||||
OptionalAssert.equals("0.0", tabData.getPercentage("boolVal_aggregate").map(data -> data.getFormattedValue(Objects::toString)));
|
OptionalAssert.equals("0.0", tabData.getPercentage("boolVal_aggregate").map(data -> data.getFormattedValue(Objects::toString)));
|
||||||
OptionalAssert.equals("0.5", tabData.getPercentage("percentageVal_avg").map(data -> data.getFormattedValue(Objects::toString)));
|
OptionalAssert.equals("0.5", tabData.getPercentage("percentageVal_avg").map(data -> data.getFormattedValue(Objects::toString)));
|
||||||
OptionalAssert.equals("0.5", tabData.getDouble("doubleVal_avg").map(data -> data.getFormattedValue(Objects::toString)));
|
OptionalAssert.equals("0.5", tabData.getDouble("doubleVal_avg").map(data -> data.getFormattedValue(Objects::toString)));
|
||||||
|
@ -29,6 +29,7 @@ import java.io.IOException;
|
|||||||
import java.nio.file.Files;
|
import java.nio.file.Files;
|
||||||
import java.nio.file.Path;
|
import java.nio.file.Path;
|
||||||
import java.time.Duration;
|
import java.time.Duration;
|
||||||
|
import java.time.temporal.ChronoUnit;
|
||||||
import java.util.Arrays;
|
import java.util.Arrays;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
import java.util.stream.Collectors;
|
import java.util.stream.Collectors;
|
||||||
@ -127,7 +128,7 @@ class ErrorLoggerTest {
|
|||||||
error.addSuppressed(new IllegalArgumentException());
|
error.addSuppressed(new IllegalArgumentException());
|
||||||
error.addSuppressed(new NullPointerException());
|
error.addSuppressed(new NullPointerException());
|
||||||
|
|
||||||
assertTimeoutPreemptively(Duration.ofMillis(500), () ->
|
assertTimeoutPreemptively(Duration.of(5, ChronoUnit.SECONDS), () ->
|
||||||
UNDER_TEST.warn(error, ErrorContext.builder()
|
UNDER_TEST.warn(error, ErrorContext.builder()
|
||||||
.whatToDo("Succeed the test")
|
.whatToDo("Succeed the test")
|
||||||
.related("Test object")
|
.related("Test object")
|
||||||
|
@ -43,6 +43,7 @@ import com.djrapitops.plan.utilities.logging.ErrorLogger;
|
|||||||
|
|
||||||
import javax.inject.Inject;
|
import javax.inject.Inject;
|
||||||
import java.util.Optional;
|
import java.util.Optional;
|
||||||
|
import java.util.concurrent.TimeUnit;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Event Listener for detecting player and mob deaths.
|
* Event Listener for detecting player and mob deaths.
|
||||||
@ -90,7 +91,7 @@ public class DeathEventListener implements Listener {
|
|||||||
}
|
}
|
||||||
|
|
||||||
private PlayerKill.Victim getVictim(Player victim) {
|
private PlayerKill.Victim getVictim(Player victim) {
|
||||||
return new PlayerKill.Victim(victim.getUniqueId(), victim.getName());
|
return new PlayerKill.Victim(victim.getUniqueId(), victim.getName(), TimeUnit.SECONDS.toMillis(victim.getFirstPlayed()));
|
||||||
}
|
}
|
||||||
|
|
||||||
@EventHandler(priority = EventPriority.MONITOR)
|
@EventHandler(priority = EventPriority.MONITOR)
|
||||||
|
@ -5,6 +5,18 @@ import {useTheme} from "../../hooks/themeHook";
|
|||||||
import {useTranslation} from "react-i18next";
|
import {useTranslation} from "react-i18next";
|
||||||
import Scrollable from "../Scrollable";
|
import Scrollable from "../Scrollable";
|
||||||
|
|
||||||
|
const VictimName = ({kill}) => {
|
||||||
|
const {t} = useTranslation();
|
||||||
|
|
||||||
|
const day = 24 * 60 * 60 * 1000;
|
||||||
|
if (kill.timeSinceRegisterMillis > 0 && kill.timeSinceRegisterMillis < day) {
|
||||||
|
return <span className={"col-light-green"}
|
||||||
|
title={t('html.label.playerKillsVictimIndicator').replace("<>", kill.timeSinceRegisterFormatted)}>{kill.victimName}</span>
|
||||||
|
}
|
||||||
|
|
||||||
|
return <>{kill.victimName}</>
|
||||||
|
}
|
||||||
|
|
||||||
const KillRow = ({kill}) => {
|
const KillRow = ({kill}) => {
|
||||||
const killSeparator = <Fa
|
const killSeparator = <Fa
|
||||||
icon={kill.killerUUID === kill.victimUUID ? faSkullCrossbones : faAngleRight}
|
icon={kill.killerUUID === kill.victimUUID ? faSkullCrossbones : faAngleRight}
|
||||||
@ -12,7 +24,7 @@ const KillRow = ({kill}) => {
|
|||||||
return (
|
return (
|
||||||
<tr>
|
<tr>
|
||||||
<td>{kill.date}</td>
|
<td>{kill.date}</td>
|
||||||
<td>{kill.killerName} {killSeparator} {kill.victimName}</td>
|
<td>{kill.killerName} {killSeparator} <VictimName kill={kill}/></td>
|
||||||
<td>{kill.weapon}</td>
|
<td>{kill.weapon}</td>
|
||||||
<td>{kill.serverName}</td>
|
<td>{kill.serverName}</td>
|
||||||
</tr>
|
</tr>
|
||||||
|
Loading…
Reference in New Issue
Block a user