Display new player name as light green in kills tables

Affects issues:
- Close #1262
This commit is contained in:
Aurora Lahtela 2022-11-13 15:49:32 +02:00
parent fac196ed0d
commit a4a1001a8d
11 changed files with 58 additions and 12 deletions

View File

@ -93,7 +93,7 @@ public class DeathEventListener implements Listener {
}
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) {

View File

@ -60,6 +60,9 @@ public class PlayerKillMutator {
killMap.put("serverUUID", server.getUuid().toString());
killMap.put("serverName", server.getName());
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;
}
);

View File

@ -115,8 +115,33 @@ public class PlayerKill implements DateHolder {
}
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);
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());
}
}

View File

@ -166,6 +166,7 @@ public enum HtmlLang implements Lang {
LABEL_3RD_WEAPON("html.label.thirdDeadliestWeapon", "3rd PvP Weapon"),
LABEL_AVG_KDR("html.label.averageKdr", "Average KDR"),
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_MOB_KILLS("html.label.mobKills", "Mob Kills"),
LABEL_MOB_DEATHS("html.label.mobDeaths", "Mob Caused Deaths"),

View File

@ -55,6 +55,7 @@ public class KillQueries {
KillsTable.VICTIM_UUID + ", " +
KillsTable.SERVER_UUID + ", " +
"v." + UsersTable.USER_NAME + " as victim_name, " +
"v." + UsersTable.REGISTERED + " as victim_" + UsersTable.REGISTERED + ", " +
"k." + UsersTable.USER_NAME + " as killer_name," +
KillsTable.DATE + ", " +
KillsTable.WEAPON + ", " +
@ -91,6 +92,7 @@ public class KillQueries {
KillsTable.VICTIM_UUID + ", " +
KillsTable.SERVER_UUID + ", " +
"v." + UsersTable.USER_NAME + " as victim_name, " +
"v." + UsersTable.REGISTERED + " as victim_" + UsersTable.REGISTERED + ", " +
"k." + UsersTable.USER_NAME + " as killer_name," +
KillsTable.DATE + ", " +
KillsTable.WEAPON + ", " +
@ -126,6 +128,7 @@ public class KillQueries {
KillsTable.VICTIM_UUID + ", " +
KillsTable.SERVER_UUID + ", " +
"v." + UsersTable.USER_NAME + " as victim_name, " +
"v." + UsersTable.REGISTERED + " as victim_" + UsersTable.REGISTERED + ", " +
"k." + UsersTable.USER_NAME + " as killer_name," +
KillsTable.DATE + ", " +
KillsTable.WEAPON + ", " +
@ -165,7 +168,7 @@ public class KillQueries {
String weapon = set.getString(KillsTable.WEAPON);
return Optional.of(new PlayerKill(
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)),
Server.getIdentifiableName(set.getString("server_name"), set.getInt("server_id"))
), weapon, date

View File

@ -75,6 +75,7 @@ public class SessionQueries {
KillsTable.KILLER_UUID + ',' +
KillsTable.VICTIM_UUID + ',' +
"v." + UsersTable.USER_NAME + " as victim_name, " +
"v." + UsersTable.REGISTERED + " as victim_" + UsersTable.REGISTERED + ", " +
"k." + UsersTable.USER_NAME + " as killer_name, " +
KillsTable.DATE + ',' +
KillsTable.WEAPON +
@ -199,7 +200,8 @@ public class SessionQueries {
);
PlayerKill.Victim victim = new PlayerKill.Victim(
UUID.fromString(set.getString(KillsTable.VICTIM_UUID)),
victimName
victimName,
set.getLong("victim_" + UsersTable.REGISTERED)
);
ServerIdentifier serverIdentifier = new ServerIdentifier(serverUUID, serverName);
String weapon = set.getString(KillsTable.WEAPON);

View File

@ -303,7 +303,7 @@ class PlayerJoinEventConsumerTest {
File playerExportDir = config.getPageExportPath().resolve("player/" + TestConstants.PLAYER_ONE_UUID).toFile();
Awaitility.await()
.atMost(2, TimeUnit.SECONDS)
.atMost(5, TimeUnit.SECONDS)
.until(playerExportDir::exists);
assertTrue(playerExportDir.exists());

View File

@ -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.StoreSessionTransaction;
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.Disabled;
import org.junit.jupiter.api.Test;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.databind.node.ObjectNode;
import utilities.OptionalAssert;
import utilities.RandomData;
import utilities.TestConstants;
@ -191,8 +191,6 @@ public interface ExtensionsDatabaseTest extends DatabaseTestPreparer {
assertEquals(1, tabs.size()); // No tab defined, should contain 1 tab
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.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)));

View File

@ -29,6 +29,7 @@ import java.io.IOException;
import java.nio.file.Files;
import java.nio.file.Path;
import java.time.Duration;
import java.time.temporal.ChronoUnit;
import java.util.Arrays;
import java.util.List;
import java.util.stream.Collectors;
@ -127,7 +128,7 @@ class ErrorLoggerTest {
error.addSuppressed(new IllegalArgumentException());
error.addSuppressed(new NullPointerException());
assertTimeoutPreemptively(Duration.ofMillis(500), () ->
assertTimeoutPreemptively(Duration.of(5, ChronoUnit.SECONDS), () ->
UNDER_TEST.warn(error, ErrorContext.builder()
.whatToDo("Succeed the test")
.related("Test object")

View File

@ -43,6 +43,7 @@ import com.djrapitops.plan.utilities.logging.ErrorLogger;
import javax.inject.Inject;
import java.util.Optional;
import java.util.concurrent.TimeUnit;
/**
* Event Listener for detecting player and mob deaths.
@ -90,7 +91,7 @@ public class DeathEventListener implements Listener {
}
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)

View File

@ -5,6 +5,18 @@ import {useTheme} from "../../hooks/themeHook";
import {useTranslation} from "react-i18next";
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 killSeparator = <Fa
icon={kill.killerUUID === kill.victimUUID ? faSkullCrossbones : faAngleRight}
@ -12,7 +24,7 @@ const KillRow = ({kill}) => {
return (
<tr>
<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.serverName}</td>
</tr>