127 lines
5.3 KiB
Java
127 lines
5.3 KiB
Java
/*
|
|
* This file is part of Player Analytics (Plan).
|
|
*
|
|
* Plan is free software: you can redistribute it and/or modify
|
|
* it under the terms of the GNU Lesser General Public License v3 as published by
|
|
* the Free Software Foundation, either version 3 of the License, or
|
|
* (at your option) any later version.
|
|
*
|
|
* Plan is distributed in the hope that it will be useful,
|
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
* GNU Lesser General Public License for more details.
|
|
*
|
|
* You should have received a copy of the GNU Lesser General Public License
|
|
* along with Plan. If not, see <https://www.gnu.org/licenses/>.
|
|
*/
|
|
package com.djrapitops.plan.delivery.rendering.json;
|
|
|
|
import com.djrapitops.plan.delivery.formatting.Formatter;
|
|
import com.djrapitops.plan.delivery.formatting.Formatters;
|
|
import com.djrapitops.plan.storage.database.DBSystem;
|
|
import com.djrapitops.plan.storage.database.Database;
|
|
import com.djrapitops.plan.storage.database.queries.objects.KillQueries;
|
|
|
|
import javax.inject.Inject;
|
|
import javax.inject.Singleton;
|
|
import java.util.*;
|
|
import java.util.concurrent.TimeUnit;
|
|
|
|
/**
|
|
* Parses JSON payload for /server-page PvP and PvE tab.
|
|
*
|
|
* @author Rsl1122
|
|
*/
|
|
@Singleton
|
|
public class PvPPvEJSONParser implements ServerTabJSONParser<Map<String, Object>> {
|
|
|
|
private final DBSystem dbSystem;
|
|
|
|
private final Formatter<Double> decimals;
|
|
|
|
@Inject
|
|
public PvPPvEJSONParser(
|
|
DBSystem dbSystem,
|
|
Formatters formatters
|
|
) {
|
|
this.dbSystem = dbSystem;
|
|
|
|
decimals = formatters.decimals();
|
|
}
|
|
|
|
public Map<String, Object> createJSONAsMap(UUID serverUUID) {
|
|
Map<String, Object> serverOverview = new HashMap<>();
|
|
serverOverview.put("numbers", createNumbersMap(serverUUID));
|
|
serverOverview.put("insights", createInsightsMap(serverUUID));
|
|
return serverOverview;
|
|
}
|
|
|
|
private Map<String, Object> createNumbersMap(UUID serverUUID) {
|
|
Database db = dbSystem.getDatabase();
|
|
long now = System.currentTimeMillis();
|
|
long weekAgo = now - TimeUnit.DAYS.toMillis(7L);
|
|
long monthAgo = now - TimeUnit.DAYS.toMillis(30L);
|
|
|
|
Map<String, Object> numbers = new HashMap<>();
|
|
Long pks = db.query(KillQueries.playerKillCount(0L, now, serverUUID));
|
|
Long pks7d = db.query(KillQueries.playerKillCount(weekAgo, now, serverUUID));
|
|
Long pks30d = db.query(KillQueries.playerKillCount(monthAgo, now, serverUUID));
|
|
numbers.put("player_kills_total", pks);
|
|
numbers.put("player_kills_30d", pks30d);
|
|
numbers.put("player_kills_7d", pks7d);
|
|
|
|
numbers.put("player_kdr_avg", decimals.apply(db.query(KillQueries.averageKDR(0L, now, serverUUID))));
|
|
numbers.put("player_kdr_avg_30d", decimals.apply(db.query(KillQueries.averageKDR(monthAgo, now, serverUUID))));
|
|
numbers.put("player_kdr_avg_7d", decimals.apply(db.query(KillQueries.averageKDR(weekAgo, now, serverUUID))));
|
|
|
|
Long mobKills = db.query(KillQueries.mobKillCount(0L, now, serverUUID));
|
|
Long mobKills30d = db.query(KillQueries.mobKillCount(monthAgo, now, serverUUID));
|
|
Long mobKills7d = db.query(KillQueries.mobKillCount(weekAgo, now, serverUUID));
|
|
numbers.put("mob_kills_total", mobKills);
|
|
numbers.put("mob_kills_30d", mobKills30d);
|
|
numbers.put("mob_kills_7d", mobKills7d);
|
|
|
|
Long deaths = db.query(KillQueries.deathCount(0L, now, serverUUID));
|
|
Long deaths30d = db.query(KillQueries.deathCount(monthAgo, now, serverUUID));
|
|
Long deaths7d = db.query(KillQueries.deathCount(weekAgo, now, serverUUID));
|
|
numbers.put("deaths_total", deaths);
|
|
numbers.put("deaths_30d", deaths30d);
|
|
numbers.put("deaths_7d", deaths7d);
|
|
|
|
long mobDeaths = deaths - pks;
|
|
long mobDeaths30d = deaths30d - pks30d;
|
|
long mobDeaths7d = deaths7d - pks7d;
|
|
|
|
numbers.put("mob_deaths_total", mobDeaths);
|
|
numbers.put("mob_deaths_30d", mobDeaths30d);
|
|
numbers.put("mob_deaths_7d", mobDeaths7d);
|
|
|
|
double mobKdr = mobDeaths != 0 ? (double) mobKills / mobDeaths : mobKills;
|
|
double mobKdr30d = mobDeaths30d != 0 ? (double) mobKills30d / mobDeaths30d : mobKills30d;
|
|
double mobKdr7d = mobDeaths7d != 0 ? (double) mobKills7d / mobDeaths7d : mobKills7d;
|
|
numbers.put("mob_kdr_total", decimals.apply(mobKdr));
|
|
numbers.put("mob_kdr_30d", decimals.apply(mobKdr30d));
|
|
numbers.put("mob_kdr_7d", decimals.apply(mobKdr7d));
|
|
|
|
return numbers;
|
|
}
|
|
|
|
private Map<String, Object> createInsightsMap(UUID serverUUID) {
|
|
Database db = dbSystem.getDatabase();
|
|
long now = System.currentTimeMillis();
|
|
long monthAgo = now - TimeUnit.DAYS.toMillis(30L);
|
|
|
|
Map<String, Object> insights = new HashMap<>();
|
|
|
|
List<String> top3Weapons = db.query(KillQueries.topWeaponsOfServer(monthAgo, now, serverUUID, 3));
|
|
insights.put("weapon_1st", getWeapon(top3Weapons, 0).orElse("-"));
|
|
insights.put("weapon_2nd", getWeapon(top3Weapons, 1).orElse("-"));
|
|
insights.put("weapon_3rd", getWeapon(top3Weapons, 2).orElse("-"));
|
|
|
|
return insights;
|
|
}
|
|
|
|
private <T> Optional<T> getWeapon(List<T> list, int index) {
|
|
return list.size() <= index ? Optional.empty() : Optional.of(list.get(index));
|
|
}
|
|
} |