Skip to content

Commit 9f324ea

Browse files
committed
Fix issues with MSPT formatting
1 parent 05dd75d commit 9f324ea

7 files changed

Lines changed: 85 additions & 83 deletions

File tree

Plan/common/src/main/java/com/djrapitops/plan/delivery/rendering/json/PerformanceJSONCreator.java

Lines changed: 15 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -102,24 +102,24 @@ private Map<String, Object> createNumbersMap(List<TPS> tpsData) {
102102
numbers.put("server_uptime_7d", tpsDataWeek.serverUptime());
103103
numbers.put("server_uptime_24h", tpsDataDay.serverUptime());
104104

105-
numbers.put("players_30d", format(tpsDataMonth.averagePlayers()));
106-
numbers.put("players_7d", format(tpsDataWeek.averagePlayers()));
107-
numbers.put("players_24h", format(tpsDataDay.averagePlayers()));
108-
numbers.put("tps_30d", format(tpsDataMonth.averageTPS()));
109-
numbers.put("tps_7d", format(tpsDataWeek.averageTPS()));
110-
numbers.put("tps_24h", format(tpsDataDay.averageTPS()));
105+
numbers.put("players_30d", tpsDataMonth.averagePlayers());
106+
numbers.put("players_7d", tpsDataWeek.averagePlayers());
107+
numbers.put("players_24h", tpsDataDay.averagePlayers());
108+
numbers.put("tps_30d", tpsDataMonth.averageTPS());
109+
numbers.put("tps_7d", tpsDataWeek.averageTPS());
110+
numbers.put("tps_24h", tpsDataDay.averageTPS());
111111
numbers.put("cpu_30d", formatPercentage(tpsDataMonth.averageCPU()));
112112
numbers.put("cpu_7d", formatPercentage(tpsDataWeek.averageCPU()));
113113
numbers.put("cpu_24h", formatPercentage(tpsDataDay.averageCPU()));
114114
numbers.put("ram_30d", formatBytes(tpsDataMonth.averageRAM()));
115115
numbers.put("ram_7d", formatBytes(tpsDataWeek.averageRAM()));
116116
numbers.put("ram_24h", formatBytes(tpsDataDay.averageRAM()));
117-
numbers.put("entities_30d", format((int) tpsDataMonth.averageEntities()));
118-
numbers.put("entities_7d", format((int) tpsDataWeek.averageEntities()));
119-
numbers.put("entities_24h", format((int) tpsDataDay.averageEntities()));
120-
numbers.put("chunks_30d", format((int) tpsDataMonth.averageChunks()));
121-
numbers.put("chunks_7d", format((int) tpsDataWeek.averageChunks()));
122-
numbers.put("chunks_24h", format((int) tpsDataDay.averageChunks()));
117+
numbers.put("entities_30d", (int) tpsDataMonth.averageEntities());
118+
numbers.put("entities_7d", (int) tpsDataWeek.averageEntities());
119+
numbers.put("entities_24h", (int) tpsDataDay.averageEntities());
120+
numbers.put("chunks_30d", (int) tpsDataMonth.averageChunks());
121+
numbers.put("chunks_7d", (int) tpsDataWeek.averageChunks());
122+
numbers.put("chunks_24h", (int) tpsDataDay.averageChunks());
123123

124124
numbers.put("max_disk_30d", formatBytes(tpsDataMonth.maxFreeDisk()));
125125
numbers.put("max_disk_7d", formatBytes(tpsDataWeek.maxFreeDisk()));
@@ -128,17 +128,13 @@ private Map<String, Object> createNumbersMap(List<TPS> tpsData) {
128128
numbers.put("min_disk_7d", formatBytes(tpsDataWeek.minFreeDisk()));
129129
numbers.put("min_disk_24h", formatBytes(tpsDataDay.minFreeDisk()));
130130

131-
numbers.put("mspt_average_30d", format(tpsDataMonth.averageMspt()));
132-
numbers.put("mspt_average_7d", format(tpsDataWeek.averageMspt()));
133-
numbers.put("mspt_average_24h", format(tpsDataDay.averageMspt()));
131+
numbers.put("mspt_average_30d", tpsDataMonth.averageMspt());
132+
numbers.put("mspt_average_7d", tpsDataWeek.averageMspt());
133+
numbers.put("mspt_average_24h", tpsDataDay.averageMspt());
134134

135135
return numbers;
136136
}
137137

138-
private String format(double value) {
139-
return value != -1 ? decimals.apply(value) : GenericLang.UNAVAILABLE.getKey();
140-
}
141-
142138
private String formatBytes(double value) {
143139
return value != -1 ? byteSize.apply(value) : GenericLang.UNAVAILABLE.getKey();
144140
}

Plan/common/src/main/java/com/djrapitops/plan/delivery/webserver/resolver/json/NetworkPerformanceJSONResolver.java

Lines changed: 15 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -65,7 +65,6 @@ public class NetworkPerformanceJSONResolver implements Resolver {
6565
private final PlanConfig config;
6666
private final DBSystem dbSystem;
6767

68-
private final Formatter<Double> decimals;
6968
private final Formatter<Double> percentage;
7069
private final Formatter<Double> byteSize;
7170
private final Gson gson;
@@ -80,7 +79,6 @@ public NetworkPerformanceJSONResolver(
8079
this.config = config;
8180
this.dbSystem = dbSystem;
8281

83-
decimals = formatters.decimals();
8482
percentage = formatters.percentage();
8583
byteSize = formatters.byteSize();
8684
this.gson = gson;
@@ -193,27 +191,27 @@ private Map<String, Object> createNumbersMap(Map<Integer, List<TPS>> tpsData) {
193191
numbers.put("avg_server_uptime_24h", "-");
194192
}
195193

196-
numbers.put("players_30d", format(tpsDataMonth.averagePlayers()));
197-
numbers.put("players_7d", format(tpsDataWeek.averagePlayers()));
198-
numbers.put("players_24h", format(tpsDataDay.averagePlayers()));
199-
numbers.put("tps_30d", format(tpsDataMonth.averageTPS()));
200-
numbers.put("tps_7d", format(tpsDataWeek.averageTPS()));
201-
numbers.put("tps_24h", format(tpsDataDay.averageTPS()));
194+
numbers.put("players_30d", tpsDataMonth.averagePlayers());
195+
numbers.put("players_7d", tpsDataWeek.averagePlayers());
196+
numbers.put("players_24h", tpsDataDay.averagePlayers());
197+
numbers.put("tps_30d", tpsDataMonth.averageTPS());
198+
numbers.put("tps_7d", tpsDataWeek.averageTPS());
199+
numbers.put("tps_24h", tpsDataDay.averageTPS());
202200
numbers.put("cpu_30d", formatPercentage(tpsDataMonth.averageCPU()));
203201
numbers.put("cpu_7d", formatPercentage(tpsDataWeek.averageCPU()));
204202
numbers.put("cpu_24h", formatPercentage(tpsDataDay.averageCPU()));
205203
numbers.put("ram_30d", formatBytes(tpsDataMonth.averageRAM()));
206204
numbers.put("ram_7d", formatBytes(tpsDataWeek.averageRAM()));
207205
numbers.put("ram_24h", formatBytes(tpsDataDay.averageRAM()));
208-
numbers.put("entities_30d", format((int) tpsDataMonth.averageEntities()));
209-
numbers.put("entities_7d", format((int) tpsDataWeek.averageEntities()));
210-
numbers.put("entities_24h", format((int) tpsDataDay.averageEntities()));
211-
numbers.put("chunks_30d", format((int) tpsDataMonth.averageChunks()));
212-
numbers.put("chunks_7d", format((int) tpsDataWeek.averageChunks()));
213-
numbers.put("chunks_24h", format((int) tpsDataDay.averageChunks()));
214-
numbers.put("mspt_average_30d", format(tpsDataMonth.averageMspt()));
215-
numbers.put("mspt_average_7d", format(tpsDataWeek.averageMspt()));
216-
numbers.put("mspt_average_24h", format(tpsDataDay.averageMspt()));
206+
numbers.put("entities_30d", (int) tpsDataMonth.averageEntities());
207+
numbers.put("entities_7d", (int) tpsDataWeek.averageEntities());
208+
numbers.put("entities_24h", (int) tpsDataDay.averageEntities());
209+
numbers.put("chunks_30d", (int) tpsDataMonth.averageChunks());
210+
numbers.put("chunks_7d", (int) tpsDataWeek.averageChunks());
211+
numbers.put("chunks_24h", (int) tpsDataDay.averageChunks());
212+
numbers.put("mspt_average_30d", tpsDataMonth.averageMspt());
213+
numbers.put("mspt_average_7d", tpsDataWeek.averageMspt());
214+
numbers.put("mspt_average_24h", tpsDataDay.averageMspt());
217215

218216
return numbers;
219217
}
@@ -226,10 +224,6 @@ private long getTotal(Map<Integer, TPSMutator> mutatorsOfServersMonth, Function<
226224
return downTime;
227225
}
228226

229-
private String format(double value) {
230-
return value != -1 ? decimals.apply(value) : GenericLang.UNAVAILABLE.getKey();
231-
}
232-
233227
private String formatBytes(double value) {
234228
return value != -1 ? byteSize.apply(value) : GenericLang.UNAVAILABLE.getKey();
235229
}

Plan/react/dashboard/src/components/table/PerformanceAsNumbersTable.jsx

Lines changed: 33 additions & 30 deletions
Original file line numberDiff line numberDiff line change
@@ -17,12 +17,15 @@ import {faEye, faQuestionCircle} from "@fortawesome/free-regular-svg-icons";
1717
import AsNumbersTable from "./AsNumbersTable";
1818
import {ChartLoader} from "../navigation/Loader";
1919
import FormattedTime from "../text/FormattedTime.jsx";
20-
import {orUnavailable} from "../../util/formatters.js";
20+
import {useOrUnavailable} from "../../util/formatters.js";
2121
import {usePingFormatter} from "../../util/format/usePingFormatter.js";
22+
import {useDecimalFormatter} from "../../util/format/useDecimalFormatter.js";
2223

2324
const PerformanceAsNumbersTable = ({data, servers}) => {
2425
const {t} = useTranslation();
2526
const {formatPing} = usePingFormatter();
27+
const {formatDecimals} = useDecimalFormatter();
28+
const {orUnavailable} = useOrUnavailable();
2629
if (!data) return <ChartLoader/>;
2730

2831
const dataIncludesGameServers = servers && Boolean(servers.filter(server => !server.proxy).length);
@@ -43,51 +46,51 @@ const PerformanceAsNumbersTable = ({data, servers}) => {
4346
<TableRow icon={faPowerOff} color="downtime"
4447
text={t(data.avg_server_downtime_30d ? 'html.label.serverDowntime' : 'html.label.totalServerDowntime') + ' (' + t('generic.noData') + ')'}
4548
values={[
46-
<FormattedTime timeMs={data.server_downtime_30d}/>,
47-
<FormattedTime timeMs={data.server_downtime_7d}/>,
48-
<FormattedTime timeMs={data.server_downtime_24h}/>
49+
<FormattedTime key={'30d'} timeMs={data.server_downtime_30d}/>,
50+
<FormattedTime key={'7d'} timeMs={data.server_downtime_7d}/>,
51+
<FormattedTime key={'1d'} timeMs={data.server_downtime_24h}/>
4952
]}/>
50-
{data.avg_server_downtime_30d && (
53+
{!!data.avg_server_downtime_30d && (
5154
<TableRow icon={faPowerOff} color="downtime"
5255
text={t('html.label.averageServerDowntime')}
5356
values={[
54-
<FormattedTime timeMs={data.avg_server_downtime_30d}/>,
55-
<FormattedTime timeMs={data.avg_server_downtime_7d}/>,
56-
<FormattedTime timeMs={data.avg_server_downtime_24h}/>
57+
<FormattedTime key={'30d'} timeMs={data.avg_server_downtime_30d}/>,
58+
<FormattedTime key={'7d'} timeMs={data.avg_server_downtime_7d}/>,
59+
<FormattedTime key={'1d'} timeMs={data.avg_server_downtime_24h}/>
5760
]}/>)}
5861
<TableRow icon={faPowerOff} color="uptime"
5962
text={t('html.label.serverUptime')}
6063
values={[
61-
<FormattedTime timeMs={data.server_uptime_30d}/>,
62-
<FormattedTime timeMs={data.server_uptime_7d}/>,
63-
<FormattedTime timeMs={data.server_uptime_24h}/>
64+
<FormattedTime key={'30d'} timeMs={data.server_uptime_30d}/>,
65+
<FormattedTime key={'7d'} timeMs={data.server_uptime_7d}/>,
66+
<FormattedTime key={'1d'} timeMs={data.server_uptime_24h}/>
6467
]}/>
6568
{data.avg_server_uptime_30d && (
6669
<TableRow icon={faPowerOff} color="uptime"
6770
text={t('html.label.averageServerUptime')}
6871
values={[
69-
<FormattedTime timeMs={data.avg_server_uptime_30d}/>,
70-
<FormattedTime timeMs={data.avg_server_uptime_7d}/>,
71-
<FormattedTime timeMs={data.avg_server_uptime_24h}/>
72+
<FormattedTime key={'30d'} timeMs={data.avg_server_uptime_30d}/>,
73+
<FormattedTime key={'7d'} timeMs={data.avg_server_uptime_7d}/>,
74+
<FormattedTime key={'1d'} timeMs={data.avg_server_uptime_24h}/>
7275
]}/>)}
7376
<TableRow icon={faUser} color="players-online" text={t('html.label.averagePlayers')}
7477
values={[
75-
data.players_30d,
76-
data.players_7d,
77-
data.players_24h
78+
orUnavailable(data.players_30d),
79+
orUnavailable(data.players_7d),
80+
orUnavailable(data.players_24h)
7881
]}/>
7982
<TableRow icon={faTachometerAlt} color="tps-average" text={t('html.label.averageTps')}
8083
values={[
81-
<>{t(data.tps_30d)} {noTPSOnProxies}</>,
82-
<>{t(data.tps_7d)} {noTPSOnProxies}</>,
83-
<>{t(data.tps_24h)} {noTPSOnProxies}</>
84+
<>{formatDecimals(orUnavailable(data.tps_30d))} {noTPSOnProxies}</>,
85+
<>{formatDecimals(orUnavailable(data.tps_7d))} {noTPSOnProxies}</>,
86+
<>{formatDecimals(orUnavailable(data.tps_24h))} {noTPSOnProxies}</>
8487
]}/>
8588
<TableRow icon={faStopwatch} color="mspt-average" text={t('html.label.msptAverage')}
8689
title={t('html.label.msptFull')}
8790
values={[
88-
<>{formatPing(orUnavailable(data.mspt_average_30d, t))} {noTPSOnProxies}</>,
89-
<>{formatPing(orUnavailable(data.mspt_average_7d, t))} {noTPSOnProxies}</>,
90-
<>{formatPing(orUnavailable(data.mspt_average_24h, t))} {noTPSOnProxies}</>
91+
<>{formatPing(orUnavailable(data.mspt_average_30d))} {noTPSOnProxies}</>,
92+
<>{formatPing(orUnavailable(data.mspt_average_7d))} {noTPSOnProxies}</>,
93+
<>{formatPing(orUnavailable(data.mspt_average_24h))} {noTPSOnProxies}</>
9194
]}/>
9295
<TableRow icon={faTachometerAlt} color="cpu" text={t('html.label.averageCpuUsage')}
9396
values={[
@@ -103,17 +106,17 @@ const PerformanceAsNumbersTable = ({data, servers}) => {
103106
]}/>
104107
<TableRow icon={faDragon} color="entities" text={t('html.label.averageEntities')}
105108
values={[
106-
<>{t(data.entities_30d)} {noTPSOnProxies}</>,
107-
<>{t(data.entities_7d)} {noTPSOnProxies}</>,
108-
<>{t(data.entities_24h)} {noTPSOnProxies}</>
109+
<>{orUnavailable(data.entities_30d)} {noTPSOnProxies}</>,
110+
<>{orUnavailable(data.entities_7d)} {noTPSOnProxies}</>,
111+
<>{orUnavailable(data.entities_24h)} {noTPSOnProxies}</>
109112
]}/>
110113
<TableRow icon={faMap} color="chunks"
111-
text={<>{t('html.label.averageChunks')}{' '}{data.chunks_30d === 'plugin.generic.unavailable' ?
114+
text={<>{t('html.label.averageChunks')}{' '}{data.chunks_30d === -1 ?
112115
<span title={t('html.description.noSpongeChunks')}><Fa icon={faEye}/></span> : ''}</>}
113116
values={[
114-
<>{t(data.chunks_30d)} {noTPSOnProxies}</>,
115-
<>{t(data.chunks_7d)} {noTPSOnProxies}</>,
116-
<>{t(data.chunks_24h)} {noTPSOnProxies}</>
117+
<>{orUnavailable(data.chunks_30d)} {noTPSOnProxies}</>,
118+
<>{orUnavailable(data.chunks_7d)} {noTPSOnProxies}</>,
119+
<>{orUnavailable(data.chunks_24h)} {noTPSOnProxies}</>
117120
]}/>
118121
<TableRow icon={faHdd} color="disk"
119122
text={t('html.label.maxFreeDisk')}

Plan/react/dashboard/src/util/format/useDecimalFormatter.js

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,12 @@
11
import {usePreferences} from "../../hooks/preferencesHook.jsx";
22
import {useCallback, useMemo} from "react";
3+
import {isString} from "highcharts";
34

45
export const useDecimalFormatter = () => {
56
const {decimalFormat} = usePreferences();
67

78
const formatDecimals = useCallback((value) => {
8-
if (!decimalFormat || Number.isNaN(value)) return value;
9+
if (!decimalFormat || Number.isNaN(value) || isString(value)) return value;
910
const split = decimalFormat.includes('.') ? decimalFormat.split('.') : decimalFormat.split(',');
1011
if (split.length <= 1) return value.toFixed(0);
1112
return value.toFixed(split[1].length);

Plan/react/dashboard/src/util/format/usePingFormatter.js

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,8 @@ export const usePingFormatter = () => {
1111
const formatPing = useCallback((value) => {
1212
if (isNumber(value) && !String(value).includes("ms")) {
1313
const split = isNumber(value) ? [value] : value.split('.');
14-
const parts = formatter.formatToParts({milliseconds: split[0]});
14+
const decimals = split.length > 1 ? split[1] : value % 1;
15+
const parts = formatter.formatToParts({milliseconds: Math.floor(Number(split[0]))});
1516

1617
const ints = parts.map((part, i) => part.type === 'integer' ? i : -1)
1718
.filter((i) => i >= 0);
@@ -21,7 +22,7 @@ export const usePingFormatter = () => {
2122
return '';
2223
}
2324
if (lastIndex === i && split.length > 1) {
24-
return part.value + '.' + split[1];
25+
return isNumber(decimals) ? Number(part.value) + decimals : part.value + '.' + decimals;
2526
}
2627
return part.value;
2728
}).join('');
Lines changed: 13 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,16 @@
11
import {isString} from "highcharts";
2+
import {useCallback} from "react";
3+
import {useTranslation} from "react-i18next";
24

3-
export const orUnavailable = (value, t) => {
4-
if (!t) return value;
5-
if (!value) return t('plugin.generic.unavailable');
6-
if (isString(value)) {
7-
return t(value);
8-
}
9-
return value;
5+
export const useOrUnavailable = () => {
6+
const {t} = useTranslation();
7+
const orUnavailable = useCallback((value) => {
8+
if (!t) return value;
9+
if (value === undefined || value === null || value === -1) return t('plugin.generic.unavailable');
10+
if (isString(value)) {
11+
return t(value);
12+
}
13+
return value;
14+
}, [t]);
15+
return {orUnavailable};
1016
}

Plan/react/dashboard/src/util/isNumber.js

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,8 @@
22
import {isString} from "highcharts";
33

44
export function isNumber(n) {
5-
return !Number.isNaN(Number.parseFloat(n))
6-
|| isString(n) && !Number.isNaN(Number.parseFloat(n.replace(',', '.')))
7-
&& !Number.isNaN(n - 0)
5+
const parseableFloat = !Number.isNaN(Number.parseFloat(n));
6+
const parseableFloatWithDelimeter = isString(n) && !Number.isNaN(Number.parseFloat(n.replace(',', '.')));
7+
const convertableNumber = !Number.isNaN(n - 0);
8+
return (parseableFloat || parseableFloatWithDelimeter) && convertableNumber
89
}

0 commit comments

Comments
 (0)