From d339edfe217a64cac7268dd6612022cb08cf5c61 Mon Sep 17 00:00:00 2001 From: tastybento Date: Mon, 11 Nov 2024 09:14:18 -0800 Subject: [PATCH 1/5] Change to 3.0.0 --- pom.xml | 2 +- .../bentobox/AbstractCommonSetup.java | 36 ------------------- 2 files changed, 1 insertion(+), 37 deletions(-) diff --git a/pom.xml b/pom.xml index 4fc48b5b9..c48e504c4 100644 --- a/pom.xml +++ b/pom.xml @@ -84,7 +84,7 @@ -LOCAL - 2.7.1 + 3.0.0 bentobox-world https://sonarcloud.io ${project.basedir}/lib diff --git a/src/test/java/world/bentobox/bentobox/AbstractCommonSetup.java b/src/test/java/world/bentobox/bentobox/AbstractCommonSetup.java index 73596f4d4..59d49a543 100644 --- a/src/test/java/world/bentobox/bentobox/AbstractCommonSetup.java +++ b/src/test/java/world/bentobox/bentobox/AbstractCommonSetup.java @@ -241,42 +241,6 @@ public abstract class AbstractCommonSetup { checkSpigotMessage(expectedMessage, 1); } - /* - public void checkSpigotMessage(String expectedMessage, boolean shouldBePresent) { - // Capture the argument passed to spigot().sendMessage(...) if messages are sent - ArgumentCaptor captor = ArgumentCaptor.forClass(TextComponent.class); - - if (shouldBePresent) { - // If we expect a message to be present, verify that sendMessage() was called at least once - verify(spigot, atLeastOnce()).sendMessage(captor.capture()); - - // Get all captured TextComponents - List capturedMessages = captor.getAllValues(); - - // Check if any captured message contains the expected text - boolean messageFound = capturedMessages.stream() - .map(component -> component.toPlainText()) // Convert each TextComponent to plain text - .anyMatch(messageText -> messageText.contains(expectedMessage)); // Check if the expected message is present - - // Assert that the message was found - assertTrue("Expected message not found: " + expectedMessage, messageFound); - - } else { - // If we expect no messages with this text, capture any sent messages to ensure none match the given message - verify(spigot, atLeast(0)).sendMessage(captor.capture()); - - // Get all captured TextComponents - List capturedMessages = captor.getAllValues(); - - // Check that none of the captured messages contain the forbidden text - boolean messageFound = capturedMessages.stream().map(component -> component.toPlainText()) // Convert each TextComponent to plain text - .anyMatch(messageText -> messageText.contains(expectedMessage)); // Check if the message is present - - // Assert that the message was NOT found - assertFalse("Unexpected message found: " + expectedMessage, messageFound); - } - }*/ - public void checkSpigotMessage(String expectedMessage, int expectedOccurrences) { // Capture the argument passed to spigot().sendMessage(...) if messages are sent ArgumentCaptor captor = ArgumentCaptor.forClass(TextComponent.class); From b135484f3c78178f78f811b033168d8daa2660dc Mon Sep 17 00:00:00 2001 From: tastybento Date: Mon, 11 Nov 2024 12:45:16 -0800 Subject: [PATCH 2/5] Adds island history for team members adding and removing Adds placeholder for the historical number of players --- .../admin/AdminUnregisterCommand.java | 5 +-- .../team/IslandTeamInviteAcceptCommand.java | 5 +++ .../team/IslandTeamSetownerCommand.java | 5 +++ .../island/team/IslandTeamTrustCommand.java | 6 ++++ .../bentobox/bentobox/api/logs/LogEntry.java | 17 ++++++---- .../bentobox/database/objects/Island.java | 9 +++--- .../objects/adapters/LogEntryListAdapter.java | 5 ++- .../bentobox/lists/GameModePlaceholder.java | 31 +++++++++++++++++++ .../bentobox/managers/IslandsManager.java | 5 +++ .../bentobox/managers/island/IslandCache.java | 4 +++ .../bentobox/managers/island/NewIsland.java | 4 +++ 11 files changed, 83 insertions(+), 13 deletions(-) diff --git a/src/main/java/world/bentobox/bentobox/api/commands/admin/AdminUnregisterCommand.java b/src/main/java/world/bentobox/bentobox/api/commands/admin/AdminUnregisterCommand.java index 06cb6a578..f9f631df3 100644 --- a/src/main/java/world/bentobox/bentobox/api/commands/admin/AdminUnregisterCommand.java +++ b/src/main/java/world/bentobox/bentobox/api/commands/admin/AdminUnregisterCommand.java @@ -15,6 +15,7 @@ import world.bentobox.bentobox.api.commands.ConfirmableCommand; import world.bentobox.bentobox.api.events.island.IslandEvent; import world.bentobox.bentobox.api.localization.TextVariables; import world.bentobox.bentobox.api.logs.LogEntry; +import world.bentobox.bentobox.api.logs.LogEntry.LogType; import world.bentobox.bentobox.api.user.User; import world.bentobox.bentobox.database.objects.Island; import world.bentobox.bentobox.managers.RanksManager; @@ -115,10 +116,10 @@ public class AdminUnregisterCommand extends ConfirmableCommand { // Remove all island players that reference this island targetIsland.getMembers().clear(); if (user.isPlayer()) { - targetIsland.log(new LogEntry.Builder("UNREGISTER").data("player", targetUUID.toString()) + targetIsland.log(new LogEntry.Builder(LogType.UNREGISTER).data("player", targetUUID.toString()) .data("admin", user.getUniqueId().toString()).build()); } else { - targetIsland.log(new LogEntry.Builder("UNREGISTER").data("player", targetUUID.toString()) + targetIsland.log(new LogEntry.Builder(LogType.UNREGISTER).data("player", targetUUID.toString()) .data("admin", "console").build()); } user.sendMessage("commands.admin.unregister.unregistered-island", TextVariables.XYZ, Util.xyz(targetIsland.getCenter().toVector()), diff --git a/src/main/java/world/bentobox/bentobox/api/commands/island/team/IslandTeamInviteAcceptCommand.java b/src/main/java/world/bentobox/bentobox/api/commands/island/team/IslandTeamInviteAcceptCommand.java index 9244508c7..f0e3523bd 100644 --- a/src/main/java/world/bentobox/bentobox/api/commands/island/team/IslandTeamInviteAcceptCommand.java +++ b/src/main/java/world/bentobox/bentobox/api/commands/island/team/IslandTeamInviteAcceptCommand.java @@ -9,6 +9,8 @@ import world.bentobox.bentobox.api.events.IslandBaseEvent; import world.bentobox.bentobox.api.events.island.IslandEvent; import world.bentobox.bentobox.api.events.team.TeamEvent; import world.bentobox.bentobox.api.localization.TextVariables; +import world.bentobox.bentobox.api.logs.LogEntry; +import world.bentobox.bentobox.api.logs.LogEntry.LogType; import world.bentobox.bentobox.api.user.User; import world.bentobox.bentobox.database.objects.Island; import world.bentobox.bentobox.database.objects.TeamInvite; @@ -120,6 +122,9 @@ public class IslandTeamInviteAcceptCommand extends ConfirmableCommand { user.sendMessage("commands.island.team.trust.you-are-trusted", TextVariables.NAME, inviter.getName(), TextVariables.DISPLAY_NAME, inviter.getDisplayName()); } + // Add historu record + island.log(new LogEntry.Builder(LogType.TRUSTED).data(user.getUniqueId().toString(), "trusted") + .data(invite.getInviter().toString(), "trusted by").build()); } } diff --git a/src/main/java/world/bentobox/bentobox/api/commands/island/team/IslandTeamSetownerCommand.java b/src/main/java/world/bentobox/bentobox/api/commands/island/team/IslandTeamSetownerCommand.java index 16e23ee5c..0533f65ea 100644 --- a/src/main/java/world/bentobox/bentobox/api/commands/island/team/IslandTeamSetownerCommand.java +++ b/src/main/java/world/bentobox/bentobox/api/commands/island/team/IslandTeamSetownerCommand.java @@ -12,6 +12,8 @@ import world.bentobox.bentobox.api.events.IslandBaseEvent; import world.bentobox.bentobox.api.events.island.IslandEvent; import world.bentobox.bentobox.api.events.team.TeamEvent; import world.bentobox.bentobox.api.localization.TextVariables; +import world.bentobox.bentobox.api.logs.LogEntry; +import world.bentobox.bentobox.api.logs.LogEntry.LogType; import world.bentobox.bentobox.api.user.User; import world.bentobox.bentobox.database.objects.Island; import world.bentobox.bentobox.managers.RanksManager; @@ -91,6 +93,9 @@ public class IslandTeamSetownerCommand extends CompositeCommand { IslandEvent.builder().island(island).involvedPlayer(user.getUniqueId()).admin(false) .reason(IslandEvent.Reason.RANK_CHANGE).rankChange(RanksManager.OWNER_RANK, RanksManager.SUB_OWNER_RANK) .build(); + // Add historu record + island.log(new LogEntry.Builder(LogType.NEWOWNER).data(targetUUID2.toString(), "new owner") + .data(user.getUniqueId().toString(), "old owner").build()); return true; } diff --git a/src/main/java/world/bentobox/bentobox/api/commands/island/team/IslandTeamTrustCommand.java b/src/main/java/world/bentobox/bentobox/api/commands/island/team/IslandTeamTrustCommand.java index 38c0349f7..435bbdee5 100644 --- a/src/main/java/world/bentobox/bentobox/api/commands/island/team/IslandTeamTrustCommand.java +++ b/src/main/java/world/bentobox/bentobox/api/commands/island/team/IslandTeamTrustCommand.java @@ -9,6 +9,8 @@ import org.eclipse.jdt.annotation.Nullable; import world.bentobox.bentobox.api.commands.CompositeCommand; import world.bentobox.bentobox.api.localization.TextVariables; +import world.bentobox.bentobox.api.logs.LogEntry; +import world.bentobox.bentobox.api.logs.LogEntry.LogType; import world.bentobox.bentobox.api.user.User; import world.bentobox.bentobox.database.objects.Island; import world.bentobox.bentobox.database.objects.TeamInvite.Type; @@ -110,6 +112,10 @@ public class IslandTeamTrustCommand extends CompositeCommand { island.setRank(target, RanksManager.TRUSTED_RANK); user.sendMessage("commands.island.team.trust.success", TextVariables.NAME, target.getName(), TextVariables.DISPLAY_NAME, target.getDisplayName()); target.sendMessage("commands.island.team.trust.you-are-trusted", TextVariables.NAME, user.getName(), TextVariables.DISPLAY_NAME, user.getDisplayName()); + // Add historu record + island.log(new LogEntry.Builder(LogType.TRUSTED).data(targetUUID.toString(), "trusted") + .data(user.getUniqueId().toString(), "trusted by").build()); + } return true; } else { diff --git a/src/main/java/world/bentobox/bentobox/api/logs/LogEntry.java b/src/main/java/world/bentobox/bentobox/api/logs/LogEntry.java index 583bd24a9..012623479 100644 --- a/src/main/java/world/bentobox/bentobox/api/logs/LogEntry.java +++ b/src/main/java/world/bentobox/bentobox/api/logs/LogEntry.java @@ -15,16 +15,21 @@ import com.google.gson.annotations.Expose; * An {@link world.bentobox.bentobox.database.objects.adapters.AdapterInterface AdapterInterface} is provided to be able to save/retrieve * a list of instances of this object to/from the database: {@link world.bentobox.bentobox.database.objects.adapters.LogEntryListAdapter LogEntryListAdapter}. * - * @author Poslovitch + * @author Poslovitch, tastybento + * */ public class LogEntry { @Expose private final long timestamp; @Expose - private final String type; + private final LogType type; @Expose private final Map data; + public enum LogType { + REMOVE, ADD, UNREGISTER, BAN, UNOWNED, SPAWN, UNBAN, JOINED, NEWOWNER, TRUSTED, UNKNOWN + } + private LogEntry(@NonNull Builder builder) { this.timestamp = builder.timestamp; this.type = builder.type; @@ -36,7 +41,7 @@ public class LogEntry { } @NonNull - public String getType() { + public LogType getType() { return type; } @@ -47,12 +52,12 @@ public class LogEntry { public static class Builder { private long timestamp; - private final String type; + private final LogType type; private Map data; - public Builder(@NonNull String type) { + public Builder(LogType type) { this.timestamp = System.currentTimeMillis(); - this.type = type.toUpperCase(Locale.ENGLISH); + this.type = type; this.data = new LinkedHashMap<>(); } diff --git a/src/main/java/world/bentobox/bentobox/database/objects/Island.java b/src/main/java/world/bentobox/bentobox/database/objects/Island.java index e55c6a0ea..663c31cf0 100644 --- a/src/main/java/world/bentobox/bentobox/database/objects/Island.java +++ b/src/main/java/world/bentobox/bentobox/database/objects/Island.java @@ -37,6 +37,7 @@ import world.bentobox.bentobox.api.commands.CompositeCommand; import world.bentobox.bentobox.api.configuration.WorldSettings; import world.bentobox.bentobox.api.flags.Flag; import world.bentobox.bentobox.api.logs.LogEntry; +import world.bentobox.bentobox.api.logs.LogEntry.LogType; import world.bentobox.bentobox.api.metadata.MetaDataAble; import world.bentobox.bentobox.api.metadata.MetaDataValue; import world.bentobox.bentobox.api.user.User; @@ -327,7 +328,7 @@ public class Island implements DataObject, MetaDataAble { public boolean ban(@NonNull UUID issuer, @NonNull UUID target) { if (getRank(target) != RanksManager.BANNED_RANK) { setRank(target, RanksManager.BANNED_RANK); - log(new LogEntry.Builder("BAN").data("player", target.toString()).data("issuer", issuer.toString()) + log(new LogEntry.Builder(LogType.BAN).data("player", target.toString()).data("issuer", issuer.toString()) .build()); setChanged(); } @@ -360,7 +361,7 @@ public class Island implements DataObject, MetaDataAble { */ public boolean unban(@NonNull UUID issuer, @NonNull UUID target) { if (members.remove(target) != null) { - log(new LogEntry.Builder("UNBAN").data("player", target.toString()).data("issuer", issuer.toString()) + log(new LogEntry.Builder(LogType.UNBAN).data("player", target.toString()).data("issuer", issuer.toString()) .build()); return true; } @@ -1132,7 +1133,7 @@ public class Island implements DataObject, MetaDataAble { this.owner = owner; if (owner == null) { - log(new LogEntry.Builder("UNOWNED").build()); + log(new LogEntry.Builder(LogType.UNOWNED).build()); return; } // Defensive code: demote any previous owner @@ -1281,7 +1282,7 @@ public class Island implements DataObject, MetaDataAble { setFlagsDefaults(); setFlag(Flags.LOCK, RanksManager.VISITOR_RANK); } - log(new LogEntry.Builder("SPAWN").data("value", String.valueOf(isSpawn)).build()); + log(new LogEntry.Builder(LogType.SPAWN).data("value", String.valueOf(isSpawn)).build()); setChanged(); } diff --git a/src/main/java/world/bentobox/bentobox/database/objects/adapters/LogEntryListAdapter.java b/src/main/java/world/bentobox/bentobox/database/objects/adapters/LogEntryListAdapter.java index a4f8b5954..b687263c0 100644 --- a/src/main/java/world/bentobox/bentobox/database/objects/adapters/LogEntryListAdapter.java +++ b/src/main/java/world/bentobox/bentobox/database/objects/adapters/LogEntryListAdapter.java @@ -5,7 +5,10 @@ import java.util.LinkedList; import java.util.List; import java.util.Map; +import com.google.common.base.Enums; + import world.bentobox.bentobox.api.logs.LogEntry; +import world.bentobox.bentobox.api.logs.LogEntry.LogType; /** * @author Poslovitch @@ -41,7 +44,7 @@ public class LogEntryListAdapter implements AdapterInterface, Lis List> serialized = (List>) object; for (Map entry : serialized) { long timestamp = (long) entry.get(TIMESTAMP); - String type = (String) entry.get(TYPE); + LogType type = Enums.getIfPresent(LogType.class, (String) entry.get(TYPE)).or(LogType.UNKNOWN); Map data = (Map) entry.get(DATA); result.add(new LogEntry.Builder(type).timestamp(timestamp).data(data).build()); diff --git a/src/main/java/world/bentobox/bentobox/lists/GameModePlaceholder.java b/src/main/java/world/bentobox/bentobox/lists/GameModePlaceholder.java index 03b67d59b..f79a69bf2 100644 --- a/src/main/java/world/bentobox/bentobox/lists/GameModePlaceholder.java +++ b/src/main/java/world/bentobox/bentobox/lists/GameModePlaceholder.java @@ -3,7 +3,10 @@ package world.bentobox.bentobox.lists; import java.text.DateFormat; import java.time.Instant; import java.util.Date; +import java.util.HashSet; +import java.util.Iterator; import java.util.Optional; +import java.util.Set; import java.util.stream.Collectors; import org.eclipse.jdt.annotation.NonNull; @@ -11,6 +14,8 @@ import org.eclipse.jdt.annotation.Nullable; import world.bentobox.bentobox.api.addons.GameModeAddon; import world.bentobox.bentobox.api.localization.TextVariables; +import world.bentobox.bentobox.api.logs.LogEntry; +import world.bentobox.bentobox.api.logs.LogEntry.LogType; import world.bentobox.bentobox.api.placeholders.GameModePlaceholderReplacer; import world.bentobox.bentobox.api.user.User; import world.bentobox.bentobox.database.objects.Island; @@ -120,6 +125,14 @@ public enum GameModePlaceholder { * @since 1.5.0 */ ISLAND_MEMBERS_COUNT("island_members_count", (addon, user, island) -> island == null ? "" : String.valueOf(island.getMemberSet().size())), + + /** + * Returns the number of players that are or have ever been a MEMBER on this island. + * @since 3.0.0 + */ + ISLAND_HISTORICAL_MEMBERS_COUNT("island_historical_members_count", + (addon, user, island) -> island == null ? "" : getHistoricalMembers(island)), + /** * Returns a comma separated list of player names that are at least MEMBER on this island. * @since 1.13.0 @@ -395,6 +408,24 @@ public enum GameModePlaceholder { this.replacer = replacer; } + /** + * Provides a count of how many players have ever joined the island as a member including the owner + * @param island island + * @return String count of the number of members + */ + private static String getHistoricalMembers(@Nullable Island island) { + Set uniqueMembers = new HashSet<>(); + for (LogEntry le : island.getHistory()) { + if (le.getType() == LogType.JOINED) { + Iterator it = le.getData().keySet().iterator(); + while (it.hasNext()) { + uniqueMembers.add(it.next()); + } + } + } + return String.valueOf(uniqueMembers.size()); + } + /** * Get the visited island * @param addon - game mode addon diff --git a/src/main/java/world/bentobox/bentobox/managers/IslandsManager.java b/src/main/java/world/bentobox/bentobox/managers/IslandsManager.java index 9aceb1595..0452c970c 100644 --- a/src/main/java/world/bentobox/bentobox/managers/IslandsManager.java +++ b/src/main/java/world/bentobox/bentobox/managers/IslandsManager.java @@ -47,6 +47,8 @@ import world.bentobox.bentobox.api.events.island.IslandEvent; import world.bentobox.bentobox.api.events.island.IslandEvent.Reason; import world.bentobox.bentobox.api.flags.Flag; import world.bentobox.bentobox.api.localization.TextVariables; +import world.bentobox.bentobox.api.logs.LogEntry; +import world.bentobox.bentobox.api.logs.LogEntry.LogType; import world.bentobox.bentobox.api.user.User; import world.bentobox.bentobox.database.Database; import world.bentobox.bentobox.database.json.BentoboxTypeAdapterFactory; @@ -1189,6 +1191,7 @@ public class IslandsManager { * * @param player player */ + @SuppressWarnings("deprecation") private void readyPlayer(@NonNull Player player) { // Stop any gliding player.setGliding(false); @@ -1537,6 +1540,8 @@ public class IslandsManager { // Add player to new island teamIsland.addMember(playerUUID); islandCache.addPlayer(playerUUID, teamIsland); + // Add historu record + teamIsland.log(new LogEntry.Builder(LogType.JOINED).data(playerUUID.toString(), "player").build()); // Save the island updateIsland(teamIsland); } diff --git a/src/main/java/world/bentobox/bentobox/managers/island/IslandCache.java b/src/main/java/world/bentobox/bentobox/managers/island/IslandCache.java index a1c0c6859..d4b04400c 100644 --- a/src/main/java/world/bentobox/bentobox/managers/island/IslandCache.java +++ b/src/main/java/world/bentobox/bentobox/managers/island/IslandCache.java @@ -23,6 +23,8 @@ import org.eclipse.jdt.annotation.Nullable; import world.bentobox.bentobox.BentoBox; import world.bentobox.bentobox.api.flags.Flag; +import world.bentobox.bentobox.api.logs.LogEntry; +import world.bentobox.bentobox.api.logs.LogEntry.LogType; import world.bentobox.bentobox.database.Database; import world.bentobox.bentobox.database.objects.Island; import world.bentobox.bentobox.managers.RanksManager; @@ -431,6 +433,8 @@ public class IslandCache { } island.removeMember(uuid); island.removePrimary(uuid); + // Add historu record + island.log(new LogEntry.Builder(LogType.REMOVE).data(uuid.toString(), "player").build()); } /** diff --git a/src/main/java/world/bentobox/bentobox/managers/island/NewIsland.java b/src/main/java/world/bentobox/bentobox/managers/island/NewIsland.java index bb4f2cb22..198e8950c 100644 --- a/src/main/java/world/bentobox/bentobox/managers/island/NewIsland.java +++ b/src/main/java/world/bentobox/bentobox/managers/island/NewIsland.java @@ -15,6 +15,8 @@ import world.bentobox.bentobox.api.events.IslandBaseEvent; import world.bentobox.bentobox.api.events.island.IslandCreateEvent; import world.bentobox.bentobox.api.events.island.IslandEvent; import world.bentobox.bentobox.api.events.island.IslandEvent.Reason; +import world.bentobox.bentobox.api.logs.LogEntry; +import world.bentobox.bentobox.api.logs.LogEntry.LogType; import world.bentobox.bentobox.api.events.island.IslandResetEvent; import world.bentobox.bentobox.api.user.User; import world.bentobox.bentobox.database.objects.Island; @@ -217,6 +219,8 @@ public class NewIsland { island.setFlagsDefaults(); // Register metrics plugin.getMetrics().ifPresent(BStats::increaseIslandsCreatedCount); + // Add historu record + island.log(new LogEntry.Builder(LogType.JOINED).data(user.getUniqueId().toString(), "owner").build()); // Save island IslandsManager.updateIsland(island); } From 9fcee4488805b25f8218237b8a7a03f548e4f853 Mon Sep 17 00:00:00 2001 From: tastybento Date: Mon, 11 Nov 2024 13:14:33 -0800 Subject: [PATCH 3/5] Fix tests --- .../objects/adapters/AdapterInterface.java | 14 ++++---- .../objects/adapters/LogEntryListAdapter.java | 2 +- .../adapters/LogEntryListAdapterTest.java | 36 ++++++++++++++++--- 3 files changed, 39 insertions(+), 13 deletions(-) diff --git a/src/main/java/world/bentobox/bentobox/database/objects/adapters/AdapterInterface.java b/src/main/java/world/bentobox/bentobox/database/objects/adapters/AdapterInterface.java index 096e59b07..7c688b9d1 100644 --- a/src/main/java/world/bentobox/bentobox/database/objects/adapters/AdapterInterface.java +++ b/src/main/java/world/bentobox/bentobox/database/objects/adapters/AdapterInterface.java @@ -10,17 +10,17 @@ package world.bentobox.bentobox.database.objects.adapters; */ public interface AdapterInterface { - /** - * Serialize object - * @param object - object to serialize - * @return serialized object - */ - S deserialize(Object object); - /** * Deserialize object * @param object - object to deserialize * @return deserialized object */ + S deserialize(Object object); + + /** + * Serialize object + * @param object - object to serialize + * @return serialized object + */ V serialize(Object object); } diff --git a/src/main/java/world/bentobox/bentobox/database/objects/adapters/LogEntryListAdapter.java b/src/main/java/world/bentobox/bentobox/database/objects/adapters/LogEntryListAdapter.java index b687263c0..d3b38f358 100644 --- a/src/main/java/world/bentobox/bentobox/database/objects/adapters/LogEntryListAdapter.java +++ b/src/main/java/world/bentobox/bentobox/database/objects/adapters/LogEntryListAdapter.java @@ -65,7 +65,7 @@ public class LogEntryListAdapter implements AdapterInterface, Lis history.forEach(logEntry -> { Map value = new LinkedHashMap<>(); value.put(TIMESTAMP, logEntry.getTimestamp()); - value.put(TYPE, logEntry.getType()); + value.put(TYPE, logEntry.getType().name()); if (logEntry.getData() != null) { value.put(DATA, logEntry.getData()); diff --git a/src/test/java/world/bentobox/bentobox/database/objects/adapters/LogEntryListAdapterTest.java b/src/test/java/world/bentobox/bentobox/database/objects/adapters/LogEntryListAdapterTest.java index ce91f6469..d6620aec9 100644 --- a/src/test/java/world/bentobox/bentobox/database/objects/adapters/LogEntryListAdapterTest.java +++ b/src/test/java/world/bentobox/bentobox/database/objects/adapters/LogEntryListAdapterTest.java @@ -7,6 +7,7 @@ import java.util.LinkedList; import java.util.List; import java.util.UUID; +import org.bukkit.configuration.InvalidConfigurationException; import org.bukkit.configuration.file.YamlConfiguration; import org.junit.After; import org.junit.Before; @@ -14,6 +15,7 @@ import org.junit.Test; import org.mockito.Mockito; import world.bentobox.bentobox.api.logs.LogEntry; +import world.bentobox.bentobox.api.logs.LogEntry.LogType; /** * @author tastybento @@ -28,8 +30,6 @@ public class LogEntryListAdapterTest { private UUID issuer; private List toLog; - /** - */ @Before public void setUp() throws Exception { config = new YamlConfiguration(); @@ -38,9 +38,11 @@ public class LogEntryListAdapterTest { issuer = UUID.randomUUID(); toLog = new ArrayList<>(); - toLog.add(new LogEntry.Builder("BAN").data("player", target.toString()).data("issuer", issuer.toString()).build()); - toLog.add(new LogEntry.Builder("UNBAN").data("player", target.toString()).data("issuer", issuer.toString()).build()); - toLog.add(new LogEntry.Builder("UNOWNED").build()); + toLog.add(new LogEntry.Builder(LogType.BAN).data("player", target.toString()).data("issuer", issuer.toString()) + .build()); + toLog.add(new LogEntry.Builder(LogType.UNBAN).data("player", target.toString()) + .data("issuer", issuer.toString()).build()); + toLog.add(new LogEntry.Builder(LogType.UNOWNED).build()); history.addAll(toLog); } @@ -67,4 +69,28 @@ public class LogEntryListAdapterTest { } } + /** + * Test method for {@link world.bentobox.bentobox.database.objects.adapters.LogEntryListAdapter#serialize(java.lang.Object)} + * and {@link world.bentobox.bentobox.database.objects.adapters.LogEntryListAdapter#deserialize(java.lang.Object)}. + * @throws InvalidConfigurationException + */ + @Test + public void testSerializeDeserializeUnknownHistory() throws InvalidConfigurationException { + // Make entries using unknown types + String bad = "test:\n" + " history:\n" + " - timestamp: 1731359067207\n" + " type: WEIRD\n" + " data:\n" + + " player: 3f9d5634-331e-4598-9445-7449d56f7f74\n" + + " issuer: b366ba84-adec-42fe-b9dc-2c6a7b26f067\n" + " - timestamp: 1731359067207\n" + + " type: ENTRY\n" + " data:\n" + " player: 3f9d5634-331e-4598-9445-7449d56f7f74\n" + + " issuer: b366ba84-adec-42fe-b9dc-2c6a7b26f067\n" + " - timestamp: 1731359067207\n" + + " type: SUPER\n" + " data: {}"; + config.loadFromString(bad); + + // Verify + List historyCheck = a.deserialize(config.get("test.history")); + assertEquals(3, historyCheck.size()); + for (int i = 0; i < historyCheck.size(); i++) { + assertEquals(LogType.UNKNOWN, historyCheck.get(i).getType()); + } + } + } From 626b2153220262abcbac598e073e9fe9d88b08a5 Mon Sep 17 00:00:00 2001 From: tastybento Date: Tue, 12 Nov 2024 21:50:28 -0800 Subject: [PATCH 4/5] Make island info show min and max world heights --- src/main/java/world/bentobox/bentobox/util/IslandInfo.java | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/src/main/java/world/bentobox/bentobox/util/IslandInfo.java b/src/main/java/world/bentobox/bentobox/util/IslandInfo.java index 909262f44..43af66e9b 100644 --- a/src/main/java/world/bentobox/bentobox/util/IslandInfo.java +++ b/src/main/java/world/bentobox/bentobox/util/IslandInfo.java @@ -150,8 +150,9 @@ public class IslandInfo { user.sendMessage("commands.admin.info.island-center", TextVariables.XYZ, Util.xyz(location)); user.sendMessage("commands.admin.info.protection-range", RANGE, String.valueOf(island.getProtectionRange())); user.sendMessage("commands.admin.info.protection-coords", XZ1, - Util.xyz(new Vector(island.getMinProtectedX(), 0, island.getMinProtectedZ())), "[xz2]", - Util.xyz(new Vector(island.getMaxProtectedX() - 1, 0, island.getMaxProtectedZ() - 1))); + Util.xyz(new Vector(island.getMinProtectedX(), world.getMinHeight(), island.getMinProtectedZ())), + "[xz2]", Util.xyz(new Vector(island.getMaxProtectedX() - 1, world.getMaxHeight(), + island.getMaxProtectedZ() - 1))); if (island.isSpawn()) { user.sendMessage("commands.admin.info.is-spawn"); } From f19ca99362f0e81a68901c160b2ac40e41ce0a85 Mon Sep 17 00:00:00 2001 From: tastybento Date: Thu, 14 Nov 2024 22:12:21 -0800 Subject: [PATCH 5/5] Explicitly save panels from Jar. --- .../world/bentobox/bentobox/BentoBox.java | 29 +++++++++++++++++++ 1 file changed, 29 insertions(+) diff --git a/src/main/java/world/bentobox/bentobox/BentoBox.java b/src/main/java/world/bentobox/bentobox/BentoBox.java index b46ab2b69..2cca38701 100644 --- a/src/main/java/world/bentobox/bentobox/BentoBox.java +++ b/src/main/java/world/bentobox/bentobox/BentoBox.java @@ -1,5 +1,7 @@ package world.bentobox.bentobox; +import java.nio.file.Files; +import java.nio.file.Path; import java.util.List; import java.util.Optional; @@ -465,6 +467,33 @@ public class BentoBox extends JavaPlugin implements Listener { return false; } + log("Saving default panels..."); + + if (!Files.exists(Path.of(this.getDataFolder().getPath(), "panels", "island_creation_panel.yml"))) { + log("Saving default island_creation_panel..."); + this.saveResource("panels/island_creation_panel.yml", false); + } + + if (!Files.exists(Path.of(this.getDataFolder().getPath(), "panels", "language_panel.yml"))) { + log("Saving default language_panel..."); + this.saveResource("panels/language_panel.yml", false); + } + + if (!Files.exists(Path.of(this.getDataFolder().getPath(), "panels", "island_homes_panel.yml"))) { + log("Saving default island_homes_panel..."); + this.saveResource("panels/island_homes_panel.yml", false); + } + + if (!Files.exists(Path.of(this.getDataFolder().getPath(), "panels", "team_invite_panel.yml"))) { + log("Saving default team_invite_panel..."); + this.saveResource("panels/team_invite_panel.yml", false); + } + + if (!Files.exists(Path.of(this.getDataFolder().getPath(), "panels", "team_panel.yml"))) { + log("Saving default team_panel..."); + this.saveResource("panels/team_panel.yml", false); + } + return true; }