mirror of
https://github.com/plan-player-analytics/Plan.git
synced 2024-12-23 09:37:54 +01:00
parent
cff7fffe92
commit
314e0a2ca7
@ -10,6 +10,7 @@ import com.djrapitops.plan.data.store.mutators.health.HealthInformation;
|
|||||||
import com.djrapitops.plan.data.time.WorldTimes;
|
import com.djrapitops.plan.data.time.WorldTimes;
|
||||||
import com.djrapitops.plan.system.database.DBSystem;
|
import com.djrapitops.plan.system.database.DBSystem;
|
||||||
import com.djrapitops.plan.system.info.server.properties.ServerProperties;
|
import com.djrapitops.plan.system.info.server.properties.ServerProperties;
|
||||||
|
import com.djrapitops.plan.system.locale.Locale;
|
||||||
import com.djrapitops.plan.system.settings.Settings;
|
import com.djrapitops.plan.system.settings.Settings;
|
||||||
import com.djrapitops.plan.system.settings.config.PlanConfig;
|
import com.djrapitops.plan.system.settings.config.PlanConfig;
|
||||||
import com.djrapitops.plan.system.settings.theme.Theme;
|
import com.djrapitops.plan.system.settings.theme.Theme;
|
||||||
@ -46,6 +47,7 @@ public class AnalysisContainer extends DataContainer {
|
|||||||
private final ServerContainer serverContainer;
|
private final ServerContainer serverContainer;
|
||||||
|
|
||||||
private final String version;
|
private final String version;
|
||||||
|
private final Locale locale;
|
||||||
private final PlanConfig config;
|
private final PlanConfig config;
|
||||||
private final Theme theme;
|
private final Theme theme;
|
||||||
private final DBSystem dbSystem;
|
private final DBSystem dbSystem;
|
||||||
@ -61,6 +63,7 @@ public class AnalysisContainer extends DataContainer {
|
|||||||
public AnalysisContainer(
|
public AnalysisContainer(
|
||||||
ServerContainer serverContainer,
|
ServerContainer serverContainer,
|
||||||
String version,
|
String version,
|
||||||
|
Locale locale,
|
||||||
PlanConfig config,
|
PlanConfig config,
|
||||||
Theme theme,
|
Theme theme,
|
||||||
DBSystem dbSystem,
|
DBSystem dbSystem,
|
||||||
@ -73,6 +76,7 @@ public class AnalysisContainer extends DataContainer {
|
|||||||
) {
|
) {
|
||||||
this.serverContainer = serverContainer;
|
this.serverContainer = serverContainer;
|
||||||
this.version = version;
|
this.version = version;
|
||||||
|
this.locale = locale;
|
||||||
this.config = config;
|
this.config = config;
|
||||||
this.theme = theme;
|
this.theme = theme;
|
||||||
this.dbSystem = dbSystem;
|
this.dbSystem = dbSystem;
|
||||||
@ -447,6 +451,7 @@ public class AnalysisContainer extends DataContainer {
|
|||||||
Key<HealthInformation> healthInformation = new Key<>(HealthInformation.class, "HEALTH_INFORMATION");
|
Key<HealthInformation> healthInformation = new Key<>(HealthInformation.class, "HEALTH_INFORMATION");
|
||||||
putCachingSupplier(healthInformation, () -> new HealthInformation(
|
putCachingSupplier(healthInformation, () -> new HealthInformation(
|
||||||
this,
|
this,
|
||||||
|
locale,
|
||||||
config.getNumber(Settings.THEME_GRAPH_TPS_THRESHOLD_MED),
|
config.getNumber(Settings.THEME_GRAPH_TPS_THRESHOLD_MED),
|
||||||
config.getNumber(Settings.ACTIVE_PLAY_THRESHOLD),
|
config.getNumber(Settings.ACTIVE_PLAY_THRESHOLD),
|
||||||
config.getNumber(Settings.ACTIVE_LOGIN_THRESHOLD),
|
config.getNumber(Settings.ACTIVE_LOGIN_THRESHOLD),
|
||||||
@ -471,6 +476,7 @@ public class AnalysisContainer extends DataContainer {
|
|||||||
|
|
||||||
private final String version;
|
private final String version;
|
||||||
private final PlanConfig config;
|
private final PlanConfig config;
|
||||||
|
private final Locale locale;
|
||||||
private final Theme theme;
|
private final Theme theme;
|
||||||
private final DBSystem dbSystem;
|
private final DBSystem dbSystem;
|
||||||
private final ServerProperties serverProperties;
|
private final ServerProperties serverProperties;
|
||||||
@ -484,6 +490,7 @@ public class AnalysisContainer extends DataContainer {
|
|||||||
public Factory(
|
public Factory(
|
||||||
@Named("currentVersion") String version,
|
@Named("currentVersion") String version,
|
||||||
PlanConfig config,
|
PlanConfig config,
|
||||||
|
Locale locale,
|
||||||
Theme theme,
|
Theme theme,
|
||||||
DBSystem dbSystem,
|
DBSystem dbSystem,
|
||||||
ServerProperties serverProperties,
|
ServerProperties serverProperties,
|
||||||
@ -495,6 +502,7 @@ public class AnalysisContainer extends DataContainer {
|
|||||||
) {
|
) {
|
||||||
this.version = version;
|
this.version = version;
|
||||||
this.config = config;
|
this.config = config;
|
||||||
|
this.locale = locale;
|
||||||
this.theme = theme;
|
this.theme = theme;
|
||||||
this.dbSystem = dbSystem;
|
this.dbSystem = dbSystem;
|
||||||
this.serverProperties = serverProperties;
|
this.serverProperties = serverProperties;
|
||||||
@ -509,6 +517,7 @@ public class AnalysisContainer extends DataContainer {
|
|||||||
return new AnalysisContainer(
|
return new AnalysisContainer(
|
||||||
serverContainer,
|
serverContainer,
|
||||||
version,
|
version,
|
||||||
|
locale,
|
||||||
config,
|
config,
|
||||||
theme,
|
theme,
|
||||||
dbSystem,
|
dbSystem,
|
||||||
|
@ -9,6 +9,7 @@ import com.djrapitops.plan.data.store.mutators.TPSMutator;
|
|||||||
import com.djrapitops.plan.data.store.mutators.health.NetworkHealthInformation;
|
import com.djrapitops.plan.data.store.mutators.health.NetworkHealthInformation;
|
||||||
import com.djrapitops.plan.system.database.DBSystem;
|
import com.djrapitops.plan.system.database.DBSystem;
|
||||||
import com.djrapitops.plan.system.info.server.properties.ServerProperties;
|
import com.djrapitops.plan.system.info.server.properties.ServerProperties;
|
||||||
|
import com.djrapitops.plan.system.locale.Locale;
|
||||||
import com.djrapitops.plan.system.settings.Settings;
|
import com.djrapitops.plan.system.settings.Settings;
|
||||||
import com.djrapitops.plan.system.settings.config.PlanConfig;
|
import com.djrapitops.plan.system.settings.config.PlanConfig;
|
||||||
import com.djrapitops.plan.system.settings.theme.Theme;
|
import com.djrapitops.plan.system.settings.theme.Theme;
|
||||||
@ -44,6 +45,7 @@ public class NetworkContainer extends DataContainer {
|
|||||||
|
|
||||||
private final String version;
|
private final String version;
|
||||||
private final PlanConfig config;
|
private final PlanConfig config;
|
||||||
|
private final Locale locale;
|
||||||
private final Theme theme;
|
private final Theme theme;
|
||||||
private final DBSystem dbSystem;
|
private final DBSystem dbSystem;
|
||||||
private final ServerProperties serverProperties;
|
private final ServerProperties serverProperties;
|
||||||
@ -54,6 +56,7 @@ public class NetworkContainer extends DataContainer {
|
|||||||
ServerContainer bungeeContainer,
|
ServerContainer bungeeContainer,
|
||||||
String version,
|
String version,
|
||||||
PlanConfig config,
|
PlanConfig config,
|
||||||
|
Locale locale,
|
||||||
Theme theme,
|
Theme theme,
|
||||||
DBSystem dbSystem,
|
DBSystem dbSystem,
|
||||||
ServerProperties serverProperties,
|
ServerProperties serverProperties,
|
||||||
@ -63,6 +66,7 @@ public class NetworkContainer extends DataContainer {
|
|||||||
this.bungeeContainer = bungeeContainer;
|
this.bungeeContainer = bungeeContainer;
|
||||||
this.version = version;
|
this.version = version;
|
||||||
this.config = config;
|
this.config = config;
|
||||||
|
this.locale = locale;
|
||||||
this.theme = theme;
|
this.theme = theme;
|
||||||
this.dbSystem = dbSystem;
|
this.dbSystem = dbSystem;
|
||||||
this.serverProperties = serverProperties;
|
this.serverProperties = serverProperties;
|
||||||
@ -101,6 +105,7 @@ public class NetworkContainer extends DataContainer {
|
|||||||
Key<NetworkHealthInformation> healthInformation = new Key<>(NetworkHealthInformation.class, "HEALTH_INFORMATION");
|
Key<NetworkHealthInformation> healthInformation = new Key<>(NetworkHealthInformation.class, "HEALTH_INFORMATION");
|
||||||
putCachingSupplier(healthInformation, () -> new NetworkHealthInformation(
|
putCachingSupplier(healthInformation, () -> new NetworkHealthInformation(
|
||||||
this,
|
this,
|
||||||
|
locale,
|
||||||
config.getNumber(Settings.ACTIVE_PLAY_THRESHOLD),
|
config.getNumber(Settings.ACTIVE_PLAY_THRESHOLD),
|
||||||
config.getNumber(Settings.ACTIVE_LOGIN_THRESHOLD),
|
config.getNumber(Settings.ACTIVE_LOGIN_THRESHOLD),
|
||||||
formatters.timeAmount(), formatters.decimals(), formatters.percentage()
|
formatters.timeAmount(), formatters.decimals(), formatters.percentage()
|
||||||
@ -212,6 +217,7 @@ public class NetworkContainer extends DataContainer {
|
|||||||
|
|
||||||
private final Lazy<String> version;
|
private final Lazy<String> version;
|
||||||
private final Lazy<PlanConfig> config;
|
private final Lazy<PlanConfig> config;
|
||||||
|
private final Lazy<Locale> locale;
|
||||||
private final Lazy<Theme> theme;
|
private final Lazy<Theme> theme;
|
||||||
private final Lazy<DBSystem> dbSystem;
|
private final Lazy<DBSystem> dbSystem;
|
||||||
private final Lazy<ServerProperties> serverProperties;
|
private final Lazy<ServerProperties> serverProperties;
|
||||||
@ -222,6 +228,7 @@ public class NetworkContainer extends DataContainer {
|
|||||||
public Factory(
|
public Factory(
|
||||||
@Named("currentVersion") Lazy<String> version,
|
@Named("currentVersion") Lazy<String> version,
|
||||||
Lazy<PlanConfig> config,
|
Lazy<PlanConfig> config,
|
||||||
|
Lazy<Locale> locale,
|
||||||
Lazy<Theme> theme,
|
Lazy<Theme> theme,
|
||||||
Lazy<DBSystem> dbSystem,
|
Lazy<DBSystem> dbSystem,
|
||||||
Lazy<ServerProperties> serverProperties,
|
Lazy<ServerProperties> serverProperties,
|
||||||
@ -230,6 +237,7 @@ public class NetworkContainer extends DataContainer {
|
|||||||
) {
|
) {
|
||||||
this.version = version;
|
this.version = version;
|
||||||
this.config = config;
|
this.config = config;
|
||||||
|
this.locale = locale;
|
||||||
this.theme = theme;
|
this.theme = theme;
|
||||||
this.dbSystem = dbSystem;
|
this.dbSystem = dbSystem;
|
||||||
this.serverProperties = serverProperties;
|
this.serverProperties = serverProperties;
|
||||||
@ -242,6 +250,7 @@ public class NetworkContainer extends DataContainer {
|
|||||||
bungeeContainer,
|
bungeeContainer,
|
||||||
version.get(),
|
version.get(),
|
||||||
config.get(),
|
config.get(),
|
||||||
|
locale.get(),
|
||||||
theme.get(),
|
theme.get(),
|
||||||
dbSystem.get(),
|
dbSystem.get(),
|
||||||
serverProperties.get(),
|
serverProperties.get(),
|
||||||
|
@ -3,6 +3,8 @@ package com.djrapitops.plan.data.store.mutators.health;
|
|||||||
import com.djrapitops.plan.data.store.containers.PlayerContainer;
|
import com.djrapitops.plan.data.store.containers.PlayerContainer;
|
||||||
import com.djrapitops.plan.data.store.mutators.PlayersMutator;
|
import com.djrapitops.plan.data.store.mutators.PlayersMutator;
|
||||||
import com.djrapitops.plan.data.store.mutators.SessionsMutator;
|
import com.djrapitops.plan.data.store.mutators.SessionsMutator;
|
||||||
|
import com.djrapitops.plan.system.locale.Locale;
|
||||||
|
import com.djrapitops.plan.system.locale.lang.HealthInfoLang;
|
||||||
import com.djrapitops.plan.utilities.formatting.Formatter;
|
import com.djrapitops.plan.utilities.formatting.Formatter;
|
||||||
import com.djrapitops.plan.utilities.html.icon.Icons;
|
import com.djrapitops.plan.utilities.html.icon.Icons;
|
||||||
|
|
||||||
@ -19,6 +21,7 @@ public abstract class AbstractHealthInfo {
|
|||||||
|
|
||||||
protected double serverHealth;
|
protected double serverHealth;
|
||||||
|
|
||||||
|
protected final Locale locale;
|
||||||
protected final int activeMinuteThreshold;
|
protected final int activeMinuteThreshold;
|
||||||
protected final int activeLoginThreshold;
|
protected final int activeLoginThreshold;
|
||||||
protected final Formatter<Long> timeAmountFormatter;
|
protected final Formatter<Long> timeAmountFormatter;
|
||||||
@ -27,7 +30,7 @@ public abstract class AbstractHealthInfo {
|
|||||||
|
|
||||||
public AbstractHealthInfo(
|
public AbstractHealthInfo(
|
||||||
long now, long monthAgo,
|
long now, long monthAgo,
|
||||||
int activeMinuteThreshold,
|
Locale locale, int activeMinuteThreshold,
|
||||||
int activeLoginThreshold,
|
int activeLoginThreshold,
|
||||||
Formatter<Long> timeAmountFormatter,
|
Formatter<Long> timeAmountFormatter,
|
||||||
Formatter<Double> decimalFormatter,
|
Formatter<Double> decimalFormatter,
|
||||||
@ -35,6 +38,7 @@ public abstract class AbstractHealthInfo {
|
|||||||
) {
|
) {
|
||||||
this.now = now;
|
this.now = now;
|
||||||
this.monthAgo = monthAgo;
|
this.monthAgo = monthAgo;
|
||||||
|
this.locale = locale;
|
||||||
this.activeMinuteThreshold = activeMinuteThreshold;
|
this.activeMinuteThreshold = activeMinuteThreshold;
|
||||||
this.activeLoginThreshold = activeLoginThreshold;
|
this.activeLoginThreshold = activeLoginThreshold;
|
||||||
this.timeAmountFormatter = timeAmountFormatter;
|
this.timeAmountFormatter = timeAmountFormatter;
|
||||||
@ -80,36 +84,40 @@ public abstract class AbstractHealthInfo {
|
|||||||
regularRemainCompareSet.removeAll(veryActiveNow);
|
regularRemainCompareSet.removeAll(veryActiveNow);
|
||||||
int notRegularAnymore = regularRemainCompareSet.size();
|
int notRegularAnymore = regularRemainCompareSet.size();
|
||||||
int remain = activeFWAGNum - notRegularAnymore;
|
int remain = activeFWAGNum - notRegularAnymore;
|
||||||
double percRemain = activeFWAGNum != 0 ? remain / activeFWAGNum : 1.0;
|
double percRemain = activeFWAGNum != 0 ? remain * 1.0 / activeFWAGNum : 1.0;
|
||||||
|
|
||||||
int newActive = getNewActive(veryActiveNow, activeNow, regularNow, veryActiveFWAG, activeFWAG, regularFWAG);
|
int newActive = getNewActive(veryActiveNow, activeNow, regularNow, veryActiveFWAG, activeFWAG, regularFWAG);
|
||||||
|
|
||||||
int change = newActive - notRegularAnymore;
|
int change = newActive - notRegularAnymore;
|
||||||
|
|
||||||
String remainNote = "";
|
StringBuilder remainNote = new StringBuilder();
|
||||||
if (activeFWAGNum != 0) {
|
if (activeFWAGNum != 0) {
|
||||||
remainNote = "<br> ";
|
remainNote.append(subNote);
|
||||||
if (percRemain > 0.5) {
|
if (percRemain > 0.5) {
|
||||||
remainNote += Icons.GREEN_THUMB;
|
remainNote.append(Icons.GREEN_THUMB);
|
||||||
} else if (percRemain > 0.2) {
|
} else if (percRemain > 0.2) {
|
||||||
remainNote += Icons.YELLOW_FLAG;
|
remainNote.append(Icons.YELLOW_FLAG);
|
||||||
} else {
|
} else {
|
||||||
remainNote += Icons.RED_WARN;
|
remainNote.append(Icons.RED_WARN);
|
||||||
serverHealth -= 2.5;
|
serverHealth -= 2.5;
|
||||||
}
|
}
|
||||||
|
|
||||||
remainNote += " " + percentageFormatter.apply(percRemain) + " of regular players have remained active ("
|
remainNote.append(locale.getString(HealthInfoLang.REGULAR_ACTIVITY_REMAIN,
|
||||||
+ remain + "/" + activeFWAGNum + ")";
|
percentageFormatter.apply(percRemain),
|
||||||
|
remain, activeFWAGNum
|
||||||
|
));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
String sentenceStart = locale.getString(HealthInfoLang.REGULAR_CHANGE);
|
||||||
if (change > 0) {
|
if (change > 0) {
|
||||||
addNote(Icons.GREEN_THUMB + " Number of regular players has increased (+" + change + ")" + remainNote);
|
addNote(Icons.GREEN_THUMB + sentenceStart + locale.getString(HealthInfoLang.REGULAR_CHANGE_INCREASE, change) + remainNote);
|
||||||
} else if (change == 0) {
|
} else if (change == 0) {
|
||||||
addNote(Icons.GREEN_THUMB + " Number of regular players has stayed the same (+" + change + ")" + remainNote);
|
addNote(Icons.GREEN_THUMB + sentenceStart + locale.getString(HealthInfoLang.REGULAR_CHANGE_ZERO, change) + remainNote);
|
||||||
} else if (change > -20) {
|
} else if (change > -20) {
|
||||||
addNote(Icons.YELLOW_FLAG + " Number of regular players has decreased (" + change + ")" + remainNote);
|
addNote(Icons.YELLOW_FLAG + sentenceStart + locale.getString(HealthInfoLang.REGULAR_CHANGE_DECREASE, change) + remainNote);
|
||||||
serverHealth -= 5;
|
serverHealth -= 5;
|
||||||
} else {
|
} else {
|
||||||
addNote(Icons.RED_WARN + " Number of regular players has decreased (" + change + ")" + remainNote);
|
addNote(Icons.RED_WARN + sentenceStart + locale.getString(HealthInfoLang.REGULAR_CHANGE_DECREASE, change) + remainNote);
|
||||||
serverHealth -= 10;
|
serverHealth -= 10;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -133,18 +141,15 @@ public abstract class AbstractHealthInfo {
|
|||||||
String avgLastTwoWeeksString = timeAmountFormatter.apply(avgLastTwoWeeks);
|
String avgLastTwoWeeksString = timeAmountFormatter.apply(avgLastTwoWeeks);
|
||||||
String avgFourToTwoWeeksString = timeAmountFormatter.apply(avgFourToTwoWeeks);
|
String avgFourToTwoWeeksString = timeAmountFormatter.apply(avgFourToTwoWeeks);
|
||||||
if (avgFourToTwoWeeks >= avgLastTwoWeeks) {
|
if (avgFourToTwoWeeks >= avgLastTwoWeeks) {
|
||||||
addNote(Icons.GREEN_THUMB + " Active players seem to have things to do (Played "
|
addNote(Icons.GREEN_THUMB + locale.getString(HealthInfoLang.ACTIVE_PLAY_COMPARISON_INCREASE,
|
||||||
+ avgLastTwoWeeksString + " vs " + avgFourToTwoWeeksString
|
avgLastTwoWeeksString, avgFourToTwoWeeksString));
|
||||||
+ ", last two weeks vs weeks 2-4)");
|
|
||||||
} else if (avgFourToTwoWeeks - avgLastTwoWeeks > TimeUnit.HOURS.toMillis(2L)) {
|
} else if (avgFourToTwoWeeks - avgLastTwoWeeks > TimeUnit.HOURS.toMillis(2L)) {
|
||||||
addNote(Icons.RED_WARN + " Active players might be running out of things to do (Played "
|
addNote(Icons.RED_WARN + locale.getString(HealthInfoLang.ACTIVE_PLAY_COMPARISON_DECREASE,
|
||||||
+ avgLastTwoWeeksString + " vs " + avgFourToTwoWeeksString
|
avgLastTwoWeeksString, avgFourToTwoWeeksString));
|
||||||
+ ", last two weeks vs weeks 2-4)");
|
|
||||||
serverHealth -= 5;
|
serverHealth -= 5;
|
||||||
} else {
|
} else {
|
||||||
addNote(Icons.YELLOW_FLAG + " Active players might be running out of things to do (Played "
|
addNote(Icons.YELLOW_FLAG + locale.getString(HealthInfoLang.ACTIVE_PLAY_COMPARISON_DECREASE,
|
||||||
+ avgLastTwoWeeksString + " vs " + avgFourToTwoWeeksString
|
avgLastTwoWeeksString, avgFourToTwoWeeksString));
|
||||||
+ ", last two weeks vs weeks 2-4)");
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -10,6 +10,8 @@ import com.djrapitops.plan.data.store.keys.AnalysisKeys;
|
|||||||
import com.djrapitops.plan.data.store.mutators.PlayersMutator;
|
import com.djrapitops.plan.data.store.mutators.PlayersMutator;
|
||||||
import com.djrapitops.plan.data.store.mutators.PlayersOnlineResolver;
|
import com.djrapitops.plan.data.store.mutators.PlayersOnlineResolver;
|
||||||
import com.djrapitops.plan.data.store.mutators.TPSMutator;
|
import com.djrapitops.plan.data.store.mutators.TPSMutator;
|
||||||
|
import com.djrapitops.plan.system.locale.Locale;
|
||||||
|
import com.djrapitops.plan.system.locale.lang.HealthInfoLang;
|
||||||
import com.djrapitops.plan.utilities.formatting.Formatter;
|
import com.djrapitops.plan.utilities.formatting.Formatter;
|
||||||
import com.djrapitops.plan.utilities.html.icon.Icons;
|
import com.djrapitops.plan.utilities.html.icon.Icons;
|
||||||
import com.djrapitops.plugin.api.TimeAmount;
|
import com.djrapitops.plugin.api.TimeAmount;
|
||||||
@ -31,7 +33,9 @@ public class HealthInformation extends AbstractHealthInfo {
|
|||||||
|
|
||||||
public HealthInformation(
|
public HealthInformation(
|
||||||
AnalysisContainer analysisContainer,
|
AnalysisContainer analysisContainer,
|
||||||
int lowTPSThreshold, int activeMinuteThreshold,
|
Locale locale,
|
||||||
|
int lowTPSThreshold,
|
||||||
|
int activeMinuteThreshold,
|
||||||
int activeLoginThreshold,
|
int activeLoginThreshold,
|
||||||
Formatter<Long> timeAmountFormatter,
|
Formatter<Long> timeAmountFormatter,
|
||||||
Formatter<Double> decimalFormatter,
|
Formatter<Double> decimalFormatter,
|
||||||
@ -40,7 +44,9 @@ public class HealthInformation extends AbstractHealthInfo {
|
|||||||
super(
|
super(
|
||||||
analysisContainer.getUnsafe(AnalysisKeys.ANALYSIS_TIME),
|
analysisContainer.getUnsafe(AnalysisKeys.ANALYSIS_TIME),
|
||||||
analysisContainer.getUnsafe(AnalysisKeys.ANALYSIS_TIME_MONTH_AGO),
|
analysisContainer.getUnsafe(AnalysisKeys.ANALYSIS_TIME_MONTH_AGO),
|
||||||
activeMinuteThreshold, activeLoginThreshold, timeAmountFormatter, decimalFormatter, percentageFormatter
|
locale,
|
||||||
|
activeMinuteThreshold, activeLoginThreshold,
|
||||||
|
timeAmountFormatter, decimalFormatter, percentageFormatter
|
||||||
);
|
);
|
||||||
this.analysisContainer = analysisContainer;
|
this.analysisContainer = analysisContainer;
|
||||||
this.lowTPSThreshold = lowTPSThreshold;
|
this.lowTPSThreshold = lowTPSThreshold;
|
||||||
@ -75,11 +81,11 @@ public class HealthInformation extends AbstractHealthInfo {
|
|||||||
.mapToInt(Optional::get)
|
.mapToInt(Optional::get)
|
||||||
.average().orElse(0);
|
.average().orElse(0);
|
||||||
if (avgOnlineOnRegister >= 1) {
|
if (avgOnlineOnRegister >= 1) {
|
||||||
addNote(Icons.GREEN_THUMB + " New Players have players to play with when they join ("
|
addNote(Icons.GREEN_THUMB + locale.getString(HealthInfoLang.NEW_PLAYER_JOIN_PLAYERS_GOOD,
|
||||||
+ decimalFormatter.apply(avgOnlineOnRegister) + " on average)");
|
decimalFormatter.apply(avgOnlineOnRegister)));
|
||||||
} else {
|
} else {
|
||||||
addNote(Icons.YELLOW_FLAG + " New Players may not have players to play with when they join ("
|
addNote(Icons.YELLOW_FLAG + locale.getString(HealthInfoLang.NEW_PLAYER_JOIN_PLAYERS_BAD,
|
||||||
+ decimalFormatter.apply(avgOnlineOnRegister) + " on average)");
|
decimalFormatter.apply(avgOnlineOnRegister)));
|
||||||
serverHealth -= 5;
|
serverHealth -= 5;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -88,12 +94,12 @@ public class HealthInformation extends AbstractHealthInfo {
|
|||||||
|
|
||||||
if (playersNewMonth != 0) {
|
if (playersNewMonth != 0) {
|
||||||
double retainPercentage = playersRetainedMonth * 1.0 / playersNewMonth;
|
double retainPercentage = playersRetainedMonth * 1.0 / playersNewMonth;
|
||||||
|
String stickinessSentence = locale.getString(HealthInfoLang.NEW_PLAYER_STICKINESS,
|
||||||
|
percentageFormatter.apply(retainPercentage), playersRetainedMonth, playersNewMonth);
|
||||||
if (retainPercentage >= 0.25) {
|
if (retainPercentage >= 0.25) {
|
||||||
addNote(Icons.GREEN_THUMB + " " + percentageFormatter.apply(retainPercentage)
|
addNote(Icons.GREEN_THUMB + stickinessSentence);
|
||||||
+ " of new players have stuck around (" + playersRetainedMonth + "/" + playersNewMonth + ")");
|
|
||||||
} else {
|
} else {
|
||||||
addNote(Icons.YELLOW_FLAG + " " + percentageFormatter.apply(retainPercentage)
|
addNote(Icons.YELLOW_FLAG + stickinessSentence);
|
||||||
+ " of new players have stuck around (" + playersRetainedMonth + "/" + playersNewMonth + ")");
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -106,44 +112,39 @@ public class HealthInformation extends AbstractHealthInfo {
|
|||||||
double aboveThreshold = tpsMutator.percentageTPSAboveThreshold(lowTPSThreshold);
|
double aboveThreshold = tpsMutator.percentageTPSAboveThreshold(lowTPSThreshold);
|
||||||
long tpsSpikeMonth = analysisContainer.getValue(AnalysisKeys.TPS_SPIKE_MONTH).orElse(0);
|
long tpsSpikeMonth = analysisContainer.getValue(AnalysisKeys.TPS_SPIKE_MONTH).orElse(0);
|
||||||
|
|
||||||
String avgLowThresholdString = "<br> ";
|
StringBuilder avgLowThresholdString = new StringBuilder(subNote);
|
||||||
if (aboveThreshold >= 0.96) {
|
if (aboveThreshold >= 0.96) {
|
||||||
avgLowThresholdString += Icons.GREEN_THUMB;
|
avgLowThresholdString.append(Icons.GREEN_THUMB);
|
||||||
} else if (aboveThreshold >= 0.9) {
|
} else if (aboveThreshold >= 0.9) {
|
||||||
avgLowThresholdString += Icons.YELLOW_FLAG;
|
avgLowThresholdString.append(Icons.YELLOW_FLAG);
|
||||||
serverHealth *= 0.9;
|
serverHealth *= 0.9;
|
||||||
} else {
|
} else {
|
||||||
avgLowThresholdString += Icons.RED_WARN;
|
avgLowThresholdString.append(Icons.RED_WARN);
|
||||||
serverHealth *= 0.6;
|
serverHealth *= 0.6;
|
||||||
}
|
}
|
||||||
avgLowThresholdString += " Average TPS was above Low Threshold "
|
avgLowThresholdString.append(locale.getString(HealthInfoLang.TPS_ABOVE_LOW_THERSHOLD, percentageFormatter.apply(aboveThreshold)));
|
||||||
+ decimalFormatter.apply(aboveThreshold * 100.0) + "% of the time";
|
|
||||||
|
|
||||||
|
String tpsDipSentence = locale.getString(HealthInfoLang.TPS_LOW_DIPS, lowTPSThreshold, tpsSpikeMonth);
|
||||||
if (tpsSpikeMonth <= 5) {
|
if (tpsSpikeMonth <= 5) {
|
||||||
addNote(Icons.GREEN_THUMB + " Average TPS dropped below Low Threshold (" + lowTPSThreshold + ")" +
|
addNote(Icons.GREEN_THUMB + tpsDipSentence + avgLowThresholdString);
|
||||||
" " + tpsSpikeMonth + " times" +
|
|
||||||
avgLowThresholdString);
|
|
||||||
} else if (tpsSpikeMonth <= 25) {
|
} else if (tpsSpikeMonth <= 25) {
|
||||||
addNote(Icons.YELLOW_FLAG + " Average TPS dropped below Low Threshold (" + lowTPSThreshold + ")" +
|
addNote(Icons.YELLOW_FLAG + tpsDipSentence + avgLowThresholdString);
|
||||||
" " + tpsSpikeMonth + " times" +
|
|
||||||
avgLowThresholdString);
|
|
||||||
serverHealth *= 0.95;
|
serverHealth *= 0.95;
|
||||||
} else {
|
} else {
|
||||||
addNote(Icons.RED_WARN + " Average TPS dropped below Low Threshold (" + lowTPSThreshold + ")" +
|
addNote(Icons.RED_WARN + tpsDipSentence + avgLowThresholdString);
|
||||||
" " + tpsSpikeMonth + " times" +
|
|
||||||
avgLowThresholdString);
|
|
||||||
serverHealth *= 0.8;
|
serverHealth *= 0.8;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
String downtimeSentence = locale.getString(HealthInfoLang.DOWNTIME, timeAmountFormatter.apply(serverDownTime));
|
||||||
if (serverDownTime <= TimeUnit.DAYS.toMillis(1L)) {
|
if (serverDownTime <= TimeUnit.DAYS.toMillis(1L)) {
|
||||||
addNote(Icons.GREEN_THUMB + " Total Server downtime (No Data) was " + timeAmountFormatter.apply(serverDownTime));
|
addNote(Icons.GREEN_THUMB + downtimeSentence);
|
||||||
} else {
|
} else {
|
||||||
long weekMs = TimeAmount.WEEK.toMillis(1L);
|
long weekMs = TimeAmount.WEEK.toMillis(1L);
|
||||||
if (serverDownTime <= weekMs) {
|
if (serverDownTime <= weekMs) {
|
||||||
addNote(Icons.YELLOW_FLAG + " Total Server downtime (No Data) was " + timeAmountFormatter.apply(serverDownTime));
|
addNote(Icons.YELLOW_FLAG + downtimeSentence);
|
||||||
serverHealth *= (weekMs - serverDownTime) * 1.0 / weekMs;
|
serverHealth *= (weekMs - serverDownTime) * 1.0 / weekMs;
|
||||||
} else {
|
} else {
|
||||||
addNote(Icons.RED_WARN + " Total Server downtime (No Data) was " + timeAmountFormatter.apply(serverDownTime));
|
addNote(Icons.RED_WARN + downtimeSentence);
|
||||||
long monthMs = TimeAmount.MONTH.toMillis(1L);
|
long monthMs = TimeAmount.MONTH.toMillis(1L);
|
||||||
serverHealth *= (monthMs - serverDownTime) * 1.0 / monthMs;
|
serverHealth *= (monthMs - serverDownTime) * 1.0 / monthMs;
|
||||||
}
|
}
|
||||||
|
@ -8,6 +8,8 @@ import com.djrapitops.plan.data.store.keys.NetworkKeys;
|
|||||||
import com.djrapitops.plan.data.store.mutators.PlayersMutator;
|
import com.djrapitops.plan.data.store.mutators.PlayersMutator;
|
||||||
import com.djrapitops.plan.data.store.mutators.SessionsMutator;
|
import com.djrapitops.plan.data.store.mutators.SessionsMutator;
|
||||||
import com.djrapitops.plan.system.info.server.Server;
|
import com.djrapitops.plan.system.info.server.Server;
|
||||||
|
import com.djrapitops.plan.system.locale.Locale;
|
||||||
|
import com.djrapitops.plan.system.locale.lang.HealthInfoLang;
|
||||||
import com.djrapitops.plan.utilities.formatting.Formatter;
|
import com.djrapitops.plan.utilities.formatting.Formatter;
|
||||||
import com.djrapitops.plan.utilities.html.icon.Icon;
|
import com.djrapitops.plan.utilities.html.icon.Icon;
|
||||||
import com.djrapitops.plan.utilities.html.icon.Icons;
|
import com.djrapitops.plan.utilities.html.icon.Icons;
|
||||||
@ -20,6 +22,7 @@ public class NetworkHealthInformation extends AbstractHealthInfo {
|
|||||||
|
|
||||||
public NetworkHealthInformation(
|
public NetworkHealthInformation(
|
||||||
NetworkContainer container,
|
NetworkContainer container,
|
||||||
|
Locale locale,
|
||||||
int activeMinuteThreshold,
|
int activeMinuteThreshold,
|
||||||
int activeLoginThreshold,
|
int activeLoginThreshold,
|
||||||
Formatter<Long> timeAmountFormatter,
|
Formatter<Long> timeAmountFormatter,
|
||||||
@ -29,7 +32,9 @@ public class NetworkHealthInformation extends AbstractHealthInfo {
|
|||||||
super(
|
super(
|
||||||
container.getUnsafe(NetworkKeys.REFRESH_TIME),
|
container.getUnsafe(NetworkKeys.REFRESH_TIME),
|
||||||
container.getUnsafe(NetworkKeys.REFRESH_TIME_MONTH_AGO),
|
container.getUnsafe(NetworkKeys.REFRESH_TIME_MONTH_AGO),
|
||||||
activeMinuteThreshold, activeLoginThreshold, timeAmountFormatter, decimalFormatter, percentageFormatter
|
locale,
|
||||||
|
activeMinuteThreshold, activeLoginThreshold,
|
||||||
|
timeAmountFormatter, decimalFormatter, percentageFormatter
|
||||||
);
|
);
|
||||||
this.container = container;
|
this.container = container;
|
||||||
calculate();
|
calculate();
|
||||||
@ -48,12 +53,12 @@ public class NetworkHealthInformation extends AbstractHealthInfo {
|
|||||||
.orElse(Collections.emptyList());
|
.orElse(Collections.emptyList());
|
||||||
|
|
||||||
if (servers.isEmpty()) {
|
if (servers.isEmpty()) {
|
||||||
addNote(Icons.HELP_RING + " No Bukkit/Sponge servers to gather session data - These measures are inaccurate.");
|
addNote(Icons.HELP_RING + locale.getString(HealthInfoLang.NO_SERVERS_INACCURACY));
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
int serverCount = servers.size();
|
int serverCount = servers.size();
|
||||||
if (serverCount == 1) {
|
if (serverCount == 1) {
|
||||||
addNote(Icons.HELP_RING + " Single Bukkit/Sponge server to gather session data.");
|
addNote(Icons.HELP_RING + locale.getString(HealthInfoLang.SINGLE_SERVER_INACCURACY));
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -68,7 +73,7 @@ public class NetworkHealthInformation extends AbstractHealthInfo {
|
|||||||
|
|
||||||
private void uniquePlayersNote(int serverCount, Key<Server> serverKey, List<DataContainer> perServerContainers) {
|
private void uniquePlayersNote(int serverCount, Key<Server> serverKey, List<DataContainer> perServerContainers) {
|
||||||
Icon icon;
|
Icon icon;
|
||||||
String uniquePlayersNote = " players visit on servers per day/server on average.";
|
String uniquePlayersNote = locale.getString(HealthInfoLang.PLAYER_VISIT_PER_SERVER);
|
||||||
double average = perServerContainers.stream()
|
double average = perServerContainers.stream()
|
||||||
.mapToInt(c -> c.getUnsafe(AnalysisKeys.AVG_PLAYERS_MONTH))
|
.mapToInt(c -> c.getUnsafe(AnalysisKeys.AVG_PLAYERS_MONTH))
|
||||||
.average().orElse(0.0);
|
.average().orElse(0.0);
|
||||||
@ -95,7 +100,7 @@ public class NetworkHealthInformation extends AbstractHealthInfo {
|
|||||||
|
|
||||||
private void newPlayersNote(int serverCount, Key<Server> serverKey, List<DataContainer> perServerContainers) {
|
private void newPlayersNote(int serverCount, Key<Server> serverKey, List<DataContainer> perServerContainers) {
|
||||||
Icon icon;
|
Icon icon;
|
||||||
String newPlayersNote = " players register on servers per day/server on average.";
|
String newPlayersNote = locale.getString(HealthInfoLang.PLAYER_REGISTER_PER_SERVER);
|
||||||
double average = perServerContainers.stream()
|
double average = perServerContainers.stream()
|
||||||
.mapToInt(c -> c.getUnsafe(AnalysisKeys.AVG_PLAYERS_NEW_MONTH))
|
.mapToInt(c -> c.getUnsafe(AnalysisKeys.AVG_PLAYERS_NEW_MONTH))
|
||||||
.average().orElse(0.0);
|
.average().orElse(0.0);
|
||||||
@ -147,7 +152,7 @@ public class NetworkHealthInformation extends AbstractHealthInfo {
|
|||||||
|
|
||||||
private void playersNote(Key<Server> serverKey, List<DataContainer> perServerContainers) {
|
private void playersNote(Key<Server> serverKey, List<DataContainer> perServerContainers) {
|
||||||
Icon icon = Icons.HELP_RING;
|
Icon icon = Icons.HELP_RING;
|
||||||
String uniquePlayersNote = "${playersMonth} players played on the network:";
|
String uniquePlayersNote = "${playersMonth}" + locale.getString(HealthInfoLang.PLAYER_PLAY_ON_NETWORK);
|
||||||
StringBuilder subNotes = new StringBuilder();
|
StringBuilder subNotes = new StringBuilder();
|
||||||
perServerContainers.stream()
|
perServerContainers.stream()
|
||||||
.sorted(Comparator.comparingInt(c -> 0 - c.getUnsafe(AnalysisKeys.PLAYERS_MONTH)))
|
.sorted(Comparator.comparingInt(c -> 0 - c.getUnsafe(AnalysisKeys.PLAYERS_MONTH)))
|
||||||
|
@ -66,7 +66,8 @@ public class LocaleSystem implements SubSystem {
|
|||||||
ServerPageLang.values(),
|
ServerPageLang.values(),
|
||||||
NetworkPageLang.values(),
|
NetworkPageLang.values(),
|
||||||
ErrorPageLang.values(),
|
ErrorPageLang.values(),
|
||||||
FailReason.values()
|
FailReason.values(),
|
||||||
|
HealthInfoLang.values()
|
||||||
};
|
};
|
||||||
|
|
||||||
return Arrays.stream(lang)
|
return Arrays.stream(lang)
|
||||||
|
@ -0,0 +1,45 @@
|
|||||||
|
package com.djrapitops.plan.system.locale.lang;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* {@link Lang} enum for {@link com.djrapitops.plan.data.store.mutators.health.AbstractHealthInfo} related language.
|
||||||
|
*
|
||||||
|
* @author Rsl1122
|
||||||
|
*/
|
||||||
|
public enum HealthInfoLang implements Lang {
|
||||||
|
REGULAR_ACTIVITY_REMAIN("Regular Activity Remain", " ${0} of regular players have remained active (${1}/${2})"),
|
||||||
|
REGULAR_CHANGE("Regular Activity Change", " Number of regular players has "),
|
||||||
|
REGULAR_CHANGE_INCREASE("Regular Activity Change Increase", "increased (+${0})"),
|
||||||
|
REGULAR_CHANGE_ZERO("Regular Activity Change Zero", "stayed the same (+${0})"),
|
||||||
|
REGULAR_CHANGE_DECREASE("Regular Activity Change Decrease", "decreased (${0})"),
|
||||||
|
ACTIVE_PLAY_COMPARISON_INCREASE("Active Playtime Comparison Increase", " Active players seem to have things to do (Played ${0} vs ${1}, last two weeks vs weeks 2-4)"),
|
||||||
|
ACTIVE_PLAY_COMPARISON_DECREASE("Active Playtime Comparison Decrease", " Active players might be running out of things to do (Played ${0} vs ${1}, last two weeks vs weeks 2-4)"),
|
||||||
|
NEW_PLAYER_JOIN_PLAYERS_GOOD("New Player Join Players, Yes", " New Players have players to play with when they join (${0} on average)"),
|
||||||
|
NEW_PLAYER_JOIN_PLAYERS_BAD("New Player Join Players, No", " New Players may not have players to play with when they join (${0} on average)"),
|
||||||
|
NEW_PLAYER_STICKINESS("New Player Stickiness", " ${0} of new players have stuck around (${1}/${2})"),
|
||||||
|
TPS_ABOVE_LOW_THERSHOLD("TPS Above Low Threshold", " Average TPS was above Low Threshold ${0} of the time"),
|
||||||
|
TPS_LOW_DIPS("TPS Low Dips", " Average TPS dropped below Low Threshold (${0}) ${1} times"),
|
||||||
|
DOWNTIME("Downtime", "Total Server downtime (No Data) was ${0}"),
|
||||||
|
NO_SERVERS_INACCURACY("No Servers Inaccuracy", " No Bukkit/Sponge servers to gather session data - These measures are inaccurate."),
|
||||||
|
SINGLE_SERVER_INACCURACY("Single Servers Inaccuracy", " Single Bukkit/Sponge server to gather session data."),
|
||||||
|
PLAYER_VISIT_PER_SERVER("Player Visit Server", " players visit on servers per day/server on average."),
|
||||||
|
PLAYER_REGISTER_PER_SERVER("Player Register Server", " players register on servers per day/server on average."),
|
||||||
|
PLAYER_PLAY_ON_NETWORK("Player Play on Network", " players played on the network:");
|
||||||
|
|
||||||
|
private final String identifier;
|
||||||
|
private final String defaultValue;
|
||||||
|
|
||||||
|
HealthInfoLang(String identifier, String defaultValue) {
|
||||||
|
this.identifier = identifier;
|
||||||
|
this.defaultValue = defaultValue;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public String getIdentifier() {
|
||||||
|
return "Health - " + identifier;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public String getDefault() {
|
||||||
|
return defaultValue;
|
||||||
|
}
|
||||||
|
}
|
@ -314,4 +314,22 @@ WebServer FAIL - Port Bind || 未成功初始化网页服
|
|||||||
WebServer FAIL - SSL Context || 网页服务器:SSL 环境初始化失败。
|
WebServer FAIL - SSL Context || 网页服务器:SSL 环境初始化失败。
|
||||||
WebServer FAIL - Store Load || 网页服务器:SSL 证书载入失败。
|
WebServer FAIL - Store Load || 网页服务器:SSL 证书载入失败。
|
||||||
Yesterday || 'Yesterday'
|
Yesterday || 'Yesterday'
|
||||||
Today || 'Today'
|
Today || 'Today'
|
||||||
|
Health - Active Playtime Comparison Decrease || Active players might be running out of things to do (Played ${0} vs ${1}, last two weeks vs weeks 2-4)
|
||||||
|
Health - Active Playtime Comparison Increase || Active players seem to have things to do (Played ${0} vs ${1}, last two weeks vs weeks 2-4)
|
||||||
|
Health - Downtime || Total Server downtime (No Data) was ${0}
|
||||||
|
Health - New Player Join Players, No || New Players may not have players to play with when they join (${0} on average)
|
||||||
|
Health - New Player Join Players, Yes || New Players have players to play with when they join (${0} on average)
|
||||||
|
Health - New Player Stickiness || ${0} of new players have stuck around (${1}/${2})
|
||||||
|
Health - No Servers Inaccuracy || No Bukkit/Sponge servers to gather session data - These measures are inaccurate.
|
||||||
|
Health - Player Play on Network || players played on the network:
|
||||||
|
Health - Player Register Server || players register on servers per day/server on average.
|
||||||
|
Health - Player Visit Server || players visit on servers per day/server on average.
|
||||||
|
Health - Regular Activity Change || Number of regular players has
|
||||||
|
Health - Regular Activity Change Decrease || decreased (${0})
|
||||||
|
Health - Regular Activity Change Increase || increased (+${0})
|
||||||
|
Health - Regular Activity Change Zero || stayed the same (+${0})
|
||||||
|
Health - Regular Activity Remain || ${0} of regular players have remained active (${1}/${2})
|
||||||
|
Health - Single Servers Inaccuracy || Single Bukkit/Sponge server to gather session data.
|
||||||
|
Health - TPS Above Low Threshold || Average TPS was above Low Threshold ${0} of the time
|
||||||
|
Health - TPS Low Dips || Average TPS dropped below Low Threshold (${0}) ${1} times
|
@ -313,4 +313,22 @@ WebServer FAIL - Port Bind || WebServer was not initialized
|
|||||||
WebServer FAIL - SSL Context || WebServer: SSL Context Initialization Failed.
|
WebServer FAIL - SSL Context || WebServer: SSL Context Initialization Failed.
|
||||||
WebServer FAIL - Store Load || WebServer: SSL Certificate loading Failed.
|
WebServer FAIL - Store Load || WebServer: SSL Certificate loading Failed.
|
||||||
Yesterday || 'Yesterday'
|
Yesterday || 'Yesterday'
|
||||||
Today || 'Today'
|
Today || 'Today'
|
||||||
|
Health - Active Playtime Comparison Decrease || Active players might be running out of things to do (Played ${0} vs ${1}, last two weeks vs weeks 2-4)
|
||||||
|
Health - Active Playtime Comparison Increase || Active players seem to have things to do (Played ${0} vs ${1}, last two weeks vs weeks 2-4)
|
||||||
|
Health - Downtime || Total Server downtime (No Data) was ${0}
|
||||||
|
Health - New Player Join Players, No || New Players may not have players to play with when they join (${0} on average)
|
||||||
|
Health - New Player Join Players, Yes || New Players have players to play with when they join (${0} on average)
|
||||||
|
Health - New Player Stickiness || ${0} of new players have stuck around (${1}/${2})
|
||||||
|
Health - No Servers Inaccuracy || No Bukkit/Sponge servers to gather session data - These measures are inaccurate.
|
||||||
|
Health - Player Play on Network || players played on the network:
|
||||||
|
Health - Player Register Server || players register on servers per day/server on average.
|
||||||
|
Health - Player Visit Server || players visit on servers per day/server on average.
|
||||||
|
Health - Regular Activity Change || Number of regular players has
|
||||||
|
Health - Regular Activity Change Decrease || decreased (${0})
|
||||||
|
Health - Regular Activity Change Increase || increased (+${0})
|
||||||
|
Health - Regular Activity Change Zero || stayed the same (+${0})
|
||||||
|
Health - Regular Activity Remain || ${0} of regular players have remained active (${1}/${2})
|
||||||
|
Health - Single Servers Inaccuracy || Single Bukkit/Sponge server to gather session data.
|
||||||
|
Health - TPS Above Low Threshold || Average TPS was above Low Threshold ${0} of the time
|
||||||
|
Health - TPS Low Dips || Average TPS dropped below Low Threshold (${0}) ${1} times
|
@ -313,4 +313,22 @@ WebServer FAIL - Port Bind || WebServer wurde nicht erfolgr
|
|||||||
WebServer FAIL - SSL Context || WebServer: SSL Context Initialisierung fehlgeschlagen.
|
WebServer FAIL - SSL Context || WebServer: SSL Context Initialisierung fehlgeschlagen.
|
||||||
WebServer FAIL - Store Load || WebServer: SSL Zertifikat konnte nicht geladen werden.
|
WebServer FAIL - Store Load || WebServer: SSL Zertifikat konnte nicht geladen werden.
|
||||||
Yesterday || 'Yesterday'
|
Yesterday || 'Yesterday'
|
||||||
Today || 'Today'
|
Today || 'Today'
|
||||||
|
Health - Active Playtime Comparison Decrease || Active players might be running out of things to do (Played ${0} vs ${1}, last two weeks vs weeks 2-4)
|
||||||
|
Health - Active Playtime Comparison Increase || Active players seem to have things to do (Played ${0} vs ${1}, last two weeks vs weeks 2-4)
|
||||||
|
Health - Downtime || Total Server downtime (No Data) was ${0}
|
||||||
|
Health - New Player Join Players, No || New Players may not have players to play with when they join (${0} on average)
|
||||||
|
Health - New Player Join Players, Yes || New Players have players to play with when they join (${0} on average)
|
||||||
|
Health - New Player Stickiness || ${0} of new players have stuck around (${1}/${2})
|
||||||
|
Health - No Servers Inaccuracy || No Bukkit/Sponge servers to gather session data - These measures are inaccurate.
|
||||||
|
Health - Player Play on Network || players played on the network:
|
||||||
|
Health - Player Register Server || players register on servers per day/server on average.
|
||||||
|
Health - Player Visit Server || players visit on servers per day/server on average.
|
||||||
|
Health - Regular Activity Change || Number of regular players has
|
||||||
|
Health - Regular Activity Change Decrease || decreased (${0})
|
||||||
|
Health - Regular Activity Change Increase || increased (+${0})
|
||||||
|
Health - Regular Activity Change Zero || stayed the same (+${0})
|
||||||
|
Health - Regular Activity Remain || ${0} of regular players have remained active (${1}/${2})
|
||||||
|
Health - Single Servers Inaccuracy || Single Bukkit/Sponge server to gather session data.
|
||||||
|
Health - TPS Above Low Threshold || Average TPS was above Low Threshold ${0} of the time
|
||||||
|
Health - TPS Low Dips || Average TPS dropped below Low Threshold (${0}) ${1} times
|
@ -313,4 +313,22 @@ WebServer FAIL - Port Bind || WebServer was not initialized
|
|||||||
WebServer FAIL - SSL Context || WebServer: SSL Context Initialization Failed.
|
WebServer FAIL - SSL Context || WebServer: SSL Context Initialization Failed.
|
||||||
WebServer FAIL - Store Load || WebServer: SSL Certificate loading Failed.
|
WebServer FAIL - Store Load || WebServer: SSL Certificate loading Failed.
|
||||||
Yesterday || 'Yesterday'
|
Yesterday || 'Yesterday'
|
||||||
Today || 'Today'
|
Today || 'Today'
|
||||||
|
Health - Active Playtime Comparison Decrease || Active players might be running out of things to do (Played ${0} vs ${1}, last two weeks vs weeks 2-4)
|
||||||
|
Health - Active Playtime Comparison Increase || Active players seem to have things to do (Played ${0} vs ${1}, last two weeks vs weeks 2-4)
|
||||||
|
Health - Downtime || Total Server downtime (No Data) was ${0}
|
||||||
|
Health - New Player Join Players, No || New Players may not have players to play with when they join (${0} on average)
|
||||||
|
Health - New Player Join Players, Yes || New Players have players to play with when they join (${0} on average)
|
||||||
|
Health - New Player Stickiness || ${0} of new players have stuck around (${1}/${2})
|
||||||
|
Health - No Servers Inaccuracy || No Bukkit/Sponge servers to gather session data - These measures are inaccurate.
|
||||||
|
Health - Player Play on Network || players played on the network:
|
||||||
|
Health - Player Register Server || players register on servers per day/server on average.
|
||||||
|
Health - Player Visit Server || players visit on servers per day/server on average.
|
||||||
|
Health - Regular Activity Change || Number of regular players has
|
||||||
|
Health - Regular Activity Change Decrease || decreased (${0})
|
||||||
|
Health - Regular Activity Change Increase || increased (+${0})
|
||||||
|
Health - Regular Activity Change Zero || stayed the same (+${0})
|
||||||
|
Health - Regular Activity Remain || ${0} of regular players have remained active (${1}/${2})
|
||||||
|
Health - Single Servers Inaccuracy || Single Bukkit/Sponge server to gather session data.
|
||||||
|
Health - TPS Above Low Threshold || Average TPS was above Low Threshold ${0} of the time
|
||||||
|
Health - TPS Low Dips || Average TPS dropped below Low Threshold (${0}) ${1} times
|
@ -312,4 +312,22 @@ WebServer FAIL - Port Bind || Web Palvelin ei käynnistynyt
|
|||||||
WebServer FAIL - SSL Context || Web Palvelin: SSL Kontekstin käynnistys ei onnistunut.
|
WebServer FAIL - SSL Context || Web Palvelin: SSL Kontekstin käynnistys ei onnistunut.
|
||||||
WebServer FAIL - Store Load || Web Palvelin: SSL Sertifikaatin lataus ei onnistunut.
|
WebServer FAIL - Store Load || Web Palvelin: SSL Sertifikaatin lataus ei onnistunut.
|
||||||
Yesterday || 'Eilen'
|
Yesterday || 'Eilen'
|
||||||
Today || 'Tänään'
|
Today || 'Tänään'
|
||||||
|
Health - Active Playtime Comparison Decrease || Aktiivisilta pelaajilta voi olla loppumassa tekeminen (Pelasivat ${0} vs ${1}, viimeisen kahden viikon vs viikot 2-4)
|
||||||
|
Health - Active Playtime Comparison Increase || Aktiivisilta pelaajilta vaikuttaa olevan tekemistä (Pelasivat ${0} vs ${1}, viimeisen kahden viikon vs viikot 2-4)
|
||||||
|
Health - Downtime || Palvelimen downtime (Ei Dataa) oli ${0}
|
||||||
|
Health - New Player Join Players, No || Uusilla pelaajilla voi olla yksinäistä (${0} paikalla keskimäärin)
|
||||||
|
Health - New Player Join Players, Yes || Uusilla pelaajilla on kavereita liittyessä (${0} paikalla keskimäärin)
|
||||||
|
Health - New Player Stickiness || ${0} uusista pelaajista jäi pelaamaan (${1}/${2})
|
||||||
|
Health - No Servers Inaccuracy || Ei Bukkit/Sponge palvelimia sessio tietojen keräykseen - Nämä arviot ovat epätarkkoja.
|
||||||
|
Health - Player Play on Network || pelaajaa pelasi verkossa:
|
||||||
|
Health - Player Register Server || pelaajaa rekisteröityi palvelimille per päivä/palvelin keskimäärin.
|
||||||
|
Health - Player Visit Server || pelaajaa käy palvelimilla per päivä/palvelin keskimäärin.
|
||||||
|
Health - Regular Activity Change || Kestopelaajien määrä on
|
||||||
|
Health - Regular Activity Change Decrease || pienentynyt (${0})
|
||||||
|
Health - Regular Activity Change Increase || kasvanut (+${0})
|
||||||
|
Health - Regular Activity Change Zero || pysynyt samana (+${0})
|
||||||
|
Health - Regular Activity Remain || ${0} kestopelaajista on pysynyt aktiivisena (${1}/${2})
|
||||||
|
Health - Single Servers Inaccuracy || Yksi Bukkit/Sponge palvelin sessio tietojen keräykseen.
|
||||||
|
Health - TPS Above Low Threshold || Keskimääräinen TPS oli alarajan yläpuolella ${0} ajasta
|
||||||
|
Health - TPS Low Dips || Keskimääräinen TPS putosi alarajan alapuolelle (${0}) ${1} kertaa
|
@ -313,4 +313,22 @@ WebServer FAIL - Port Bind || WebServer was not initialized
|
|||||||
WebServer FAIL - SSL Context || WebServer: SSL Context Initialization Failed.
|
WebServer FAIL - SSL Context || WebServer: SSL Context Initialization Failed.
|
||||||
WebServer FAIL - Store Load || WebServer: SSL Certificate loading Failed.
|
WebServer FAIL - Store Load || WebServer: SSL Certificate loading Failed.
|
||||||
Yesterday || 'Yesterday'
|
Yesterday || 'Yesterday'
|
||||||
Today || 'Today'
|
Today || 'Today'
|
||||||
|
Health - Active Playtime Comparison Decrease || Active players might be running out of things to do (Played ${0} vs ${1}, last two weeks vs weeks 2-4)
|
||||||
|
Health - Active Playtime Comparison Increase || Active players seem to have things to do (Played ${0} vs ${1}, last two weeks vs weeks 2-4)
|
||||||
|
Health - Downtime || Total Server downtime (No Data) was ${0}
|
||||||
|
Health - New Player Join Players, No || New Players may not have players to play with when they join (${0} on average)
|
||||||
|
Health - New Player Join Players, Yes || New Players have players to play with when they join (${0} on average)
|
||||||
|
Health - New Player Stickiness || ${0} of new players have stuck around (${1}/${2})
|
||||||
|
Health - No Servers Inaccuracy || No Bukkit/Sponge servers to gather session data - These measures are inaccurate.
|
||||||
|
Health - Player Play on Network || players played on the network:
|
||||||
|
Health - Player Register Server || players register on servers per day/server on average.
|
||||||
|
Health - Player Visit Server || players visit on servers per day/server on average.
|
||||||
|
Health - Regular Activity Change || Number of regular players has
|
||||||
|
Health - Regular Activity Change Decrease || decreased (${0})
|
||||||
|
Health - Regular Activity Change Increase || increased (+${0})
|
||||||
|
Health - Regular Activity Change Zero || stayed the same (+${0})
|
||||||
|
Health - Regular Activity Remain || ${0} of regular players have remained active (${1}/${2})
|
||||||
|
Health - Single Servers Inaccuracy || Single Bukkit/Sponge server to gather session data.
|
||||||
|
Health - TPS Above Low Threshold || Average TPS was above Low Threshold ${0} of the time
|
||||||
|
Health - TPS Low Dips || Average TPS dropped below Low Threshold (${0}) ${1} times
|
@ -313,4 +313,22 @@ WebServer FAIL - Port Bind || WebServer was not initialized
|
|||||||
WebServer FAIL - SSL Context || WebServer: SSL Context Initialization Failed.
|
WebServer FAIL - SSL Context || WebServer: SSL Context Initialization Failed.
|
||||||
WebServer FAIL - Store Load || WebServer: SSL Certificate loading Failed.
|
WebServer FAIL - Store Load || WebServer: SSL Certificate loading Failed.
|
||||||
Yesterday || 'Yesterday'
|
Yesterday || 'Yesterday'
|
||||||
Today || 'Today'
|
Today || 'Today'
|
||||||
|
Health - Active Playtime Comparison Decrease || Active players might be running out of things to do (Played ${0} vs ${1}, last two weeks vs weeks 2-4)
|
||||||
|
Health - Active Playtime Comparison Increase || Active players seem to have things to do (Played ${0} vs ${1}, last two weeks vs weeks 2-4)
|
||||||
|
Health - Downtime || Total Server downtime (No Data) was ${0}
|
||||||
|
Health - New Player Join Players, No || New Players may not have players to play with when they join (${0} on average)
|
||||||
|
Health - New Player Join Players, Yes || New Players have players to play with when they join (${0} on average)
|
||||||
|
Health - New Player Stickiness || ${0} of new players have stuck around (${1}/${2})
|
||||||
|
Health - No Servers Inaccuracy || No Bukkit/Sponge servers to gather session data - These measures are inaccurate.
|
||||||
|
Health - Player Play on Network || players played on the network:
|
||||||
|
Health - Player Register Server || players register on servers per day/server on average.
|
||||||
|
Health - Player Visit Server || players visit on servers per day/server on average.
|
||||||
|
Health - Regular Activity Change || Number of regular players has
|
||||||
|
Health - Regular Activity Change Decrease || decreased (${0})
|
||||||
|
Health - Regular Activity Change Increase || increased (+${0})
|
||||||
|
Health - Regular Activity Change Zero || stayed the same (+${0})
|
||||||
|
Health - Regular Activity Remain || ${0} of regular players have remained active (${1}/${2})
|
||||||
|
Health - Single Servers Inaccuracy || Single Bukkit/Sponge server to gather session data.
|
||||||
|
Health - TPS Above Low Threshold || Average TPS was above Low Threshold ${0} of the time
|
||||||
|
Health - TPS Low Dips || Average TPS dropped below Low Threshold (${0}) ${1} times
|
@ -313,4 +313,22 @@ WebServer FAIL - Port Bind || WebServer was not initialized
|
|||||||
WebServer FAIL - SSL Context || WebServer: SSL Context Initialization Failed.
|
WebServer FAIL - SSL Context || WebServer: SSL Context Initialization Failed.
|
||||||
WebServer FAIL - Store Load || WebServer: SSL Certificate loading Failed.
|
WebServer FAIL - Store Load || WebServer: SSL Certificate loading Failed.
|
||||||
Yesterday || 'Yesterday'
|
Yesterday || 'Yesterday'
|
||||||
Today || 'Today'
|
Today || 'Today'
|
||||||
|
Health - Active Playtime Comparison Decrease || Active players might be running out of things to do (Played ${0} vs ${1}, last two weeks vs weeks 2-4)
|
||||||
|
Health - Active Playtime Comparison Increase || Active players seem to have things to do (Played ${0} vs ${1}, last two weeks vs weeks 2-4)
|
||||||
|
Health - Downtime || Total Server downtime (No Data) was ${0}
|
||||||
|
Health - New Player Join Players, No || New Players may not have players to play with when they join (${0} on average)
|
||||||
|
Health - New Player Join Players, Yes || New Players have players to play with when they join (${0} on average)
|
||||||
|
Health - New Player Stickiness || ${0} of new players have stuck around (${1}/${2})
|
||||||
|
Health - No Servers Inaccuracy || No Bukkit/Sponge servers to gather session data - These measures are inaccurate.
|
||||||
|
Health - Player Play on Network || players played on the network:
|
||||||
|
Health - Player Register Server || players register on servers per day/server on average.
|
||||||
|
Health - Player Visit Server || players visit on servers per day/server on average.
|
||||||
|
Health - Regular Activity Change || Number of regular players has
|
||||||
|
Health - Regular Activity Change Decrease || decreased (${0})
|
||||||
|
Health - Regular Activity Change Increase || increased (+${0})
|
||||||
|
Health - Regular Activity Change Zero || stayed the same (+${0})
|
||||||
|
Health - Regular Activity Remain || ${0} of regular players have remained active (${1}/${2})
|
||||||
|
Health - Single Servers Inaccuracy || Single Bukkit/Sponge server to gather session data.
|
||||||
|
Health - TPS Above Low Threshold || Average TPS was above Low Threshold ${0} of the time
|
||||||
|
Health - TPS Low Dips || Average TPS dropped below Low Threshold (${0}) ${1} times
|
@ -313,4 +313,22 @@ WebServer FAIL - Port Bind || WebServer was not initialized
|
|||||||
WebServer FAIL - SSL Context || WebServer: SSL Context Initialization Failed.
|
WebServer FAIL - SSL Context || WebServer: SSL Context Initialization Failed.
|
||||||
WebServer FAIL - Store Load || WebServer: SSL Certificate loading Failed.
|
WebServer FAIL - Store Load || WebServer: SSL Certificate loading Failed.
|
||||||
Yesterday || 'Yesterday'
|
Yesterday || 'Yesterday'
|
||||||
Today || 'Today'
|
Today || 'Today'
|
||||||
|
Health - Active Playtime Comparison Decrease || Active players might be running out of things to do (Played ${0} vs ${1}, last two weeks vs weeks 2-4)
|
||||||
|
Health - Active Playtime Comparison Increase || Active players seem to have things to do (Played ${0} vs ${1}, last two weeks vs weeks 2-4)
|
||||||
|
Health - Downtime || Total Server downtime (No Data) was ${0}
|
||||||
|
Health - New Player Join Players, No || New Players may not have players to play with when they join (${0} on average)
|
||||||
|
Health - New Player Join Players, Yes || New Players have players to play with when they join (${0} on average)
|
||||||
|
Health - New Player Stickiness || ${0} of new players have stuck around (${1}/${2})
|
||||||
|
Health - No Servers Inaccuracy || No Bukkit/Sponge servers to gather session data - These measures are inaccurate.
|
||||||
|
Health - Player Play on Network || players played on the network:
|
||||||
|
Health - Player Register Server || players register on servers per day/server on average.
|
||||||
|
Health - Player Visit Server || players visit on servers per day/server on average.
|
||||||
|
Health - Regular Activity Change || Number of regular players has
|
||||||
|
Health - Regular Activity Change Decrease || decreased (${0})
|
||||||
|
Health - Regular Activity Change Increase || increased (+${0})
|
||||||
|
Health - Regular Activity Change Zero || stayed the same (+${0})
|
||||||
|
Health - Regular Activity Remain || ${0} of regular players have remained active (${1}/${2})
|
||||||
|
Health - Single Servers Inaccuracy || Single Bukkit/Sponge server to gather session data.
|
||||||
|
Health - TPS Above Low Threshold || Average TPS was above Low Threshold ${0} of the time
|
||||||
|
Health - TPS Low Dips || Average TPS dropped below Low Threshold (${0}) ${1} times
|
@ -313,4 +313,22 @@ WebServer FAIL - Port Bind || WebServer was not initialized
|
|||||||
WebServer FAIL - SSL Context || WebServer: SSL Context Initialization Failed.
|
WebServer FAIL - SSL Context || WebServer: SSL Context Initialization Failed.
|
||||||
WebServer FAIL - Store Load || WebServer: SSL Certificate loading Failed.
|
WebServer FAIL - Store Load || WebServer: SSL Certificate loading Failed.
|
||||||
Yesterday || 'Yesterday'
|
Yesterday || 'Yesterday'
|
||||||
Today || 'Today'
|
Today || 'Today'
|
||||||
|
Health - Active Playtime Comparison Decrease || Active players might be running out of things to do (Played ${0} vs ${1}, last two weeks vs weeks 2-4)
|
||||||
|
Health - Active Playtime Comparison Increase || Active players seem to have things to do (Played ${0} vs ${1}, last two weeks vs weeks 2-4)
|
||||||
|
Health - Downtime || Total Server downtime (No Data) was ${0}
|
||||||
|
Health - New Player Join Players, No || New Players may not have players to play with when they join (${0} on average)
|
||||||
|
Health - New Player Join Players, Yes || New Players have players to play with when they join (${0} on average)
|
||||||
|
Health - New Player Stickiness || ${0} of new players have stuck around (${1}/${2})
|
||||||
|
Health - No Servers Inaccuracy || No Bukkit/Sponge servers to gather session data - These measures are inaccurate.
|
||||||
|
Health - Player Play on Network || players played on the network:
|
||||||
|
Health - Player Register Server || players register on servers per day/server on average.
|
||||||
|
Health - Player Visit Server || players visit on servers per day/server on average.
|
||||||
|
Health - Regular Activity Change || Number of regular players has
|
||||||
|
Health - Regular Activity Change Decrease || decreased (${0})
|
||||||
|
Health - Regular Activity Change Increase || increased (+${0})
|
||||||
|
Health - Regular Activity Change Zero || stayed the same (+${0})
|
||||||
|
Health - Regular Activity Remain || ${0} of regular players have remained active (${1}/${2})
|
||||||
|
Health - Single Servers Inaccuracy || Single Bukkit/Sponge server to gather session data.
|
||||||
|
Health - TPS Above Low Threshold || Average TPS was above Low Threshold ${0} of the time
|
||||||
|
Health - TPS Low Dips || Average TPS dropped below Low Threshold (${0}) ${1} times
|
@ -313,4 +313,22 @@ WebServer FAIL - Port Bind || WebServer was not initialized
|
|||||||
WebServer FAIL - SSL Context || WebServer: SSL Context Initialization Failed.
|
WebServer FAIL - SSL Context || WebServer: SSL Context Initialization Failed.
|
||||||
WebServer FAIL - Store Load || WebServer: SSL Certificate loading Failed.
|
WebServer FAIL - Store Load || WebServer: SSL Certificate loading Failed.
|
||||||
Yesterday || 'Yesterday'
|
Yesterday || 'Yesterday'
|
||||||
Today || 'Today'
|
Today || 'Today'
|
||||||
|
Health - Active Playtime Comparison Decrease || Active players might be running out of things to do (Played ${0} vs ${1}, last two weeks vs weeks 2-4)
|
||||||
|
Health - Active Playtime Comparison Increase || Active players seem to have things to do (Played ${0} vs ${1}, last two weeks vs weeks 2-4)
|
||||||
|
Health - Downtime || Total Server downtime (No Data) was ${0}
|
||||||
|
Health - New Player Join Players, No || New Players may not have players to play with when they join (${0} on average)
|
||||||
|
Health - New Player Join Players, Yes || New Players have players to play with when they join (${0} on average)
|
||||||
|
Health - New Player Stickiness || ${0} of new players have stuck around (${1}/${2})
|
||||||
|
Health - No Servers Inaccuracy || No Bukkit/Sponge servers to gather session data - These measures are inaccurate.
|
||||||
|
Health - Player Play on Network || players played on the network:
|
||||||
|
Health - Player Register Server || players register on servers per day/server on average.
|
||||||
|
Health - Player Visit Server || players visit on servers per day/server on average.
|
||||||
|
Health - Regular Activity Change || Number of regular players has
|
||||||
|
Health - Regular Activity Change Decrease || decreased (${0})
|
||||||
|
Health - Regular Activity Change Increase || increased (+${0})
|
||||||
|
Health - Regular Activity Change Zero || stayed the same (+${0})
|
||||||
|
Health - Regular Activity Remain || ${0} of regular players have remained active (${1}/${2})
|
||||||
|
Health - Single Servers Inaccuracy || Single Bukkit/Sponge server to gather session data.
|
||||||
|
Health - TPS Above Low Threshold || Average TPS was above Low Threshold ${0} of the time
|
||||||
|
Health - TPS Low Dips || Average TPS dropped below Low Threshold (${0}) ${1} times
|
@ -313,4 +313,22 @@ WebServer FAIL - Port Bind || WebServer was not initialized
|
|||||||
WebServer FAIL - SSL Context || WebServer: SSL Context Initialization Failed.
|
WebServer FAIL - SSL Context || WebServer: SSL Context Initialization Failed.
|
||||||
WebServer FAIL - Store Load || WebServer: SSL Certificate loading Failed.
|
WebServer FAIL - Store Load || WebServer: SSL Certificate loading Failed.
|
||||||
Yesterday || 'Yesterday'
|
Yesterday || 'Yesterday'
|
||||||
Today || 'Today'
|
Today || 'Today'
|
||||||
|
Health - Active Playtime Comparison Decrease || Active players might be running out of things to do (Played ${0} vs ${1}, last two weeks vs weeks 2-4)
|
||||||
|
Health - Active Playtime Comparison Increase || Active players seem to have things to do (Played ${0} vs ${1}, last two weeks vs weeks 2-4)
|
||||||
|
Health - Downtime || Total Server downtime (No Data) was ${0}
|
||||||
|
Health - New Player Join Players, No || New Players may not have players to play with when they join (${0} on average)
|
||||||
|
Health - New Player Join Players, Yes || New Players have players to play with when they join (${0} on average)
|
||||||
|
Health - New Player Stickiness || ${0} of new players have stuck around (${1}/${2})
|
||||||
|
Health - No Servers Inaccuracy || No Bukkit/Sponge servers to gather session data - These measures are inaccurate.
|
||||||
|
Health - Player Play on Network || players played on the network:
|
||||||
|
Health - Player Register Server || players register on servers per day/server on average.
|
||||||
|
Health - Player Visit Server || players visit on servers per day/server on average.
|
||||||
|
Health - Regular Activity Change || Number of regular players has
|
||||||
|
Health - Regular Activity Change Decrease || decreased (${0})
|
||||||
|
Health - Regular Activity Change Increase || increased (+${0})
|
||||||
|
Health - Regular Activity Change Zero || stayed the same (+${0})
|
||||||
|
Health - Regular Activity Remain || ${0} of regular players have remained active (${1}/${2})
|
||||||
|
Health - Single Servers Inaccuracy || Single Bukkit/Sponge server to gather session data.
|
||||||
|
Health - TPS Above Low Threshold || Average TPS was above Low Threshold ${0} of the time
|
||||||
|
Health - TPS Low Dips || Average TPS dropped below Low Threshold (${0}) ${1} times
|
Loading…
Reference in New Issue
Block a user