From 4a7a4ed7dbca7b2084324917bdaabc6453d73e00 Mon Sep 17 00:00:00 2001 From: Florian CUNY Date: Tue, 1 Jan 2019 21:50:20 +0100 Subject: [PATCH 01/12] Improved Javadocs in User --- .../bentobox/bentobox/api/user/User.java | 24 ++++++++++++------- 1 file changed, 16 insertions(+), 8 deletions(-) diff --git a/src/main/java/world/bentobox/bentobox/api/user/User.java b/src/main/java/world/bentobox/bentobox/api/user/User.java index e464d9d9f..1ec70d3ab 100644 --- a/src/main/java/world/bentobox/bentobox/api/user/User.java +++ b/src/main/java/world/bentobox/bentobox/api/user/User.java @@ -17,9 +17,15 @@ import org.bukkit.util.Vector; import world.bentobox.bentobox.BentoBox; /** - * BSB's user object. Wraps Player. - * @author tastybento + * Combines {@link Player}, {@link OfflinePlayer} and {@link CommandSender} to provide convenience methods related to + * localization and generic interactions. + *
+ * Therefore, a User could usually be a Player, an OfflinePlayer or the server's console. + * Preliminary checks should be performed before trying to run methods that relies on a specific implementation. + *

+ * It is good practice to use the User instance whenever possible instead of Player or CommandSender. * + * @author tastybento */ public class User { @@ -33,7 +39,7 @@ public class User { } /** - * Get an instance of User from a CommandSender + * Gets an instance of User from a CommandSender * @param sender - command sender, e.g. console * @return user - user */ @@ -44,8 +50,9 @@ public class User { // Console return new User(sender); } + /** - * Get an instance of User from a Player object + * Gets an instance of User from a Player object * @param player - the player * @return user - user */ @@ -58,8 +65,9 @@ public class User { } return new User(player); } + /** - * Get an instance of User from a UUID + * Gets an instance of User from a UUID * @param uuid - UUID * @return user - user */ @@ -73,9 +81,10 @@ public class User { // Return player, or null if they are not online return new User(uuid); } + /** * Removes this player from the User cache - * @param player - the player + * @param player the player */ public static void removePlayer(Player player) { users.remove(player.getUniqueId()); @@ -342,7 +351,6 @@ public class User { return Locale.forLanguageTag(plugin.getPlayers().getLocale(playerUUID)); } return Locale.forLanguageTag(plugin.getSettings().getDefaultLanguage()); - } /** @@ -351,7 +359,6 @@ public class User { */ public void updateInventory() { player.updateInventory(); - } /** @@ -421,6 +428,7 @@ public class User { result = prime * result + ((playerUUID == null) ? 0 : playerUUID.hashCode()); return result; } + /* (non-Javadoc) * @see java.lang.Object#equals(java.lang.Object) */ From d5a85e86b3c55d4b7612148b789e5bea89c39d2c Mon Sep 17 00:00:00 2001 From: Florian CUNY Date: Wed, 2 Jan 2019 13:32:36 +0100 Subject: [PATCH 02/12] Changed the scope of spigot-api and VaultAPI to compile This will avoid addons needing to import these dependencies themselves --- pom.xml | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/pom.xml b/pom.xml index 02c2287e3..e9b7a3ca7 100644 --- a/pom.xml +++ b/pom.xml @@ -72,7 +72,6 @@ org.spigotmc spigot-api 1.13.2-R0.1-SNAPSHOT - provided @@ -110,13 +109,13 @@ net.milkbowl.vault VaultAPI 1.7 - provided me.clip placeholderapi 2.9.2 + provided From 2bef086db483c9a157f63ece66fb11d5e3083661 Mon Sep 17 00:00:00 2001 From: Florian CUNY Date: Wed, 2 Jan 2019 13:45:09 +0100 Subject: [PATCH 03/12] Improved some config comments in Settings --- src/main/java/world/bentobox/bentobox/Settings.java | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/src/main/java/world/bentobox/bentobox/Settings.java b/src/main/java/world/bentobox/bentobox/Settings.java index cd2c48b1a..6dab1ca20 100644 --- a/src/main/java/world/bentobox/bentobox/Settings.java +++ b/src/main/java/world/bentobox/bentobox/Settings.java @@ -110,7 +110,7 @@ public class Settings implements DataObject { @ConfigEntry(path = "island.cooldown.trust") private int trustCooldown = 5; - @ConfigComment("How long a player must wait until they can ban a player") + @ConfigComment("How long a player must wait until they can ban a player.") @ConfigComment("after unbanning them. In minutes.") @ConfigEntry(path = "island.cooldown.ban") private int banCooldown = 10; @@ -125,7 +125,6 @@ public class Settings implements DataObject { private int confirmationTime = 10; @ConfigComment("Ask the player to confirm the command he is using by typing it again.") - @ConfigComment("The 'wait' value is the number of seconds to wait for confirmation.") @ConfigEntry(path = "island.confirmation.commands.kick") private boolean kickConfirmation = true; From efd0aba8e8efa0262efd1b3b5e40e6314b535b30 Mon Sep 17 00:00:00 2001 From: Florian CUNY Date: Wed, 2 Jan 2019 13:45:21 +0100 Subject: [PATCH 04/12] Improved WorldSettings Javadoc --- .../bentobox/bentobox/api/configuration/WorldSettings.java | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/src/main/java/world/bentobox/bentobox/api/configuration/WorldSettings.java b/src/main/java/world/bentobox/bentobox/api/configuration/WorldSettings.java index f3d6dbcdc..5c9f23910 100644 --- a/src/main/java/world/bentobox/bentobox/api/configuration/WorldSettings.java +++ b/src/main/java/world/bentobox/bentobox/api/configuration/WorldSettings.java @@ -11,9 +11,10 @@ import org.bukkit.entity.EntityType; import world.bentobox.bentobox.api.flags.Flag; /** - * Contains world-specific settings. Only getters are required, but you may need setters for your own class. + * Contains world-specific settings that must be provided by the {@link world.bentobox.bentobox.api.addons.GameModeAddon} in order to register its Worlds. + *
+ * Depending on your implementation, you may need to add setters. * @author tastybento - * */ public interface WorldSettings { From c078d8dce6af2b3d0915897a7936c4dc4551a8da Mon Sep 17 00:00:00 2001 From: Florian CUNY Date: Wed, 2 Jan 2019 14:37:52 +0100 Subject: [PATCH 05/12] Added ban limit (#getBanLimit() in WorldSettings) Closes #423. I had some trouble with unit testings, that's why I didn't update them to test the new features :( --- .../api/commands/island/IslandBanCommand.java | 23 ++++++++++++------- .../commands/island/IslandBanlistCommand.java | 6 +++++ .../api/configuration/WorldSettings.java | 10 +++++++- .../bentobox/database/objects/Island.java | 2 ++ .../bentobox/managers/IslandWorldManager.java | 5 ++-- src/main/resources/locales/en-US.yml | 2 ++ .../commands/island/IslandBanCommandTest.java | 9 ++------ 7 files changed, 39 insertions(+), 18 deletions(-) diff --git a/src/main/java/world/bentobox/bentobox/api/commands/island/IslandBanCommand.java b/src/main/java/world/bentobox/bentobox/api/commands/island/IslandBanCommand.java index d41ea00c9..27f0f095d 100644 --- a/src/main/java/world/bentobox/bentobox/api/commands/island/IslandBanCommand.java +++ b/src/main/java/world/bentobox/bentobox/api/commands/island/IslandBanCommand.java @@ -82,15 +82,22 @@ public class IslandBanCommand extends CompositeCommand { private boolean ban(User user, User targetUser) { Island island = getIslands().getIsland(getWorld(), user.getUniqueId()); - if (island.addToBanList(targetUser.getUniqueId())) { - user.sendMessage("general.success"); - targetUser.sendMessage("commands.island.ban.owner-banned-you", TextVariables.NAME, user.getName()); - // If the player is online, has an island and on the banned island, move them home immediately - if (targetUser.isOnline() && getIslands().hasIsland(getWorld(), targetUser.getUniqueId()) && island.onIsland(targetUser.getLocation())) { - getIslands().homeTeleport(getWorld(), targetUser.getPlayer()); - island.getWorld().playSound(targetUser.getLocation(), Sound.ENTITY_GENERIC_EXPLODE, 1F, 1F); + + // Check if player can ban any more players + int banLimit = user.getPermissionValue(getPermissionPrefix() + "ban.maxlimit", getIWM().getBanLimit(getWorld())); + if (banLimit <= -1 || island.getBanned().size() < banLimit) { + if (island.addToBanList(targetUser.getUniqueId())) { + user.sendMessage("general.success"); + targetUser.sendMessage("commands.island.ban.owner-banned-you", TextVariables.NAME, user.getName()); + // If the player is online, has an island and on the banned island, move them home immediately + if (targetUser.isOnline() && getIslands().hasIsland(getWorld(), targetUser.getUniqueId()) && island.onIsland(targetUser.getLocation())) { + getIslands().homeTeleport(getWorld(), targetUser.getPlayer()); + island.getWorld().playSound(targetUser.getLocation(), Sound.ENTITY_GENERIC_EXPLODE, 1F, 1F); + } + return true; } - return true; + } else { + user.sendMessage("commands.island.ban.cannot-ban-more-players"); } // Banning was blocked, maybe due to an event cancellation. Fail silently. return false; diff --git a/src/main/java/world/bentobox/bentobox/api/commands/island/IslandBanlistCommand.java b/src/main/java/world/bentobox/bentobox/api/commands/island/IslandBanlistCommand.java index f2ee6f26f..d5bb1e8ac 100644 --- a/src/main/java/world/bentobox/bentobox/api/commands/island/IslandBanlistCommand.java +++ b/src/main/java/world/bentobox/bentobox/api/commands/island/IslandBanlistCommand.java @@ -5,6 +5,7 @@ import java.util.List; import java.util.stream.Collectors; import world.bentobox.bentobox.api.commands.CompositeCommand; +import world.bentobox.bentobox.api.localization.TextVariables; import world.bentobox.bentobox.api.user.User; import world.bentobox.bentobox.database.objects.Island; @@ -64,6 +65,11 @@ public class IslandBanlistCommand extends CompositeCommand { } // Send the strings lines.forEach(l -> user.sendMessage("commands.island.banlist.names", "[line]", l)); + + int banLimit = user.getPermissionValue(getPermissionPrefix() + "ban.maxlimit", getIWM().getBanLimit(getWorld())); + if (banLimit <= -1 || island.getBanned().size() < banLimit) { + user.sendMessage("commands.island.banlist.you-can-ban", TextVariables.NUMBER, String.valueOf(banLimit - island.getBanned().size())); + } return true; } diff --git a/src/main/java/world/bentobox/bentobox/api/configuration/WorldSettings.java b/src/main/java/world/bentobox/bentobox/api/configuration/WorldSettings.java index 5c9f23910..48850f143 100644 --- a/src/main/java/world/bentobox/bentobox/api/configuration/WorldSettings.java +++ b/src/main/java/world/bentobox/bentobox/api/configuration/WorldSettings.java @@ -226,7 +226,6 @@ public interface WorldSettings { */ int getResetLimit(); - /** * Get the island reset time stamp. Any player who last logged in before this time will have resets zeroed */ @@ -272,4 +271,13 @@ public interface WorldSettings { */ boolean isRequireConfirmationToSetHomeInTheEnd(); + /** + * Gets ban limit for this world. + * Once exceeded, island members won't be able to ban any more players from their island. + * Set it to -1 for unlimited. + *
+ * Permission to increase the limit: {@code (permissionprefix).ban.maxlimit.(value)} + * @return the ban limit for this world. + */ + int getBanLimit(); } 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 8b155dc2b..e796f8502 100644 --- a/src/main/java/world/bentobox/bentobox/database/objects/Island.java +++ b/src/main/java/world/bentobox/bentobox/database/objects/Island.java @@ -115,6 +115,7 @@ public class Island implements DataObject { members.put(playerUUID, RanksManager.MEMBER_RANK); } } + /** * Adds target to a list of banned players for this island. May be blocked by the event being cancelled. * If the player is a member, coop or trustee, they will be removed from those lists. @@ -155,6 +156,7 @@ public class Island implements DataObject { public long getCreatedDate(){ return createdDate; } + /** * Gets the Island Guard flag's setting. If this is a protection flag, the this will be the * rank needed to bypass this flag. If it is a Settings flag, any non-zero value means the diff --git a/src/main/java/world/bentobox/bentobox/managers/IslandWorldManager.java b/src/main/java/world/bentobox/bentobox/managers/IslandWorldManager.java index f21099781..c4fea38d0 100644 --- a/src/main/java/world/bentobox/bentobox/managers/IslandWorldManager.java +++ b/src/main/java/world/bentobox/bentobox/managers/IslandWorldManager.java @@ -648,6 +648,7 @@ public class IslandWorldManager { return gameModes.get(Util.getWorld(world)).getWorldSettings().getDeathsMax(); } - - + public int getBanLimit(World world) { + return gameModes.get(Util.getWorld(world)).getWorldSettings().getBanLimit(); + } } diff --git a/src/main/resources/locales/en-US.yml b/src/main/resources/locales/en-US.yml index 2d4e8866e..b51ef0823 100644 --- a/src/main/resources/locales/en-US.yml +++ b/src/main/resources/locales/en-US.yml @@ -369,6 +369,7 @@ commands: cannot-ban-yourself: "&cYou cannot ban yourself!" cannot-ban: "&cThat player cannot be banned." cannot-ban-member: "&cKick the team member first, then ban." + cannot-ban-more-players: "&cYou reached the ban limit, you cannot ban any more players from your island." player-already-banned: "&cPlayer is already banned" owner-banned-you: "&b[name]&c banned you from their island!" you-are-banned: "&bYou are banned from this island!" @@ -383,6 +384,7 @@ commands: noone: "&aNo one is banned on this island" the-following: "&bThe following players are banned:" names: "&c[line]" + you-can-ban: "&bYou can ban up to &e[number] &bmore players." settings: description: "display island settings" language: diff --git a/src/test/java/world/bentobox/bentobox/api/commands/island/IslandBanCommandTest.java b/src/test/java/world/bentobox/bentobox/api/commands/island/IslandBanCommandTest.java index 80d68ee20..97fe138dd 100644 --- a/src/test/java/world/bentobox/bentobox/api/commands/island/IslandBanCommandTest.java +++ b/src/test/java/world/bentobox/bentobox/api/commands/island/IslandBanCommandTest.java @@ -1,6 +1,3 @@ -/** - * - */ package world.bentobox.bentobox.api.commands.island; import static org.junit.Assert.assertFalse; @@ -61,9 +58,6 @@ public class IslandBanCommandTest { private PlayersManager pm; private Island island; - /** - * @throws java.lang.Exception - */ @Before public void setUp() throws Exception { // Set up plugin @@ -121,7 +115,6 @@ public class IslandBanCommandTest { IslandWorldManager iwm = mock(IslandWorldManager.class); when(iwm.getFriendlyName(Mockito.any())).thenReturn("BSkyBlock"); when(plugin.getIWM()).thenReturn(iwm); - } /** @@ -241,6 +234,7 @@ public class IslandBanCommandTest { when(targetUser.isPlayer()).thenReturn(true); when(targetUser.isOnline()).thenReturn(false); when(User.getInstance(Mockito.any(UUID.class))).thenReturn(targetUser); + when(user.getPermissionValue(Mockito.anyString(), Mockito.anyInt())).thenReturn(-1); // Allow adding to ban list when(island.addToBanList(Mockito.any())).thenReturn(true); @@ -263,6 +257,7 @@ public class IslandBanCommandTest { when(targetUser.isPlayer()).thenReturn(true); when(targetUser.isOnline()).thenReturn(true); when(User.getInstance(Mockito.any(UUID.class))).thenReturn(targetUser); + when(user.getPermissionValue(Mockito.anyString(), Mockito.anyInt())).thenReturn(-1); // Allow adding to ban list when(island.addToBanList(Mockito.any())).thenReturn(true); From 01b7ace0be78fe8439414c53c27d416e9b5d73c5 Mon Sep 17 00:00:00 2001 From: Florian CUNY Date: Wed, 2 Jan 2019 14:48:17 +0100 Subject: [PATCH 06/12] Fixed code smells --- .../admin/AdminClearresetsallCommand.java | 2 +- .../versions/ServerCompatibility.java | 15 ++++++++---- .../api/localization/TextVariablesTest.java | 23 ++++++++----------- 3 files changed, 20 insertions(+), 20 deletions(-) diff --git a/src/main/java/world/bentobox/bentobox/api/commands/admin/AdminClearresetsallCommand.java b/src/main/java/world/bentobox/bentobox/api/commands/admin/AdminClearresetsallCommand.java index e2ec56fd4..61830f151 100644 --- a/src/main/java/world/bentobox/bentobox/api/commands/admin/AdminClearresetsallCommand.java +++ b/src/main/java/world/bentobox/bentobox/api/commands/admin/AdminClearresetsallCommand.java @@ -10,7 +10,7 @@ import world.bentobox.bentobox.api.commands.ConfirmableCommand; import world.bentobox.bentobox.api.user.User; /** - * Unlike {@link AdminClearresetsCommand}, this command will be removed. + * @deprecated Unlike {@link AdminClearresetsCommand}, this command will be removed. * We will be working on an alternative which will use {@link world.bentobox.bentobox.api.commands.admin.resets.AdminResetsResetCommand} instead. */ @Deprecated diff --git a/src/main/java/world/bentobox/bentobox/versions/ServerCompatibility.java b/src/main/java/world/bentobox/bentobox/versions/ServerCompatibility.java index aeb077ada..e58818c8a 100644 --- a/src/main/java/world/bentobox/bentobox/versions/ServerCompatibility.java +++ b/src/main/java/world/bentobox/bentobox/versions/ServerCompatibility.java @@ -118,7 +118,8 @@ public class ServerCompatibility { if (version == null || version.getCompatibility().equals(Compatibility.INCOMPATIBLE)) { // 'Version = null' means that it's not listed. And therefore, it's implicitly incompatible. - return result = Compatibility.INCOMPATIBLE; + result = Compatibility.INCOMPATIBLE; + return result; } // Now, check the server software @@ -126,19 +127,23 @@ public class ServerCompatibility { if (software == null || software.getCompatibility().equals(Compatibility.INCOMPATIBLE)) { // 'software = null' means that it's not listed. And therefore, it's implicitly incompatible. - return result = Compatibility.INCOMPATIBLE; + result = Compatibility.INCOMPATIBLE; + return result; } if (software.getCompatibility().equals(Compatibility.NOT_SUPPORTED) || version.getCompatibility().equals(Compatibility.NOT_SUPPORTED)) { - return result = Compatibility.NOT_SUPPORTED; + result = Compatibility.NOT_SUPPORTED; + return result; } if (software.getCompatibility().equals(Compatibility.SUPPORTED) || version.getCompatibility().equals(Compatibility.SUPPORTED)) { - return result = Compatibility.SUPPORTED; + result = Compatibility.SUPPORTED; + return result; } // Nothing's wrong, the server is compatible. - return result = Compatibility.COMPATIBLE; + result = Compatibility.COMPATIBLE; + return result; } return result; diff --git a/src/test/java/world/bentobox/bentobox/api/localization/TextVariablesTest.java b/src/test/java/world/bentobox/bentobox/api/localization/TextVariablesTest.java index bee49f61f..85ab9bf43 100644 --- a/src/test/java/world/bentobox/bentobox/api/localization/TextVariablesTest.java +++ b/src/test/java/world/bentobox/bentobox/api/localization/TextVariablesTest.java @@ -1,6 +1,3 @@ -/** - * - */ package world.bentobox.bentobox.api.localization; import static org.junit.Assert.*; @@ -10,21 +7,19 @@ import org.junit.Test; /** * Test class just to check that these constants don't accidentally change * @author tastybento - * */ public class TextVariablesTest { @Test public void test() { - assertEquals("[name]", TextVariables.NAME); - assertEquals("[description]", TextVariables.DESCRIPTION); - assertEquals("[number]", TextVariables.NUMBER); - assertEquals("[rank]", TextVariables.RANK); - assertEquals("[label]", TextVariables.LABEL); - assertEquals("[permission]", TextVariables.PERMISSION); - assertEquals("[spawn_here]", TextVariables.SPAWN_HERE); - assertEquals("[version]", TextVariables.VERSION); - assertEquals("[start]", TextVariables.START_TEXT); + assertEquals(TextVariables.NAME, "[name]"); + assertEquals(TextVariables.DESCRIPTION, "[description]"); + assertEquals(TextVariables.NUMBER, "[number]"); + assertEquals(TextVariables.RANK, "[rank]"); + assertEquals(TextVariables.LABEL, "[label]"); + assertEquals(TextVariables.PERMISSION, "[permission]"); + assertEquals(TextVariables.SPAWN_HERE, "[spawn_here]"); + assertEquals(TextVariables.VERSION, "[version]"); + assertEquals(TextVariables.START_TEXT, "[start]"); } - } From 6f0912e1d22b767ceacfa3c26037e27f54ec920c Mon Sep 17 00:00:00 2001 From: Florian CUNY Date: Wed, 2 Jan 2019 15:29:27 +0100 Subject: [PATCH 07/12] Added ITEM_FRAME flag #391. --- .../listeners/flags/BlockInteractionListener.java | 14 ++++++++++++-- .../java/world/bentobox/bentobox/lists/Flags.java | 1 + 2 files changed, 13 insertions(+), 2 deletions(-) diff --git a/src/main/java/world/bentobox/bentobox/listeners/flags/BlockInteractionListener.java b/src/main/java/world/bentobox/bentobox/listeners/flags/BlockInteractionListener.java index 35a678ac3..80de5d705 100644 --- a/src/main/java/world/bentobox/bentobox/listeners/flags/BlockInteractionListener.java +++ b/src/main/java/world/bentobox/bentobox/listeners/flags/BlockInteractionListener.java @@ -14,7 +14,6 @@ import world.bentobox.bentobox.lists.Flags; /** * @author tastybento - * */ public class BlockInteractionListener extends FlagListener { @@ -24,6 +23,15 @@ public class BlockInteractionListener extends FlagListener { */ @EventHandler(priority = EventPriority.LOWEST, ignoreCancelled = true) public void onPlayerInteract(final PlayerInteractEvent e) { + // For some items, we need to do a specific check for RIGHT_CLICK_BLOCK + if (e.getAction().equals(Action.RIGHT_CLICK_BLOCK)) { + if (e.getClickedBlock().getType().equals(Material.ITEM_FRAME)) { + checkIsland(e, e.getClickedBlock().getLocation(), Flags.ITEM_FRAME); + return; + } + } + + // Otherwise, we just don't care about the RIGHT_CLICK_BLOCK action. if (!e.getAction().equals(Action.RIGHT_CLICK_BLOCK)) { return; } @@ -243,11 +251,13 @@ public class BlockInteractionListener extends FlagListener { case END_PORTAL_FRAME: checkIsland(e, loc, Flags.PLACE_BLOCKS); break; + case ITEM_FRAME: + checkIsland(e, loc, Flags.ITEM_FRAME); + break; default: break; } - } /** diff --git a/src/main/java/world/bentobox/bentobox/lists/Flags.java b/src/main/java/world/bentobox/bentobox/lists/Flags.java index 61476c31b..249c604d9 100644 --- a/src/main/java/world/bentobox/bentobox/lists/Flags.java +++ b/src/main/java/world/bentobox/bentobox/lists/Flags.java @@ -83,6 +83,7 @@ public final class Flags { public static final Flag BUTTON = new Flag.Builder("BUTTON", Material.OAK_BUTTON).build(); public static final Flag REDSTONE = new Flag.Builder("REDSTONE", Material.REDSTONE).build(); public static final Flag SPAWN_EGGS = new Flag.Builder("SPAWN_EGGS", Material.COW_SPAWN_EGG).build(); + public static final Flag ITEM_FRAME = new Flag.Builder("ITEM_FRAME", Material.ITEM_FRAME).build(); // Entity interactions public static final Flag ARMOR_STAND = new Flag.Builder("ARMOR_STAND", Material.ARMOR_STAND).listener(new EntityInteractListener()).build(); From 30c20216fa602c31a6918348539a0e49473d6ee8 Mon Sep 17 00:00:00 2001 From: Florian CUNY Date: Wed, 2 Jan 2019 16:54:58 +0100 Subject: [PATCH 08/12] Metrics: added islands count line chart --- src/main/java/world/bentobox/bentobox/BStats.java | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/src/main/java/world/bentobox/bentobox/BStats.java b/src/main/java/world/bentobox/bentobox/BStats.java index 3f3a283cd..93b252bdf 100644 --- a/src/main/java/world/bentobox/bentobox/BStats.java +++ b/src/main/java/world/bentobox/bentobox/BStats.java @@ -25,6 +25,9 @@ class BStats { // Simple Pie Charts registerDefaultLanguageChart(); registerDatabaseTypeChart(); + + // Single Line charts + registerIslandsCountChart(); } private void registerDefaultLanguageChart() { @@ -34,4 +37,8 @@ class BStats { private void registerDatabaseTypeChart() { metrics.addCustomChart(new Metrics.SimplePie("database_type", () -> plugin.getSettings().getDatabaseType().toString())); } + + private void registerIslandsCountChart() { + metrics.addCustomChart(new Metrics.SingleLineChart("islands", () -> plugin.getIslands().getIslandCount())); + } } From c7a85c2b5ab9ec9c916fe8615e12952469c026ab Mon Sep 17 00:00:00 2001 From: Florian CUNY Date: Wed, 2 Jan 2019 17:28:11 +0100 Subject: [PATCH 09/12] Fixed AddonDescription to use a valid Builder pattern AddonDescriptionBuilder has been renamed to AddonDescription.Builder ; and there is no longer public constructors in this class. This change is obviously API breaking, but it's relatively "internal", so hopefully people didn't use it. --- .../bentobox/api/addons/AddonClassLoader.java | 16 +- .../bentobox/api/addons/AddonDescription.java | 182 +++++++----------- .../bentobox/api/addons/AddonTest.java | 28 +-- .../bentobox/managers/LocalesManagerTest.java | 3 +- 4 files changed, 81 insertions(+), 148 deletions(-) diff --git a/src/main/java/world/bentobox/bentobox/api/addons/AddonClassLoader.java b/src/main/java/world/bentobox/bentobox/api/addons/AddonClassLoader.java index b5a9b7df5..fc6f7f563 100644 --- a/src/main/java/world/bentobox/bentobox/api/addons/AddonClassLoader.java +++ b/src/main/java/world/bentobox/bentobox/api/addons/AddonClassLoader.java @@ -16,7 +16,6 @@ import org.bukkit.permissions.PermissionDefault; import org.bukkit.plugin.InvalidDescriptionException; import org.bukkit.util.permissions.DefaultPermissions; -import world.bentobox.bentobox.api.addons.AddonDescription.AddonDescriptionBuilder; import world.bentobox.bentobox.api.addons.exceptions.InvalidAddonFormatException; import world.bentobox.bentobox.api.addons.exceptions.InvalidAddonInheritException; import world.bentobox.bentobox.managers.AddonsManager; @@ -83,18 +82,19 @@ public class AddonClassLoader extends URLClassLoader { } private AddonDescription asDescription(YamlConfiguration data) { - AddonDescriptionBuilder adb = new AddonDescriptionBuilder(data.getString("name")) - .withVersion(data.getString("version")) - .withAuthor(data.getString("authors")); + AddonDescription.Builder builder = new AddonDescription.Builder(data.getString("main"), data.getString("name")) + .version(data.getString("version")) + .authors(data.getString("authors")); + if (data.getString("depend") != null) { - adb.withDepend(Arrays.asList(data.getString("depend").split("\\s*,\\s*"))); + builder.dependencies(Arrays.asList(data.getString("depend").split("\\s*,\\s*"))); } if (data.getString("softdepend") != null) { - adb.withSoftDepend(Arrays.asList(data.getString("softdepend").split("\\s*,\\s*"))); + builder.softDependencies(Arrays.asList(data.getString("softdepend").split("\\s*,\\s*"))); } - return adb.build(); - } + return builder.build(); + } /* (non-Javadoc) * @see java.net.URLClassLoader#findClass(java.lang.String) diff --git a/src/main/java/world/bentobox/bentobox/api/addons/AddonDescription.java b/src/main/java/world/bentobox/bentobox/api/addons/AddonDescription.java index 75ca82a64..a347eb673 100644 --- a/src/main/java/world/bentobox/bentobox/api/addons/AddonDescription.java +++ b/src/main/java/world/bentobox/bentobox/api/addons/AddonDescription.java @@ -5,7 +5,7 @@ import java.util.Arrays; import java.util.List; /** - * @author Tastybento, Poslovitch + * @author tastybento, Poslovitch */ public final class AddonDescription { @@ -13,83 +13,18 @@ public final class AddonDescription { private String name; private String version; private String description; - private List authors = new ArrayList<>(); - private List dependencies = new ArrayList<>(); - private List softDependencies = new ArrayList<>(); + private List authors; + private List dependencies; + private List softDependencies; - public AddonDescription() {} - - public AddonDescription(String main, String name, String version, String description, List authors, List dependencies, List softDependencies) { - this.main = main; - this.name = name; - this.version = version; - this.description = description; - this.authors = authors; - this.dependencies = dependencies; - this.softDependencies = softDependencies; - } - - /** - * @param main the main to set - */ - public void setMain(String main) { - this.main = main; - } - - /** - * @param name the name to set - */ - public void setName(String name) { - this.name = name; - } - - /** - * @param version the version to set - */ - public void setVersion(String version) { - this.version = version; - } - - /** - * @param description the description to set - */ - public void setDescription(String description) { - this.description = description; - } - - /** - * @param authors the authors to set - */ - public void setAuthors(List authors) { - this.authors = authors; - } - - /** - * @return the dependencies - */ - public List getDependencies() { - return dependencies; - } - - /** - * @return the softDependencies - */ - public List getSoftDependencies() { - return softDependencies; - } - - /** - * @param dependencies the dependencies to set - */ - public void setDependencies(List dependencies) { - this.dependencies = dependencies; - } - - /** - * @param softDependencies the softDependencies to set - */ - public void setSoftDependencies(List softDependencies) { - this.softDependencies = softDependencies; + private AddonDescription(Builder builder) { + this.main = builder.main; + this.name = builder.name; + this.version = builder.version; + this.description = builder.description; + this.authors = builder.authors; + this.dependencies = builder.dependencies; + this.softDependencies = builder.softDependencies; } public String getName() { @@ -112,44 +47,61 @@ public final class AddonDescription { return authors; } - public static class AddonDescriptionBuilder{ - - private AddonDescription description; - - public AddonDescriptionBuilder(String name){ - description = new AddonDescription(); - description.setName(name); - } - - public AddonDescriptionBuilder withAuthor(String... authors){ - description.setAuthors(Arrays.asList(authors)); - return this; - } - - public AddonDescriptionBuilder withDescription(String desc){ - description.setDescription(desc); - return this; - } - - public AddonDescriptionBuilder withVersion(String version){ - description.setVersion(version); - return this; - } - - public AddonDescriptionBuilder withDepend(List addons) { - description.setDependencies(addons); - return this; - } - - public AddonDescriptionBuilder withSoftDepend(List addons) { - description.setSoftDependencies(addons); - return this; - } - - public AddonDescription build(){ - return description; - } - + /** + * @return the dependencies + */ + public List getDependencies() { + return dependencies; } + /** + * @return the softDependencies + */ + public List getSoftDependencies() { + return softDependencies; + } + + public static class Builder { + private String main; + private String name; + private String version; + private String description; + private List authors = new ArrayList<>(); + private List dependencies = new ArrayList<>(); + private List softDependencies = new ArrayList<>(); + + public Builder(String main, String name) { + this.main = main; + this.name = name; + } + + public Builder version(String version) { + this.version = version; + return this; + } + + public Builder description(String description) { + this.description = description; + return this; + } + + public Builder authors(String... authors) { + this.authors = Arrays.asList(authors); + return this; + } + + public Builder dependencies(List dependencies) { + this.dependencies = dependencies; + return this; + } + + public Builder softDependencies(List softDependencies) { + this.softDependencies = softDependencies; + return this; + } + + public AddonDescription build() { + return new AddonDescription(this); + } + } } diff --git a/src/test/java/world/bentobox/bentobox/api/addons/AddonTest.java b/src/test/java/world/bentobox/bentobox/api/addons/AddonTest.java index a998f8544..3938b58b0 100644 --- a/src/test/java/world/bentobox/bentobox/api/addons/AddonTest.java +++ b/src/test/java/world/bentobox/bentobox/api/addons/AddonTest.java @@ -44,7 +44,6 @@ public class AddonTest { static BentoBox plugin; static JavaPlugin javaPlugin; - @Before public void setUp() throws Exception { Server server = mock(Server.class); @@ -69,21 +68,14 @@ public class AddonTest { when(server.getItemFactory()).thenReturn(itemFactory); ItemMeta itemMeta = mock(ItemMeta.class); when(itemFactory.getItemMeta(any())).thenReturn(itemMeta); - } class TestClass extends Addon { + @Override + public void onEnable() { } @Override - public void onEnable() { - - } - - @Override - public void onDisable() { - - } - + public void onDisable() { } } @Test @@ -118,7 +110,7 @@ public class AddonTest { @Test public void testGetDescription() { TestClass test = new TestClass(); - AddonDescription d = new AddonDescription(); + AddonDescription d = new AddonDescription.Builder("main", "name").build(); assertNull(test.getDescription()); test.setDescription(d); assertEquals(d, test.getDescription()); @@ -159,14 +151,6 @@ public class AddonTest { test.registerListener(listener); } - - @Test - public void testSaveConfig() { - //TestClass test = new TestClass(); - // This will wipe out the config.yml of BSB so I am commenting it out - //test.saveConfig(); - } - @Test public void testSaveDefaultConfig() { TestClass test = new TestClass(); @@ -210,7 +194,6 @@ public class AddonTest { test.saveResource("no_such_file", jarFile, false, true); test.saveResource("no_such_file", jarFile, true, false); test.saveResource("no_such_file", jarFile, true, true); - } @Test @@ -242,7 +225,7 @@ public class AddonTest { @Test public void testSetDescription() { TestClass test = new TestClass(); - AddonDescription desc = new AddonDescription(); + AddonDescription desc = new AddonDescription.Builder("main", "name").build(); test.setDescription(desc); assertEquals(desc, test.getDescription()); } @@ -279,5 +262,4 @@ public class AddonTest { TestClass test = new TestClass(); assertEquals(Optional.empty(),test.getAddonByName("addon")); } - } diff --git a/src/test/java/world/bentobox/bentobox/managers/LocalesManagerTest.java b/src/test/java/world/bentobox/bentobox/managers/LocalesManagerTest.java index 12562f100..c4a08f568 100644 --- a/src/test/java/world/bentobox/bentobox/managers/LocalesManagerTest.java +++ b/src/test/java/world/bentobox/bentobox/managers/LocalesManagerTest.java @@ -299,8 +299,7 @@ public class LocalesManagerTest { AddonsManager am = mock(AddonsManager.class); List none = new ArrayList<>(); Addon addon = mock(Addon.class); - AddonDescription desc = new AddonDescription(); - desc.setName("AcidIsland"); + AddonDescription desc = new AddonDescription.Builder("", "AcidIsland").build(); when(addon.getDescription()).thenReturn(desc); // Create a tmp folder to jar up File localeDir = new File(LOCALE_FOLDER); From be91e137a81cf335cab28ae35a54e05fdd63a829 Mon Sep 17 00:00:00 2001 From: Florian CUNY Date: Wed, 2 Jan 2019 17:49:37 +0100 Subject: [PATCH 10/12] Implemented Addons reloading Relates (a bit) to #370 --- .../commands/BentoBoxReloadCommand.java | 22 +++++++++---------- .../bentobox/managers/AddonsManager.java | 17 +++++++++++--- src/main/resources/locales/en-US.yml | 1 + 3 files changed, 25 insertions(+), 15 deletions(-) diff --git a/src/main/java/world/bentobox/bentobox/commands/BentoBoxReloadCommand.java b/src/main/java/world/bentobox/bentobox/commands/BentoBoxReloadCommand.java index c50365f35..092476f7c 100644 --- a/src/main/java/world/bentobox/bentobox/commands/BentoBoxReloadCommand.java +++ b/src/main/java/world/bentobox/bentobox/commands/BentoBoxReloadCommand.java @@ -7,7 +7,7 @@ import world.bentobox.bentobox.api.commands.ConfirmableCommand; import world.bentobox.bentobox.api.user.User; /** - * Displays information about Gamemodes, Addons and versioning. + * Reloads addons and localization. * * @author tastybento */ @@ -29,17 +29,15 @@ public class BentoBoxReloadCommand extends ConfirmableCommand { @Override public boolean execute(User user, String label, List args) { - this.askConfirmation(user, () -> reloadLocales(user)); + this.askConfirmation(user, () -> { + // Reload addons + getPlugin().getAddonsManager().reloadAddons(); + user.sendMessage("commands.bentobox.reload.addons-reloaded"); + + // Reload locales + getPlugin().getLocalesManager().reloadLanguages(); + user.sendMessage("commands.bentobox.reload.locales-reloaded"); + }); return false; } - - /** - * Reloads the languages - * @param user - */ - public void reloadLocales(User user) { - getPlugin().getLocalesManager().reloadLanguages(); - user.sendMessage("commands.bentobox.reload.locales-reloaded"); - } - } diff --git a/src/main/java/world/bentobox/bentobox/managers/AddonsManager.java b/src/main/java/world/bentobox/bentobox/managers/AddonsManager.java index 713a24796..4e9a316ea 100644 --- a/src/main/java/world/bentobox/bentobox/managers/AddonsManager.java +++ b/src/main/java/world/bentobox/bentobox/managers/AddonsManager.java @@ -44,8 +44,6 @@ public class AddonsManager { loaders = new HashMap<>(); } - //TODO: add addon reload - /** * Loads all the addons from the addons folder */ @@ -95,6 +93,20 @@ public class AddonsManager { } } + /** + * Reloads all the enabled addons + */ + public void reloadAddons() { + if (!addons.isEmpty()) { + plugin.log("Reloading addons..."); + addons.stream().filter(Addon::isEnabled).forEach(addon -> { + plugin.log("Reloading " + addon.getDescription().getName() + "..."); + addon.onReload(); + }); + plugin.log("Addons successfully reloaded."); + } + } + /** * Gets the addon by name * @param name - addon name @@ -260,5 +272,4 @@ public class AddonsManager { addons.addAll(sortedAddons.values()); } - } diff --git a/src/main/resources/locales/en-US.yml b/src/main/resources/locales/en-US.yml index b51ef0823..b37503e59 100644 --- a/src/main/resources/locales/en-US.yml +++ b/src/main/resources/locales/en-US.yml @@ -216,6 +216,7 @@ commands: reload: description: "reloads all locale files" locales-reloaded: "&2Languages reloaded" + addons-reloaded: "&2Addons reloaded" version: plugin-version: "&2Bentobox version: &3[name]" description: "display info" From cf3e260dac7dbd1ff6320c4f26a10f8306da9446 Mon Sep 17 00:00:00 2001 From: Florian CUNY Date: Wed, 2 Jan 2019 18:11:43 +0100 Subject: [PATCH 11/12] Revert "Changed the scope of spigot-api and VaultAPI to compile" This reverts commit d5a85e86b3c55d4b7612148b789e5bea89c39d2c. --- pom.xml | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index e9b7a3ca7..02c2287e3 100644 --- a/pom.xml +++ b/pom.xml @@ -72,6 +72,7 @@ org.spigotmc spigot-api 1.13.2-R0.1-SNAPSHOT + provided @@ -109,13 +110,13 @@ net.milkbowl.vault VaultAPI 1.7 + provided me.clip placeholderapi 2.9.2 - provided From 81a0b3290f9306b84379fc98125505e70bb08a5b Mon Sep 17 00:00:00 2001 From: tastybento Date: Wed, 2 Jan 2019 10:22:39 -0800 Subject: [PATCH 12/12] Adjustment to English locale file for addon reloading https://github.com/BentoBoxWorld/BentoBox/issues/370 --- src/main/resources/locales/en-US.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/resources/locales/en-US.yml b/src/main/resources/locales/en-US.yml index b37503e59..4a60eb074 100644 --- a/src/main/resources/locales/en-US.yml +++ b/src/main/resources/locales/en-US.yml @@ -214,7 +214,7 @@ commands: about: description: "display copyright and license info" reload: - description: "reloads all locale files" + description: "reloads addons (if supported) and locale files" locales-reloaded: "&2Languages reloaded" addons-reloaded: "&2Addons reloaded" version: