From 3bcebc89628421e83dca9a5c078e16c664a72a40 Mon Sep 17 00:00:00 2001 From: CJ Burkey Date: Sat, 1 Jun 2024 22:10:33 -0400 Subject: [PATCH] Prepare for permission revolution --- .../com/cjburkey/claimchunk/ClaimChunk.java | 7 +- .../cjburkey/claimchunk/chunk/DataChunk.java | 28 +++--- .../claimchunk/cmd/CoreActionHandler.java | 2 + .../data/newdata/IClaimChunkDataHandler.java | 58 ++++++----- .../data/newdata/JsonDataHandler.java | 26 ++++- .../data/newdata/MySQLDataHandler.java | 22 ++++- .../data/sqlite/SqLiteDataHandler.java | 32 +++++- .../sqlite/SqLiteTableMigrationManager.java | 9 ++ .../claimchunk/data/sqlite/SqLiteWrapper.java | 99 ++++++++++++++++--- .../claimchunk/data/sqlite/SqlDataChunk.java | 3 + .../gui/screens/PermModifyMenu.java | 1 + .../claimchunk/i18n/V2JsonMessages.java | 5 + .../claimchunk/player/PlayerHandler.java | 2 +- .../smartcommand/ClaimChunkBaseCommand.java | 4 + .../sub/ply/DefaultAccessCmd.java | 47 +++++++++ .../cjburkey/claimchunk/update/SemVer.java | 4 +- .../claimchunk/update/UpdateChecker.java | 12 ++- .../cjburkey/claimchunk/TestSQLPlease.java | 8 +- 18 files changed, 295 insertions(+), 74 deletions(-) create mode 100644 src/main/java/com/cjburkey/claimchunk/smartcommand/sub/ply/DefaultAccessCmd.java diff --git a/src/main/java/com/cjburkey/claimchunk/ClaimChunk.java b/src/main/java/com/cjburkey/claimchunk/ClaimChunk.java index 185b897..4e189c6 100644 --- a/src/main/java/com/cjburkey/claimchunk/ClaimChunk.java +++ b/src/main/java/com/cjburkey/claimchunk/ClaimChunk.java @@ -452,7 +452,7 @@ private void initEcon() { Utils.log("Economy not enabled."); } - @SuppressWarnings("unused") + @SuppressWarnings("deprecation") private JsonDataHandler createJsonDataHandler() { // Create the basic JSON data handler return new JsonDataHandler( @@ -560,7 +560,7 @@ private void setupNewCommands() { private void doUpdateCheck() { try { // Get the latest online plugin version - availableVersion = UpdateChecker.getLatestRelease("cjburkey01", "ClaimChunk"); + availableVersion = UpdateChecker.getLatestRelease(); // Make sure the latest available version is valid if (availableVersion == null) { @@ -570,8 +570,7 @@ private void doUpdateCheck() { if (availableVersion.isNewerThan(version)) { // If the latest available version is newer than the current plugin version, the - // server - // should be updated + // server version should be updated updateAvailable = true; Utils.log( "An update for ClaimChunk is available! Your version: %s | Latest version:" diff --git a/src/main/java/com/cjburkey/claimchunk/chunk/DataChunk.java b/src/main/java/com/cjburkey/claimchunk/chunk/DataChunk.java index f220e4c..a97809a 100644 --- a/src/main/java/com/cjburkey/claimchunk/chunk/DataChunk.java +++ b/src/main/java/com/cjburkey/claimchunk/chunk/DataChunk.java @@ -1,5 +1,8 @@ package com.cjburkey.claimchunk.chunk; +import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; + import java.util.Map; import java.util.Objects; import java.util.UUID; @@ -7,35 +10,32 @@ public class DataChunk { /** The position of the chunk. */ - public final ChunkPos chunk; + public final @NotNull ChunkPos chunk; /** The UUID of the owning player. */ - public final UUID player; - - /** Whether TNT can explode in this chunk if TNT is disabled in the config. */ - // Assignment because I'm not sure if GSON will handle it? - @SuppressWarnings("UnusedAssignment") - public boolean tnt = true; + public final @NotNull UUID player; /** The other players that have access to the chunk, and their permissions * */ - public Map playerPermissions; + public @NotNull Map playerPermissions; + + /** The default access that players will have in this chunk */ + public @Nullable ChunkPlayerPermissions defaultPermissions; /** * Create an instance of chunk data that links a chunk's position and the owning player. * * @param chunk The position of chunk. * @param player The UUID of the owning player. - * @param tnt Whether TNT is enabled in this chunk. */ public DataChunk( - ChunkPos chunk, - UUID player, - Map playerPermissions, - boolean tnt) { + @NotNull ChunkPos chunk, + @NotNull UUID player, + @NotNull Map playerPermissions, + @Nullable ChunkPlayerPermissions defaultPermissions) { this.chunk = chunk; this.player = player; this.playerPermissions = playerPermissions; - this.tnt = tnt; + this.defaultPermissions = defaultPermissions; } @Override diff --git a/src/main/java/com/cjburkey/claimchunk/cmd/CoreActionHandler.java b/src/main/java/com/cjburkey/claimchunk/cmd/CoreActionHandler.java index 4191cda..0dbfa62 100644 --- a/src/main/java/com/cjburkey/claimchunk/cmd/CoreActionHandler.java +++ b/src/main/java/com/cjburkey/claimchunk/cmd/CoreActionHandler.java @@ -9,8 +9,10 @@ import com.cjburkey.claimchunk.player.PlayerHandler; import com.cjburkey.claimchunk.rank.RankHandler; import com.cjburkey.claimchunk.service.prereq.claim.*; + import org.bukkit.*; import org.bukkit.entity.Player; + import java.util.Map; import java.util.UUID; diff --git a/src/main/java/com/cjburkey/claimchunk/data/newdata/IClaimChunkDataHandler.java b/src/main/java/com/cjburkey/claimchunk/data/newdata/IClaimChunkDataHandler.java index 6400729..5ea8793 100644 --- a/src/main/java/com/cjburkey/claimchunk/data/newdata/IClaimChunkDataHandler.java +++ b/src/main/java/com/cjburkey/claimchunk/data/newdata/IClaimChunkDataHandler.java @@ -6,6 +6,7 @@ import com.cjburkey.claimchunk.player.FullPlayerData; import com.cjburkey.claimchunk.player.SimplePlayerData; +import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; import java.util.*; @@ -113,39 +114,37 @@ public interface IClaimChunkDataHandler { UUID getChunkOwner(ChunkPos pos); /** - * Retrieves all claimed chunks and their owners across all worlds. + * Sets the given chunk's default permission flags for all players without specific access flags + * granted. These permissions will override the player's default chunk permissions. * - * @return An array of all claimed chunks - * @since 0.0.13 + * @param pos The position of the chunk to modify. Nothing happens if the chunk is not currently + * claimed. + * @param chunkPermissions The permissions to set as default, or {@code null} to clear the + * permissions for this chunk. + * @since 0.0.26 */ - DataChunk[] getClaimedChunks(); + void setDefaultChunkPermissions( + @NotNull ChunkPos pos, @Nullable ChunkPlayerPermissions chunkPermissions); /** - * Toggles whether TNT can explode in the given chunk. + * Get the given chunk's default permissions for players that haven't been granted special + * access. * - * @param ignoredPos The position of the chunk - * @return Whether TNT is now enabled in the provided chunk - * @since 0.0.16 - * @deprecated Unused. + * @param pos The position of the chunk. + * @return The default permissions for the chunk, or {@code null} if the chunk is not claimed or + * the chunk doesn't have any specific default access permissions. + * @since 0.0.26 */ - @Deprecated - default boolean toggleTnt(ChunkPos ignoredPos) { - return false; - } + @Nullable + ChunkPlayerPermissions getDefaultChunkPermissions(@NotNull ChunkPos pos); /** - * Retrieves whether TNT can explode in the given chunk (regardless of whether TNT is disabled - * in the config). + * Retrieves all claimed chunks and their owners across all worlds. * - * @param ignoredPos The position of the chunk - * @return Whether TNT is enabled in the provided chunk - * @since 0.0.16 - * @deprecated Unused. + * @return An array of all claimed chunks + * @since 0.0.13 */ - @Deprecated - default boolean isTntEnabled(ChunkPos ignoredPos) { - return false; - } + DataChunk[] getClaimedChunks(); // -- PLAYERS -- // @@ -204,6 +203,17 @@ default void addPlayer(UUID player, String lastIgn, boolean alerts, int defaultM */ void addPlayers(FullPlayerData[] players); + /** + * Set the given player's default permission flags in chunks that don't have any specific + * permissions granted. + * + * @param player The player's default to modify + * @param permissions The permissions to grant by default + * @since 0.0.26 + */ + void setDefaultPermissionsForPlayer( + @NotNull UUID player, @NotNull ChunkPlayerPermissions permissions); + /** * Get this player's default permission flags for non-overridden chunks. * @@ -212,7 +222,7 @@ default void addPlayer(UUID player, String lastIgn, boolean alerts, int defaultM * @since 0.0.26 */ @Nullable - Map getDefaultPermissionsForPlayer(UUID player); + ChunkPlayerPermissions getDefaultPermissionsForPlayer(UUID player); /** * Retrieves the username for the given player UUID. diff --git a/src/main/java/com/cjburkey/claimchunk/data/newdata/JsonDataHandler.java b/src/main/java/com/cjburkey/claimchunk/data/newdata/JsonDataHandler.java index 1259556..e90a98b 100644 --- a/src/main/java/com/cjburkey/claimchunk/data/newdata/JsonDataHandler.java +++ b/src/main/java/com/cjburkey/claimchunk/data/newdata/JsonDataHandler.java @@ -84,6 +84,7 @@ public void load() throws Exception { } } + //noinspection ConstantValue if (claimedChunks.values().stream().allMatch(c -> c.playerPermissions == null)) { // If all playerPermissions are null, then the JSON files are in the pre 0.0.24 format loadPre0024Data(); @@ -102,12 +103,12 @@ void clearData() { @Override public void addClaimedChunk(ChunkPos pos, UUID player) { - claimedChunks.put(pos, new DataChunk(pos, player, new HashMap<>(), false)); + claimedChunks.put(pos, new DataChunk(pos, player, new HashMap<>(), null)); } private void addClaimedChunkWithPerms( ChunkPos pos, UUID player, Map playerPermissions) { - claimedChunks.put(pos, new DataChunk(pos, player, playerPermissions, false)); + claimedChunks.put(pos, new DataChunk(pos, player, playerPermissions, null)); } @Override @@ -135,6 +136,17 @@ public UUID getChunkOwner(ChunkPos pos) { return null; } + // Implemented by SqLiteDataHandler + @Override + public void setDefaultChunkPermissions( + @NotNull ChunkPos pos, @Nullable ChunkPlayerPermissions chunkPermissions) {} + + // Implemented by SqLiteDataHandler + @Override + public @Nullable ChunkPlayerPermissions getDefaultChunkPermissions(@NotNull ChunkPos pos) { + return null; + } + @Override public DataChunk[] getClaimedChunks() { return this.claimedChunks.entrySet().stream() @@ -144,7 +156,7 @@ public DataChunk[] getClaimedChunks() { claimedChunk.getKey(), claimedChunk.getValue().player, claimedChunk.getValue().playerPermissions, - claimedChunk.getValue().tnt)) + null)) .toArray(DataChunk[]::new); } @@ -173,8 +185,14 @@ public void addPlayers(FullPlayerData[] players) { for (FullPlayerData player : players) addPlayer(player); } + // Implemented by SqLiteDataHandler + @Override + public void setDefaultPermissionsForPlayer( + @NotNull UUID player, @NotNull ChunkPlayerPermissions permissions) {} + + // Implemented by SqLiteDataHandler @Override - public @Nullable Map getDefaultPermissionsForPlayer(UUID player) { + public @Nullable ChunkPlayerPermissions getDefaultPermissionsForPlayer(UUID player) { return null; } diff --git a/src/main/java/com/cjburkey/claimchunk/data/newdata/MySQLDataHandler.java b/src/main/java/com/cjburkey/claimchunk/data/newdata/MySQLDataHandler.java index ae26717..49837de 100644 --- a/src/main/java/com/cjburkey/claimchunk/data/newdata/MySQLDataHandler.java +++ b/src/main/java/com/cjburkey/claimchunk/data/newdata/MySQLDataHandler.java @@ -11,6 +11,7 @@ import com.cjburkey.claimchunk.player.FullPlayerData; import com.cjburkey.claimchunk.player.SimplePlayerData; +import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; import java.sql.Connection; @@ -318,6 +319,17 @@ public UUID getChunkOwner(ChunkPos pos) { return null; } + // Implemented by SqLiteDataHandler + @Override + public void setDefaultChunkPermissions( + @NotNull ChunkPos pos, @Nullable ChunkPlayerPermissions chunkPermissions) {} + + // Implemented by SqLiteDataHandler + @Override + public @Nullable ChunkPlayerPermissions getDefaultChunkPermissions(@NotNull ChunkPos pos) { + return null; + } + @Override public DataChunk[] getClaimedChunks() { String sql = @@ -343,7 +355,7 @@ public DataChunk[] getClaimedChunks() { result.getString(2), result.getInt(3), result.getInt(4)), UUID.fromString(result.getString(6)), allChunkPermissions.getOrDefault(result.getInt(1), new HashMap<>()), - result.getBoolean(5))); + null)); } } catch (Exception e) { Utils.err("Failed to get all claimed chunks: %s", e.getMessage()); @@ -427,8 +439,14 @@ public void addPlayers(FullPlayerData[] players) { } } + // Implemented by SqLiteDataHandler + @Override + public void setDefaultPermissionsForPlayer( + @NotNull UUID player, @NotNull ChunkPlayerPermissions permissions) {} + + // Implemented by SqLiteDataHandler @Override - public @Nullable Map getDefaultPermissionsForPlayer(UUID player) { + public @Nullable ChunkPlayerPermissions getDefaultPermissionsForPlayer(UUID player) { return null; } diff --git a/src/main/java/com/cjburkey/claimchunk/data/sqlite/SqLiteDataHandler.java b/src/main/java/com/cjburkey/claimchunk/data/sqlite/SqLiteDataHandler.java index c578af0..f68b193 100644 --- a/src/main/java/com/cjburkey/claimchunk/data/sqlite/SqLiteDataHandler.java +++ b/src/main/java/com/cjburkey/claimchunk/data/sqlite/SqLiteDataHandler.java @@ -74,7 +74,7 @@ public void load() throws Exception { @Override public void addClaimedChunk(ChunkPos pos, UUID player) { - DataChunk chunk = new DataChunk(pos, player, new HashMap<>(), false); + DataChunk chunk = new DataChunk(pos, player, new HashMap<>(), null); claimedChunks.put(pos, chunk); sqLiteWrapper.addClaimedChunk(chunk); } @@ -101,6 +101,22 @@ public boolean isChunkClaimed(ChunkPos pos) { return chunk == null ? null : chunk.player; } + @Override + public void setDefaultChunkPermissions( + @NotNull ChunkPos pos, @Nullable ChunkPlayerPermissions chunkPermissions) { + DataChunk chunk = claimedChunks.get(pos); + if (chunk != null) { + chunk.defaultPermissions = chunkPermissions; + } + sqLiteWrapper.setDefaultChunkPermissions(pos, chunkPermissions); + } + + @Override + public @Nullable ChunkPlayerPermissions getDefaultChunkPermissions(@NotNull ChunkPos pos) { + DataChunk chunk = claimedChunks.get(pos); + return chunk == null ? null : chunk.defaultPermissions; + } + @Override public DataChunk[] getClaimedChunks() { return claimedChunks.values().toArray(new DataChunk[0]); @@ -138,9 +154,19 @@ public void addPlayers(FullPlayerData[] players) { } @Override - public @Nullable Map getDefaultPermissionsForPlayer(UUID player) { + public void setDefaultPermissionsForPlayer( + @NotNull UUID player, @NotNull ChunkPlayerPermissions permissions) { + FullPlayerData ply = joinedPlayers.get(player); + if (ply != null) { + ply.defaultChunkPermissions = permissions; + } + sqLiteWrapper.setDefaultPermissionsForPlayer(player, permissions); + } + + @Override + public @Nullable ChunkPlayerPermissions getDefaultPermissionsForPlayer(UUID player) { FullPlayerData ply = joinedPlayers.get(player); - return ply == null ? null : ply.defaultChunkPermissions.toPermissionsMap(); + return ply == null ? null : ply.defaultChunkPermissions; } @Override diff --git a/src/main/java/com/cjburkey/claimchunk/data/sqlite/SqLiteTableMigrationManager.java b/src/main/java/com/cjburkey/claimchunk/data/sqlite/SqLiteTableMigrationManager.java index 7ed37b6..3182639 100644 --- a/src/main/java/com/cjburkey/claimchunk/data/sqlite/SqLiteTableMigrationManager.java +++ b/src/main/java/com/cjburkey/claimchunk/data/sqlite/SqLiteTableMigrationManager.java @@ -43,6 +43,7 @@ CREATE TABLE IF NOT EXISTS chunk_data ( chunk_x INTEGER NOT NULL, chunk_z INTEGER NOT NULL, owner_uuid TEXT NOT NULL, + default_local_permissions INTEGER, FOREIGN KEY(owner_uuid) REFERENCES player_data(player_uuid) ) STRICT @@ -78,6 +79,14 @@ private static void migrate_0_0_25() { ADD default_chunk_permissions INTEGER NOT NULL DEFAULT 0 """); } + + if (!columnExists("chunk_data", "default_local_permissions")) { + Q2Sql.executeUpdate( + """ + ALTER TABLE chunk_data + ADD default_local_permissions INTEGER DEFAULT NULL + """); + } } // Use this method to determine if a column exists in a table to perform migrations diff --git a/src/main/java/com/cjburkey/claimchunk/data/sqlite/SqLiteWrapper.java b/src/main/java/com/cjburkey/claimchunk/data/sqlite/SqLiteWrapper.java index 96233f0..403b7fa 100644 --- a/src/main/java/com/cjburkey/claimchunk/data/sqlite/SqLiteWrapper.java +++ b/src/main/java/com/cjburkey/claimchunk/data/sqlite/SqLiteWrapper.java @@ -7,6 +7,7 @@ import com.zaxxer.q2o.*; import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; import org.sqlite.SQLiteDataSource; import java.io.Closeable; @@ -15,9 +16,9 @@ import java.sql.PreparedStatement; import java.sql.ResultSet; import java.sql.SQLException; +import java.sql.Types; import java.util.*; import java.util.regex.Pattern; -import java.util.stream.Collectors; public record SqLiteWrapper(File dbFile, boolean usesTransactionManager) implements Closeable { @@ -95,13 +96,15 @@ INSERT INTO chunk_data ( chunk_world, chunk_x, chunk_z, - owner_uuid + owner_uuid, + default_local_permissions ) VALUES ( - ?, ?, ?, ? + ?, ?, ?, ?, ? ) """)) { int next = setChunkPosParams(statement, 1, chunk.chunk); - statement.setString(next, chunk.player.toString()); + statement.setString(next++, chunk.player.toString()); + statement.setNull(next, Types.INTEGER); statement.execute(); } @@ -171,6 +174,30 @@ public void removeClaimedChunk(ChunkPos chunk) { }); } + public void setDefaultChunkPermissions( + @NotNull ChunkPos pos, @Nullable ChunkPlayerPermissions chunkPermissions) { + SqlClosure.sqlExecute( + connection -> { + try (PreparedStatement statement = + connection.prepareStatement( + chunkIdQuery( + """ + UPDATE chunk_data + SET default_local_permissions=? + WHERE chunk_id=%%SELECT_CHUNK_ID_SQL%% + """))) { + if (chunkPermissions == null) { + statement.setNull(1, Types.INTEGER); + } else { + statement.setInt(1, chunkPermissions.permissionFlags); + } + setChunkPosParams(statement, 2, pos); + statement.execute(); + } + return null; + }); + } + // The provided player data will replace an existing row public void addPlayer(FullPlayerData playerData) { SqlClosure.sqlExecute( @@ -203,6 +230,25 @@ INSERT OR REPLACE INTO player_data ( }); } + public void setDefaultPermissionsForPlayer( + @NotNull UUID player, @NotNull ChunkPlayerPermissions permissions) { + SqlClosure.sqlExecute( + connection -> { + try (PreparedStatement statement = + connection.prepareStatement( + """ + UPDATE player_data + SET default_chunk_permissions=? + WHERE player_uuid=? + """)) { + statement.setInt(1, permissions.permissionFlags); + statement.setString(2, player.toString()); + statement.execute(); + return null; + } + }); + } + public void setPlayerLastOnline(UUID player, long time) { SqlClosure.sqlExecute( connection -> { @@ -373,15 +419,42 @@ public Collection getAllChunks() { new ChunkPos(chunk.world, chunk.x, chunk.z), UUID.fromString(chunk.uuid)); } - return owners.entrySet().stream() - .map( - entry -> - new DataChunk( - entry.getKey(), - entry.getValue(), - permissions.getOrDefault(entry.getKey(), new HashMap<>()), - false)) - .collect(Collectors.toList()); + ArrayList chunks = new ArrayList<>(); + for (Map.Entry entry : owners.entrySet()) { + ChunkPlayerPermissions chunkDefaultPermissions = + nullableDefaultChunkLocalPermissions(entry.getKey()); + + chunks.add( + new DataChunk( + entry.getKey(), + entry.getValue(), + permissions.getOrDefault(entry.getKey(), new HashMap<>()), + chunkDefaultPermissions)); + } + + return chunks; + } + + private @Nullable ChunkPlayerPermissions nullableDefaultChunkLocalPermissions( + ChunkPos chunkPos) { + return SqlClosure.sqlExecute( + connection -> { + try (PreparedStatement statement = + connection.prepareStatement( + chunkIdQuery( + """ + SELECT default_local_permissions FROM chunk_data + WHERE chunk_id=%%SELECT_CHUNK_ID_SQL%% + """))) { + setChunkPosParams(statement, 1, chunkPos); + ResultSet resultSet = statement.executeQuery(); + if (resultSet.next()) { + int val = resultSet.getInt(1); + return resultSet.wasNull() ? null : new ChunkPlayerPermissions(val); + } + return null; + } + }); } // -- Queries -- // diff --git a/src/main/java/com/cjburkey/claimchunk/data/sqlite/SqlDataChunk.java b/src/main/java/com/cjburkey/claimchunk/data/sqlite/SqlDataChunk.java index dfb4af3..1b467d4 100644 --- a/src/main/java/com/cjburkey/claimchunk/data/sqlite/SqlDataChunk.java +++ b/src/main/java/com/cjburkey/claimchunk/data/sqlite/SqlDataChunk.java @@ -16,4 +16,7 @@ public class SqlDataChunk { @Column(name = "owner_uuid") String uuid; + + @Column(name = "default_local_permissions") + transient int defaultLocalPermissions; } diff --git a/src/main/java/com/cjburkey/claimchunk/gui/screens/PermModifyMenu.java b/src/main/java/com/cjburkey/claimchunk/gui/screens/PermModifyMenu.java index a117d28..150111f 100644 --- a/src/main/java/com/cjburkey/claimchunk/gui/screens/PermModifyMenu.java +++ b/src/main/java/com/cjburkey/claimchunk/gui/screens/PermModifyMenu.java @@ -47,6 +47,7 @@ public void onOpen(@NotNull Inventory inventory) { ? claimChunk .getPlayerHandler() .getDefaultPermissions(getPlayer().getUniqueId()) + .toPermissionsMap() : null; if (permissions == null) { return; diff --git a/src/main/java/com/cjburkey/claimchunk/i18n/V2JsonMessages.java b/src/main/java/com/cjburkey/claimchunk/i18n/V2JsonMessages.java index ea33c46..d57830e 100644 --- a/src/main/java/com/cjburkey/claimchunk/i18n/V2JsonMessages.java +++ b/src/main/java/com/cjburkey/claimchunk/i18n/V2JsonMessages.java @@ -240,6 +240,11 @@ &r&fpermissions in your chunk(s) public String cmdAccess = "Change permissions for [player] in either the current chunk, or across your claimed" + " territory"; + public String cmdDefaultAccess = + "Change permissions for players in chunks without specific access flags granted."; + public String cmdDefaultAccessHere = + "Change permissions for players in this chunk if they have not been granted specific" + + " permission flags."; public String cmdCheckAccess = "List permissions that [player] has in the current chunk or list permissions for all" + " players with access to this chunk"; diff --git a/src/main/java/com/cjburkey/claimchunk/player/PlayerHandler.java b/src/main/java/com/cjburkey/claimchunk/player/PlayerHandler.java index ce94da8..c84dc2a 100644 --- a/src/main/java/com/cjburkey/claimchunk/player/PlayerHandler.java +++ b/src/main/java/com/cjburkey/claimchunk/player/PlayerHandler.java @@ -61,7 +61,7 @@ public Map getPermissions(ChunkPos chunk, UUID player) { return null; } - public Map getDefaultPermissions(UUID player) { + public ChunkPlayerPermissions getDefaultPermissions(UUID player) { return dataHandler.getDefaultPermissionsForPlayer(player); } diff --git a/src/main/java/com/cjburkey/claimchunk/smartcommand/ClaimChunkBaseCommand.java b/src/main/java/com/cjburkey/claimchunk/smartcommand/ClaimChunkBaseCommand.java index 11abee6..a575698 100644 --- a/src/main/java/com/cjburkey/claimchunk/smartcommand/ClaimChunkBaseCommand.java +++ b/src/main/java/com/cjburkey/claimchunk/smartcommand/ClaimChunkBaseCommand.java @@ -45,6 +45,10 @@ public ClaimChunkBaseCommand(ClaimChunk claimChunk) { registerCmds( // `/chunk access` new CommandStr(new AccessCmd(claimChunk), "access"), + // `/chunk default access` + new CommandStr(new DefaultAccessCmd(claimChunk, false), "default", "access"), + // `/chunk default access here` + new CommandStr(new DefaultAccessCmd(claimChunk, true), "default", "access", "here"), // `/chunk checkaccess` new CommandStr(new CheckAccessCmd(claimChunk), "checkaccess"), // `/chunk revokeaccess` diff --git a/src/main/java/com/cjburkey/claimchunk/smartcommand/sub/ply/DefaultAccessCmd.java b/src/main/java/com/cjburkey/claimchunk/smartcommand/sub/ply/DefaultAccessCmd.java new file mode 100644 index 0000000..be79cfc --- /dev/null +++ b/src/main/java/com/cjburkey/claimchunk/smartcommand/sub/ply/DefaultAccessCmd.java @@ -0,0 +1,47 @@ +package com.cjburkey.claimchunk.smartcommand.sub.ply; + +import com.cjburkey.claimchunk.ClaimChunk; +import com.cjburkey.claimchunk.i18n.V2JsonMessages; +import com.cjburkey.claimchunk.smartcommand.CCSubCommand; + +import de.goldmensch.commanddispatcher.Executor; + +import org.bukkit.command.CommandSender; +import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; + +/** + * @since 0.0.26 + */ +public class DefaultAccessCmd extends CCSubCommand { + + public final boolean isSingleChunk; + + public DefaultAccessCmd(ClaimChunk claimChunk, boolean isSingleChunk) { + super(claimChunk, Executor.PLAYER, true, "player", "access"); + + this.isSingleChunk = isSingleChunk; + } + + @Override + public @Nullable String getDescription() { + V2JsonMessages messages = claimChunk.getMessages(); + return isSingleChunk ? messages.cmdDefaultAccessHere : messages.cmdDefaultAccess; + } + + @Override + public CCArg[] getPermittedArguments() { + return new CCArg[0]; + } + + @Override + public int getRequiredArguments() { + return 0; + } + + @Override + public boolean onCall(@NotNull String cmdUsed, @NotNull CommandSender executor, String[] args) { + // TODO: THIS + return true; + } +} diff --git a/src/main/java/com/cjburkey/claimchunk/update/SemVer.java b/src/main/java/com/cjburkey/claimchunk/update/SemVer.java index 050427b..847bacd 100644 --- a/src/main/java/com/cjburkey/claimchunk/update/SemVer.java +++ b/src/main/java/com/cjburkey/claimchunk/update/SemVer.java @@ -56,7 +56,9 @@ public int compareTo(SemVer o) { return marker.compareTo(o.marker); } - if (marker == null && o.marker != null) { + // Quick hack fix, if I release 0.0.25 and then 0.0.25-FIX1, I want FIX1 to represent a + // newer version because I've decided semver is a fuck and I can do what i want + if (marker == null && o.marker != null && !o.marker.startsWith("FIX")) { return 1; } diff --git a/src/main/java/com/cjburkey/claimchunk/update/UpdateChecker.java b/src/main/java/com/cjburkey/claimchunk/update/UpdateChecker.java index 9517cb3..3e08e10 100644 --- a/src/main/java/com/cjburkey/claimchunk/update/UpdateChecker.java +++ b/src/main/java/com/cjburkey/claimchunk/update/UpdateChecker.java @@ -15,10 +15,11 @@ import java.util.Comparator; // A not-too-flexible GitHub update checker designed by yours truly! -// Note: I had to use the GitHub /tags api because /releases/latest was always -// a 404 for me? Not sure why. public class UpdateChecker { + public static final String repoOwner = "cjburkey01"; + public static final String repoName = "ClaimChunk"; + private static Gson gson; private static String getRequest(URL url) @@ -51,16 +52,16 @@ private static GithubRelease[] getRepoReleases(String url) return getRepoReleases(new URL(url)); } - private static GithubRelease[] getRepoReleases(String repoOwner, String repoName) + private static GithubRelease[] getRepoReleases() throws URISyntaxException, InterruptedException, IOException { return getRepoReleases( String.format("https://api.github.com/repos/%s/%s/releases", repoOwner, repoName)); } @SuppressWarnings("SameParameterValue") - public static SemVer getLatestRelease(String repoOwner, String repoName) + public static SemVer getLatestRelease() throws URISyntaxException, InterruptedException, IOException { - GithubRelease[] tags = getRepoReleases(repoOwner, repoName); + GithubRelease[] tags = getRepoReleases(); if (tags.length == 0) return null; if (tags.length > 1) Arrays.sort(tags, new GithubTagComparator()); return tags[tags.length - 1].semVer; @@ -71,6 +72,7 @@ private static Gson getGson() { return gson; } + @SuppressWarnings("CallToPrintStackTrace") private static class GithubRelease implements Comparable { // Assigned while reading from JSON response diff --git a/src/test/java/com/cjburkey/claimchunk/TestSQLPlease.java b/src/test/java/com/cjburkey/claimchunk/TestSQLPlease.java index e3535fb..e4981e1 100644 --- a/src/test/java/com/cjburkey/claimchunk/TestSQLPlease.java +++ b/src/test/java/com/cjburkey/claimchunk/TestSQLPlease.java @@ -32,6 +32,8 @@ void ensureColumnExistsMethodWorks() { assert SqLiteTableMigrationManager.columnExists("player_data", "player_uuid"); assert SqLiteTableMigrationManager.columnExists("chunk_data", "owner_uuid"); assert SqLiteTableMigrationManager.columnExists("chunk_permissions", "permission_bits"); + assert SqLiteTableMigrationManager.columnExists( + "chunk_data", "default_local_permissions"); assert !SqLiteTableMigrationManager.columnExists("chunk_hell", "permission_bits"); assert !SqLiteTableMigrationManager.columnExists("player_data", "fake_col"); } @@ -102,7 +104,7 @@ void ensureNoDataLoss() { // Add a chunk to the player and give the permissions to the other players ChunkPos chunkPos = new ChunkPos("world", 10, -3); - DataChunk chunkData = new DataChunk(chunkPos, ply1Uuid, new HashMap<>(), false); + DataChunk chunkData = new DataChunk(chunkPos, ply1Uuid, new HashMap<>(), null); chunkData.playerPermissions.put(accessorUuid1, permissions1); chunkData.playerPermissions.put(accessorUuid2, permissions2); wrapper.sql.addClaimedChunk(chunkData); @@ -134,7 +136,7 @@ void multiplePermissions() { UUID accessor1 = UUID.randomUUID(); UUID accessor2 = UUID.randomUUID(); ChunkPos chunk = new ChunkPos("world", 824, -29); - DataChunk chunkData = new DataChunk(chunk, owner, new HashMap<>(), false); + DataChunk chunkData = new DataChunk(chunk, owner, new HashMap<>(), null); chunkData.playerPermissions.put(accessor1, new ChunkPlayerPermissions(0b01)); chunkData.playerPermissions.put(accessor2, new ChunkPlayerPermissions(0b10)); @@ -206,7 +208,7 @@ void insertOrUpdatePermission() { true, 0, new ChunkPlayerPermissions(0))); - wrapper.sql.addClaimedChunk(new DataChunk(chunk, owner, new HashMap<>(), false)); + wrapper.sql.addClaimedChunk(new DataChunk(chunk, owner, new HashMap<>(), null)); // Insert the permission and check it wrapper.sql.setPlayerAccess(chunk, accessor, flags1);