From 5479aeb13e5b470c1e11974c778ff2adf5cf6a1c Mon Sep 17 00:00:00 2001 From: Cola Date: Mon, 26 Sep 2022 20:36:24 +0100 Subject: [PATCH 1/2] First attempt at adding group renaming Ready for testing --- .../mc/namelayer/command/CommandHandler.java | 1 + .../command/commands/CreateGroup.java | 52 +++++++++------- .../command/commands/RenameGroup.java | 60 +++++++++++++++++++ .../namelayer/database/GroupManagerDao.java | 22 ++++++- .../vg/civcraft/mc/namelayer/group/Group.java | 13 +++- 5 files changed, 126 insertions(+), 22 deletions(-) create mode 100644 paper/src/main/java/vg/civcraft/mc/namelayer/command/commands/RenameGroup.java diff --git a/paper/src/main/java/vg/civcraft/mc/namelayer/command/CommandHandler.java b/paper/src/main/java/vg/civcraft/mc/namelayer/command/CommandHandler.java index 3ca900be..cd8c1a46 100644 --- a/paper/src/main/java/vg/civcraft/mc/namelayer/command/CommandHandler.java +++ b/paper/src/main/java/vg/civcraft/mc/namelayer/command/CommandHandler.java @@ -54,6 +54,7 @@ public void registerCommands(){ registerCommand(new RemoveBlacklist()); registerCommand(new ShowBlacklist()); registerCommand(new NameLayerGroupGui()); + registerCommand(new RenameGroup()); } @Override diff --git a/paper/src/main/java/vg/civcraft/mc/namelayer/command/commands/CreateGroup.java b/paper/src/main/java/vg/civcraft/mc/namelayer/command/commands/CreateGroup.java index 82ea6d38..a59fb529 100644 --- a/paper/src/main/java/vg/civcraft/mc/namelayer/command/commands/CreateGroup.java +++ b/paper/src/main/java/vg/civcraft/mc/namelayer/command/commands/CreateGroup.java @@ -10,6 +10,7 @@ import java.util.logging.Level; import org.bukkit.Bukkit; import org.bukkit.ChatColor; +import org.bukkit.command.CommandSender; import org.bukkit.entity.Player; import vg.civcraft.mc.namelayer.GroupManager; import vg.civcraft.mc.namelayer.NameAPI; @@ -34,27 +35,9 @@ public void execute(Player sender, String groupName, @Optional String userPasswo } //enforce regulations on the name - if (name.length() > 32) { - p.sendMessage(ChatColor.RED + "The group name is not allowed to contain more than 32 characters"); - return; - } - Charset latin1 = StandardCharsets.ISO_8859_1; - boolean invalidChars = false; - if (!latin1.newEncoder().canEncode(name)) { - invalidChars = true; - } - //cant allow them to hurt mercury :( - if (name.contains("|")) { - invalidChars = true; - } + boolean validName = validateGroupName(p, name); - for(char c:name.toCharArray()) { - if (Character.isISOControl(c)) { - invalidChars = true; - } - } - - if(invalidChars) { + if(!validName) { p.sendMessage(ChatColor.RED + "You used characters, which are not allowed"); return; } @@ -93,4 +76,33 @@ public void run() { } p.sendMessage(ChatColor.GREEN + "Group creation request is in process."); } + + /** + * Returns if the group name was validated successfully + * @param sender Player or console + * @param groupName Group name to validate + * @return True if the group name is fine, false if it violated any of our constraints + */ + public static boolean validateGroupName(CommandSender sender, String groupName) { + if (groupName.length() > 32) { + sender.sendMessage(ChatColor.RED + "The group name is not allowed to contain more than 32 characters"); + return false; + } + Charset latin1 = StandardCharsets.ISO_8859_1; + boolean invalidCharacters = false; + if (!latin1.newEncoder().canEncode(groupName)) { + invalidCharacters = true; + } + //cant allow them to hurt mercury :( + if (groupName.contains("|")) { + invalidCharacters = true; + } + + for(char c:groupName.toCharArray()) { + if (Character.isISOControl(c)) { + invalidCharacters = true; + } + } + return !invalidCharacters; + } } diff --git a/paper/src/main/java/vg/civcraft/mc/namelayer/command/commands/RenameGroup.java b/paper/src/main/java/vg/civcraft/mc/namelayer/command/commands/RenameGroup.java new file mode 100644 index 00000000..7536127a --- /dev/null +++ b/paper/src/main/java/vg/civcraft/mc/namelayer/command/commands/RenameGroup.java @@ -0,0 +1,60 @@ +package vg.civcraft.mc.namelayer.command.commands; + +import co.aikar.commands.annotation.CommandAlias; +import co.aikar.commands.annotation.CommandCompletion; +import co.aikar.commands.annotation.Description; +import co.aikar.commands.annotation.Syntax; +import net.kyori.adventure.text.Component; +import net.kyori.adventure.text.format.NamedTextColor; +import org.bukkit.ChatColor; +import org.bukkit.command.CommandSender; +import org.bukkit.entity.Player; +import vg.civcraft.mc.namelayer.GroupManager; +import vg.civcraft.mc.namelayer.NameAPI; +import vg.civcraft.mc.namelayer.command.BaseCommandMiddle; +import vg.civcraft.mc.namelayer.group.Group; +import vg.civcraft.mc.namelayer.permission.PermissionType; + +public class RenameGroup extends BaseCommandMiddle { + + @CommandAlias("nlrg|renamegroup") + @Syntax(" ") + @Description("Renames a group") + @CommandCompletion("@NL_Groups @nothing") + public void execute(CommandSender sender, String currentGroup, String newGroupName) { + if (currentGroup == null || currentGroup.isEmpty()) { + sender.sendMessage(Component.text(currentGroup + " is not a valid group", NamedTextColor.RED)); + return; + } + if (newGroupName == null || newGroupName.isEmpty()) { + sender.sendMessage(Component.text(currentGroup + " is not a valid name", NamedTextColor.RED)); + return; + } + boolean validGroupName = CreateGroup.validateGroupName(sender, newGroupName); + if (!validGroupName) { + sender.sendMessage(ChatColor.RED + "You used characters, which are not allowed"); + return; + } + Group targetGroup = GroupManager.getGroup(currentGroup); + if (targetGroup == null) { + sender.sendMessage(Component.text(currentGroup + " is not a valid group", NamedTextColor.RED)); + return; + } + if (!(sender instanceof Player player)) { + //We are console here + targetGroup.setName(newGroupName, true); + sender.sendMessage(Component.text("We have changed the group " + currentGroup + " to " + newGroupName, NamedTextColor.GREEN)); + return; + } + boolean hasPerm = NameAPI.getGroupManager().hasAccess(targetGroup, player.getUniqueId(), PermissionType.getPermission("OWNER")); + if (!hasPerm) { + player.sendMessage(Component.text("You do not have the adequate permission to change this groups name!", NamedTextColor.RED)); + return; + } + //We do have permission here + GroupManager.invalidateCache(targetGroup.getName()); + targetGroup.setName(newGroupName); + GroupManager.getGroup(targetGroup.getName()); + player.sendMessage(Component.text("We have changed the group " + currentGroup + " to " + newGroupName, NamedTextColor.GREEN)); + } +} diff --git a/paper/src/main/java/vg/civcraft/mc/namelayer/database/GroupManagerDao.java b/paper/src/main/java/vg/civcraft/mc/namelayer/database/GroupManagerDao.java index 39f66060..0b1bde7a 100644 --- a/paper/src/main/java/vg/civcraft/mc/namelayer/database/GroupManagerDao.java +++ b/paper/src/main/java/vg/civcraft/mc/namelayer/database/GroupManagerDao.java @@ -109,7 +109,10 @@ public class GroupManagerDao { private static final String updateOwner = "update faction set founder = ? " + "where group_name = ?"; - + + private static final String updateGroupName = "update faction, faction_id set faction.group_name = ?, faction_id.group_name = ? " + + "where faction.group_name = ? AND faction_id.group_name = ?;"; + private static final String updateDisciplined = "update faction set discipline_flags = ? " + "where group_name = ?"; @@ -1317,6 +1320,23 @@ public Map getAllDefaultGroups() { } return groups; } + + public void setNewGroupName(String oldGroupName, String newGroupName) { + try (Connection connection = db.getConnection(); + PreparedStatement updateOwner = connection.prepareStatement(GroupManagerDao.updateGroupName);){ + updateOwner.setString(1, newGroupName); + updateOwner.setString(2, newGroupName); + updateOwner.setString(3, oldGroupName); + updateOwner.setString(4, oldGroupName); + updateOwner.executeUpdate(); + } catch (SQLException e) { + logger.log(Level.WARNING, "Problem setting new name of group " + oldGroupName + " to " + newGroupName, e); + } + } + + public void setNewGroupNameAsync(String oldGroupName, String newGroupName) { + plugin.getServer().getScheduler().runTaskAsynchronously(plugin, () -> setNewGroupName(oldGroupName, newGroupName)); + } /** * Use this method to override the current founder of a group. diff --git a/paper/src/main/java/vg/civcraft/mc/namelayer/group/Group.java b/paper/src/main/java/vg/civcraft/mc/namelayer/group/Group.java index 403357c3..4a39216f 100644 --- a/paper/src/main/java/vg/civcraft/mc/namelayer/group/Group.java +++ b/paper/src/main/java/vg/civcraft/mc/namelayer/group/Group.java @@ -559,7 +559,18 @@ public void setOwner(UUID uuid, boolean savetodb) { db.setFounder(uuid, this); } } - + + public void setName(String name) { + setName(name, true); + } + + public void setName(String name, boolean saveToDB) { + if (saveToDB) { + db.setNewGroupName(this.name, name); + } + this.name = name; + } + public void setDisciplined(boolean value){ setDisciplined(value, true); } From 9220d47798810f58af169e0bd756bdc5d0825a5a Mon Sep 17 00:00:00 2001 From: Cola Date: Tue, 27 Sep 2022 12:43:08 +0100 Subject: [PATCH 2/2] Polish --- .../mc/namelayer/command/commands/RenameGroup.java | 7 ++++--- .../mc/namelayer/database/GroupManagerDao.java | 12 ++++++------ 2 files changed, 10 insertions(+), 9 deletions(-) diff --git a/paper/src/main/java/vg/civcraft/mc/namelayer/command/commands/RenameGroup.java b/paper/src/main/java/vg/civcraft/mc/namelayer/command/commands/RenameGroup.java index 7536127a..802a2243 100644 --- a/paper/src/main/java/vg/civcraft/mc/namelayer/command/commands/RenameGroup.java +++ b/paper/src/main/java/vg/civcraft/mc/namelayer/command/commands/RenameGroup.java @@ -43,18 +43,19 @@ public void execute(CommandSender sender, String currentGroup, String newGroupNa if (!(sender instanceof Player player)) { //We are console here targetGroup.setName(newGroupName, true); - sender.sendMessage(Component.text("We have changed the group " + currentGroup + " to " + newGroupName, NamedTextColor.GREEN)); + sender.sendMessage(Component.text("You have changed the group " + currentGroup + " to " + newGroupName, NamedTextColor.GREEN)); return; } boolean hasPerm = NameAPI.getGroupManager().hasAccess(targetGroup, player.getUniqueId(), PermissionType.getPermission("OWNER")); if (!hasPerm) { - player.sendMessage(Component.text("You do not have the adequate permission to change this groups name!", NamedTextColor.RED)); + player.sendMessage(Component.text("You do not have the adequate permission to change this group's name!", NamedTextColor.RED)); return; } //We do have permission here GroupManager.invalidateCache(targetGroup.getName()); targetGroup.setName(newGroupName); + //We use getGroup here to force the group to be reloaded and readded to the cache. We removed it above here using invalidateCache. GroupManager.getGroup(targetGroup.getName()); - player.sendMessage(Component.text("We have changed the group " + currentGroup + " to " + newGroupName, NamedTextColor.GREEN)); + player.sendMessage(Component.text("You have changed the group's name from " + currentGroup + " to " + newGroupName, NamedTextColor.GREEN)); } } diff --git a/paper/src/main/java/vg/civcraft/mc/namelayer/database/GroupManagerDao.java b/paper/src/main/java/vg/civcraft/mc/namelayer/database/GroupManagerDao.java index 0b1bde7a..f563c886 100644 --- a/paper/src/main/java/vg/civcraft/mc/namelayer/database/GroupManagerDao.java +++ b/paper/src/main/java/vg/civcraft/mc/namelayer/database/GroupManagerDao.java @@ -1323,12 +1323,12 @@ public Map getAllDefaultGroups() { public void setNewGroupName(String oldGroupName, String newGroupName) { try (Connection connection = db.getConnection(); - PreparedStatement updateOwner = connection.prepareStatement(GroupManagerDao.updateGroupName);){ - updateOwner.setString(1, newGroupName); - updateOwner.setString(2, newGroupName); - updateOwner.setString(3, oldGroupName); - updateOwner.setString(4, oldGroupName); - updateOwner.executeUpdate(); + PreparedStatement updateName = connection.prepareStatement(GroupManagerDao.updateGroupName);){ + updateName.setString(1, newGroupName); + updateName.setString(2, newGroupName); + updateName.setString(3, oldGroupName); + updateName.setString(4, oldGroupName); + updateName.executeUpdate(); } catch (SQLException e) { logger.log(Level.WARNING, "Problem setting new name of group " + oldGroupName + " to " + newGroupName, e); }