diff --git a/Plan/src/main/java/com/djrapitops/plan/command/commands/ListServersCommand.java b/Plan/src/main/java/com/djrapitops/plan/command/commands/ListServersCommand.java index 931f419f9..35429e6b4 100644 --- a/Plan/src/main/java/com/djrapitops/plan/command/commands/ListServersCommand.java +++ b/Plan/src/main/java/com/djrapitops/plan/command/commands/ListServersCommand.java @@ -1,7 +1,7 @@ package com.djrapitops.plan.command.commands; import com.djrapitops.plan.api.exceptions.database.DBOpException; -import com.djrapitops.plan.data.store.mutators.formatting.Formatter; +import com.djrapitops.plan.utilities.formatting.Formatter; import com.djrapitops.plan.system.database.databases.Database; import com.djrapitops.plan.system.info.server.Server; import com.djrapitops.plan.system.locale.Locale; diff --git a/Plan/src/main/java/com/djrapitops/plan/command/commands/QInspectCommand.java b/Plan/src/main/java/com/djrapitops/plan/command/commands/QInspectCommand.java index a78c7a221..53d152204 100644 --- a/Plan/src/main/java/com/djrapitops/plan/command/commands/QInspectCommand.java +++ b/Plan/src/main/java/com/djrapitops/plan/command/commands/QInspectCommand.java @@ -7,8 +7,8 @@ import com.djrapitops.plan.data.store.keys.PlayerKeys; import com.djrapitops.plan.data.store.mutators.ActivityIndex; import com.djrapitops.plan.data.store.mutators.GeoInfoMutator; import com.djrapitops.plan.data.store.mutators.SessionsMutator; -import com.djrapitops.plan.data.store.mutators.formatting.Formatter; -import com.djrapitops.plan.data.store.mutators.formatting.Formatters; +import com.djrapitops.plan.utilities.formatting.Formatter; +import com.djrapitops.plan.utilities.formatting.Formatters; import com.djrapitops.plan.data.store.objects.DateHolder; import com.djrapitops.plan.system.database.databases.Database; import com.djrapitops.plan.system.locale.Locale; @@ -45,6 +45,7 @@ public class QInspectCommand extends CommandNode { private final Locale locale; private final Database database; private final Processing processing; + private final Formatters formatters; private final UUIDUtility uuidUtility; private final ErrorHandler errorHandler; @@ -54,10 +55,12 @@ public class QInspectCommand extends CommandNode { Processing processing, Database database, UUIDUtility uuidUtility, + Formatters formatters, ErrorHandler errorHandler ) { super("qinspect", Permissions.QUICK_INSPECT.getPermission(), CommandType.PLAYER_OR_ARGS); this.processing = processing; + this.formatters = formatters; setArguments(""); this.locale = locale; @@ -107,8 +110,8 @@ public class QInspectCommand extends CommandNode { private void sendMessages(ISender sender, PlayerContainer player) { long now = System.currentTimeMillis(); - Formatter timestamp = Formatters.year(); - Formatter length = Formatters.timeAmount(); + Formatter timestamp = formatters.year(); + Formatter length = formatters.timeAmount(); String playerName = player.getValue(PlayerKeys.NAME).orElse(locale.getString(GenericLang.UNKNOWN)); diff --git a/Plan/src/main/java/com/djrapitops/plan/command/commands/manage/ManageBackupCommand.java b/Plan/src/main/java/com/djrapitops/plan/command/commands/manage/ManageBackupCommand.java index 6269e4a89..4ccf5fde2 100644 --- a/Plan/src/main/java/com/djrapitops/plan/command/commands/manage/ManageBackupCommand.java +++ b/Plan/src/main/java/com/djrapitops/plan/command/commands/manage/ManageBackupCommand.java @@ -2,7 +2,7 @@ package com.djrapitops.plan.command.commands.manage; import com.djrapitops.plan.api.exceptions.database.DBException; import com.djrapitops.plan.api.exceptions.database.DBInitException; -import com.djrapitops.plan.data.store.mutators.formatting.Formatters; +import com.djrapitops.plan.utilities.formatting.Formatters; import com.djrapitops.plan.system.database.DBSystem; import com.djrapitops.plan.system.database.databases.Database; import com.djrapitops.plan.system.database.databases.sql.SQLiteDB; @@ -105,7 +105,7 @@ public class ManageBackupCommand extends CommandNode { private void createNewBackup(String dbName, Database copyFromDB) { SQLiteDB backupDB = null; try { - String timeStamp = Formatters.iso8601NoClock().apply(System::currentTimeMillis); + String timeStamp = Formatters.iso8601NoClock_Old().apply(System::currentTimeMillis); String fileName = dbName + "-backup-" + timeStamp; backupDB = sqliteFactory.usingFileCalled(fileName); Collection uuids = copyFromDB.fetch().getSavedUUIDs(); diff --git a/Plan/src/main/java/com/djrapitops/plan/data/container/Session.java b/Plan/src/main/java/com/djrapitops/plan/data/container/Session.java index cc548ce01..eb06dfd9e 100644 --- a/Plan/src/main/java/com/djrapitops/plan/data/container/Session.java +++ b/Plan/src/main/java/com/djrapitops/plan/data/container/Session.java @@ -2,7 +2,7 @@ package com.djrapitops.plan.data.container; import com.djrapitops.plan.data.store.containers.DataContainer; import com.djrapitops.plan.data.store.keys.SessionKeys; -import com.djrapitops.plan.data.store.mutators.formatting.Formatters; +import com.djrapitops.plan.utilities.formatting.Formatters; import com.djrapitops.plan.data.store.objects.DateHolder; import com.djrapitops.plan.data.time.WorldTimes; import com.djrapitops.plan.system.info.server.ServerInfo; @@ -246,6 +246,6 @@ public class Session extends DataContainer implements DateHolder { double quotient = longest * 1.0 / total; - return theWorld + " (" + Formatters.percentage().apply(quotient) + ")"; + return theWorld + " (" + Formatters.percentage_Old().apply(quotient) + ")"; } } diff --git a/Plan/src/main/java/com/djrapitops/plan/data/element/TableContainer.java b/Plan/src/main/java/com/djrapitops/plan/data/element/TableContainer.java index 44d725caf..fc4b6f6fb 100644 --- a/Plan/src/main/java/com/djrapitops/plan/data/element/TableContainer.java +++ b/Plan/src/main/java/com/djrapitops/plan/data/element/TableContainer.java @@ -4,7 +4,7 @@ */ package com.djrapitops.plan.data.element; -import com.djrapitops.plan.data.store.mutators.formatting.Formatter; +import com.djrapitops.plan.utilities.formatting.Formatter; import com.djrapitops.plan.utilities.html.Html; import com.djrapitops.plan.utilities.html.icon.Icon; import com.djrapitops.plugin.utilities.ArrayUtil; diff --git a/Plan/src/main/java/com/djrapitops/plan/data/store/containers/AnalysisContainer.java b/Plan/src/main/java/com/djrapitops/plan/data/store/containers/AnalysisContainer.java index a0f7eacde..8ca73e13f 100644 --- a/Plan/src/main/java/com/djrapitops/plan/data/store/containers/AnalysisContainer.java +++ b/Plan/src/main/java/com/djrapitops/plan/data/store/containers/AnalysisContainer.java @@ -7,7 +7,7 @@ import com.djrapitops.plan.data.store.keys.PlayerKeys; import com.djrapitops.plan.data.store.keys.ServerKeys; import com.djrapitops.plan.data.store.mutators.*; import com.djrapitops.plan.data.store.mutators.combiners.MultiBanCombiner; -import com.djrapitops.plan.data.store.mutators.formatting.Formatters; +import com.djrapitops.plan.utilities.formatting.Formatters; import com.djrapitops.plan.data.store.mutators.health.HealthInformation; import com.djrapitops.plan.data.time.WorldTimes; import com.djrapitops.plan.system.database.databases.Database; @@ -93,7 +93,7 @@ public class AnalysisContainer extends DataContainer { putRawData(AnalysisKeys.ANALYSIS_TIME_DAY_AGO, now - TimeAmount.DAY.ms()); putRawData(AnalysisKeys.ANALYSIS_TIME_WEEK_AGO, now - TimeAmount.WEEK.ms()); putRawData(AnalysisKeys.ANALYSIS_TIME_MONTH_AGO, now - TimeAmount.MONTH.ms()); - putSupplier(AnalysisKeys.REFRESH_TIME_F, () -> Formatters.second().apply(() -> getUnsafe(AnalysisKeys.ANALYSIS_TIME))); + putSupplier(AnalysisKeys.REFRESH_TIME_F, () -> Formatters.second_Old().apply(() -> getUnsafe(AnalysisKeys.ANALYSIS_TIME))); putRawData(AnalysisKeys.VERSION, version); putSupplier(AnalysisKeys.TIME_ZONE, MiscUtils::getTimeZoneOffsetHours); @@ -146,11 +146,11 @@ public class AnalysisContainer extends DataContainer { ); putSupplier(AnalysisKeys.LAST_PEAK_TIME_F, () -> serverContainer.getValue(ServerKeys.RECENT_PEAK_PLAYERS) - .map(dateObj -> Formatters.year().apply(dateObj)).orElse("-") + .map(dateObj -> Formatters.year_Old().apply(dateObj)).orElse("-") ); putSupplier(AnalysisKeys.ALL_TIME_PEAK_TIME_F, () -> serverContainer.getValue(ServerKeys.ALL_TIME_PEAK_PLAYERS) - .map(dateObj -> Formatters.year().apply(dateObj)).orElse("-") + .map(dateObj -> Formatters.year_Old().apply(dateObj)).orElse("-") ); putSupplier(AnalysisKeys.OPERATORS, () -> serverContainer.getValue(ServerKeys.OPERATORS).map(List::size).orElse(0)); putSupplier(AnalysisKeys.PLAYERS_TABLE, () -> @@ -243,20 +243,20 @@ public class AnalysisContainer extends DataContainer { putSupplier(AnalysisKeys.PLAYERS_RETAINED_DAY_PERC, () -> { try { Integer playersNewDay = getUnsafe(AnalysisKeys.PLAYERS_NEW_DAY); - return playersNewDay != 0 ? Formatters.percentage().apply(1.0 * getUnsafe(retentionDay) / playersNewDay) : "-"; + return playersNewDay != 0 ? Formatters.percentage_Old().apply(1.0 * getUnsafe(retentionDay) / playersNewDay) : "-"; } catch (IllegalStateException noPlayersAfterDateFiltering) { return "Not enough data"; } }); putSupplier(AnalysisKeys.PLAYERS_RETAINED_WEEK_PERC, () -> { Integer playersNewWeek = getUnsafe(AnalysisKeys.PLAYERS_NEW_WEEK); - return playersNewWeek != 0 ? Formatters.percentage().apply( + return playersNewWeek != 0 ? Formatters.percentage_Old().apply( 1.0 * getUnsafe(AnalysisKeys.PLAYERS_RETAINED_WEEK) / playersNewWeek) : "-"; } ); putSupplier(AnalysisKeys.PLAYERS_RETAINED_MONTH_PERC, () -> { Integer playersNewMonth = getUnsafe(AnalysisKeys.PLAYERS_NEW_MONTH); - return playersNewMonth != 0 ? Formatters.percentage().apply( + return playersNewMonth != 0 ? Formatters.percentage_Old().apply( 1.0 * getUnsafe(AnalysisKeys.PLAYERS_RETAINED_MONTH) / playersNewMonth) : "-"; } ); @@ -281,7 +281,7 @@ public class AnalysisContainer extends DataContainer { getUnsafe(AnalysisKeys.PLAYER_NAMES), getUnsafe(AnalysisKeys.SESSIONS_MUTATOR).all()).parseHtml() ); - putSupplier(AnalysisKeys.AVERAGE_SESSION_LENGTH_F, () -> Formatters.timeAmount() + putSupplier(AnalysisKeys.AVERAGE_SESSION_LENGTH_F, () -> Formatters.timeAmount_Old() .apply(getUnsafe(AnalysisKeys.SESSIONS_MUTATOR).toAverageSessionLength()) ); putSupplier(AnalysisKeys.SESSION_COUNT, () -> getUnsafe(AnalysisKeys.SESSIONS_MUTATOR).count()); @@ -289,16 +289,16 @@ public class AnalysisContainer extends DataContainer { putSupplier(AnalysisKeys.DEATHS, () -> getUnsafe(AnalysisKeys.SESSIONS_MUTATOR).toDeathCount()); putSupplier(AnalysisKeys.MOB_KILL_COUNT, () -> getUnsafe(AnalysisKeys.SESSIONS_MUTATOR).toMobKillCount()); putSupplier(AnalysisKeys.PLAYER_KILL_COUNT, () -> getUnsafe(AnalysisKeys.SESSIONS_MUTATOR).toPlayerKillCount()); - putSupplier(AnalysisKeys.PLAYTIME_F, () -> Formatters.timeAmount() + putSupplier(AnalysisKeys.PLAYTIME_F, () -> Formatters.timeAmount_Old() .apply(getUnsafe(AnalysisKeys.PLAYTIME_TOTAL)) ); putSupplier(AnalysisKeys.AVERAGE_PLAYTIME_F, () -> { long players = getUnsafe(AnalysisKeys.PLAYERS_TOTAL); - return players != 0 ? Formatters.timeAmount() + return players != 0 ? Formatters.timeAmount_Old() .apply(getUnsafe(AnalysisKeys.PLAYTIME_TOTAL) / players) : "-"; } ); - putSupplier(AnalysisKeys.AVERAGE_SESSION_LENGTH_F, () -> Formatters.timeAmount() + putSupplier(AnalysisKeys.AVERAGE_SESSION_LENGTH_F, () -> Formatters.timeAmount_Old() .apply(getUnsafe(AnalysisKeys.SESSIONS_MUTATOR).toAverageSessionLength()) ); diff --git a/Plan/src/main/java/com/djrapitops/plan/data/store/containers/DataContainer.java b/Plan/src/main/java/com/djrapitops/plan/data/store/containers/DataContainer.java index 96d7ca388..5b98b9212 100644 --- a/Plan/src/main/java/com/djrapitops/plan/data/store/containers/DataContainer.java +++ b/Plan/src/main/java/com/djrapitops/plan/data/store/containers/DataContainer.java @@ -2,7 +2,7 @@ package com.djrapitops.plan.data.store.containers; import com.djrapitops.plan.data.store.CachingSupplier; import com.djrapitops.plan.data.store.Key; -import com.djrapitops.plan.data.store.mutators.formatting.Formatter; +import com.djrapitops.plan.utilities.formatting.Formatter; import com.djrapitops.plugin.api.TimeAmount; import java.util.HashMap; diff --git a/Plan/src/main/java/com/djrapitops/plan/data/store/containers/NetworkContainer.java b/Plan/src/main/java/com/djrapitops/plan/data/store/containers/NetworkContainer.java index a7090aeed..e0240da37 100644 --- a/Plan/src/main/java/com/djrapitops/plan/data/store/containers/NetworkContainer.java +++ b/Plan/src/main/java/com/djrapitops/plan/data/store/containers/NetworkContainer.java @@ -6,7 +6,7 @@ import com.djrapitops.plan.data.store.keys.NetworkKeys; import com.djrapitops.plan.data.store.keys.ServerKeys; import com.djrapitops.plan.data.store.mutators.PlayersMutator; import com.djrapitops.plan.data.store.mutators.TPSMutator; -import com.djrapitops.plan.data.store.mutators.formatting.Formatters; +import com.djrapitops.plan.utilities.formatting.Formatters; import com.djrapitops.plan.data.store.mutators.health.NetworkHealthInformation; import com.djrapitops.plan.system.database.databases.Database; import com.djrapitops.plan.system.info.server.ServerInfo; @@ -80,7 +80,7 @@ public class NetworkContainer extends DataContainer { putRawData(NetworkKeys.REFRESH_TIME_DAY_AGO, getUnsafe(NetworkKeys.REFRESH_TIME) - TimeAmount.DAY.ms()); putRawData(NetworkKeys.REFRESH_TIME_WEEK_AGO, getUnsafe(NetworkKeys.REFRESH_TIME) - TimeAmount.WEEK.ms()); putRawData(NetworkKeys.REFRESH_TIME_MONTH_AGO, getUnsafe(NetworkKeys.REFRESH_TIME) - TimeAmount.MONTH.ms()); - putSupplier(NetworkKeys.REFRESH_TIME_F, () -> Formatters.second().apply(() -> getUnsafe(NetworkKeys.REFRESH_TIME))); + putSupplier(NetworkKeys.REFRESH_TIME_F, () -> Formatters.second_Old().apply(() -> getUnsafe(NetworkKeys.REFRESH_TIME))); putRawData(NetworkKeys.VERSION, PlanPlugin.getInstance().getVersion()); putSupplier(NetworkKeys.TIME_ZONE, MiscUtils::getTimeZoneOffsetHours); @@ -119,10 +119,10 @@ public class NetworkContainer extends DataContainer { ); putSupplier(NetworkKeys.ALL_TIME_PEAK_TIME_F, () -> - bungeeContainer.getValue(ServerKeys.ALL_TIME_PEAK_PLAYERS).map(Formatters.year()::apply).orElse("No data") + bungeeContainer.getValue(ServerKeys.ALL_TIME_PEAK_PLAYERS).map(Formatters.year_Old()::apply).orElse("No data") ); putSupplier(NetworkKeys.RECENT_PEAK_TIME_F, () -> - bungeeContainer.getValue(ServerKeys.RECENT_PEAK_PLAYERS).map(Formatters.year()::apply).orElse("No data") + bungeeContainer.getValue(ServerKeys.RECENT_PEAK_PLAYERS).map(Formatters.year_Old()::apply).orElse("No data") ); putSupplier(NetworkKeys.PLAYERS_ALL_TIME_PEAK, () -> bungeeContainer.getValue(ServerKeys.ALL_TIME_PEAK_PLAYERS).map(dateObj -> "" + dateObj.getValue()).orElse("-") diff --git a/Plan/src/main/java/com/djrapitops/plan/data/store/mutators/formatting/Formatters.java b/Plan/src/main/java/com/djrapitops/plan/data/store/mutators/formatting/Formatters.java deleted file mode 100644 index d34c3e321..000000000 --- a/Plan/src/main/java/com/djrapitops/plan/data/store/mutators/formatting/Formatters.java +++ /dev/null @@ -1,98 +0,0 @@ -package com.djrapitops.plan.data.store.mutators.formatting; - -import com.djrapitops.plan.data.store.objects.DateHolder; -import com.djrapitops.plan.utilities.FormatUtils; -import com.djrapitops.plugin.api.TimeAmount; -import com.djrapitops.plugin.utilities.Format; -import org.apache.commons.text.TextStringBuilder; - -import java.util.Arrays; -import java.util.Calendar; -import java.util.function.Function; - -/** - * Class that holds static methods for getting new instances of different {@link Formatter}s. - * - * @author Rsl1122 - */ -public class Formatters { - - private Formatters() { - /* Static method class */ - } - - public static Formatter year() { - return dateHolder -> { - long date = dateHolder.getDate(); - return date > 0 ? FormatUtils.formatTimeStampYear(date) : "-"; - }; - } - - public static Formatter yearLongValue() { - return date -> date > 0 ? FormatUtils.formatTimeStampYear(date) : "-"; - } - - public static Formatter day() { - return dateHolder -> { - long date = dateHolder.getDate(); - return date > 0 ? FormatUtils.formatTimeStampDay(date) : "-"; - }; - } - - public static Formatter second() { - return dateHolder -> { - long date = dateHolder.getDate(); - return date > 0 ? FormatUtils.formatTimeStampSecond(date) : "-"; - }; - } - - public static Formatter clock() { - return dateHolder -> { - long date = dateHolder.getDate(); - return date > 0 ? FormatUtils.formatTimeStampClock(date) : "-"; - }; - } - - public static Formatter iso8601NoClock() { - return dateHolder -> FormatUtils.formatTimeStampISO8601NoClock(dateHolder.getDate()); - } - - public static Formatter timeAmount() { - return new TimeAmountFormatter(); - } - - public static Function dayOfYear() { - return date -> { - Calendar day = Calendar.getInstance(); - day.setTimeInMillis(date); - return day.get(Calendar.DAY_OF_YEAR); - }; - } - - public static Formatter percentage() { - return value -> value >= 0 ? FormatUtils.cutDecimals(value * 100.0) + "%" : "-"; - } - - public static Formatter benchmark() { - return ns -> { - if (ns > TimeAmount.MILLISECOND.ns() * 5L) { - return (ns / TimeAmount.MILLISECOND.ns()) + "ms"; - } else { - return 1.0 * ns / TimeAmount.MILLISECOND.ns() + "ms"; - } - }; - } - - public static Formatter itemName() { - return name -> { - String[] parts = name.split("_"); - TextStringBuilder builder = new TextStringBuilder(); - builder.appendWithSeparators(Arrays.stream(parts).map(part -> new Format(part).capitalize()).iterator(), " "); - return builder.toString(); - }; - } - - public static Formatter entityName() { - return name -> new Format(name).removeNumbers().removeSymbols().capitalize().toString(); - } -} \ No newline at end of file diff --git a/Plan/src/main/java/com/djrapitops/plan/data/store/mutators/health/AbstractHealthInfo.java b/Plan/src/main/java/com/djrapitops/plan/data/store/mutators/health/AbstractHealthInfo.java index f519456ad..a935edea7 100644 --- a/Plan/src/main/java/com/djrapitops/plan/data/store/mutators/health/AbstractHealthInfo.java +++ b/Plan/src/main/java/com/djrapitops/plan/data/store/mutators/health/AbstractHealthInfo.java @@ -3,7 +3,7 @@ package com.djrapitops.plan.data.store.mutators.health; import com.djrapitops.plan.data.store.containers.PlayerContainer; import com.djrapitops.plan.data.store.mutators.PlayersMutator; import com.djrapitops.plan.data.store.mutators.SessionsMutator; -import com.djrapitops.plan.data.store.mutators.formatting.Formatters; +import com.djrapitops.plan.utilities.formatting.Formatters; import com.djrapitops.plan.utilities.FormatUtils; import com.djrapitops.plan.utilities.html.icon.Icons; import com.djrapitops.plugin.api.TimeAmount; @@ -113,8 +113,8 @@ public abstract class AbstractHealthInfo { if (activeCount != 0) { long avgFourToTwoWeeks = totalFourToTwoWeeks / (long) activeCount; long avgLastTwoWeeks = totalLastTwoWeeks / (long) activeCount; - String avgLastTwoWeeksString = Formatters.timeAmount().apply(avgLastTwoWeeks); - String avgFourToTwoWeeksString = Formatters.timeAmount().apply(avgFourToTwoWeeks); + String avgLastTwoWeeksString = Formatters.timeAmount_Old().apply(avgLastTwoWeeks); + String avgFourToTwoWeeksString = Formatters.timeAmount_Old().apply(avgFourToTwoWeeks); if (avgFourToTwoWeeks >= avgLastTwoWeeks) { addNote(Icons.GREEN_THUMB + " Active players seem to have things to do (Played " + avgLastTwoWeeksString + " vs " + avgFourToTwoWeeksString diff --git a/Plan/src/main/java/com/djrapitops/plan/data/store/mutators/health/HealthInformation.java b/Plan/src/main/java/com/djrapitops/plan/data/store/mutators/health/HealthInformation.java index 7de0a8b2f..9137078b7 100644 --- a/Plan/src/main/java/com/djrapitops/plan/data/store/mutators/health/HealthInformation.java +++ b/Plan/src/main/java/com/djrapitops/plan/data/store/mutators/health/HealthInformation.java @@ -10,8 +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.PlayersOnlineResolver; import com.djrapitops.plan.data.store.mutators.TPSMutator; -import com.djrapitops.plan.data.store.mutators.formatting.Formatter; -import com.djrapitops.plan.data.store.mutators.formatting.Formatters; +import com.djrapitops.plan.utilities.formatting.Formatter; +import com.djrapitops.plan.utilities.formatting.Formatters; import com.djrapitops.plan.system.settings.Settings; import com.djrapitops.plan.utilities.FormatUtils; import com.djrapitops.plan.utilities.html.icon.Icons; @@ -80,10 +80,10 @@ public class HealthInformation extends AbstractHealthInfo { if (playersNewMonth != 0) { double retainPercentage = playersRetainedMonth * 1.0 / playersNewMonth; if (retainPercentage >= 0.25) { - addNote(Icons.GREEN_THUMB + " " + Formatters.percentage().apply(retainPercentage) + addNote(Icons.GREEN_THUMB + " " + Formatters.percentage_Old().apply(retainPercentage) + " of new players have stuck around (" + playersRetainedMonth + "/" + playersNewMonth + ")"); } else { - addNote(Icons.YELLOW_FLAG + " " + Formatters.percentage().apply(retainPercentage) + addNote(Icons.YELLOW_FLAG + " " + Formatters.percentage_Old().apply(retainPercentage) + " of new players have stuck around (" + playersRetainedMonth + "/" + playersNewMonth + ")"); } } @@ -126,7 +126,7 @@ public class HealthInformation extends AbstractHealthInfo { serverHealth *= 0.8; } - Formatter formatter = Formatters.timeAmount(); + Formatter formatter = Formatters.timeAmount_Old(); if (serverDownTime <= TimeAmount.DAY.ms()) { addNote(Icons.GREEN_THUMB + " Total Server downtime (No Data) was " + formatter.apply(serverDownTime)); } else if (serverDownTime <= TimeAmount.WEEK.ms()) { diff --git a/Plan/src/main/java/com/djrapitops/plan/data/store/mutators/health/NetworkHealthInformation.java b/Plan/src/main/java/com/djrapitops/plan/data/store/mutators/health/NetworkHealthInformation.java index 64bbffc91..fab14f71c 100644 --- a/Plan/src/main/java/com/djrapitops/plan/data/store/mutators/health/NetworkHealthInformation.java +++ b/Plan/src/main/java/com/djrapitops/plan/data/store/mutators/health/NetworkHealthInformation.java @@ -60,7 +60,7 @@ public class NetworkHealthInformation extends AbstractHealthInfo { private void uniquePlayersNote(int serverCount, Key serverKey, List perServerContainers) { Icon icon; - String uniquePlayersNote = " players visit on servers per day/server on average."; + String uniquePlayersNote = " players visit on servers per day_Old/server on average."; double average = perServerContainers.stream() .mapToInt(c -> c.getUnsafe(AnalysisKeys.AVG_PLAYERS_MONTH)) .average().orElse(0.0); @@ -87,7 +87,7 @@ public class NetworkHealthInformation extends AbstractHealthInfo { private void newPlayersNote(int serverCount, Key serverKey, List perServerContainers) { Icon icon; - String newPlayersNote = " players register on servers per day/server on average."; + String newPlayersNote = " players register on servers per day_Old/server on average."; double average = perServerContainers.stream() .mapToInt(c -> c.getUnsafe(AnalysisKeys.AVG_PLAYERS_NEW_MONTH)) .average().orElse(0.0); diff --git a/Plan/src/main/java/com/djrapitops/plan/system/listeners/bukkit/DeathEventListener.java b/Plan/src/main/java/com/djrapitops/plan/system/listeners/bukkit/DeathEventListener.java index 66323b5e2..e3b782261 100644 --- a/Plan/src/main/java/com/djrapitops/plan/system/listeners/bukkit/DeathEventListener.java +++ b/Plan/src/main/java/com/djrapitops/plan/system/listeners/bukkit/DeathEventListener.java @@ -1,11 +1,12 @@ package com.djrapitops.plan.system.listeners.bukkit; import com.djrapitops.plan.data.container.Session; -import com.djrapitops.plan.data.store.mutators.formatting.Formatters; import com.djrapitops.plan.system.cache.SessionCache; import com.djrapitops.plan.system.processing.Processing; import com.djrapitops.plan.system.processing.processors.player.MobKillProcessor; import com.djrapitops.plan.system.processing.processors.player.PlayerKillProcessor; +import com.djrapitops.plan.utilities.formatting.EntityNameFormatter; +import com.djrapitops.plan.utilities.formatting.ItemNameFormatter; import com.djrapitops.plugin.logging.L; import com.djrapitops.plugin.logging.error.ErrorHandler; import org.bukkit.Material; @@ -93,7 +94,7 @@ public class DeathEventListener implements Listener { } } - String weaponName = Formatters.itemName().apply(itemInHand.name()); + String weaponName = new ItemNameFormatter().apply(itemInHand.name()); return victimUUID != null ? new PlayerKillProcessor(killer.getUniqueId(), time, victimUUID, weaponName) @@ -119,7 +120,7 @@ public class DeathEventListener implements Listener { } return victimUUID != null - ? new PlayerKillProcessor(owner.getUniqueId(), time, victimUUID, Formatters.entityName().apply(name)) + ? new PlayerKillProcessor(owner.getUniqueId(), time, victimUUID, new EntityNameFormatter().apply(name)) : new MobKillProcessor(owner.getUniqueId()); } @@ -130,7 +131,7 @@ public class DeathEventListener implements Listener { } Player player = (Player) source; - String projectileName = Formatters.entityName().apply(projectile.getType().name()); + String projectileName = new EntityNameFormatter().apply(projectile.getType().name()); return victimUUID != null ? new PlayerKillProcessor(player.getUniqueId(), time, victimUUID, projectileName) diff --git a/Plan/src/main/java/com/djrapitops/plan/system/listeners/sponge/SpongeDeathListener.java b/Plan/src/main/java/com/djrapitops/plan/system/listeners/sponge/SpongeDeathListener.java index 4b93c0199..9bdf996b8 100644 --- a/Plan/src/main/java/com/djrapitops/plan/system/listeners/sponge/SpongeDeathListener.java +++ b/Plan/src/main/java/com/djrapitops/plan/system/listeners/sponge/SpongeDeathListener.java @@ -1,11 +1,12 @@ package com.djrapitops.plan.system.listeners.sponge; import com.djrapitops.plan.data.container.Session; -import com.djrapitops.plan.data.store.mutators.formatting.Formatters; import com.djrapitops.plan.system.cache.SessionCache; import com.djrapitops.plan.system.processing.Processing; import com.djrapitops.plan.system.processing.processors.player.MobKillProcessor; import com.djrapitops.plan.system.processing.processors.player.PlayerKillProcessor; +import com.djrapitops.plan.utilities.formatting.EntityNameFormatter; +import com.djrapitops.plan.utilities.formatting.ItemNameFormatter; import com.djrapitops.plugin.logging.L; import com.djrapitops.plugin.logging.error.ErrorHandler; import org.spongepowered.api.data.key.Keys; @@ -90,7 +91,7 @@ public class SpongeDeathListener { ItemType type = inHand.isEmpty() ? ItemTypes.AIR : inHand.getType(); return victimUUID != null - ? new PlayerKillProcessor(killer.getUniqueId(), time, victimUUID, Formatters.itemName().apply(type.getName())) + ? new PlayerKillProcessor(killer.getUniqueId(), time, victimUUID, new ItemNameFormatter().apply(type.getName())) : new MobKillProcessor(killer.getUniqueId()); } @@ -123,7 +124,7 @@ public class SpongeDeathListener { } Player player = (Player) source; - String projectileName = Formatters.entityName().apply(projectile.getType().getName()); + String projectileName = new EntityNameFormatter().apply(projectile.getType().getName()); return victimUUID != null ? new PlayerKillProcessor(player.getUniqueId(), time, victimUUID, projectileName) diff --git a/Plan/src/main/java/com/djrapitops/plan/utilities/FormatUtils.java b/Plan/src/main/java/com/djrapitops/plan/utilities/FormatUtils.java index 1f1cd0e88..98325cb03 100644 --- a/Plan/src/main/java/com/djrapitops/plan/utilities/FormatUtils.java +++ b/Plan/src/main/java/com/djrapitops/plan/utilities/FormatUtils.java @@ -24,12 +24,14 @@ public class FormatUtils { throw new IllegalStateException("Utility class"); } + @Deprecated public static String formatTimeStampISO8601NoClock(long epochMs) { String format = "yyyy-MM-dd"; return format(epochMs, format); } + @Deprecated public static String formatTimeStampDay(long epochMs) { String format = "MMMMM d"; @@ -40,6 +42,7 @@ public class FormatUtils { return format(epochMs, format); } + @Deprecated public static String formatTimeStampClock(long epochMs) { String format = Settings.FORMAT_DATE_CLOCK.toString(); @@ -56,6 +59,7 @@ public class FormatUtils { return dateFormat.format(epochMs); } + @Deprecated public static String formatTimeStampSecond(long epochMs) { String format = Settings.FORMAT_DATE_FULL.toString(); @@ -84,6 +88,7 @@ public class FormatUtils { return format; } + @Deprecated public static String formatTimeStampYear(long epochMs) { String format = Settings.FORMAT_DATE_NO_SECONDS.toString(); @@ -99,6 +104,7 @@ public class FormatUtils { * @param d Double. * @return String format of the double. */ + @Deprecated public static String cutDecimals(double d) { return new DecimalFormat(Settings.FORMAT_DECIMALS.toString()).format(d); } diff --git a/Plan/src/main/java/com/djrapitops/plan/utilities/formatting/DecimalFormatter.java b/Plan/src/main/java/com/djrapitops/plan/utilities/formatting/DecimalFormatter.java new file mode 100644 index 000000000..d466abb42 --- /dev/null +++ b/Plan/src/main/java/com/djrapitops/plan/utilities/formatting/DecimalFormatter.java @@ -0,0 +1,25 @@ +package com.djrapitops.plan.utilities.formatting; + +import com.djrapitops.plan.system.settings.Settings; +import com.djrapitops.plan.system.settings.config.PlanConfig; + +import java.text.DecimalFormat; + +/** + * //TODO Class Javadoc Comment + * + * @author Rsl1122 + */ +public class DecimalFormatter implements Formatter { + + private final PlanConfig config; + + public DecimalFormatter(PlanConfig config) { + this.config = config; + } + + @Override + public String apply(Double value) { + return new DecimalFormat(config.getString(Settings.FORMAT_DECIMALS)).format(value); + } +} \ No newline at end of file diff --git a/Plan/src/main/java/com/djrapitops/plan/utilities/formatting/EntityNameFormatter.java b/Plan/src/main/java/com/djrapitops/plan/utilities/formatting/EntityNameFormatter.java new file mode 100644 index 000000000..02e37011e --- /dev/null +++ b/Plan/src/main/java/com/djrapitops/plan/utilities/formatting/EntityNameFormatter.java @@ -0,0 +1,16 @@ +package com.djrapitops.plan.utilities.formatting; + +import com.djrapitops.plugin.utilities.Format; + +/** + * //TODO Class Javadoc Comment + * + * @author Rsl1122 + */ +public class EntityNameFormatter implements Formatter { + + @Override + public String apply(String name) { + return new Format(name).removeNumbers().removeSymbols().capitalize().toString(); + } +} \ No newline at end of file diff --git a/Plan/src/main/java/com/djrapitops/plan/data/store/mutators/formatting/Formatter.java b/Plan/src/main/java/com/djrapitops/plan/utilities/formatting/Formatter.java similarity index 75% rename from Plan/src/main/java/com/djrapitops/plan/data/store/mutators/formatting/Formatter.java rename to Plan/src/main/java/com/djrapitops/plan/utilities/formatting/Formatter.java index 5255d287e..d237a65d5 100644 --- a/Plan/src/main/java/com/djrapitops/plan/data/store/mutators/formatting/Formatter.java +++ b/Plan/src/main/java/com/djrapitops/plan/utilities/formatting/Formatter.java @@ -1,4 +1,4 @@ -package com.djrapitops.plan.data.store.mutators.formatting; +package com.djrapitops.plan.utilities.formatting; import java.util.function.Function; diff --git a/Plan/src/main/java/com/djrapitops/plan/utilities/formatting/Formatters.java b/Plan/src/main/java/com/djrapitops/plan/utilities/formatting/Formatters.java new file mode 100644 index 000000000..bfdb3bfba --- /dev/null +++ b/Plan/src/main/java/com/djrapitops/plan/utilities/formatting/Formatters.java @@ -0,0 +1,125 @@ +package com.djrapitops.plan.utilities.formatting; + +import com.djrapitops.plan.data.store.objects.DateHolder; +import com.djrapitops.plan.system.settings.config.PlanConfig; +import com.djrapitops.plan.utilities.FormatUtils; +import com.djrapitops.plan.utilities.formatting.time.*; + +import javax.inject.Inject; +import javax.inject.Singleton; + +/** + * Factory for new instances of different {@link Formatter}s. + * + * @author Rsl1122 + */ +@Singleton +public class Formatters { + + private PlanConfig config; + + @Inject + public Formatters(PlanConfig config) { + this.config = config; + } + + @Deprecated + public static Formatter year_Old() { + return nop(); + } + + private static Formatter nop() { + return dateHolder -> "-"; + } + + private static Formatter nop2() { + return l -> "-"; + } + + public Formatter year() { + return new DateHolderFormatter(yearLong()); + } + + @Deprecated + public static Formatter yearLongValue_Old() { + return nop2(); + } + + public Formatter yearLong() { + return new YearFormatter(config); + } + + @Deprecated + public static Formatter day_Old() { + return nop(); + } + + public Formatter day() { + return new DateHolderFormatter(dayLong()); + } + + public Formatter dayLong() { + return new DayFormatter(config); + } + + @Deprecated + public static Formatter second_Old() { + return nop(); + } + + public Formatter second() { + return new DateHolderFormatter(secondLong()); + } + + public Formatter secondLong() { + return new SecondFormatter(config); + } + + @Deprecated + public static Formatter clock_Old() { + return nop(); + } + + public Formatter clock() { + return new DateHolderFormatter(clockLong()); + } + + public Formatter clockLong() { + return new ClockFormatter(config); + } + + @Deprecated + public static Formatter iso8601NoClock_Old() { + return dateHolder -> FormatUtils.formatTimeStampISO8601NoClock(dateHolder.getDate()); + } + + public Formatter iso8601NoClock() { + return new DateHolderFormatter(iso8601NoClockLong()); + } + + public Formatter iso8601NoClockLong() { + return new ISO8601NoClockFormatter(config); + } + + @Deprecated + public static Formatter timeAmount_Old() { + return nop2(); + } + + public Formatter timeAmount() { + return new TimeAmountFormatter(config); + } + + @Deprecated + public static Formatter percentage_Old() { + return value -> value >= 0 ? FormatUtils.cutDecimals(value * 100.0) + "%" : "-"; + } + + public Formatter percentage() { + return new PercentageFormatter(decimals()); + } + + private Formatter decimals() { + return new DecimalFormatter(config); + } +} \ No newline at end of file diff --git a/Plan/src/main/java/com/djrapitops/plan/utilities/formatting/ItemNameFormatter.java b/Plan/src/main/java/com/djrapitops/plan/utilities/formatting/ItemNameFormatter.java new file mode 100644 index 000000000..e93cd1272 --- /dev/null +++ b/Plan/src/main/java/com/djrapitops/plan/utilities/formatting/ItemNameFormatter.java @@ -0,0 +1,22 @@ +package com.djrapitops.plan.utilities.formatting; + +import com.djrapitops.plugin.utilities.Format; +import org.apache.commons.text.TextStringBuilder; + +import java.util.Arrays; + +/** + * //TODO Class Javadoc Comment + * + * @author Rsl1122 + */ +public class ItemNameFormatter implements Formatter { + + @Override + public String apply(String name) { + String[] parts = name.split("_"); + TextStringBuilder builder = new TextStringBuilder(); + builder.appendWithSeparators(Arrays.stream(parts).map(part -> new Format(part).capitalize()).iterator(), " "); + return builder.toString(); + } +} \ No newline at end of file diff --git a/Plan/src/main/java/com/djrapitops/plan/utilities/formatting/PercentageFormatter.java b/Plan/src/main/java/com/djrapitops/plan/utilities/formatting/PercentageFormatter.java new file mode 100644 index 000000000..5e5e1a42a --- /dev/null +++ b/Plan/src/main/java/com/djrapitops/plan/utilities/formatting/PercentageFormatter.java @@ -0,0 +1,20 @@ +package com.djrapitops.plan.utilities.formatting; + +/** + * //TODO Class Javadoc Comment + * + * @author Rsl1122 + */ +public class PercentageFormatter implements Formatter { + + private final Formatter formatter; + + public PercentageFormatter(Formatter formatter) { + this.formatter = formatter; + } + + @Override + public String apply(Double value) { + return value >= 0 ? formatter.apply(value * 100.0) + "%" : "-"; + } +} \ No newline at end of file diff --git a/Plan/src/main/java/com/djrapitops/plan/data/store/mutators/formatting/PlaceholderReplacer.java b/Plan/src/main/java/com/djrapitops/plan/utilities/formatting/PlaceholderReplacer.java similarity index 96% rename from Plan/src/main/java/com/djrapitops/plan/data/store/mutators/formatting/PlaceholderReplacer.java rename to Plan/src/main/java/com/djrapitops/plan/utilities/formatting/PlaceholderReplacer.java index 487dc4304..301199af0 100644 --- a/Plan/src/main/java/com/djrapitops/plan/data/store/mutators/formatting/PlaceholderReplacer.java +++ b/Plan/src/main/java/com/djrapitops/plan/utilities/formatting/PlaceholderReplacer.java @@ -1,4 +1,4 @@ -package com.djrapitops.plan.data.store.mutators.formatting; +package com.djrapitops.plan.utilities.formatting; import com.djrapitops.plan.data.store.PlaceholderKey; import com.djrapitops.plan.data.store.containers.DataContainer; diff --git a/Plan/src/main/java/com/djrapitops/plan/utilities/formatting/time/ClockFormatter.java b/Plan/src/main/java/com/djrapitops/plan/utilities/formatting/time/ClockFormatter.java new file mode 100644 index 000000000..2788a4921 --- /dev/null +++ b/Plan/src/main/java/com/djrapitops/plan/utilities/formatting/time/ClockFormatter.java @@ -0,0 +1,27 @@ +package com.djrapitops.plan.utilities.formatting.time; + +import com.djrapitops.plan.system.settings.Settings; +import com.djrapitops.plan.system.settings.config.PlanConfig; + +/** + * //TODO Class Javadoc Comment + * + * @author Rsl1122 + */ +public class ClockFormatter extends DateFormatter { + + public ClockFormatter(PlanConfig config) { + super(config); + } + + @Override + public String apply(Long date) { + return date > 0 ? format(date) : "-"; + } + + private String format(Long date) { + String format = config.getString(Settings.FORMAT_DATE_CLOCK); + + return format(date, format); + } +} \ No newline at end of file diff --git a/Plan/src/main/java/com/djrapitops/plan/utilities/formatting/time/DateFormatter.java b/Plan/src/main/java/com/djrapitops/plan/utilities/formatting/time/DateFormatter.java new file mode 100644 index 000000000..2d3cfed16 --- /dev/null +++ b/Plan/src/main/java/com/djrapitops/plan/utilities/formatting/time/DateFormatter.java @@ -0,0 +1,56 @@ +package com.djrapitops.plan.utilities.formatting.time; + +import com.djrapitops.plan.utilities.formatting.Formatter; +import com.djrapitops.plan.system.settings.Settings; +import com.djrapitops.plan.system.settings.config.PlanConfig; +import com.djrapitops.plugin.api.TimeAmount; + +import java.text.SimpleDateFormat; +import java.util.Locale; +import java.util.TimeZone; + +/** + * //TODO Class Javadoc Comment + * + * @author Rsl1122 + */ +public abstract class DateFormatter implements Formatter { + + protected final PlanConfig config; + + public DateFormatter(PlanConfig config) { + this.config = config; + } + + @Override + public abstract String apply(Long value); + + protected String format(long epochMs, String format) { + boolean useServerTime = config.isTrue(Settings.USE_SERVER_TIME); + String locale = config.getString(Settings.LOCALE); + Locale usedLocale = locale.equalsIgnoreCase("default") ? Locale.ENGLISH : Locale.forLanguageTag(locale); + SimpleDateFormat dateFormat = new SimpleDateFormat(format, usedLocale); + TimeZone timeZone = useServerTime ? TimeZone.getDefault() : TimeZone.getTimeZone("GMT"); + dateFormat.setTimeZone(timeZone); + return dateFormat.format(epochMs); + } + + protected String replaceRecentDays(long epochMs, String format) { + return replaceRecentDays(epochMs, format, config.getString(Settings.FORMAT_DATE_RECENT_DAYS_PATTERN)); + } + + protected String replaceRecentDays(long epochMs, String format, String pattern) { + long now = System.currentTimeMillis(); + + long fromStartOfDay = now % TimeAmount.DAY.ms(); + if (epochMs > now - fromStartOfDay) { + format = format.replace(pattern, "'Today'"); + } else if (epochMs > now - TimeAmount.DAY.ms() - fromStartOfDay) { + format = format.replace(pattern, "'Yesterday'"); + } else if (epochMs > now - TimeAmount.DAY.ms() * 5L) { + format = format.replace(pattern, "EEEE"); + } + return format; + } + +} \ No newline at end of file diff --git a/Plan/src/main/java/com/djrapitops/plan/utilities/formatting/time/DateHolderFormatter.java b/Plan/src/main/java/com/djrapitops/plan/utilities/formatting/time/DateHolderFormatter.java new file mode 100644 index 000000000..8909bd301 --- /dev/null +++ b/Plan/src/main/java/com/djrapitops/plan/utilities/formatting/time/DateHolderFormatter.java @@ -0,0 +1,23 @@ +package com.djrapitops.plan.utilities.formatting.time; + +import com.djrapitops.plan.utilities.formatting.Formatter; +import com.djrapitops.plan.data.store.objects.DateHolder; + +/** + * //TODO Class Javadoc Comment + * + * @author Rsl1122 + */ +public class DateHolderFormatter implements Formatter { + + private final Formatter formatter; + + public DateHolderFormatter(Formatter formatter) { + this.formatter = formatter; + } + + @Override + public String apply(DateHolder dateHolder) { + return formatter.apply(dateHolder.getDate()); + } +} \ No newline at end of file diff --git a/Plan/src/main/java/com/djrapitops/plan/utilities/formatting/time/DayFormatter.java b/Plan/src/main/java/com/djrapitops/plan/utilities/formatting/time/DayFormatter.java new file mode 100644 index 000000000..31163c5ad --- /dev/null +++ b/Plan/src/main/java/com/djrapitops/plan/utilities/formatting/time/DayFormatter.java @@ -0,0 +1,31 @@ +package com.djrapitops.plan.utilities.formatting.time; + +import com.djrapitops.plan.system.settings.Settings; +import com.djrapitops.plan.system.settings.config.PlanConfig; + +/** + * //TODO Class Javadoc Comment + * + * @author Rsl1122 + */ +public class DayFormatter extends DateFormatter { + + public DayFormatter(PlanConfig config) { + super(config); + } + + @Override + public String apply(Long date) { + return date > 0 ? format(date) : "-"; + } + + private String format(Long date) { + String format = "MMMMM d"; + + if (config.isTrue(Settings.FORMAT_DATE_RECENT_DAYS)) { + format = replaceRecentDays(date, format, "MMMMM"); + } + + return format(date, format); + } +} \ No newline at end of file diff --git a/Plan/src/main/java/com/djrapitops/plan/utilities/formatting/time/ISO8601NoClockFormatter.java b/Plan/src/main/java/com/djrapitops/plan/utilities/formatting/time/ISO8601NoClockFormatter.java new file mode 100644 index 000000000..b4aab4d56 --- /dev/null +++ b/Plan/src/main/java/com/djrapitops/plan/utilities/formatting/time/ISO8601NoClockFormatter.java @@ -0,0 +1,26 @@ +package com.djrapitops.plan.utilities.formatting.time; + +import com.djrapitops.plan.system.settings.config.PlanConfig; + +/** + * //TODO Class Javadoc Comment + * + * @author Rsl1122 + */ +public class ISO8601NoClockFormatter extends DateFormatter { + + public ISO8601NoClockFormatter(PlanConfig config) { + super(config); + } + + @Override + public String apply(Long date) { + return date > 0 ? format(date) : "-"; + } + + private String format(Long date) { + String format = "yyyy-MM-dd"; + + return format(date, format); + } +} \ No newline at end of file diff --git a/Plan/src/main/java/com/djrapitops/plan/utilities/formatting/time/SecondFormatter.java b/Plan/src/main/java/com/djrapitops/plan/utilities/formatting/time/SecondFormatter.java new file mode 100644 index 000000000..064b8a294 --- /dev/null +++ b/Plan/src/main/java/com/djrapitops/plan/utilities/formatting/time/SecondFormatter.java @@ -0,0 +1,31 @@ +package com.djrapitops.plan.utilities.formatting.time; + +import com.djrapitops.plan.system.settings.Settings; +import com.djrapitops.plan.system.settings.config.PlanConfig; + +/** + * //TODO Class Javadoc Comment + * + * @author Rsl1122 + */ +public class SecondFormatter extends DateFormatter { + + public SecondFormatter(PlanConfig config) { + super(config); + } + + @Override + public String apply(Long date) { + return date > 0 ? format(date) : "-"; + } + + private String format(Long date) { + String format = config.getString(Settings.FORMAT_DATE_FULL); + + if (config.isTrue(Settings.FORMAT_DATE_RECENT_DAYS)) { + format = replaceRecentDays(date, format); + } + + return format(date, format); + } +} \ No newline at end of file diff --git a/Plan/src/main/java/com/djrapitops/plan/utilities/formatting/time/TimeAmountFormatter.java b/Plan/src/main/java/com/djrapitops/plan/utilities/formatting/time/TimeAmountFormatter.java new file mode 100644 index 000000000..0b82af52f --- /dev/null +++ b/Plan/src/main/java/com/djrapitops/plan/utilities/formatting/time/TimeAmountFormatter.java @@ -0,0 +1,139 @@ +package com.djrapitops.plan.utilities.formatting.time; + +import com.djrapitops.plan.system.settings.Settings; +import com.djrapitops.plan.system.settings.config.PlanConfig; +import com.djrapitops.plan.utilities.formatting.Formatter; +import org.apache.commons.lang3.StringUtils; + +/** + * Formatter for time amount in milliseconds. + * + * @author Rsl1122 + */ +public class TimeAmountFormatter implements Formatter { + + // Placeholders for the config settings + private static final String ZERO_PH = "%zero%"; + private static final String SECONDS_PH = "%seconds%"; + private static final String MINUTES_PH = "%minutes%"; + private static final String HOURS_PH = "%hours%"; + private static final String DAYS_PH = "%days%"; + private static final String MONTHS_PH = "%months%"; + private static final String YEARS_PH = "%years%"; + + private final PlanConfig config; + + public TimeAmountFormatter(PlanConfig config) { + this.config = config; + } + + @Override + public String apply(Long ms) { + if (ms <= 0) { + return "-"; + } + StringBuilder builder = new StringBuilder(); + long x = ms / 1000; + long seconds = x % 60; + x /= 60; + long minutes = x % 60; + x /= 60; + long hours = x % 24; + x /= 24; + long days = x % 365; + long months = (days - days % 30) / 30; + days -= months * 30; + x /= 365; + long years = x; + + appendYears(builder, years); + appendMonths(builder, months); + appendDays(builder, days); + + String hourFormat = config.getString(Settings.FORMAT_HOURS); + String minuteFormat = config.getString(Settings.FORMAT_MINUTES); + String secondFormat = config.getString(Settings.FORMAT_SECONDS); + + appendHours(builder, hours, hourFormat); + appendMinutes(builder, minutes, hours, hourFormat, minuteFormat); + appendSeconds(builder, seconds, minutes, hours, hourFormat, minuteFormat, secondFormat); + + String formattedTime = StringUtils.remove(builder.toString(), ZERO_PH); + if (formattedTime.isEmpty()) { + return config.getString(Settings.FORMAT_ZERO_SECONDS); + } + return formattedTime; + } + + private void appendSeconds(StringBuilder builder, long seconds, long minutes, long hours, String fHours, String fMinutes, String fSeconds) { + if (seconds != 0) { + String s = fSeconds.replace(SECONDS_PH, String.valueOf(seconds)); + if (minutes == 0 && s.contains(MINUTES_PH)) { + if (hours == 0 && fMinutes.contains(HOURS_PH)) { + builder.append(fHours.replace(ZERO_PH, "0").replace(HOURS_PH, "0")); + } + builder.append(fMinutes.replace(HOURS_PH, "").replace(ZERO_PH, "0").replace(MINUTES_PH, "0")); + } + s = s.replace(MINUTES_PH, ""); + if (s.contains(ZERO_PH) && String.valueOf(seconds).length() == 1) { + builder.append('0'); + } + builder.append(s); + } + } + + private void appendMinutes(StringBuilder builder, long minutes, long hours, String fHours, String fMinutes) { + if (minutes != 0) { + String m = fMinutes.replace(MINUTES_PH, String.valueOf(minutes)); + if (hours == 0 && m.contains(HOURS_PH)) { + builder.append(fHours.replace(ZERO_PH, "0").replace(HOURS_PH, "0")); + m = m.replace(HOURS_PH, ""); + } + m = m.replace(HOURS_PH, ""); + if (m.contains(ZERO_PH) && String.valueOf(minutes).length() == 1) { + builder.append('0'); + } + builder.append(m); + } + } + + private void appendHours(StringBuilder builder, long hours, String fHours) { + if (hours != 0) { + String h = fHours.replace(HOURS_PH, String.valueOf(hours)); + if (h.contains(ZERO_PH) && String.valueOf(hours).length() == 1) { + builder.append('0'); + } + builder.append(h); + } + } + + private void appendDays(StringBuilder builder, long days) { + String singular = config.getString(Settings.FORMAT_DAY); + String plural = config.getString(Settings.FORMAT_DAYS); + appendValue(builder, days, singular, plural, DAYS_PH); + } + + private void appendMonths(StringBuilder builder, long months) { + String singular = config.getString(Settings.FORMAT_MONTH); + String plural = config.getString(Settings.FORMAT_MONTHS); + + appendValue(builder, months, singular, plural, MONTHS_PH); + } + + private void appendYears(StringBuilder builder, long years) { + String singular = config.getString(Settings.FORMAT_YEAR); + String plural = config.getString(Settings.FORMAT_YEARS); + + appendValue(builder, years, singular, plural, YEARS_PH); + } + + private void appendValue(StringBuilder builder, long amount, String singular, String plural, String replace) { + if (amount != 0) { + if (amount == 1) { + builder.append(singular); + } else { + builder.append(plural.replace(replace, String.valueOf(amount))); + } + } + } +} \ No newline at end of file diff --git a/Plan/src/main/java/com/djrapitops/plan/utilities/formatting/time/YearFormatter.java b/Plan/src/main/java/com/djrapitops/plan/utilities/formatting/time/YearFormatter.java new file mode 100644 index 000000000..20b274131 --- /dev/null +++ b/Plan/src/main/java/com/djrapitops/plan/utilities/formatting/time/YearFormatter.java @@ -0,0 +1,30 @@ +package com.djrapitops.plan.utilities.formatting.time; + +import com.djrapitops.plan.system.settings.Settings; +import com.djrapitops.plan.system.settings.config.PlanConfig; + +/** + * //TODO Class Javadoc Comment + * + * @author Rsl1122 + */ +public class YearFormatter extends DateFormatter { + + public YearFormatter(PlanConfig config) { + super(config); + } + + @Override + public String apply(Long date) { + return date > 0 ? format(date) : "-"; + } + + private String format(Long date) { + String format = config.getString(Settings.FORMAT_DATE_NO_SECONDS); + + if (config.isTrue(Settings.FORMAT_DATE_RECENT_DAYS)) { + format = replaceRecentDays(date, format); + } + return format(date, format); + } +} \ No newline at end of file diff --git a/Plan/src/main/java/com/djrapitops/plan/utilities/html/HtmlStructure.java b/Plan/src/main/java/com/djrapitops/plan/utilities/html/HtmlStructure.java index 4a303da19..b9b744d05 100644 --- a/Plan/src/main/java/com/djrapitops/plan/utilities/html/HtmlStructure.java +++ b/Plan/src/main/java/com/djrapitops/plan/utilities/html/HtmlStructure.java @@ -111,7 +111,7 @@ public class HtmlStructure { "

Type " + "" + serverType + "

" + "
" + - "

Last Updated" + + "

Last Updated" + "" + refresh + "

" + "
" + "