├── .github ├── FUNDING.yml └── ISSUE_TEMPLATE │ └── config.yml ├── .gitignore ├── LICENSE.md ├── README.md ├── pom.xml └── src └── main ├── java └── com │ └── bghddevelopment │ └── LuckPemsGUI │ ├── LuckPermsGUI.java │ ├── commands │ └── LPGUICommand.java │ ├── events │ └── Events.java │ ├── groups │ ├── EditGroup.java │ ├── GroupsGUI.java │ ├── Parents.java │ ├── Permissions.java │ ├── Prefix.java │ └── Suffix.java │ ├── tracks │ ├── EditTrack.java │ └── TracksGUI.java │ ├── users │ ├── EditUser.java │ ├── Parents.java │ ├── Permissions.java │ ├── Prefix.java │ ├── Suffix.java │ ├── UsersGUI.java │ └── Wipe.java │ └── util │ ├── Color.java │ ├── Logger.java │ ├── Metrics.java │ ├── OpenGUI.java │ └── Tools.java └── resources └── plugin.yml /.github/FUNDING.yml: -------------------------------------------------------------------------------- 1 | custom: https://bghddevelopment.com/donate -------------------------------------------------------------------------------- /.github/ISSUE_TEMPLATE/config.yml: -------------------------------------------------------------------------------- 1 | blank_issues_enabled: false 2 | contact_links: 3 | - 4 | about: "Discord Support for BGHDDevelopment Plugins." 5 | name: "BGHD Discord" 6 | url: "https://bghddevelopment.com/discord" 7 | - 8 | about: "Wiki for BGHDDevelopment Plugins." 9 | name: "BGHD Wiki" 10 | url: "https://wiki.bghddevelopment.com/" 11 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | 2 | # Created by https://www.gitignore.io/api/java,maven,eclipse,intellij+iml 3 | # Edit at https://www.gitignore.io/?templates=java,maven,eclipse,intellij+iml 4 | 5 | ### Eclipse ### 6 | .metadata 7 | bin/ 8 | tmp/ 9 | *.tmp 10 | *.bak 11 | *.swp 12 | *~.nib 13 | local.properties 14 | .settings/ 15 | .loadpath 16 | .recommenders 17 | 18 | # External tool builders 19 | .externalToolBuilders/ 20 | 21 | # Locally stored "Eclipse launch configurations" 22 | *.launch 23 | 24 | # PyDev specific (Python IDE for Eclipse) 25 | *.pydevproject 26 | 27 | # CDT-specific (C/C++ Development Tooling) 28 | .cproject 29 | 30 | # CDT- autotools 31 | .autotools 32 | 33 | # Java annotation processor (APT) 34 | .factorypath 35 | 36 | # PDT-specific (PHP Development Tools) 37 | .buildpath 38 | 39 | # sbteclipse plugin 40 | .target 41 | 42 | # Tern plugin 43 | .tern-project 44 | 45 | # TeXlipse plugin 46 | .texlipse 47 | 48 | # STS (Spring Tool Suite) 49 | .springBeans 50 | 51 | # Code Recommenders 52 | .recommenders/ 53 | 54 | # Annotation Processing 55 | .apt_generated/ 56 | 57 | # Scala IDE specific (Scala & Java development for Eclipse) 58 | .cache-main 59 | .scala_dependencies 60 | .worksheet 61 | 62 | ### Eclipse Patch ### 63 | # Eclipse Core 64 | .project 65 | 66 | # JDT-specific (Eclipse Java Development Tools) 67 | .classpath 68 | 69 | # Annotation Processing 70 | .apt_generated 71 | 72 | .sts4-cache/ 73 | 74 | ### Intellij+iml ### 75 | # Covers JetBrains IDEs: IntelliJ, RubyMine, PhpStorm, AppCode, PyCharm, CLion, Android Studio and WebStorm 76 | # Reference: https://intellij-support.jetbrains.com/hc/en-us/articles/206544839 77 | 78 | # User-specific stuff 79 | .idea/**/workspace.xml 80 | .idea/**/tasks.xml 81 | .idea/**/usage.statistics.xml 82 | .idea/**/dictionaries 83 | .idea/**/shelf 84 | 85 | # Generated files 86 | .idea/**/contentModel.xml 87 | 88 | # Sensitive or high-churn files 89 | .idea/**/dataSources/ 90 | .idea/**/dataSources.ids 91 | .idea/**/dataSources.local.xml 92 | .idea/**/sqlDataSources.xml 93 | .idea/**/dynamic.xml 94 | .idea/**/uiDesigner.xml 95 | .idea/**/dbnavigator.xml 96 | 97 | # Gradle 98 | .idea/**/gradle.xml 99 | .idea/**/libraries 100 | 101 | # Gradle and Maven with auto-import 102 | # When using Gradle or Maven with auto-import, you should exclude module files, 103 | # since they will be recreated, and may cause churn. Uncomment if using 104 | # auto-import. 105 | # .idea/modules.xml 106 | # .idea/*.iml 107 | # .idea/modules 108 | # *.iml 109 | # *.ipr 110 | 111 | # CMake 112 | cmake-build-*/ 113 | 114 | # Mongo Explorer plugin 115 | .idea/**/mongoSettings.xml 116 | 117 | # File-based project format 118 | *.iws 119 | 120 | # IntelliJ 121 | out/ 122 | 123 | # IntelliJ IDEA fix 124 | .idea 125 | 126 | # mpeltonen/sbt-idea plugin 127 | .idea_modules/ 128 | 129 | # JIRA plugin 130 | atlassian-ide-plugin.xml 131 | 132 | # Cursive Clojure plugin 133 | .idea/replstate.xml 134 | 135 | # Crashlytics plugin (for Android Studio and IntelliJ) 136 | com_crashlytics_export_strings.xml 137 | crashlytics.properties 138 | crashlytics-build.properties 139 | fabric.properties 140 | 141 | # Editor-based Rest Client 142 | .idea/httpRequests 143 | 144 | # Android studio 3.1+ serialized cache file 145 | .idea/caches/build_file_checksums.ser 146 | 147 | ### Intellij+iml Patch ### 148 | # Reason: https://github.com/joeblau/gitignore.io/issues/186#issuecomment-249601023 149 | 150 | *.iml 151 | modules.xml 152 | .idea/misc.xml 153 | *.ipr 154 | 155 | ### Java ### 156 | # Compiled class file 157 | *.class 158 | 159 | # Log file 160 | *.log 161 | 162 | # BlueJ files 163 | *.ctxt 164 | 165 | # Mobile Tools for Java (J2ME) 166 | .mtj.tmp/ 167 | 168 | # Package Files # 169 | *.jar 170 | *.war 171 | *.nar 172 | *.ear 173 | *.zip 174 | *.tar.gz 175 | *.rar 176 | 177 | # virtual machine crash logs, see http://www.java.com/en/download/help/error_hotspot.xml 178 | hs_err_pid* 179 | 180 | ### Maven ### 181 | target/ 182 | pom.xml.tag 183 | pom.xml.releaseBackup 184 | pom.xml.versionsBackup 185 | pom.xml.next 186 | release.properties 187 | dependency-reduced-pom.xml 188 | buildNumber.properties 189 | .mvn/timing.properties 190 | .mvn/wrapper/maven-wrapper.jar 191 | .flattened-pom.xml 192 | 193 | ### Ant ### 194 | build.xml 195 | 196 | ### Git ### 197 | # Created by git for backups. To disable backups in Git: 198 | # $ git config --global mergetool.keepBackup false 199 | *.orig 200 | 201 | # Created by git when using merge tools for conflicts 202 | *.BACKUP.* 203 | *.BASE.* 204 | *.LOCAL.* 205 | *.REMOTE.* 206 | *_BACKUP_*.txt 207 | *_BASE_*.txt 208 | *_LOCAL_*.txt 209 | *_REMOTE_*.txt 210 | 211 | ### Github ### 212 | .github 213 | CODE_OF_CONDUCT.md 214 | README.md 215 | LICENSE 216 | 217 | # End of https://www.gitignore.io/api/java,maven,eclipse,intellij+iml,git -------------------------------------------------------------------------------- /LICENSE.md: -------------------------------------------------------------------------------- 1 | # Released under MIT License 2 | 3 | Copyright (c) 2022 BGHDDevelopment LLC (ceo@bghddevelopment.com). 4 | Copyright (c) 2022 Contributors. 5 | 6 | Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: 7 | 8 | The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. 9 | 10 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. 11 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # LuckPermsGUI 2 | 3 | LuckPermsGUI is an add-on for the plugin LuckPerms which creates a GUI to edit the plugin's functions without the need to use commands. 4 | 5 | ## Normal Installation 6 | 7 | If you are not a developer, you can download LuckPermsGUI for free on [SpigotMC](https://www.spigotmc.org/resources/53460/)! 8 | 9 | You can find information on how to use the plugin on our [Wiki](https://wiki.bghddevelopment.com) website! 10 | 11 | ## Developer Installation 12 | 13 | If you are a developer, you can fork this project to make a custom version for your server! 14 | 15 | ## Contributing 16 | Pull requests are welcome. For major changes, please open an issue or contact us on [Discord](https://bghddevelopment.com/discord) first to discuss what you would like to change. 17 | 18 | Please make sure to test changes as appropriate. 19 | 20 | ## License 21 | License information can be found in the [LICENSE.md](LICENSE.md) file. 22 | 23 | Any questions regarding this license can be asked on [Discord](https://bghddevelopment.com/discord) or messaged directly to [ceo@bghddevelopment.com](mailto:ceo@bghddevelopment.com). 24 | -------------------------------------------------------------------------------- /pom.xml: -------------------------------------------------------------------------------- 1 | 2 | 7 | 8 | 11 | 4.0.0 12 | 13 | com.bghddevelopment.LuckPermsGUI 14 | LuckPermsGUI 15 | 4.5 16 | jar 17 | 18 | LuckPermsGUI 19 | 20 | GUI plugin for LuckPerms. 21 | 22 | 1.8 23 | UTF-8 24 | 25 | https://bghddevelopment.com 26 | 27 | 28 | clean package 29 | 30 | 31 | org.apache.maven.plugins 32 | maven-compiler-plugin 33 | 3.7.0 34 | 35 | ${java.version} 36 | ${java.version} 37 | 38 | 39 | 40 | org.apache.maven.plugins 41 | maven-shade-plugin 42 | 3.1.0 43 | 44 | 45 | package 46 | 47 | shade 48 | 49 | 50 | false 51 | 52 | 53 | 54 | 55 | 56 | 57 | 58 | src/main/resources 59 | true 60 | 61 | 62 | 63 | 64 | 65 | 66 | spigotmc-repo 67 | https://hub.spigotmc.org/nexus/content/groups/public/ 68 | 69 | 70 | sonatype 71 | https://oss.sonatype.org/content/groups/public/ 72 | 73 | 74 | 75 | 76 | 77 | org.spigotmc 78 | spigot-api 79 | 1.8.8-R0.1-SNAPSHOT 80 | provided 81 | 82 | 83 | net.luckperms 84 | api 85 | 5.3 86 | provided 87 | 88 | 89 | org.projectlombok 90 | lombok 91 | 1.18.22 92 | compile 93 | 94 | 95 | 96 | -------------------------------------------------------------------------------- /src/main/java/com/bghddevelopment/LuckPemsGUI/LuckPermsGUI.java: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright (c) BGHDDevelopment. 3 | * Please refer to the plugin page or GitHub page for our open-source license. 4 | * If you have any questions please email ceo@bghddevelopment or reach us on Discord 5 | */ 6 | 7 | package com.bghddevelopment.LuckPemsGUI; 8 | 9 | import java.io.BufferedReader; 10 | import java.io.InputStreamReader; 11 | import java.net.HttpURLConnection; 12 | import java.net.URL; 13 | import com.bghddevelopment.LuckPemsGUI.events.Events; 14 | import com.bghddevelopment.LuckPemsGUI.util.Color; 15 | import com.google.gson.JsonObject; 16 | import com.google.gson.JsonParser; 17 | import lombok.Getter; 18 | import com.bghddevelopment.LuckPemsGUI.commands.LPGUICommand; 19 | import com.bghddevelopment.LuckPemsGUI.util.Metrics; 20 | import com.bghddevelopment.LuckPemsGUI.util.Logger; 21 | import org.bukkit.Bukkit; 22 | import org.bukkit.command.CommandSender; 23 | import org.bukkit.plugin.Plugin; 24 | import org.bukkit.plugin.java.JavaPlugin; 25 | import com.bghddevelopment.LuckPemsGUI.groups.EditGroup; 26 | import com.bghddevelopment.LuckPemsGUI.groups.GroupsGUI; 27 | import com.bghddevelopment.LuckPemsGUI.groups.Parents; 28 | import com.bghddevelopment.LuckPemsGUI.groups.Permissions; 29 | import com.bghddevelopment.LuckPemsGUI.groups.Prefix; 30 | import com.bghddevelopment.LuckPemsGUI.groups.Suffix; 31 | import com.bghddevelopment.LuckPemsGUI.tracks.EditTrack; 32 | import com.bghddevelopment.LuckPemsGUI.tracks.TracksGUI; 33 | import com.bghddevelopment.LuckPemsGUI.users.EditUser; 34 | import com.bghddevelopment.LuckPemsGUI.users.UsersGUI; 35 | import com.bghddevelopment.LuckPemsGUI.users.Wipe; 36 | 37 | @Getter 38 | public class LuckPermsGUI extends JavaPlugin { 39 | 40 | @Getter 41 | private static Plugin instance; 42 | public static LuckPermsGUI plugin; 43 | 44 | @Override 45 | public void onEnable() { 46 | instance = this; 47 | plugin = this; 48 | new Metrics(this, 5970); 49 | registerEvents(); 50 | registerCommands(); 51 | setEnabled(true); 52 | Logger.log(Logger.LogLevel.SUCCESS, "LuckPermsGUI Version: " + getDescription().getVersion() + " Loaded."); 53 | updateCheck(Bukkit.getConsoleSender(), true); 54 | } 55 | 56 | public void registerEvents() { 57 | Bukkit.getServer().getPluginManager().registerEvents(new GroupsGUI(), this); 58 | Bukkit.getServer().getPluginManager().registerEvents(new EditGroup(), this); 59 | Bukkit.getServer().getPluginManager().registerEvents(new Permissions(), this); 60 | Bukkit.getServer().getPluginManager().registerEvents(new Parents(), this); 61 | Bukkit.getServer().getPluginManager().registerEvents(new Prefix(), this); 62 | Bukkit.getServer().getPluginManager().registerEvents(new Suffix(), this); 63 | Bukkit.getServer().getPluginManager().registerEvents(new UsersGUI(), this); 64 | Bukkit.getServer().getPluginManager().registerEvents(new EditUser(), this); 65 | Bukkit.getServer().getPluginManager().registerEvents(new com.bghddevelopment.LuckPemsGUI.users.Permissions(), this); 66 | Bukkit.getServer().getPluginManager().registerEvents(new com.bghddevelopment.LuckPemsGUI.users.Parents(), this); 67 | Bukkit.getServer().getPluginManager().registerEvents(new com.bghddevelopment.LuckPemsGUI.users.Prefix(), this); 68 | Bukkit.getServer().getPluginManager().registerEvents(new com.bghddevelopment.LuckPemsGUI.users.Suffix(), this); 69 | Bukkit.getServer().getPluginManager().registerEvents(new Wipe(), this); 70 | Bukkit.getServer().getPluginManager().registerEvents(new TracksGUI(), this); 71 | Bukkit.getServer().getPluginManager().registerEvents(new EditTrack(), this); 72 | Bukkit.getServer().getPluginManager().registerEvents(new Events(), this); 73 | Bukkit.getServer().getPluginManager().registerEvents(new LPGUICommand(), this); 74 | } 75 | 76 | public void updateCheck(CommandSender sender, boolean console) { 77 | try { 78 | String urlString = "https://updatecheck.bghddevelopment.com"; 79 | URL url = new URL(urlString); 80 | HttpURLConnection connection = (HttpURLConnection) url.openConnection(); 81 | connection.setRequestMethod("GET"); 82 | connection.setRequestProperty("User-Agent", "Mozilla/5.0"); 83 | BufferedReader reader = new BufferedReader(new InputStreamReader(connection.getInputStream())); 84 | String input; 85 | StringBuffer response = new StringBuffer(); 86 | while ((input = reader.readLine()) != null) { 87 | response.append(input); 88 | } 89 | reader.close(); 90 | JsonObject object = new JsonParser().parse(response.toString()).getAsJsonObject(); 91 | 92 | if (object.has("plugins")) { 93 | JsonObject plugins = object.get("plugins").getAsJsonObject(); 94 | JsonObject info = plugins.get("LuckPermsGUI").getAsJsonObject(); 95 | String version = info.get("version").getAsString(); 96 | Boolean archived = info.get("archived").getAsBoolean(); 97 | if(archived) { 98 | sender.sendMessage(Color.translate("")); 99 | sender.sendMessage(Color.translate("")); 100 | sender.sendMessage(Color.translate("&cThis plugin has been marked as 'Archived' by BGHDDevelopment LLC.")); 101 | sender.sendMessage(Color.translate("&cThis version will continue to work but will not receive updates or support.")); 102 | sender.sendMessage(Color.translate("")); 103 | sender.sendMessage(Color.translate("")); 104 | return; 105 | } 106 | if (version.equals(getDescription().getVersion())) { 107 | if (console) { 108 | sender.sendMessage(Color.translate("&aLuckPermsGUI is on the latest version.")); 109 | } 110 | } else { 111 | sender.sendMessage(Color.translate("")); 112 | sender.sendMessage(Color.translate("")); 113 | sender.sendMessage(Color.translate("&cYour LuckPermsGUI version is out of date!")); 114 | sender.sendMessage(Color.translate("&cWe recommend updating ASAP!")); 115 | sender.sendMessage(Color.translate("")); 116 | sender.sendMessage(Color.translate("&cYour Version: &e" + getDescription().getVersion())); 117 | sender.sendMessage(Color.translate("&aNewest Version: &e" + version)); 118 | sender.sendMessage(Color.translate("")); 119 | sender.sendMessage(Color.translate("")); 120 | } 121 | } else { 122 | sender.sendMessage(Color.translate("&cWrong response from update API, contact plugin developer!")); 123 | } 124 | } catch ( 125 | Exception ex) { 126 | sender.sendMessage(Color.translate("&cFailed to get updater check. (" + ex.getMessage() + ")")); 127 | } 128 | } 129 | 130 | public void registerCommands() { 131 | this.getCommand("lpgui").setExecutor(new LPGUICommand()); 132 | } 133 | } 134 | -------------------------------------------------------------------------------- /src/main/java/com/bghddevelopment/LuckPemsGUI/commands/LPGUICommand.java: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright (c) BGHDDevelopment. 3 | * Please refer to the plugin page or GitHub page for our open-source license. 4 | * If you have any questions please email ceo@bghddevelopment or reach us on Discord 5 | */ 6 | 7 | package com.bghddevelopment.LuckPemsGUI.commands; 8 | 9 | import com.bghddevelopment.LuckPemsGUI.groups.EditGroup; 10 | import com.bghddevelopment.LuckPemsGUI.tracks.EditTrack; 11 | import com.bghddevelopment.LuckPemsGUI.users.EditUser; 12 | import com.bghddevelopment.LuckPemsGUI.util.OpenGUI; 13 | import net.luckperms.api.LuckPerms; 14 | import net.luckperms.api.LuckPermsProvider; 15 | import net.luckperms.api.model.user.User; 16 | import net.luckperms.api.track.Track; 17 | import org.bukkit.ChatColor; 18 | import org.bukkit.command.Command; 19 | import org.bukkit.command.CommandExecutor; 20 | import org.bukkit.command.CommandSender; 21 | import org.bukkit.entity.Player; 22 | import org.bukkit.event.EventHandler; 23 | import org.bukkit.event.Listener; 24 | import org.bukkit.event.player.PlayerCommandPreprocessEvent; 25 | 26 | public class LPGUICommand implements CommandExecutor, Listener { 27 | 28 | static LuckPerms l = LuckPermsProvider.get(); 29 | 30 | 31 | public boolean onCommand(CommandSender sender, Command cmd, String label, String[] args) { 32 | 33 | if (!(sender instanceof Player)) { 34 | sm(sender, "&cThis command can be done only by player"); 35 | return true; 36 | } 37 | 38 | if (sender.hasPermission("luckperms.gui")) { 39 | Player p = ((Player) sender); 40 | 41 | if (cmd.getName().equalsIgnoreCase("lpgui")) { 42 | if (args.length == 0) 43 | OpenGUI.openGUI(p); 44 | if (args.length == 1) 45 | if (args[0].equals("group")) 46 | sm(sender, "&cUsage: &e/lpgui group "); 47 | else if (args[0].equals("user")) 48 | sm(sender, "&cUsage: &e/lpgui user "); 49 | else if (args[0].equals("track")) 50 | sm(sender, "&cUsage: &e/lpgui track "); 51 | else 52 | sm(sender, "&cUsage: &e/lpgui user/group "); 53 | if (args.length == 2) 54 | if (args[0].equals("group")) { 55 | EditGroup.open(p, l.getGroupManager().getGroup(args[1])); 56 | } else if (args[0].equals("user")) { 57 | EditUser.open(p, args[1]); 58 | } else if (args[0].equals("track")) { 59 | Track user = l.getTrackManager().getTrack(args[1]); 60 | EditTrack.open(p, user); 61 | } else 62 | sm(sender, "&cUsage: &e/lpgui user/group/track "); 63 | } 64 | } else sm(sender, "&cYou can't use this command! No permission"); 65 | return true; 66 | } 67 | 68 | @EventHandler 69 | public void onCommand(PlayerCommandPreprocessEvent e) { 70 | if (!e.getMessage().contains("/lp gui")) return; 71 | e.setCancelled(true); 72 | Player sender = e.getPlayer(); 73 | 74 | if (sender.hasPermission("luckperms.gui")) { 75 | Player p = ((Player) sender); 76 | 77 | String[] args = e.getMessage().split(" "); 78 | 79 | if (args.length == 2) 80 | OpenGUI.openGUI(p); 81 | if (args.length == 3) 82 | if (args[2].equals("group")) 83 | sm(sender, "&cUsage: &e/lp gui group "); 84 | else if (args[2].equals("user")) 85 | sm(sender, "&cUsage: &e/lp gui user "); 86 | else if (args[2].equals("track")) 87 | sm(sender, "&cUsage: &e/lp gui track "); 88 | else 89 | sm(sender, "&cUsage: &e/lp gui user/group "); 90 | if (args.length == 4) 91 | if (args[2].equals("group")) { 92 | EditGroup.open(p, l.getGroupManager().getGroup(args[3])); 93 | } else if (args[2].equals("user")) { 94 | User user = l.getUserManager().getUser(args[3]); 95 | EditUser.open(p, user); 96 | } else if (args[2].equals("track")) { 97 | Track user = l.getTrackManager().getTrack(args[3]); 98 | EditTrack.open(p, user); 99 | } else 100 | sm(sender, "&cUsage: &e/lp gui user/group "); 101 | } else sm(sender, "&cYou can't use this command! No permission"); 102 | } 103 | 104 | 105 | private void sm(CommandSender sender, String txt) { 106 | sender.sendMessage(ChatColor.translateAlternateColorCodes('&', txt)); 107 | } 108 | } 109 | -------------------------------------------------------------------------------- /src/main/java/com/bghddevelopment/LuckPemsGUI/events/Events.java: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright (c) BGHDDevelopment. 3 | * Please refer to the plugin page or GitHub page for our open-source license. 4 | * If you have any questions please email ceo@bghddevelopment or reach us on Discord 5 | */ 6 | 7 | package com.bghddevelopment.LuckPemsGUI.events; 8 | 9 | import com.bghddevelopment.LuckPemsGUI.groups.GroupsGUI; 10 | import com.bghddevelopment.LuckPemsGUI.tracks.TracksGUI; 11 | import com.bghddevelopment.LuckPemsGUI.users.UsersGUI; 12 | import org.bukkit.ChatColor; 13 | import org.bukkit.entity.Player; 14 | import org.bukkit.event.EventHandler; 15 | import org.bukkit.event.Listener; 16 | import org.bukkit.event.inventory.InventoryClickEvent; 17 | import org.bukkit.inventory.Inventory; 18 | import org.bukkit.inventory.ItemStack; 19 | 20 | public class Events implements Listener { 21 | 22 | @EventHandler 23 | public void onInventoryClickEvent(InventoryClickEvent e) { 24 | Player p = (Player) e.getWhoClicked(); 25 | 26 | Inventory inv = e.getClickedInventory(); 27 | ItemStack item = e.getCurrentItem(); 28 | if (inv != null && item != null) 29 | if (e.getView().getTitle().equals(ChatColor.AQUA + "LuckPerms")) { 30 | e.setCancelled(true); 31 | if (item.hasItemMeta()) 32 | if (item.getItemMeta().hasDisplayName()) { 33 | String name = ChatColor.stripColor(item.getItemMeta().getDisplayName()); 34 | if (name.equals("Groups")) 35 | GroupsGUI.open(p); 36 | if (name.equals("Users")) 37 | UsersGUI.open(p); 38 | if (name.equals("Tracks")) 39 | TracksGUI.open(p); 40 | } 41 | } 42 | } 43 | } 44 | -------------------------------------------------------------------------------- /src/main/java/com/bghddevelopment/LuckPemsGUI/groups/EditGroup.java: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright (c) BGHDDevelopment. 3 | * Please refer to the plugin page or GitHub page for our open-source license. 4 | * If you have any questions please email ceo@bghddevelopment or reach us on Discord 5 | */ 6 | 7 | package com.bghddevelopment.LuckPemsGUI.groups; 8 | 9 | import java.util.Arrays; 10 | import java.util.HashMap; 11 | import java.util.Map; 12 | 13 | import net.luckperms.api.LuckPerms; 14 | import net.luckperms.api.LuckPermsProvider; 15 | import net.luckperms.api.model.group.Group; 16 | import org.bukkit.Bukkit; 17 | import org.bukkit.ChatColor; 18 | import org.bukkit.Material; 19 | import org.bukkit.entity.Player; 20 | import org.bukkit.event.EventHandler; 21 | import org.bukkit.event.Listener; 22 | import org.bukkit.event.inventory.InventoryClickEvent; 23 | import org.bukkit.event.player.AsyncPlayerChatEvent; 24 | import org.bukkit.inventory.Inventory; 25 | import org.bukkit.inventory.ItemStack; 26 | 27 | import com.bghddevelopment.LuckPemsGUI.LuckPermsGUI; 28 | import com.bghddevelopment.LuckPemsGUI.util.Tools; 29 | 30 | public class EditGroup implements Listener { 31 | 32 | public static Map setWeight = new HashMap<>(); 33 | public static Map setName = new HashMap<>(); 34 | public static Map rename = new HashMap<>(); 35 | public static Map clone = new HashMap<>(); 36 | static LuckPerms l = LuckPermsProvider.get(); 37 | 38 | @EventHandler 39 | public void onsetWeight(AsyncPlayerChatEvent e) { 40 | if (!setWeight.containsKey(e.getPlayer())) return; 41 | String message = e.getMessage(); 42 | Group g = setWeight.get(e.getPlayer()); 43 | 44 | Tools.sendCommand(e.getPlayer(), "lp group "+g.getName()+" setweight "+message); 45 | setWeight.remove(e.getPlayer()); 46 | Bukkit.getScheduler().scheduleSyncDelayedTask(LuckPermsGUI.getInstance(), () -> { 47 | open(e.getPlayer(), g); 48 | }, 5); 49 | e.setCancelled(true); 50 | } 51 | 52 | @EventHandler 53 | public void onsetName(AsyncPlayerChatEvent e) { 54 | if (!setName.containsKey(e.getPlayer())) return; 55 | String message = e.getMessage(); 56 | Group g = setName.get(e.getPlayer()); 57 | 58 | Tools.sendCommand(e.getPlayer(), "lp group "+g.getName()+" setdisplayname "+message); 59 | setName.remove(e.getPlayer()); 60 | Bukkit.getScheduler().scheduleSyncDelayedTask(LuckPermsGUI.getInstance(), () -> { 61 | open(e.getPlayer(), g); 62 | }, 5); 63 | e.setCancelled(true); 64 | } 65 | 66 | @EventHandler 67 | public void onrename(AsyncPlayerChatEvent e) { 68 | if (!rename.containsKey(e.getPlayer())) return; 69 | String message = e.getMessage(); 70 | Group g = rename.get(e.getPlayer()); 71 | 72 | Tools.sendCommand(e.getPlayer(), "lp group "+g.getName()+" rename "+message); 73 | rename.remove(e.getPlayer()); 74 | Bukkit.getScheduler().scheduleSyncDelayedTask(LuckPermsGUI.getInstance(), () -> { 75 | open(e.getPlayer(), g); 76 | }, 5); 77 | e.setCancelled(true); 78 | } 79 | 80 | @EventHandler 81 | public void onclone(AsyncPlayerChatEvent e) { 82 | if (!clone.containsKey(e.getPlayer())) return; 83 | String message = e.getMessage(); 84 | Group g = clone.get(e.getPlayer()); 85 | 86 | Tools.sendCommand(e.getPlayer(), "lp group "+g.getName()+" clone "+message); 87 | clone.remove(e.getPlayer()); 88 | Bukkit.getScheduler().scheduleSyncDelayedTask(LuckPermsGUI.getInstance(), () -> { 89 | open(e.getPlayer(), l.getGroupManager().getGroup(message)); 90 | }, 5); 91 | e.setCancelled(true); 92 | } 93 | 94 | 95 | public static void open(Player p, Group group) { 96 | Inventory myInventory = Bukkit.createInventory(null, 54, ChatColor.AQUA+"LuckPerms group"); 97 | Tools.onAsync(() -> { 98 | 99 | // ----------------------- INFO ------------------------------ 100 | int weight = group.getWeight().orElse(0); 101 | ItemStack info = Tools.button(Material.ARMOR_STAND, 102 | "&6Info", 103 | Arrays.asList( 104 | "&cGroup info: &e"+group.getName(), 105 | "&cDisplay name: &e"+group.getFriendlyName(), 106 | "&cWeight: &e"+weight, 107 | "&cCounts:", 108 | " &cNodes: &e"+group.getNodes().size(), 109 | " &cPermissions: &e"+group.getDistinctNodes().size(), 110 | " &cPrefixes: &e"+group.getCachedData().getMetaData().getPrefixes().size(), 111 | " &cSuffixes: &e"+group.getCachedData().getMetaData().getSuffixes().size()), 112 | 1); 113 | myInventory.setItem(4, info); 114 | // ----------------------- INFO ------------------------------ 115 | 116 | // ----------------------- PERMISSION ------------------------------ 117 | ItemStack perm = Tools.button(Material.SIGN, "&6Permissions", Arrays.asList("&e----------->", 118 | "&aDescription:", 119 | "&2 Permission nodes are a method of defining", 120 | "&2 the access each player has on a server,", 121 | "&2 in the form of a name and a true/false state."), 1); 122 | ItemStack pall = Tools.button(Material.CHEST, "&6All permissions", Arrays.asList("&eClick here to see all permissions"), 1); 123 | ItemStack pset = Tools.button(Material.ARROW, "&6Add permission", Arrays.asList("&eClick to add new permission"), 1); 124 | ItemStack psettemp = Tools.button(Material.ARROW, "&6Add temp permission", Arrays.asList("&eClick to add new temporary permission"), 1); 125 | ItemStack pcheck = Tools.button(Material.TORCH, "&6Check if group has permission", Arrays.asList("&eClick to check if group has permission"), 1); 126 | myInventory.setItem(9, perm); 127 | myInventory.setItem(10, pall); 128 | myInventory.setItem(11, pset); 129 | myInventory.setItem(12, psettemp); 130 | myInventory.setItem(13, pcheck); 131 | // ----------------------- PERMISSION ------------------------------ 132 | 133 | // ----------------------- PARENT ------------------------------ 134 | ItemStack parent = Tools.button(Material.SIGN, "&6Parent", Arrays.asList("&e----------->", 135 | "&aDescription:", 136 | "&2 Parent is a group. Groups has all", 137 | "&2 permissions of its parent. For example:", 138 | "&2 Group with parent 'default' will have all", 139 | "&2 default group permissions."), 1); 140 | ItemStack parentall = Tools.button(Material.CHEST, "&6All parents", Arrays.asList("&eClick here to see all parents"), 1); 141 | ItemStack parentadd = Tools.button(Material.ARROW, "&6Add parent", Arrays.asList("&eClick here to add parent"), 1); 142 | ItemStack parenttempadd = Tools.button(Material.ARROW, "&6Add temp parent", Arrays.asList("&eClick here to add temporary parent"), 1); 143 | myInventory.setItem(18, parent); 144 | myInventory.setItem(19, parentall); 145 | myInventory.setItem(20, parentadd); 146 | myInventory.setItem(21, parenttempadd); 147 | // ----------------------- PARENT ------------------------------ 148 | 149 | // ----------------------- PREFIX/SUFFIX ------------------------------ 150 | ItemStack meta = Tools.button(Material.SIGN, "&6Prefix/Suffix", Arrays.asList("&e----------->", 151 | "&aPrefix Description:", 152 | "&2 Prefix is text that goes", 153 | "&2 before the nick.", 154 | "&aSuffix Description:", 155 | "&2 Suffix is text that goes", 156 | "&2 after the nick."), 1); 157 | ItemStack metaallprefix = Tools.button(Material.CHEST, "&6All prefixes", Arrays.asList("&eClick here to see all prefixes"), 1); 158 | ItemStack metaallsuffix = Tools.button(Material.CHEST, "&6All suffixes", Arrays.asList("&eClick here to see all suffixes"), 1); 159 | ItemStack metaaddprefix = Tools.button(Material.ARROW, "&6Add prefix", Arrays.asList("&eClick here to add prefix"), 1); 160 | ItemStack metaaddsuffix = Tools.button(Material.ARROW, "&6Add suffix", Arrays.asList("&eClick here to add suffix"), 1); 161 | ItemStack metaaddtempprefix = Tools.button(Material.ARROW, "&6Add temp prefix", Arrays.asList("&eClick here to add temporary prefix"), 1); 162 | ItemStack metaaddtempsuffix = Tools.button(Material.ARROW, "&6Add temp suffix", Arrays.asList("&eClick here to add temporary suffix"), 1); 163 | myInventory.setItem(27, meta); 164 | myInventory.setItem(28, metaallprefix); 165 | myInventory.setItem(29, metaallsuffix); 166 | myInventory.setItem(30, metaaddprefix); 167 | myInventory.setItem(31, metaaddsuffix); 168 | myInventory.setItem(32, metaaddtempprefix); 169 | myInventory.setItem(33, metaaddtempsuffix); 170 | // ----------------------- PREFIX/SUFFIX ------------------------------ 171 | 172 | // ----------------------- PREFIX/SUFFIX ------------------------------ 173 | ItemStack meta2 = Tools.button(Material.SIGN, "&6Meta", Arrays.asList("&e----------->", 174 | "&aMeta Description:", 175 | "&2 You can set custom keys", 176 | "&2 and values"), 1); 177 | ItemStack metaKeys = Tools.button(Material.CHEST, "&6All keys", Arrays.asList("&eClick here to see all meta keys"), 1); 178 | ItemStack addKey = Tools.button(Material.ARROW, "&6Add key", Arrays.asList("&eClick here to add meta key"), 1); 179 | ItemStack addTempKey = Tools.button(Material.ARROW, "&6Add temp key", Arrays.asList("&eClick here to add temp meta key"), 1); 180 | myInventory.setItem(36, meta2); 181 | myInventory.setItem(37, metaKeys); 182 | myInventory.setItem(38, addKey); 183 | myInventory.setItem(39, addTempKey); 184 | // ----------------------- PREFIX/SUFFIX ------------------------------ 185 | 186 | // ----------------------- GENERAL ------------------------------ 187 | ItemStack general = Tools.button(Material.SIGN, "&6General", Arrays.asList("&e----------->"), 1); 188 | ItemStack weight1 = Tools.button(Material.DIAMOND_BLOCK, "&6Set weight", Arrays.asList("&eClick to set group weight", "&cCurrent: &e"+weight), 1); 189 | ItemStack displayname = Tools.button(Material.NAME_TAG, "&6Set displayname", Arrays.asList("&eClick to set display name", "&cCurrent: &e"+group.getFriendlyName()), 1); 190 | ItemStack rename = Tools.button(Material.NAME_TAG, "&6Rename", Arrays.asList("&eClick to rename", "&cCurrent: &e"+group.getName()), 1); 191 | ItemStack clone = Tools.button(Material.PAPER, "&6Clone", Arrays.asList("&eClick to clone"), 1); 192 | ItemStack remove = Tools.button(Material.REDSTONE, "&6Remove group", Arrays.asList("&eRemove the group"), 1); 193 | myInventory.setItem(45, general); 194 | myInventory.setItem(46, weight1); 195 | myInventory.setItem(47, displayname); 196 | myInventory.setItem(48, rename); 197 | myInventory.setItem(49, clone); 198 | myInventory.setItem(50, remove); 199 | // ----------------------- GENERAL ------------------------------ 200 | 201 | ItemStack back = Tools.button(Material.BARRIER, "&6Back", Arrays.asList(""), 1); 202 | myInventory.setItem(8, back); 203 | 204 | }); 205 | p.openInventory(myInventory); 206 | } 207 | 208 | @EventHandler 209 | public void onInventoryClickEvent(InventoryClickEvent e) { 210 | Player p = (Player) e.getWhoClicked(); 211 | 212 | Inventory inv = e.getClickedInventory(); 213 | ItemStack item = e.getCurrentItem(); 214 | if (inv != null && item != null) 215 | if (e.getView().getTitle().equals(ChatColor.AQUA+"LuckPerms group")) { 216 | e.setCancelled(true); 217 | if (item.hasItemMeta()) 218 | if (item.getItemMeta().hasDisplayName()) { 219 | 220 | String group = ChatColor.stripColor(inv.getItem(4).getItemMeta().getLore().get(0).split(" ")[2]); 221 | Group g = l.getGroupManager().getGroup(group); 222 | 223 | String name = ChatColor.stripColor(item.getItemMeta().getDisplayName()); 224 | if (name.equals("Back")) { 225 | GroupsGUI.open(p); 226 | } else if (name.equals("All permissions")) { 227 | Permissions.open(p, g, 0); 228 | } else if (name.equals("Add permission")) { 229 | Tools.sendMessage(p, "&eWrite in chat:"); 230 | Tools.sendMessage(p, "&8<&7Permission&8> [&7Value&8] [&7Server&8] [&7World&8]"); 231 | Tools.sendMessage(p, "&aPermission - Your permission"); 232 | Tools.sendMessage(p, "&aValue - true/false"); 233 | Tools.sendMessage(p, "&aServer - server that permission will work"); 234 | Tools.sendMessage(p, " &2Leave blank or 'global' for global"); 235 | Tools.sendMessage(p, "&aWorld - world that permission will work"); 236 | Tools.sendMessage(p, " &2Leave blank or 'global' for global"); 237 | Permissions.addPermission.put(p, g); 238 | p.closeInventory(); 239 | } else if (name.equals("Add temp permission")) { 240 | Tools.sendMessage(p, "&eWrite in chat:"); 241 | Tools.sendMessage(p, "&8<&7Permission&8> [&7Value&8] <&7Duration&8> [&7Server&8] [&7World&8]"); 242 | Tools.sendMessage(p, "&aPermission - Your permission"); 243 | Tools.sendMessage(p, "&aValue - true/false"); 244 | Tools.sendMessage(p, "&aDuration - time "); 245 | Tools.sendMessage(p, "&aServer - server that permission will work"); 246 | Tools.sendMessage(p, " &2Leave blank or 'global' for global"); 247 | Tools.sendMessage(p, "&aWorld - world that permission will work"); 248 | Tools.sendMessage(p, " &2Leave blank or 'global' for global"); 249 | Permissions.addTempPermission.put(p, g); 250 | p.closeInventory(); 251 | } else if (name.equals("Check if group has permission")) { 252 | Tools.sendMessage(p, "&eWrite in chat:"); 253 | Tools.sendMessage(p, "&8<&7Permission&8> [&7Server&8] [&7World&8]"); 254 | Tools.sendMessage(p, "&aPermission - Your permission"); 255 | Tools.sendMessage(p, "&aServer - server that permission will work"); 256 | Tools.sendMessage(p, " &2Leave blank or 'global' for global"); 257 | Tools.sendMessage(p, "&aWorld - world that permission will work"); 258 | Tools.sendMessage(p, " &2Leave blank or 'global' for global"); 259 | Permissions.checkIfHas.put(p, g); 260 | p.closeInventory(); 261 | } 262 | 263 | else if (name.equals("All parents")) { 264 | Parents.open(p, g, 0); 265 | } else if (name.equals("Add parent")) { 266 | Tools.sendMessage(p, "&eWrite in chat:"); 267 | Tools.sendMessage(p, "&8<&7Parent&8> [&7Server&8] [&7World&8]"); 268 | Tools.sendMessage(p, "&aParent - parent group"); 269 | Tools.sendMessage(p, "&aServer - server that permission will work"); 270 | Tools.sendMessage(p, " &2Leave blank or 'global' for global"); 271 | Tools.sendMessage(p, "&aWorld - world that permission will work"); 272 | Tools.sendMessage(p, " &2Leave blank or 'global' for global"); 273 | Parents.addParent.put(p, g); 274 | p.closeInventory(); 275 | } else if (name.equals("Add temp parent")) { 276 | Tools.sendMessage(p, "&eWrite in chat:"); 277 | Tools.sendMessage(p, "&8<&7Parent&8> <&7Duration&8> [&7Server&8] [&7World&8]"); 278 | Tools.sendMessage(p, "&aParent - parent group"); 279 | Tools.sendMessage(p, "&aDuration - time "); 280 | Tools.sendMessage(p, "&aServer - server that permission will work"); 281 | Tools.sendMessage(p, " &2Leave blank or 'global' for global"); 282 | Tools.sendMessage(p, "&aWorld - world that permission will work"); 283 | Tools.sendMessage(p, " &2Leave blank or 'global' for global"); 284 | Parents.addTempParent.put(p, g); 285 | p.closeInventory(); 286 | } 287 | 288 | else if (name.equals("All prefixes")) { 289 | Prefix.open(p, g, 0); 290 | } else if (name.equals("Add prefix")) { 291 | Tools.sendMessage(p, "&eWrite in chat:"); 292 | Tools.sendMessage(p, "&8<&7Priority&8> \"<&7Prefix&8>\" [&7Server&8] [&7World&8]"); 293 | Tools.sendMessage(p, "&aPriority - prefix priority, if user has two groups, the higher priority prefix will be set"); 294 | Tools.sendMessage(p, "&aPrefix - own prefix"); 295 | Tools.sendMessage(p, "&aServer - server that permission will work"); 296 | Tools.sendMessage(p, " &2Leave blank or 'global' for global"); 297 | Tools.sendMessage(p, "&aWorld - world that permission will work"); 298 | Tools.sendMessage(p, " &2Leave blank or 'global' for global"); 299 | Prefix.addPrefix.put(p, g); 300 | p.closeInventory(); 301 | } else if (name.equals("Add temp prefix")) { 302 | Tools.sendMessage(p, "&eWrite in chat:"); 303 | Tools.sendMessage(p, "&8<&7Priority&8> \"<&7Prefix&8>\" <&7Duration&8> [&7Server&8] [&7World&8]"); 304 | Tools.sendMessage(p, "&aPriority - prefix priority, if user has two groups, the higher priority prefix will be set"); 305 | Tools.sendMessage(p, "&aPrefix - own prefix"); 306 | Tools.sendMessage(p, "&aDuration - time "); 307 | Tools.sendMessage(p, "&aServer - server that permission will work"); 308 | Tools.sendMessage(p, " &2Leave blank or 'global' for global"); 309 | Tools.sendMessage(p, "&aWorld - world that permission will work"); 310 | Tools.sendMessage(p, " &2Leave blank or 'global' for global"); 311 | Prefix.addTempPrefix.put(p, g); 312 | p.closeInventory(); 313 | } 314 | 315 | else if (name.equals("All suffixes")) { 316 | Suffix.open(p, g, 0); 317 | } else if (name.equals("Add suffix")) { 318 | Tools.sendMessage(p, "&eWrite in chat:"); 319 | Tools.sendMessage(p, "&8<&7Priority&8> \"<&7Suffix&8>\" [&7Server&8] [&7World&8]"); 320 | Tools.sendMessage(p, "&aPriority - suffix priority, if user has two groups, the higher priority suffix will be set"); 321 | Tools.sendMessage(p, "&aSuffix - own suffix"); 322 | Tools.sendMessage(p, "&aServer - server that permission will work"); 323 | Tools.sendMessage(p, " &2Leave blank or 'global' for global"); 324 | Tools.sendMessage(p, "&aWorld - world that permission will work"); 325 | Tools.sendMessage(p, " &2Leave blank or 'global' for global"); 326 | Suffix.addPrefix.put(p, g); 327 | p.closeInventory(); 328 | } else if (name.equals("Add temp suffix")) { 329 | Tools.sendMessage(p, "&eWrite in chat:"); 330 | Tools.sendMessage(p, "&8<&7Priority&8> \"<&7Suffix&8>\" <&7Duration&8> [&7Server&8] [&7World&8]"); 331 | Tools.sendMessage(p, "&aPriority - suffix priority, if user has two groups, the higher priority suffix will be set"); 332 | Tools.sendMessage(p, "&aSuffix - own suffix"); 333 | Tools.sendMessage(p, "&aDuration - time "); 334 | Tools.sendMessage(p, "&aServer - server that permission will work"); 335 | Tools.sendMessage(p, " &2Leave blank or 'global' for global"); 336 | Tools.sendMessage(p, "&aWorld - world that permission will work"); 337 | Tools.sendMessage(p, " &2Leave blank or 'global' for global"); 338 | Suffix.addTempPrefix.put(p, g); 339 | p.closeInventory(); 340 | } 341 | 342 | 343 | else if (name.equals("Set weight")) { 344 | Tools.sendMessage(p, "&eWrite in chat:"); 345 | Tools.sendMessage(p, "&8<&7Weight&8>"); 346 | Tools.sendMessage(p, "&aWeight - group weight"); 347 | setWeight.put(p, g); 348 | p.closeInventory(); 349 | } else if (name.equals("Set displayname")) { 350 | Tools.sendMessage(p, "&eWrite in chat:"); 351 | Tools.sendMessage(p, "&8<&7Name&8>"); 352 | Tools.sendMessage(p, "&aName - group display name"); 353 | setName.put(p, g); 354 | p.closeInventory(); 355 | } else if (name.equals("Rename")) { 356 | Tools.sendMessage(p, "&eWrite in chat:"); 357 | Tools.sendMessage(p, "&8<&7Name&8>"); 358 | Tools.sendMessage(p, "&aName - group new name"); 359 | rename.put(p, g); 360 | p.closeInventory(); 361 | } else if (name.equals("Clone")) { 362 | Tools.sendMessage(p, "&eWrite in chat:"); 363 | Tools.sendMessage(p, "&8<&7Name&8>"); 364 | Tools.sendMessage(p, "&aName - new group new name"); 365 | clone.put(p, g); 366 | p.closeInventory(); 367 | } else if (name.equals("Remove group")) { 368 | Tools.sendCommand(p, "lp deletegroup "+g.getName()); 369 | Bukkit.getScheduler().runTaskLater(LuckPermsGUI.getInstance(), () -> { 370 | GroupsGUI.open(p); 371 | }, 5); 372 | } 373 | } 374 | } 375 | } 376 | } 377 | -------------------------------------------------------------------------------- /src/main/java/com/bghddevelopment/LuckPemsGUI/groups/GroupsGUI.java: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright (c) BGHDDevelopment. 3 | * Please refer to the plugin page or GitHub page for our open-source license. 4 | * If you have any questions please email ceo@bghddevelopment or reach us on Discord 5 | */ 6 | 7 | package com.bghddevelopment.LuckPemsGUI.groups; 8 | 9 | import java.util.ArrayList; 10 | import java.util.Arrays; 11 | import java.util.List; 12 | import com.bghddevelopment.LuckPemsGUI.util.OpenGUI; 13 | import net.luckperms.api.LuckPerms; 14 | import net.luckperms.api.LuckPermsProvider; 15 | import net.luckperms.api.model.group.Group; 16 | import org.bukkit.Bukkit; 17 | import org.bukkit.ChatColor; 18 | import org.bukkit.Material; 19 | import org.bukkit.entity.Player; 20 | import org.bukkit.event.EventHandler; 21 | import org.bukkit.event.Listener; 22 | import org.bukkit.event.inventory.InventoryClickEvent; 23 | import org.bukkit.event.player.AsyncPlayerChatEvent; 24 | import org.bukkit.inventory.Inventory; 25 | import org.bukkit.inventory.ItemStack; 26 | import com.bghddevelopment.LuckPemsGUI.LuckPermsGUI; 27 | import com.bghddevelopment.LuckPemsGUI.util.Tools; 28 | 29 | public class GroupsGUI implements Listener { 30 | 31 | List newGroup = new ArrayList<>(); 32 | 33 | @EventHandler 34 | public void onGroupAdd(AsyncPlayerChatEvent e) { 35 | if (!newGroup.contains(e.getPlayer())) return; 36 | String message = e.getMessage(); 37 | 38 | Tools.sendCommand(e.getPlayer(), "lp creategroup "+message); 39 | newGroup.remove(e.getPlayer()); 40 | Bukkit.getScheduler().scheduleSyncDelayedTask(LuckPermsGUI.getInstance(), () -> { 41 | open(e.getPlayer()); 42 | }, 5); 43 | e.setCancelled(true); 44 | } 45 | 46 | static LuckPerms l = LuckPermsProvider.get(); 47 | 48 | public static void open(Player p) { 49 | Inventory myInventory = Bukkit.createInventory(null, 54, ChatColor.AQUA+"LuckPerms groups"); 50 | Tools.onAsync(() -> { 51 | 52 | int sk = 9; 53 | for (Group group : l.getGroupManager().getLoadedGroups()) { 54 | String name = group.getName(); 55 | ItemStack item = Tools.button(Material.TNT, "&6"+name, Arrays.asList("&ePress to edit this group"), 1); 56 | myInventory.setItem(sk, item); 57 | sk++; 58 | } 59 | 60 | ItemStack back = Tools.button(Material.BARRIER, "&6Back", Arrays.asList(""), 1); 61 | myInventory.setItem(8, back); 62 | 63 | ItemStack newGroup = Tools.button(Material.PAPER, "&6New group", Arrays.asList("&eCreate new group"), 1); 64 | myInventory.setItem(0, newGroup); 65 | 66 | }); 67 | p.openInventory(myInventory); 68 | } 69 | 70 | @EventHandler 71 | public void onInventoryClickEvent(InventoryClickEvent e) { 72 | Player p = (Player) e.getWhoClicked(); 73 | 74 | Inventory inv = e.getClickedInventory(); 75 | ItemStack item = e.getCurrentItem(); 76 | if (inv != null && item != null) 77 | if (e.getView().getTitle().equals(ChatColor.AQUA+"LuckPerms groups")) { 78 | e.setCancelled(true); 79 | if (item.hasItemMeta()) 80 | if (item.getItemMeta().hasDisplayName()) { 81 | String group = ChatColor.stripColor(item.getItemMeta().getDisplayName()); 82 | if (group.equals("Back")) { 83 | OpenGUI.openGUI(p); 84 | } else if (group.equals("New group")) { 85 | Tools.sendMessage(p, "&eWrite in chat:"); 86 | Tools.sendMessage(p, "&8<&7Name&8>"); 87 | Tools.sendMessage(p, "&aName - Group name"); 88 | newGroup.add(p); 89 | p.closeInventory(); 90 | } else EditGroup.open(p, l.getGroupManager().getGroup(group)); 91 | } 92 | } 93 | } 94 | } 95 | -------------------------------------------------------------------------------- /src/main/java/com/bghddevelopment/LuckPemsGUI/groups/Parents.java: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright (c) BGHDDevelopment. 3 | * Please refer to the plugin page or GitHub page for our open-source license. 4 | * If you have any questions please email ceo@bghddevelopment or reach us on Discord 5 | */ 6 | 7 | package com.bghddevelopment.LuckPemsGUI.groups; 8 | 9 | import java.util.Arrays; 10 | import java.util.HashMap; 11 | import java.util.Map; 12 | 13 | import net.luckperms.api.LuckPerms; 14 | import net.luckperms.api.LuckPermsProvider; 15 | import net.luckperms.api.context.DefaultContextKeys; 16 | import net.luckperms.api.model.group.Group; 17 | import net.luckperms.api.node.Node; 18 | import net.luckperms.api.node.NodeType; 19 | import net.luckperms.api.node.types.InheritanceNode; 20 | import org.bukkit.Bukkit; 21 | import org.bukkit.ChatColor; 22 | import org.bukkit.Material; 23 | import org.bukkit.entity.Player; 24 | import org.bukkit.event.EventHandler; 25 | import org.bukkit.event.Listener; 26 | import org.bukkit.event.inventory.InventoryClickEvent; 27 | import org.bukkit.event.player.AsyncPlayerChatEvent; 28 | import org.bukkit.inventory.Inventory; 29 | import org.bukkit.inventory.ItemStack; 30 | import com.bghddevelopment.LuckPemsGUI.LuckPermsGUI; 31 | import com.bghddevelopment.LuckPemsGUI.util.Tools; 32 | 33 | public class Parents implements Listener { 34 | 35 | public static Map addParent = new HashMap<>(); 36 | public static Map addTempParent = new HashMap<>(); 37 | 38 | @EventHandler 39 | public void onaddParent(AsyncPlayerChatEvent e) { 40 | if (!addParent.containsKey(e.getPlayer())) return; 41 | String message = e.getMessage(); 42 | Group g = addParent.get(e.getPlayer()); 43 | 44 | Tools.sendCommand(e.getPlayer(), "lp group "+g.getName()+" parent add "+message); 45 | addParent.remove(e.getPlayer()); 46 | Bukkit.getScheduler().scheduleSyncDelayedTask(LuckPermsGUI.getInstance(), () -> { 47 | EditGroup.open(e.getPlayer(), g); 48 | }, 5); 49 | e.setCancelled(true); 50 | } 51 | 52 | @EventHandler 53 | public void onaddTempParent(AsyncPlayerChatEvent e) { 54 | if (!addTempParent.containsKey(e.getPlayer())) return; 55 | String message = e.getMessage(); 56 | Group g = addTempParent.get(e.getPlayer()); 57 | 58 | Tools.sendCommand(e.getPlayer(), "lp group "+g.getName()+" parent addtemp "+message); 59 | addTempParent.remove(e.getPlayer()); 60 | Bukkit.getScheduler().scheduleSyncDelayedTask(LuckPermsGUI.getInstance(), () -> { 61 | EditGroup.open(e.getPlayer(), g); 62 | }, 5); 63 | e.setCancelled(true); 64 | } 65 | 66 | static LuckPerms l = LuckPermsProvider.get(); 67 | 68 | public static void open(Player p, Group group, int page) { 69 | Inventory myInventory = Bukkit.createInventory(null, 54, ChatColor.AQUA+"LuckPerms group parents"); 70 | Tools.onAsync(() -> { 71 | 72 | 73 | // ----------------------- INFO ------------------------------ 74 | int weight = group.getWeight().orElse(0); 75 | ItemStack info = Tools.button(Material.ARMOR_STAND, 76 | "&6Info", 77 | Arrays.asList( 78 | "&cGroup info: &e"+group.getName(), 79 | "&cDisplay name: &e"+group.getFriendlyName(), 80 | "&cWeight: &e"+weight, 81 | "&cCounts:", 82 | " &cNodes: &e"+group.getNodes().size(), 83 | " &cPermissions: &e"+group.getDistinctNodes().size(), 84 | " &cPrefixes: &e"+group.getCachedData().getMetaData().getPrefixes().size(), 85 | " &cSuffixes: &e"+group.getCachedData().getMetaData().getSuffixes().size()), 86 | 1); 87 | myInventory.setItem(4, info); 88 | // ----------------------- INFO ------------------------------ 89 | 90 | int sk = 0; 91 | int i = 9; 92 | 93 | int from = 45*page-1; 94 | int to = 45*(page+1)-1; 95 | for (Node permission : group.getDistinctNodes()) { 96 | if (permission.getType() != NodeType.INHERITANCE) continue; 97 | if (from <= sk && sk < to) { 98 | 99 | InheritanceNode parent = ((InheritanceNode)permission); 100 | String expiration = permission.hasExpiry() ? Tools.getTime(permission.getExpiry().toEpochMilli()) : "Never"; 101 | String server = permission.getContexts().getAnyValue(DefaultContextKeys.SERVER_KEY).orElse("global"); 102 | String world = permission.getContexts().getAnyValue(DefaultContextKeys.WORLD_KEY).orElse("global"); 103 | ItemStack item = Tools.button(Material.TNT, 104 | "&6"+parent.getGroupName(), 105 | Arrays.asList( 106 | "&cID: &e"+sk, 107 | "&cExpires in: &e"+expiration, 108 | "&cValue: &e"+permission.getValue(), 109 | "&cServer: &e"+server, 110 | "&cWorld: &e"+world, 111 | "&eClick to remove" 112 | ), 1); 113 | myInventory.setItem(i, item); 114 | i++; 115 | } 116 | sk++; 117 | } 118 | 119 | if (to < sk) { 120 | ItemStack next = Tools.button(Material.SIGN, "&6Next", Arrays.asList("&eNext page", "&cCurrent: &e"+page), 1); 121 | myInventory.setItem(53, next); 122 | } 123 | 124 | ItemStack back = Tools.button(Material.BARRIER, "&6Back", Arrays.asList(""), 1); 125 | myInventory.setItem(8, back); 126 | 127 | }); 128 | p.openInventory(myInventory); 129 | } 130 | 131 | @EventHandler 132 | public void onInventoryClickEvent(InventoryClickEvent e) { 133 | Player p = (Player) e.getWhoClicked(); 134 | 135 | Inventory inv = e.getClickedInventory(); 136 | ItemStack item = e.getCurrentItem(); 137 | if (inv != null && item != null) 138 | if (e.getView().getTitle().equals(ChatColor.AQUA+"LuckPerms group parents")) { 139 | e.setCancelled(true); 140 | if (item.hasItemMeta()) 141 | if (item.getItemMeta().hasDisplayName()) { 142 | 143 | String group = ChatColor.stripColor(inv.getItem(4).getItemMeta().getLore().get(0).split(" ")[2]); 144 | Group g = l.getGroupManager().getGroup(group); 145 | 146 | String name = ChatColor.stripColor(item.getItemMeta().getDisplayName()); 147 | if (name.equals("Next")) { 148 | int current = Integer.parseInt(ChatColor.stripColor(inv.getItem(53).getItemMeta().getLore().get(1).split(" ")[1])); 149 | open(p, g, current+1); 150 | } else if (name.equals("Back")) { 151 | EditGroup.open(p, g); 152 | } else if (!name.equals("Info")) { 153 | 154 | int id = Integer.parseInt(ChatColor.stripColor(item.getItemMeta().getLore().get(0).split(" ")[1])); 155 | 156 | int sk = 0; 157 | for (Node permission : g.getDistinctNodes()) { 158 | if (permission.getType() != NodeType.INHERITANCE) continue; 159 | 160 | InheritanceNode parent = ((InheritanceNode)permission); 161 | 162 | String server = permission.getContexts().getAnyValue(DefaultContextKeys.SERVER_KEY).orElse("global"); 163 | String world = permission.getContexts().getAnyValue(DefaultContextKeys.WORLD_KEY).orElse("global"); 164 | 165 | if (sk == id) { 166 | if (permission.hasExpiry()) 167 | Tools.sendCommand(p, "lp group "+g.getName()+" parent removetemp "+'"'+parent.getGroupName()+'"'+" "+server+" "+world); 168 | else 169 | Tools.sendCommand(p, "lp group "+g.getName()+" parent remove "+'"'+parent.getGroupName()+'"'+" "+server+" "+world); 170 | break; 171 | } 172 | sk++; 173 | } 174 | 175 | int current = 0; 176 | if (inv.getItem(53) != null) 177 | current = Integer.parseInt(ChatColor.stripColor(inv.getItem(53).getItemMeta().getLore().get(1).split(" ")[1])); 178 | 179 | int page = current; 180 | Bukkit.getScheduler().runTaskLater(LuckPermsGUI.getInstance(), () -> { 181 | open(p, g, page); 182 | }, 5); 183 | } 184 | } 185 | } 186 | } 187 | } 188 | -------------------------------------------------------------------------------- /src/main/java/com/bghddevelopment/LuckPemsGUI/groups/Permissions.java: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright (c) BGHDDevelopment. 3 | * Please refer to the plugin page or GitHub page for our open-source license. 4 | * If you have any questions please email ceo@bghddevelopment or reach us on Discord 5 | */ 6 | 7 | package com.bghddevelopment.LuckPemsGUI.groups; 8 | 9 | import java.util.Arrays; 10 | import java.util.HashMap; 11 | import java.util.Map; 12 | 13 | import net.luckperms.api.LuckPerms; 14 | import net.luckperms.api.LuckPermsProvider; 15 | import net.luckperms.api.context.DefaultContextKeys; 16 | import net.luckperms.api.model.group.Group; 17 | import net.luckperms.api.node.Node; 18 | import net.luckperms.api.node.NodeType; 19 | import org.bukkit.Bukkit; 20 | import org.bukkit.ChatColor; 21 | import org.bukkit.Material; 22 | import org.bukkit.entity.Player; 23 | import org.bukkit.event.EventHandler; 24 | import org.bukkit.event.Listener; 25 | import org.bukkit.event.inventory.InventoryClickEvent; 26 | import org.bukkit.event.player.AsyncPlayerChatEvent; 27 | import org.bukkit.inventory.Inventory; 28 | import org.bukkit.inventory.ItemStack; 29 | import com.bghddevelopment.LuckPemsGUI.LuckPermsGUI; 30 | import com.bghddevelopment.LuckPemsGUI.util.Tools; 31 | 32 | public class Permissions implements Listener { 33 | 34 | public static Map addPermission = new HashMap<>(); 35 | public static Map addTempPermission = new HashMap<>(); 36 | public static Map checkIfHas = new HashMap<>(); 37 | 38 | @EventHandler 39 | public void onPermissionAdd(AsyncPlayerChatEvent e) { 40 | if (!addPermission.containsKey(e.getPlayer())) return; 41 | String message = e.getMessage(); 42 | Group g = addPermission.get(e.getPlayer()); 43 | 44 | Tools.sendCommand(e.getPlayer(), "lp group "+g.getName()+" permission set "+message); 45 | addPermission.remove(e.getPlayer()); 46 | Bukkit.getScheduler().scheduleSyncDelayedTask(LuckPermsGUI.getInstance(), () -> { 47 | EditGroup.open(e.getPlayer(), g); 48 | }, 5); 49 | e.setCancelled(true); 50 | } 51 | 52 | @EventHandler 53 | public void onTempPermissionAdd(AsyncPlayerChatEvent e) { 54 | if (!addTempPermission.containsKey(e.getPlayer())) return; 55 | String message = e.getMessage(); 56 | Group g = addTempPermission.get(e.getPlayer()); 57 | 58 | Tools.sendCommand(e.getPlayer(), "lp group "+g.getName()+" permission settemp "+message); 59 | addTempPermission.remove(e.getPlayer()); 60 | Bukkit.getScheduler().scheduleSyncDelayedTask(LuckPermsGUI.getInstance(), () -> { 61 | EditGroup.open(e.getPlayer(), g); 62 | }, 5); 63 | e.setCancelled(true); 64 | } 65 | 66 | @EventHandler 67 | public void onPermissionCheck(AsyncPlayerChatEvent e) { 68 | if (!checkIfHas.containsKey(e.getPlayer())) return; 69 | String message = e.getMessage(); 70 | Group g = checkIfHas.get(e.getPlayer()); 71 | 72 | Tools.sendCommand(e.getPlayer(), "lp group "+g.getName()+" permission check "+message); 73 | checkIfHas.remove(e.getPlayer()); 74 | Bukkit.getScheduler().scheduleSyncDelayedTask(LuckPermsGUI.getInstance(), () -> { 75 | EditGroup.open(e.getPlayer(), g); 76 | }, 5); 77 | e.setCancelled(true); 78 | } 79 | 80 | static LuckPerms l = LuckPermsProvider.get(); 81 | 82 | public static void open(Player p, Group group, int page) { 83 | Inventory myInventory = Bukkit.createInventory(null, 54, ChatColor.AQUA+"LuckPerms group permissions"); 84 | Tools.onAsync(() -> { 85 | 86 | 87 | // ----------------------- INFO ------------------------------ 88 | int weight = group.getWeight().orElse(0); 89 | ItemStack info = Tools.button(Material.ARMOR_STAND, 90 | "&6Info", 91 | Arrays.asList( 92 | "&cGroup info: &e"+group.getName(), 93 | "&cDisplay name: &e"+group.getFriendlyName(), 94 | "&cWeight: &e"+weight, 95 | "&cCounts:", 96 | " &cNodes: &e"+group.getNodes().size(), 97 | " &cPermissions: &e"+group.getDistinctNodes().size(), 98 | " &cPrefixes: &e"+group.getCachedData().getMetaData().getPrefixes().size(), 99 | " &cSuffixes: &e"+group.getCachedData().getMetaData().getSuffixes().size()), 100 | 1); 101 | myInventory.setItem(4, info); 102 | // ----------------------- INFO ------------------------------ 103 | 104 | int sk = 0; 105 | int i = 9; 106 | 107 | int from = 45*page-1; 108 | int to = 45*(page+1)-1; 109 | for (Node permission : group.getDistinctNodes()) { 110 | if (permission.getType() == NodeType.META) continue; 111 | if (permission.getType() == NodeType.PREFIX) continue; 112 | if (permission.getType() == NodeType.SUFFIX) continue; 113 | if (permission.getType() == NodeType.CHAT_META) continue; 114 | if (permission.getType() == NodeType.WEIGHT) continue; 115 | if (from <= sk && sk < to) { 116 | String expiration = permission.hasExpiry() ? Tools.getTime(permission.getExpiry().toEpochMilli()) : "Never"; 117 | String server = permission.getContexts().getAnyValue(DefaultContextKeys.SERVER_KEY).orElse("global"); 118 | String world = permission.getContexts().getAnyValue(DefaultContextKeys.WORLD_KEY).orElse("global"); 119 | ItemStack item = Tools.button(Material.TNT, 120 | "&6"+permission.getKey(), 121 | Arrays.asList( 122 | "&cID: &e"+sk, 123 | "&cExpires in: &e"+expiration, 124 | "&cValue: &e"+permission.getValue(), 125 | "&cServer: &e"+server, 126 | "&cWorld: &e"+world, 127 | "&eClick to remove" 128 | ), 1); 129 | myInventory.setItem(i, item); 130 | i++; 131 | } 132 | sk++; 133 | } 134 | 135 | if (to < sk) { 136 | ItemStack next = Tools.button(Material.SIGN, "&6Next", Arrays.asList("&eNext page", "&cCurrent: &e"+page), 1); 137 | myInventory.setItem(53, next); 138 | } 139 | 140 | ItemStack back = Tools.button(Material.BARRIER, "&6Back", Arrays.asList(""), 1); 141 | myInventory.setItem(8, back); 142 | 143 | }); 144 | p.openInventory(myInventory); 145 | } 146 | 147 | @EventHandler 148 | public void onInventoryClickEvent(InventoryClickEvent e) { 149 | Player p = (Player) e.getWhoClicked(); 150 | 151 | Inventory inv = e.getClickedInventory(); 152 | ItemStack item = e.getCurrentItem(); 153 | if (inv != null && item != null) 154 | if (e.getView().getTitle().equals(ChatColor.AQUA+"LuckPerms group permissions")) { 155 | e.setCancelled(true); 156 | if (item.hasItemMeta()) 157 | if (item.getItemMeta().hasDisplayName()) { 158 | 159 | String group = ChatColor.stripColor(inv.getItem(4).getItemMeta().getLore().get(0).split(" ")[2]); 160 | Group g =l.getGroupManager().getGroup(group); 161 | 162 | String name = ChatColor.stripColor(item.getItemMeta().getDisplayName()); 163 | if (name.equals("Next")) { 164 | int current = Integer.parseInt(ChatColor.stripColor(inv.getItem(53).getItemMeta().getLore().get(1).split(" ")[1])); 165 | open(p, g, current+1); 166 | } else if (name.equals("Back")) { 167 | EditGroup.open(p, g); 168 | } else if (!name.equals("Info")) { 169 | 170 | int id = Integer.parseInt(ChatColor.stripColor(item.getItemMeta().getLore().get(0).split(" ")[1])); 171 | 172 | int sk = 0; 173 | for (Node permission : g.getDistinctNodes()) { 174 | if (permission.getType() == NodeType.META) continue; 175 | if (permission.getType() == NodeType.PREFIX) continue; 176 | if (permission.getType() == NodeType.SUFFIX) continue; 177 | if (permission.getType() == NodeType.CHAT_META) continue; 178 | if (permission.getType() == NodeType.WEIGHT) continue; 179 | if (sk == id) { 180 | 181 | String server = permission.getContexts().getAnyValue(DefaultContextKeys.SERVER_KEY).orElse("global"); 182 | String world = permission.getContexts().getAnyValue(DefaultContextKeys.WORLD_KEY).orElse("global"); 183 | 184 | if (permission.hasExpiry()) 185 | Tools.sendCommand(p, "lp group " + g.getName() + " permission unsettemp " + '"' + permission.getKey() + '"' + " " + server + " " + world); 186 | else 187 | Tools.sendCommand(p, "lp group " + g.getName() + " permission unset " + '"' + permission.getKey() + '"' + " " + server + " " + world); 188 | break; 189 | } 190 | sk++; 191 | } 192 | 193 | int current = 0; 194 | if (inv.getItem(53) != null) 195 | current = Integer.parseInt(ChatColor.stripColor(inv.getItem(53).getItemMeta().getLore().get(1).split(" ")[1])); 196 | 197 | int page = current; 198 | Bukkit.getScheduler().runTaskLater(LuckPermsGUI.getInstance(), () -> { 199 | open(p, g, page); 200 | }, 5); 201 | } 202 | } 203 | } 204 | } 205 | } 206 | -------------------------------------------------------------------------------- /src/main/java/com/bghddevelopment/LuckPemsGUI/groups/Prefix.java: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright (c) BGHDDevelopment. 3 | * Please refer to the plugin page or GitHub page for our open-source license. 4 | * If you have any questions please email ceo@bghddevelopment or reach us on Discord 5 | */ 6 | 7 | package com.bghddevelopment.LuckPemsGUI.groups; 8 | 9 | import java.util.Arrays; 10 | import java.util.HashMap; 11 | import java.util.Map; 12 | 13 | import net.luckperms.api.LuckPerms; 14 | import net.luckperms.api.LuckPermsProvider; 15 | import net.luckperms.api.context.DefaultContextKeys; 16 | import net.luckperms.api.model.group.Group; 17 | import net.luckperms.api.node.Node; 18 | import net.luckperms.api.node.NodeType; 19 | import net.luckperms.api.node.types.PrefixNode; 20 | import org.bukkit.Bukkit; 21 | import org.bukkit.ChatColor; 22 | import org.bukkit.Material; 23 | import org.bukkit.entity.Player; 24 | import org.bukkit.event.EventHandler; 25 | import org.bukkit.event.Listener; 26 | import org.bukkit.event.inventory.InventoryClickEvent; 27 | import org.bukkit.event.player.AsyncPlayerChatEvent; 28 | import org.bukkit.inventory.Inventory; 29 | import org.bukkit.inventory.ItemStack; 30 | import com.bghddevelopment.LuckPemsGUI.LuckPermsGUI; 31 | import com.bghddevelopment.LuckPemsGUI.util.Tools; 32 | 33 | public class Prefix implements Listener { 34 | 35 | public static Map addPrefix = new HashMap<>(); 36 | public static Map addTempPrefix = new HashMap<>(); 37 | 38 | @EventHandler 39 | public void onaddParent(AsyncPlayerChatEvent e) { 40 | if (!addPrefix.containsKey(e.getPlayer())) return; 41 | String message = e.getMessage(); 42 | Group g = addPrefix.get(e.getPlayer()); 43 | 44 | Tools.sendCommand(e.getPlayer(), "lp group "+g.getName()+" meta addprefix "+message); 45 | addPrefix.remove(e.getPlayer()); 46 | Bukkit.getScheduler().scheduleSyncDelayedTask(LuckPermsGUI.getInstance(), () -> { 47 | EditGroup.open(e.getPlayer(), g); 48 | }, 5); 49 | e.setCancelled(true); 50 | } 51 | 52 | @EventHandler 53 | public void onaddTempParent(AsyncPlayerChatEvent e) { 54 | if (!addTempPrefix.containsKey(e.getPlayer())) return; 55 | String message = e.getMessage(); 56 | Group g = addTempPrefix.get(e.getPlayer()); 57 | 58 | Tools.sendCommand(e.getPlayer(), "lp group "+g.getName()+" meta addtempprefix "+message); 59 | addTempPrefix.remove(e.getPlayer()); 60 | Bukkit.getScheduler().scheduleSyncDelayedTask(LuckPermsGUI.getInstance(), () -> { 61 | EditGroup.open(e.getPlayer(), g); 62 | }, 5); 63 | e.setCancelled(true); 64 | } 65 | 66 | static LuckPerms l = LuckPermsProvider.get(); 67 | 68 | public static void open(Player p, Group group, int page) { 69 | Inventory myInventory = Bukkit.createInventory(null, 54, ChatColor.AQUA+"LuckPerms group prefixs"); 70 | Tools.onAsync(() -> { 71 | 72 | 73 | // ----------------------- INFO ------------------------------ 74 | int weight = group.getWeight().orElse(0); 75 | ItemStack info = Tools.button(Material.ARMOR_STAND, 76 | "&6Info", 77 | Arrays.asList( 78 | "&cGroup info: &e"+group.getName(), 79 | "&cDisplay name: &e"+group.getFriendlyName(), 80 | "&cWeight: &e"+weight, 81 | "&cCounts:", 82 | " &cNodes: &e"+group.getNodes().size(), 83 | " &cPermissions: &e"+group.getDistinctNodes().size(), 84 | " &cPrefixes: &e"+group.getCachedData().getMetaData().getPrefixes().size(), 85 | " &cSuffixes: &e"+group.getCachedData().getMetaData().getSuffixes().size()), 86 | 1); 87 | myInventory.setItem(4, info); 88 | // ----------------------- INFO ------------------------------ 89 | 90 | int sk = 0; 91 | int i = 9; 92 | 93 | int from = 45*page-1; 94 | int to = 45*(page+1)-1; 95 | for (Node permission : group.getDistinctNodes()) { 96 | if (permission.getType() != NodeType.PREFIX) continue; 97 | if (from <= sk && sk < to) { 98 | PrefixNode prefix = ((PrefixNode) permission); 99 | String expiration = permission.hasExpiry() ? Tools.getTime(permission.getExpiry().toEpochMilli()) : "Never"; 100 | String server = permission.getContexts().getAnyValue(DefaultContextKeys.SERVER_KEY).orElse("global"); 101 | String world = permission.getContexts().getAnyValue(DefaultContextKeys.WORLD_KEY).orElse("global"); 102 | ItemStack item = Tools.button(Material.TNT, 103 | "&6"+prefix.getMetaValue(), 104 | Arrays.asList( 105 | "&cID: &e"+sk, 106 | "&cPosition: &e"+prefix.getPriority(), 107 | "&cExpires in: &e"+expiration, 108 | "&cValue: &e"+permission.getValue(), 109 | "&cServer: &e"+server, 110 | "&cWorld: &e"+world, 111 | "&eClick to remove" 112 | ), 1); 113 | myInventory.setItem(i, item); 114 | i++; 115 | } 116 | sk++; 117 | } 118 | 119 | if (to < sk) { 120 | ItemStack next = Tools.button(Material.SIGN, "&6Next", Arrays.asList("&eNext page", "&cCurrent: &e"+page), 1); 121 | myInventory.setItem(53, next); 122 | } 123 | 124 | ItemStack back = Tools.button(Material.BARRIER, "&6Back", Arrays.asList(""), 1); 125 | myInventory.setItem(8, back); 126 | 127 | }); 128 | p.openInventory(myInventory); 129 | } 130 | 131 | @EventHandler 132 | public void onInventoryClickEvent(InventoryClickEvent e) { 133 | Player p = (Player) e.getWhoClicked(); 134 | 135 | Inventory inv = e.getClickedInventory(); 136 | ItemStack item = e.getCurrentItem(); 137 | if (inv != null && item != null) 138 | if (e.getView().getTitle().equals(ChatColor.AQUA+"LuckPerms group prefixs")) { 139 | e.setCancelled(true); 140 | if (item.hasItemMeta()) 141 | if (item.getItemMeta().hasDisplayName()) { 142 | 143 | String group = ChatColor.stripColor(inv.getItem(4).getItemMeta().getLore().get(0).split(" ")[2]); 144 | Group g = l.getGroupManager().getGroup(group); 145 | 146 | String name = ChatColor.stripColor(item.getItemMeta().getDisplayName()); 147 | if (name.equals("Next")) { 148 | int current = Integer.parseInt(ChatColor.stripColor(inv.getItem(53).getItemMeta().getLore().get(1).split(" ")[1])); 149 | open(p, g, current+1); 150 | } else if (name.equals("Back")) { 151 | EditGroup.open(p, g); 152 | } else if (!name.equals("Info")) { 153 | 154 | int id = Integer.parseInt(ChatColor.stripColor(item.getItemMeta().getLore().get(0).split(" ")[1])); 155 | 156 | int sk = 0; 157 | for (Node permission : g.getDistinctNodes()) { 158 | if (permission.getType() != NodeType.PREFIX) continue; 159 | if (sk == id) { 160 | PrefixNode prefix = ((PrefixNode) permission); 161 | 162 | String server = permission.getContexts().getAnyValue(DefaultContextKeys.SERVER_KEY).orElse("global"); 163 | String world = permission.getContexts().getAnyValue(DefaultContextKeys.WORLD_KEY).orElse("global"); 164 | 165 | if (permission.hasExpiry()) 166 | Tools.sendCommand(p, "lp group " + g.getName() + " meta removetempprefix " + prefix.getPriority() + " " + '"' + prefix.getMetaValue() + '"' + " " + server + " " + world); 167 | else 168 | Tools.sendCommand(p, "lp group " + g.getName() + " meta removeprefix " + prefix.getPriority() + " " + '"' + prefix.getMetaValue() + '"' + " " + server + " " + world); 169 | break; 170 | } 171 | sk++; 172 | } 173 | 174 | int current = 0; 175 | if (inv.getItem(53) != null) 176 | current = Integer.parseInt(ChatColor.stripColor(inv.getItem(53).getItemMeta().getLore().get(1).split(" ")[1])); 177 | 178 | int page = current; 179 | Bukkit.getScheduler().runTaskLater(LuckPermsGUI.getInstance(), () -> { 180 | open(p, g, page); 181 | }, 5); 182 | } 183 | } 184 | } 185 | } 186 | } 187 | -------------------------------------------------------------------------------- /src/main/java/com/bghddevelopment/LuckPemsGUI/groups/Suffix.java: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright (c) BGHDDevelopment. 3 | * Please refer to the plugin page or GitHub page for our open-source license. 4 | * If you have any questions please email ceo@bghddevelopment or reach us on Discord 5 | */ 6 | 7 | package com.bghddevelopment.LuckPemsGUI.groups; 8 | 9 | import java.util.Arrays; 10 | import java.util.HashMap; 11 | import java.util.Map; 12 | 13 | import net.luckperms.api.LuckPerms; 14 | import net.luckperms.api.LuckPermsProvider; 15 | import net.luckperms.api.context.DefaultContextKeys; 16 | import net.luckperms.api.model.group.Group; 17 | import net.luckperms.api.node.Node; 18 | import net.luckperms.api.node.NodeType; 19 | import net.luckperms.api.node.types.SuffixNode; 20 | import org.bukkit.Bukkit; 21 | import org.bukkit.ChatColor; 22 | import org.bukkit.Material; 23 | import org.bukkit.entity.Player; 24 | import org.bukkit.event.EventHandler; 25 | import org.bukkit.event.Listener; 26 | import org.bukkit.event.inventory.InventoryClickEvent; 27 | import org.bukkit.event.player.AsyncPlayerChatEvent; 28 | import org.bukkit.inventory.Inventory; 29 | import org.bukkit.inventory.ItemStack; 30 | import com.bghddevelopment.LuckPemsGUI.LuckPermsGUI; 31 | import com.bghddevelopment.LuckPemsGUI.util.Tools; 32 | 33 | public class Suffix implements Listener { 34 | 35 | public static Map addPrefix = new HashMap<>(); 36 | public static Map addTempPrefix = new HashMap<>(); 37 | 38 | @EventHandler 39 | public void onaddParent(AsyncPlayerChatEvent e) { 40 | if (!addPrefix.containsKey(e.getPlayer())) return; 41 | String message = e.getMessage(); 42 | Group g = addPrefix.get(e.getPlayer()); 43 | 44 | e.getPlayer().sendMessage("lp group "+g.getName()+" meta addsuffix "+message); 45 | Tools.sendCommand(e.getPlayer(), "lp group "+g.getName()+" meta addsuffix "+message); 46 | addPrefix.remove(e.getPlayer()); 47 | Bukkit.getScheduler().scheduleSyncDelayedTask(LuckPermsGUI.getInstance(), () -> { 48 | EditGroup.open(e.getPlayer(), g); 49 | }, 5); 50 | e.setCancelled(true); 51 | } 52 | 53 | @EventHandler 54 | public void onaddTempParent(AsyncPlayerChatEvent e) { 55 | if (!addTempPrefix.containsKey(e.getPlayer())) return; 56 | String message = e.getMessage(); 57 | Group g = addTempPrefix.get(e.getPlayer()); 58 | 59 | Tools.sendCommand(e.getPlayer(), "lp group "+g.getName()+" meta addtempsuffix "+message); 60 | addTempPrefix.remove(e.getPlayer()); 61 | Bukkit.getScheduler().scheduleSyncDelayedTask(LuckPermsGUI.getInstance(), () -> { 62 | EditGroup.open(e.getPlayer(), g); 63 | }, 5); 64 | e.setCancelled(true); 65 | } 66 | 67 | static LuckPerms l = LuckPermsProvider.get(); 68 | 69 | public static void open(Player p, Group group, int page) { 70 | Inventory myInventory = Bukkit.createInventory(null, 54, ChatColor.AQUA+"LuckPerms group suffixes"); 71 | Tools.onAsync(() -> { 72 | 73 | 74 | // ----------------------- INFO ------------------------------ 75 | int weight = group.getWeight().orElse(0); 76 | ItemStack info = Tools.button(Material.ARMOR_STAND, 77 | "&6Info", 78 | Arrays.asList( 79 | "&cGroup info: &e"+group.getName(), 80 | "&cDisplay name: &e"+group.getFriendlyName(), 81 | "&cWeight: &e"+weight, 82 | "&cCounts:", 83 | " &cNodes: &e"+group.getNodes().size(), 84 | " &cPermissions: &e"+group.getDistinctNodes().size(), 85 | " &cPrefixes: &e"+group.getCachedData().getMetaData().getPrefixes().size(), 86 | " &cSuffixes: &e"+group.getCachedData().getMetaData().getSuffixes().size()), 87 | 1); 88 | myInventory.setItem(4, info); 89 | // ----------------------- INFO ------------------------------ 90 | 91 | int sk = 0; 92 | int i = 9; 93 | 94 | int from = 45*page-1; 95 | int to = 45*(page+1)-1; 96 | for (Node permission : group.getDistinctNodes()) { 97 | if (permission.getType() != NodeType.SUFFIX) continue; 98 | if (from <= sk && sk < to) { 99 | SuffixNode suffix = ((SuffixNode) permission); 100 | String expiration = permission.hasExpiry() ? Tools.getTime(permission.getExpiry().toEpochMilli()) : "Never"; 101 | String server = permission.getContexts().getAnyValue(DefaultContextKeys.SERVER_KEY).orElse("global"); 102 | String world = permission.getContexts().getAnyValue(DefaultContextKeys.WORLD_KEY).orElse("global"); 103 | ItemStack item = Tools.button(Material.TNT, 104 | "&6"+suffix.getMetaValue(), 105 | Arrays.asList( 106 | "&cID: &e"+sk, 107 | "&cPosition: &e"+suffix.getPriority(), 108 | "&cExpires in: &e"+expiration, 109 | "&cValue: &e"+permission.getValue(), 110 | "&cServer: &e"+server, 111 | "&cWorld: &e"+world, 112 | "&eClick to remove" 113 | ), 1); 114 | myInventory.setItem(i, item); 115 | i++; 116 | } 117 | sk++; 118 | } 119 | 120 | if (to < sk) { 121 | ItemStack next = Tools.button(Material.SIGN, "&6Next", Arrays.asList("&eNext page", "&cCurrent: &e"+page), 1); 122 | myInventory.setItem(53, next); 123 | } 124 | 125 | ItemStack back = Tools.button(Material.BARRIER, "&6Back", Arrays.asList(""), 1); 126 | myInventory.setItem(8, back); 127 | 128 | }); 129 | p.openInventory(myInventory); 130 | } 131 | 132 | @EventHandler 133 | public void onInventoryClickEvent(InventoryClickEvent e) { 134 | Player p = (Player) e.getWhoClicked(); 135 | 136 | Inventory inv = e.getClickedInventory(); 137 | ItemStack item = e.getCurrentItem(); 138 | if (inv != null && item != null) 139 | if (e.getView().getTitle().equals(ChatColor.AQUA+"LuckPerms group suffixes")) { 140 | e.setCancelled(true); 141 | if (item.hasItemMeta()) 142 | if (item.getItemMeta().hasDisplayName()) { 143 | 144 | String group = ChatColor.stripColor(inv.getItem(4).getItemMeta().getLore().get(0).split(" ")[2]); 145 | Group g = l.getGroupManager().getGroup(group); 146 | 147 | String name = ChatColor.stripColor(item.getItemMeta().getDisplayName()); 148 | if (name.equals("Next")) { 149 | int current = Integer.parseInt(ChatColor.stripColor(inv.getItem(53).getItemMeta().getLore().get(1).split(" ")[1])); 150 | open(p, g, current+1); 151 | } else if (name.equals("Back")) { 152 | EditGroup.open(p, g); 153 | } else if (!name.equals("Info")) { 154 | 155 | int id = Integer.parseInt(ChatColor.stripColor(item.getItemMeta().getLore().get(0).split(" ")[1])); 156 | 157 | int sk = 0; 158 | for (Node permission : g.getDistinctNodes()) { 159 | if (permission.getType() != NodeType.SUFFIX) continue; 160 | if (sk == id) { 161 | SuffixNode suffix = ((SuffixNode) permission); 162 | 163 | String server = permission.getContexts().getAnyValue(DefaultContextKeys.SERVER_KEY).orElse("global"); 164 | String world = permission.getContexts().getAnyValue(DefaultContextKeys.WORLD_KEY).orElse("global"); 165 | 166 | if (permission.hasExpiry()) 167 | Tools.sendCommand(p, "lp group " + g.getName() + " meta removetempsuffix " + suffix.getPriority() + " " + '"' + suffix.getMetaValue() + '"' + " " + server + " " + world); 168 | else 169 | Tools.sendCommand(p, "lp group " + g.getName() + " meta removesuffix " + suffix.getPriority() + " " + '"' + suffix.getMetaValue() + '"' + " " + server + " " + world); 170 | break; 171 | } 172 | sk++; 173 | } 174 | 175 | int current = 0; 176 | if (inv.getItem(53) != null) 177 | current = Integer.parseInt(ChatColor.stripColor(inv.getItem(53).getItemMeta().getLore().get(1).split(" ")[1])); 178 | 179 | int page = current; 180 | Bukkit.getScheduler().runTaskLater(LuckPermsGUI.getInstance(), () -> { 181 | open(p, g, page); 182 | }, 5); 183 | } 184 | } 185 | } 186 | } 187 | } 188 | -------------------------------------------------------------------------------- /src/main/java/com/bghddevelopment/LuckPemsGUI/tracks/EditTrack.java: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright (c) BGHDDevelopment. 3 | * Please refer to the plugin page or GitHub page for our open-source license. 4 | * If you have any questions please email ceo@bghddevelopment or reach us on Discord 5 | */ 6 | 7 | package com.bghddevelopment.LuckPemsGUI.tracks; 8 | 9 | import java.util.Arrays; 10 | import java.util.HashMap; 11 | import java.util.Map; 12 | 13 | import com.bghddevelopment.LuckPemsGUI.LuckPermsGUI; 14 | import net.luckperms.api.LuckPerms; 15 | import net.luckperms.api.LuckPermsProvider; 16 | import net.luckperms.api.track.Track; 17 | import org.bukkit.Bukkit; 18 | import org.bukkit.ChatColor; 19 | import org.bukkit.Material; 20 | import org.bukkit.entity.Player; 21 | import org.bukkit.event.EventHandler; 22 | import org.bukkit.event.Listener; 23 | import org.bukkit.event.inventory.InventoryClickEvent; 24 | import org.bukkit.event.player.AsyncPlayerChatEvent; 25 | import org.bukkit.inventory.Inventory; 26 | import org.bukkit.inventory.ItemStack; 27 | import com.bghddevelopment.LuckPemsGUI.util.Tools; 28 | 29 | public class EditTrack implements Listener { 30 | 31 | public static Map addgroup = new HashMap<>(); 32 | public static Map insertgroup = new HashMap<>(); 33 | public static Map rename = new HashMap<>(); 34 | public static Map clone = new HashMap<>(); 35 | static LuckPerms l = LuckPermsProvider.get(); 36 | 37 | @EventHandler 38 | public void onGroupAdd(AsyncPlayerChatEvent e) { 39 | if (!addgroup.containsKey(e.getPlayer())) return; 40 | String message = e.getMessage(); 41 | Track g = addgroup.get(e.getPlayer()); 42 | 43 | Tools.sendCommand(e.getPlayer(), "lp track "+g.getName()+" append "+message); 44 | addgroup.remove(e.getPlayer()); 45 | Bukkit.getScheduler().scheduleSyncDelayedTask(LuckPermsGUI.getInstance(), () -> { 46 | open(e.getPlayer(), g); 47 | }, 5); 48 | e.setCancelled(true); 49 | } 50 | 51 | @EventHandler 52 | public void onGroupInsert(AsyncPlayerChatEvent e) { 53 | if (!insertgroup.containsKey(e.getPlayer())) return; 54 | String message = e.getMessage(); 55 | Track g = insertgroup.get(e.getPlayer()); 56 | 57 | Tools.sendCommand(e.getPlayer(), "lp track "+g.getName()+" insert "+message); 58 | insertgroup.remove(e.getPlayer()); 59 | Bukkit.getScheduler().scheduleSyncDelayedTask(LuckPermsGUI.getInstance(), () -> { 60 | open(e.getPlayer(), g); 61 | }, 5); 62 | e.setCancelled(true); 63 | } 64 | 65 | @EventHandler 66 | public void onRename(AsyncPlayerChatEvent e) { 67 | if (!rename.containsKey(e.getPlayer())) return; 68 | String message = e.getMessage(); 69 | Track g = rename.get(e.getPlayer()); 70 | 71 | Tools.sendCommand(e.getPlayer(), "lp track "+g.getName()+" rename "+message); 72 | rename.remove(e.getPlayer()); 73 | Bukkit.getScheduler().scheduleSyncDelayedTask(LuckPermsGUI.getInstance(), () -> { 74 | open(e.getPlayer(), g); 75 | }, 5); 76 | e.setCancelled(true); 77 | } 78 | 79 | @EventHandler 80 | public void onClone(AsyncPlayerChatEvent e) { 81 | if (!clone.containsKey(e.getPlayer())) return; 82 | String message = e.getMessage(); 83 | Track g = clone.get(e.getPlayer()); 84 | 85 | Tools.sendCommand(e.getPlayer(), "lp track "+g.getName()+" clone "+message); 86 | clone.remove(e.getPlayer()); 87 | Bukkit.getScheduler().scheduleSyncDelayedTask(LuckPermsGUI.getInstance(), () -> { 88 | open(e.getPlayer(), g); 89 | }, 5); 90 | e.setCancelled(true); 91 | } 92 | 93 | public static void open(Player p, Track group) { 94 | Inventory myInventory = Bukkit.createInventory(null, 54, ChatColor.AQUA+"LuckPerms track"); 95 | Tools.onAsync(() -> { 96 | 97 | ItemStack info = Tools.button(Material.ARMOR_STAND, 98 | "&6Info", 99 | Arrays.asList( 100 | "&cName: &e"+group.getName(), 101 | "&cAll groups: &e"+group.getGroups().size()), 102 | 1); 103 | myInventory.setItem(4, info); 104 | // ----------------------- INFO ------------------------------ 105 | 106 | // ----------------------- PERMISSION ------------------------------ 107 | ItemStack addnewgroup = Tools.button(Material.TORCH, "&6Add group", Arrays.asList("&eClick here to add a group"), 1); 108 | myInventory.setItem(0, addnewgroup); 109 | 110 | ItemStack insertgroup = Tools.button(Material.ARROW, "&6Insert group", Arrays.asList("&eClick to insert a group"), 1); 111 | myInventory.setItem(1, insertgroup); 112 | 113 | ItemStack clear = Tools.button(Material.REDSTONE_BLOCK, "&cClear", Arrays.asList("&eRemove all groups"), 1); 114 | myInventory.setItem(2, clear); 115 | 116 | ItemStack delete = Tools.button(Material.REDSTONE, "&cDelete", Arrays.asList("&eClick to delete the track"), 1); 117 | myInventory.setItem(5, delete); 118 | 119 | ItemStack rename = Tools.button(Material.NAME_TAG, "&6Rename", Arrays.asList("&eClick to rename the track"), 1); 120 | myInventory.setItem(6, rename); 121 | 122 | ItemStack clone = Tools.button(Material.PAPER, "&6Clone", Arrays.asList("&eClick to clone the track"), 1); 123 | myInventory.setItem(7, clone); 124 | // ----------------------- PERMISSION ------------------------------ 125 | 126 | ItemStack back = Tools.button(Material.BARRIER, "&6Back", Arrays.asList(""), 1); 127 | myInventory.setItem(8, back); 128 | 129 | 130 | int sk = 9; 131 | for (String g : group.getGroups()) { 132 | ItemStack item = Tools.button(Material.TNT, "&6"+g, Arrays.asList("&cClick to remove"), 1); 133 | myInventory.setItem(sk, item); 134 | sk++; 135 | } 136 | }); 137 | p.openInventory(myInventory); 138 | } 139 | 140 | @EventHandler 141 | public void onInventoryClickEvent(InventoryClickEvent e) { 142 | Player p = (Player) e.getWhoClicked(); 143 | 144 | Inventory inv = e.getClickedInventory(); 145 | ItemStack item = e.getCurrentItem(); 146 | if (inv != null && item != null) 147 | if (e.getView().getTitle().equals(ChatColor.AQUA+"LuckPerms track")) { 148 | e.setCancelled(true); 149 | if (item.hasItemMeta()) 150 | if (item.getItemMeta().hasDisplayName()) { 151 | 152 | String group = ChatColor.stripColor(inv.getItem(4).getItemMeta().getLore().get(0).split(" ")[1]); 153 | Track g = l.getTrackManager().getTrack(group); 154 | 155 | String name = ChatColor.stripColor(item.getItemMeta().getDisplayName()); 156 | if (name.equals("Back")) { 157 | TracksGUI.open(p); 158 | } else if (name.equals("Add group")) { 159 | Tools.sendMessage(p, "&eWrite in chat:"); 160 | Tools.sendMessage(p, "&8<&7Group&8>"); 161 | Tools.sendMessage(p, "&aGroup - The group you want to add"); 162 | addgroup.put(p, g); 163 | p.closeInventory(); 164 | } else if (name.equals("Insert group")) { 165 | Tools.sendMessage(p, "&eWrite in chat:"); 166 | Tools.sendMessage(p, "&8<&7Group&8> &8<&7Position&8>"); 167 | Tools.sendMessage(p, "&aGroup - The group you want to add"); 168 | Tools.sendMessage(p, "&aPosition - The position to insert the group at"); 169 | insertgroup.put(p, g); 170 | p.closeInventory(); 171 | } else if (name.equals("Clear")) { 172 | g.clearGroups(); 173 | open(p, g); 174 | } else if (name.equals("Delete")) { 175 | Tools.sendCommand(p, "lp deletetrack "+g.getName()); 176 | Bukkit.getScheduler().runTaskLater(LuckPermsGUI.getInstance(), () -> { 177 | TracksGUI.open(p); 178 | }, 5); 179 | } else if (name.equals("Rename")) { 180 | Tools.sendMessage(p, "&eWrite in chat:"); 181 | Tools.sendMessage(p, "&8<&7Name&8>"); 182 | Tools.sendMessage(p, "&aName - The new name of the track"); 183 | rename.put(p, g); 184 | p.closeInventory(); 185 | } else if (name.equals("Clone")) { 186 | Tools.sendMessage(p, "&eWrite in chat:"); 187 | Tools.sendMessage(p, "&8<&7Name&8>"); 188 | Tools.sendMessage(p, "&aName - The name of the new track"); 189 | clone.put(p, g); 190 | p.closeInventory(); 191 | } else if (item.getType().equals(Material.TNT)) { 192 | Tools.sendCommand(p, "lp track "+g.getName()+" remove "+ChatColor.stripColor(item.getItemMeta().getDisplayName())); 193 | Bukkit.getScheduler().runTaskLater(LuckPermsGUI.getInstance(), () -> { 194 | open(p, g); 195 | }, 5); 196 | } 197 | } 198 | } 199 | } 200 | } 201 | -------------------------------------------------------------------------------- /src/main/java/com/bghddevelopment/LuckPemsGUI/tracks/TracksGUI.java: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright (c) BGHDDevelopment. 3 | * Please refer to the plugin page or GitHub page for our open-source license. 4 | * If you have any questions please email ceo@bghddevelopment or reach us on Discord 5 | */ 6 | 7 | package com.bghddevelopment.LuckPemsGUI.tracks; 8 | 9 | import java.util.ArrayList; 10 | import java.util.Arrays; 11 | import java.util.List; 12 | 13 | import com.bghddevelopment.LuckPemsGUI.LuckPermsGUI; 14 | import com.bghddevelopment.LuckPemsGUI.util.OpenGUI; 15 | import net.luckperms.api.LuckPerms; 16 | import net.luckperms.api.LuckPermsProvider; 17 | import net.luckperms.api.track.Track; 18 | import org.bukkit.Bukkit; 19 | import org.bukkit.ChatColor; 20 | import org.bukkit.Material; 21 | import org.bukkit.entity.Player; 22 | import org.bukkit.event.EventHandler; 23 | import org.bukkit.event.Listener; 24 | import org.bukkit.event.inventory.InventoryClickEvent; 25 | import org.bukkit.event.player.AsyncPlayerChatEvent; 26 | import org.bukkit.inventory.Inventory; 27 | import org.bukkit.inventory.ItemStack; 28 | import com.bghddevelopment.LuckPemsGUI.util.Tools; 29 | 30 | public class TracksGUI implements Listener { 31 | 32 | List newGroup = new ArrayList<>(); 33 | 34 | @EventHandler 35 | public void onGroupAdd(AsyncPlayerChatEvent e) { 36 | if (!newGroup.contains(e.getPlayer())) return; 37 | String message = e.getMessage(); 38 | 39 | Tools.sendCommand(e.getPlayer(), "lp createtrack "+message); 40 | newGroup.remove(e.getPlayer()); 41 | Bukkit.getScheduler().scheduleSyncDelayedTask(LuckPermsGUI.getInstance(), () -> { 42 | open(e.getPlayer()); 43 | }, 5); 44 | e.setCancelled(true); 45 | } 46 | 47 | static LuckPerms l = LuckPermsProvider.get(); 48 | 49 | public static void open(Player p) { 50 | Inventory myInventory = Bukkit.createInventory(null, 54, ChatColor.AQUA+"LuckPerms tracks"); 51 | Tools.onAsync(() -> { 52 | 53 | int sk = 9; 54 | for (Track group : l.getTrackManager().getLoadedTracks()) { 55 | String name = group.getName(); 56 | ItemStack item = Tools.button(Material.TNT, "&6"+name, Arrays.asList("&ePress to edit this track"), 1); 57 | myInventory.setItem(sk, item); 58 | sk++; 59 | } 60 | 61 | ItemStack back = Tools.button(Material.BARRIER, "&6Back", Arrays.asList(""), 1); 62 | myInventory.setItem(8, back); 63 | 64 | ItemStack newGroup = Tools.button(Material.PAPER, "&6New track", Arrays.asList("&eCreate new track"), 1); 65 | myInventory.setItem(0, newGroup); 66 | 67 | }); 68 | p.openInventory(myInventory); 69 | } 70 | 71 | @EventHandler 72 | public void onInventoryClickEvent(InventoryClickEvent e) { 73 | Player p = (Player) e.getWhoClicked(); 74 | 75 | Inventory inv = e.getClickedInventory(); 76 | ItemStack item = e.getCurrentItem(); 77 | if (inv != null && item != null) 78 | if (e.getView().getTitle().equals(ChatColor.AQUA+"LuckPerms tracks")) { 79 | e.setCancelled(true); 80 | if (item.hasItemMeta()) 81 | if (item.getItemMeta().hasDisplayName()) { 82 | String group = ChatColor.stripColor(item.getItemMeta().getDisplayName()); 83 | if (group.equals("Back")) { 84 | OpenGUI.openGUI(p); 85 | } else if (group.equals("New track")) { 86 | Tools.sendMessage(p, "&eWrite in chat:"); 87 | Tools.sendMessage(p, "&8<&7Name&8>"); 88 | Tools.sendMessage(p, "&aName - Track name"); 89 | newGroup.add(p); 90 | p.closeInventory(); 91 | } else EditTrack.open(p, l.getTrackManager().getTrack(group)); 92 | } 93 | } 94 | } 95 | } 96 | -------------------------------------------------------------------------------- /src/main/java/com/bghddevelopment/LuckPemsGUI/users/EditUser.java: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright (c) BGHDDevelopment. 3 | * Please refer to the plugin page or GitHub page for our open-source license. 4 | * If you have any questions please email ceo@bghddevelopment or reach us on Discord 5 | */ 6 | 7 | package com.bghddevelopment.LuckPemsGUI.users; 8 | 9 | import java.util.Arrays; 10 | import java.util.HashMap; 11 | import java.util.Map; 12 | import java.util.UUID; 13 | import java.util.concurrent.ExecutionException; 14 | 15 | import com.bghddevelopment.LuckPemsGUI.LuckPermsGUI; 16 | import com.bghddevelopment.LuckPemsGUI.util.Tools; 17 | import net.luckperms.api.LuckPerms; 18 | import net.luckperms.api.LuckPermsProvider; 19 | import net.luckperms.api.model.user.User; 20 | import net.luckperms.api.track.Track; 21 | import org.bukkit.Bukkit; 22 | import org.bukkit.ChatColor; 23 | import org.bukkit.Material; 24 | import org.bukkit.entity.Player; 25 | import org.bukkit.event.EventHandler; 26 | import org.bukkit.event.Listener; 27 | import org.bukkit.event.inventory.InventoryClickEvent; 28 | import org.bukkit.event.player.AsyncPlayerChatEvent; 29 | import org.bukkit.inventory.Inventory; 30 | import org.bukkit.inventory.ItemStack; 31 | 32 | public class EditUser implements Listener { 33 | 34 | public static Map primarygroup = new HashMap<>(); 35 | public static Map clone = new HashMap<>(); 36 | public static Map promote = new HashMap<>(); 37 | public static Map demote = new HashMap<>(); 38 | static LuckPerms l = LuckPermsProvider.get(); 39 | 40 | 41 | @EventHandler 42 | public void onswitchPrimaryGroup(AsyncPlayerChatEvent e) { 43 | if (!primarygroup.containsKey(e.getPlayer())) return; 44 | String message = e.getMessage(); 45 | User g = primarygroup.get(e.getPlayer()); 46 | 47 | Tools.sendCommand(e.getPlayer(), "lp user "+g.getUsername()+" parent set "+message); 48 | primarygroup.remove(e.getPlayer()); 49 | Bukkit.getScheduler().scheduleSyncDelayedTask(LuckPermsGUI.getInstance(), () -> { 50 | open(e.getPlayer(), g); 51 | }, 5); 52 | e.setCancelled(true); 53 | } 54 | 55 | @EventHandler 56 | public void onClone(AsyncPlayerChatEvent e) { 57 | if (!clone.containsKey(e.getPlayer())) return; 58 | String message = e.getMessage(); 59 | User g = clone.get(e.getPlayer()); 60 | 61 | Tools.sendCommand(e.getPlayer(), "lp user "+g.getUsername()+" clone "+message); 62 | clone.remove(e.getPlayer()); 63 | 64 | Bukkit.getScheduler().scheduleSyncDelayedTask(LuckPermsGUI.getInstance(), () -> { 65 | open(e.getPlayer(), l.getUserManager().getUser(message)); 66 | }, 5); 67 | e.setCancelled(true); 68 | } 69 | 70 | @EventHandler 71 | public void onPromote(AsyncPlayerChatEvent e) { 72 | if (!promote.containsKey(e.getPlayer())) return; 73 | String message = e.getMessage(); 74 | User g = promote.get(e.getPlayer()); 75 | 76 | Tools.sendCommand(e.getPlayer(), "lp user "+g.getUsername()+" promote "+message); 77 | promote.remove(e.getPlayer()); 78 | 79 | Bukkit.getScheduler().scheduleSyncDelayedTask(LuckPermsGUI.getInstance(), () -> { 80 | open(e.getPlayer(), g); 81 | }, 5); 82 | e.setCancelled(true); 83 | } 84 | 85 | 86 | @EventHandler 87 | public void onDemote(AsyncPlayerChatEvent e) { 88 | if (!demote.containsKey(e.getPlayer())) return; 89 | String message = e.getMessage(); 90 | User g = demote.get(e.getPlayer()); 91 | 92 | Tools.sendCommand(e.getPlayer(), "lp user "+g.getUsername()+" demote "+message); 93 | demote.remove(e.getPlayer()); 94 | 95 | Bukkit.getScheduler().scheduleSyncDelayedTask(LuckPermsGUI.getInstance(), () -> { 96 | open(e.getPlayer(), g); 97 | }, 5); 98 | e.setCancelled(true); 99 | } 100 | 101 | public static void open(Player p, User user) { 102 | Inventory myInventory = Bukkit.createInventory(null, 54, ChatColor.AQUA +"LuckPerms user"); 103 | Tools.onAsync(() -> { 104 | // ----------------------- INFO ------------------------------ 105 | ItemStack info = Tools.button(Material.ARMOR_STAND, 106 | "&6Info", 107 | Arrays.asList( 108 | "&cName: &e"+user.getUsername(), 109 | "&cUUID: &e"+user.getUniqueId(), 110 | "&cGroup: &e"+user.getPrimaryGroup(), 111 | "&cCounts:", 112 | "&c Nodes: &e"+user.getNodes().size(), 113 | "&c Permissions: &e"+user.getDistinctNodes().size(), 114 | "&c Prefixes: &e"+user.getCachedData().getMetaData().getPrefixes().size(), 115 | "&c Suffixes: &e"+user.getCachedData().getMetaData().getSuffixes().size(), 116 | "&cCached data:", 117 | "&c Current prefix: &e"+user.getCachedData().getMetaData().getPrefix(), 118 | "&c Current suffix: &e"+user.getCachedData().getMetaData().getSuffix() 119 | ), 120 | 1); 121 | myInventory.setItem(4, info); 122 | // ----------------------- INFO ------------------------------ 123 | 124 | 125 | // ----------------------- PERMISSION ------------------------------ 126 | ItemStack perm = Tools.button(Material.SIGN, "&6Permissions", Arrays.asList("&e----------->", 127 | "&aDescription:", 128 | "&2 Permission nodes are a method of defining", 129 | "&2 the access each player has on a server,", 130 | "&2 in the form of a name and a true/false state."), 1); 131 | ItemStack pall = Tools.button(Material.CHEST, "&6All permissions", Arrays.asList("&eClick here to see all permissions"), 1); 132 | ItemStack pset = Tools.button(Material.ARROW, "&6Add permission", Arrays.asList("&eClick to add new permission"), 1); 133 | ItemStack psettemp = Tools.button(Material.ARROW, "&6Add temp permission", Arrays.asList("&eClick to add new temporary permission"), 1); 134 | ItemStack pcheck = Tools.button(Material.TORCH, "&6Check if user has permission", Arrays.asList("&eClick to check if user has permission"), 1); 135 | myInventory.setItem(9, perm); 136 | myInventory.setItem(10, pall); 137 | myInventory.setItem(11, pset); 138 | myInventory.setItem(12, psettemp); 139 | myInventory.setItem(13, pcheck); 140 | // ----------------------- PERMISSION ------------------------------ 141 | 142 | 143 | // ----------------------- PARENT ------------------------------ 144 | ItemStack parent = Tools.button(Material.SIGN, "&6Parent", Arrays.asList("&e----------->", 145 | "&aDescription:", 146 | "&2 Parent is a group. Groups has all", 147 | "&2 permissions of its parent. For example:", 148 | "&2 Group with parent 'default' will have all", 149 | "&2 default group permissions."), 1); 150 | ItemStack parentall = Tools.button(Material.CHEST, "&6All parents", Arrays.asList("&eClick here to see all parents"), 1); 151 | ItemStack parentadd = Tools.button(Material.ARROW, "&6Add parent", Arrays.asList("&eClick here to add parent"), 1); 152 | ItemStack parenttempadd = Tools.button(Material.ARROW, "&6Add temp parent", Arrays.asList("&eClick here to add temporary parent"), 1); 153 | myInventory.setItem(18, parent); 154 | myInventory.setItem(19, parentall); 155 | myInventory.setItem(20, parentadd); 156 | myInventory.setItem(21, parenttempadd); 157 | // ----------------------- PARENT ------------------------------ 158 | 159 | 160 | // ----------------------- META ------------------------------ 161 | ItemStack meta = Tools.button(Material.SIGN, "&6Meta", Arrays.asList("&e----------->", 162 | "&aPrefix Description:", 163 | "&2 Prefix is text that goes", 164 | "&2 before the nick.", 165 | "&aSuffix Description:", 166 | "&2 Suffix is text that goes", 167 | "&2 after the nick."), 1); 168 | ItemStack metaallprefix = Tools.button(Material.CHEST, "&6All prefixes", Arrays.asList("&eClick here to see all prefixes"), 1); 169 | ItemStack metaallsuffix = Tools.button(Material.CHEST, "&6All suffixes", Arrays.asList("&eClick here to see all suffixes"), 1); 170 | ItemStack metaaddprefix = Tools.button(Material.ARROW, "&6Add prefix", Arrays.asList("&eClick here to add prefix"), 1); 171 | ItemStack metaaddsuffix = Tools.button(Material.ARROW, "&6Add suffix", Arrays.asList("&eClick here to add suffix"), 1); 172 | ItemStack metaaddtempprefix = Tools.button(Material.ARROW, "&6Add temp prefix", Arrays.asList("&eClick here to add temporary prefix"), 1); 173 | ItemStack metaaddtempsuffix = Tools.button(Material.ARROW, "&6Add temp suffix", Arrays.asList("&eClick here to add temporary suffix"), 1); 174 | myInventory.setItem(27, meta); 175 | myInventory.setItem(28, metaallprefix); 176 | myInventory.setItem(29, metaallsuffix); 177 | myInventory.setItem(30, metaaddprefix); 178 | myInventory.setItem(31, metaaddsuffix); 179 | myInventory.setItem(32, metaaddtempprefix); 180 | myInventory.setItem(33, metaaddtempsuffix); 181 | // ----------------------- META ------------------------------ 182 | 183 | // ----------------------- PREFIX/SUFFIX ------------------------------ 184 | ItemStack meta2 = Tools.button(Material.SIGN, "&6Meta", Arrays.asList("&e----------->", 185 | "&aMeta Description:", 186 | "&2 You can set custom keys", 187 | "&2 and values"), 1); 188 | ItemStack metaKeys = Tools.button(Material.CHEST, "&6All keys", Arrays.asList("&eClick here to see all meta keys"), 1); 189 | ItemStack addKey = Tools.button(Material.ARROW, "&6Add key", Arrays.asList("&eClick here to add meta key"), 1); 190 | ItemStack addTempKey = Tools.button(Material.ARROW, "&6Add temp key", Arrays.asList("&eClick here to add temp meta key"), 1); 191 | myInventory.setItem(36, meta2); 192 | myInventory.setItem(37, metaKeys); 193 | myInventory.setItem(38, addKey); 194 | myInventory.setItem(39, addTempKey); 195 | // ----------------------- PREFIX/SUFFIX ------------------------------ 196 | 197 | // ----------------------- GENERAL ------------------------------ 198 | ItemStack general = Tools.button(Material.SIGN, "&6General", Arrays.asList("&e----------->"), 1); 199 | ItemStack primarygroup = Tools.button(Material.DIAMOND_BLOCK, "&6Change primary group", Arrays.asList("&eClick to set primary group", "&cCurrent: &e"+user.getPrimaryGroup()), 1); 200 | ItemStack clone = Tools.button(Material.PAPER, "&6Clone", Arrays.asList("&eClick to clone"), 1); 201 | ItemStack promote = Tools.button(Material.ARROW, "&6Promote", Arrays.asList("&eClick to promote"), 1); 202 | ItemStack demote = Tools.button(Material.TRIPWIRE_HOOK, "&6Demote", Arrays.asList("&eClick to demote"), 1); 203 | myInventory.setItem(45, general); 204 | myInventory.setItem(46, primarygroup); 205 | myInventory.setItem(47, clone); 206 | myInventory.setItem(48, promote); 207 | myInventory.setItem(49, demote); 208 | // ----------------------- GENERAL ------------------------------ 209 | 210 | ItemStack back = Tools.button(Material.BARRIER, "&6Back", Arrays.asList(""), 1); 211 | myInventory.setItem(8, back); 212 | 213 | }); 214 | p.openInventory(myInventory); 215 | } 216 | 217 | public static void openTracks(Player p, User user, String type) { 218 | Inventory myInventory = Bukkit.createInventory(null, 54, ChatColor.AQUA + "Select " + type + " " + user.getUsername()); //+type+" "+user.getName()+" track"); 219 | Tools.onAsync(() -> { 220 | ItemStack back = Tools.button(Material.BARRIER, "&6Back", Arrays.asList(""), 1); 221 | myInventory.setItem(8, back); 222 | 223 | int i = 9; 224 | for (Track track : l.getTrackManager().getLoadedTracks()) { 225 | 226 | ItemStack item = Tools.button(Material.TNT, 227 | "&6"+track.getName(), 228 | Arrays.asList( 229 | "&cGroups: &e"+track.getGroups().size() 230 | ), 1); 231 | myInventory.setItem(i, item); 232 | 233 | i++; 234 | } 235 | }); 236 | p.openInventory(myInventory); 237 | } 238 | 239 | @EventHandler 240 | public void onInventoryPromoteClickEvent(InventoryClickEvent e) { 241 | Player p = (Player) e.getWhoClicked(); 242 | 243 | Inventory inv = e.getClickedInventory(); 244 | ItemStack item = e.getCurrentItem(); 245 | if (inv != null && item != null) 246 | if (e.getView().getTitle().contains(ChatColor.AQUA + "Select")) { 247 | e.setCancelled(true); 248 | if (item.hasItemMeta() && item.getItemMeta().hasDisplayName()) { 249 | String group = ChatColor.stripColor(e.getView().getTitle().split(" ")[2]); //default 2 250 | User g = l.getUserManager().getUser(group); 251 | String name = ChatColor.stripColor(item.getItemMeta().getDisplayName()); 252 | if (name.equals("Back")) { 253 | UsersGUI.open(p); 254 | } else { 255 | String type = e.getView().getTitle().split(" ")[1]; 256 | if (type.equalsIgnoreCase("promote")) { 257 | Tools.sendCommand(p, "lp user "+g.getUsername()+" promote "+name); 258 | } else if (type.equalsIgnoreCase("demote")) { 259 | Tools.sendCommand(p, "lp user "+g.getUsername()+" demote "+name); 260 | } 261 | } 262 | } 263 | } 264 | } 265 | 266 | 267 | @EventHandler 268 | public void onInventoryClickEvent(InventoryClickEvent e) { 269 | Player p = (Player) e.getWhoClicked(); 270 | 271 | Inventory inv = e.getClickedInventory(); 272 | ItemStack item = e.getCurrentItem(); 273 | if (inv != null && item != null) 274 | if (e.getView().getTitle().equals(ChatColor.AQUA+"LuckPerms user")) { 275 | e.setCancelled(true); 276 | if (item.hasItemMeta()) 277 | if (item.getItemMeta().hasDisplayName()) { 278 | 279 | String group = ChatColor.stripColor(inv.getItem(4).getItemMeta().getLore().get(0).split(" ")[1]); 280 | User g = l.getUserManager().getUser(group); 281 | 282 | String name = ChatColor.stripColor(item.getItemMeta().getDisplayName()); 283 | if (name.equals("Back")) { 284 | UsersGUI.open(p); 285 | } else if (name.equals("All permissions")) { 286 | Permissions.open(p, g, 0); 287 | } else if (name.equals("Add permission")) { 288 | Tools.sendMessage(p, "&eWrite in chat:"); 289 | Tools.sendMessage(p, "&8<&7Permission&8> [&7Value&8] [&7Server&8] [&7World&8]"); 290 | Tools.sendMessage(p, "&aPermission - Your permission"); 291 | Tools.sendMessage(p, "&aValue - true/false"); 292 | Tools.sendMessage(p, "&aServer - server that permission will work"); 293 | Tools.sendMessage(p, " &2Leave blank or 'global' for global"); 294 | Tools.sendMessage(p, "&aWorld - world that permission will work"); 295 | Tools.sendMessage(p, " &2Leave blank or 'global' for global"); 296 | Permissions.addPermission.put(p, g); 297 | p.closeInventory(); 298 | } else if (name.equals("Add temp permission")) { 299 | Tools.sendMessage(p, "&eWrite in chat:"); 300 | Tools.sendMessage(p, "&8<&7Permission&8> [&7Value&8] <&7Duration&8> [&7Server&8] [&7World&8]"); 301 | Tools.sendMessage(p, "&aPermission - Your permission"); 302 | Tools.sendMessage(p, "&aValue - true/false"); 303 | Tools.sendMessage(p, "&aDuration - time "); 304 | Tools.sendMessage(p, "&aServer - server that permission will work"); 305 | Tools.sendMessage(p, " &2Leave blank or 'global' for global"); 306 | Tools.sendMessage(p, "&aWorld - world that permission will work"); 307 | Tools.sendMessage(p, " &2Leave blank or 'global' for global"); 308 | Permissions.addTempPermission.put(p, g); 309 | p.closeInventory(); 310 | } else if (name.equals("Check if user has permission")) { 311 | Tools.sendMessage(p, "&eWrite in chat:"); 312 | Tools.sendMessage(p, "&8<&7Permission&8> [&7Server&8] [&7World&8]"); 313 | Tools.sendMessage(p, "&aPermission - Your permission"); 314 | Tools.sendMessage(p, "&aServer - server that permission will work"); 315 | Tools.sendMessage(p, " &2Leave blank or 'global' for global"); 316 | Tools.sendMessage(p, "&aWorld - world that permission will work"); 317 | Tools.sendMessage(p, " &2Leave blank or 'global' for global"); 318 | Permissions.checkIfHas.put(p, g); 319 | p.closeInventory(); 320 | } 321 | 322 | else if (name.equals("All parents")) { 323 | Parents.open(p, g, 0); 324 | } else if (name.equals("Add parent")) { 325 | Tools.sendMessage(p, "&eWrite in chat:"); 326 | Tools.sendMessage(p, "&8<&7Parent&8> [&7Server&8] [&7World&8]"); 327 | Tools.sendMessage(p, "&aParent - parent group"); 328 | Tools.sendMessage(p, "&aServer - server that permission will work"); 329 | Tools.sendMessage(p, " &2Leave blank or 'global' for global"); 330 | Tools.sendMessage(p, "&aWorld - world that permission will work"); 331 | Tools.sendMessage(p, " &2Leave blank or 'global' for global"); 332 | Parents.addParent.put(p, g); 333 | p.closeInventory(); 334 | } else if (name.equals("Add temp parent")) { 335 | Tools.sendMessage(p, "&eWrite in chat:"); 336 | Tools.sendMessage(p, "&8<&7Parent&8> <&7Duration&8> [&7Server&8] [&7World&8]"); 337 | Tools.sendMessage(p, "&aParent - parent group"); 338 | Tools.sendMessage(p, "&aDuration - time "); 339 | Tools.sendMessage(p, "&aServer - server that permission will work"); 340 | Tools.sendMessage(p, " &2Leave blank or 'global' for global"); 341 | Tools.sendMessage(p, "&aWorld - world that permission will work"); 342 | Tools.sendMessage(p, " &2Leave blank or 'global' for global"); 343 | Parents.addTempParent.put(p, g); 344 | p.closeInventory(); 345 | } 346 | 347 | else if (name.equals("All prefixes")) { 348 | Prefix.open(p, g, 0); 349 | } else if (name.equals("Add prefix")) { 350 | Tools.sendMessage(p, "&eWrite in chat:"); 351 | Tools.sendMessage(p, "&8<&7Priority&8> \"<&7Prefix&8>\" [&7Server&8] [&7World&8]"); 352 | Tools.sendMessage(p, "&aPriority - prefix priority"); 353 | Tools.sendMessage(p, "&aPrefix - own prefix"); 354 | Tools.sendMessage(p, "&aServer - server that permission will work"); 355 | Tools.sendMessage(p, " &2Leave blank or 'global' for global"); 356 | Tools.sendMessage(p, "&aWorld - world that permission will work"); 357 | Tools.sendMessage(p, " &2Leave blank or 'global' for global"); 358 | Prefix.addPrefix.put(p, g); 359 | p.closeInventory(); 360 | } else if (name.equals("Add temp prefix")) { 361 | Tools.sendMessage(p, "&eWrite in chat:"); 362 | Tools.sendMessage(p, "&8<&7Priority&8> \"<&7Prefix&8>\" <&7Duration&8> [&7Server&8] [&7World&8]"); 363 | Tools.sendMessage(p, "&aPriority - prefix priority"); 364 | Tools.sendMessage(p, "&aPrefix - own prefix"); 365 | Tools.sendMessage(p, "&aDuration - time "); 366 | Tools.sendMessage(p, "&aServer - server that permission will work"); 367 | Tools.sendMessage(p, " &2Leave blank or 'global' for global"); 368 | Tools.sendMessage(p, "&aWorld - world that permission will work"); 369 | Tools.sendMessage(p, " &2Leave blank or 'global' for global"); 370 | Prefix.addTempPrefix.put(p, g); 371 | p.closeInventory(); 372 | } 373 | 374 | else if (name.equals("All suffixes")) { 375 | Suffix.open(p, g, 0); 376 | } else if (name.equals("Add suffix")) { 377 | Tools.sendMessage(p, "&eWrite in chat:"); 378 | Tools.sendMessage(p, "&8<&7Priority&8> \"<&7Suffix&8>\" [&7Server&8] [&7World&8]"); 379 | Tools.sendMessage(p, "&aPriority - suffix priority"); 380 | Tools.sendMessage(p, "&aSuffix - own suffix"); 381 | Tools.sendMessage(p, "&aServer - server that permission will work"); 382 | Tools.sendMessage(p, " &2Leave blank or 'global' for global"); 383 | Tools.sendMessage(p, "&aWorld - world that permission will work"); 384 | Tools.sendMessage(p, " &2Leave blank or 'global' for global"); 385 | Suffix.addPrefix.put(p, g); 386 | p.closeInventory(); 387 | } else if (name.equals("Add temp suffix")) { 388 | Tools.sendMessage(p, "&eWrite in chat:"); 389 | Tools.sendMessage(p, "&8<&7Priority&8> \"<&7Suffix&8>\" <&7Duration&8> [&7Server&8] [&7World&8]"); 390 | Tools.sendMessage(p, "&aPriority - suffix priority"); 391 | Tools.sendMessage(p, "&aSuffix - own suffix"); 392 | Tools.sendMessage(p, "&aDuration - time "); 393 | Tools.sendMessage(p, "&aServer - server that permission will work"); 394 | Tools.sendMessage(p, " &2Leave blank or 'global' for global"); 395 | Tools.sendMessage(p, "&aWorld - world that permission will work"); 396 | Tools.sendMessage(p, " &2Leave blank or 'global' for global"); 397 | Suffix.addTempPrefix.put(p, g); 398 | p.closeInventory(); 399 | } 400 | 401 | 402 | else if (name.equals("Change primary group")) { 403 | Tools.sendMessage(p, "&eWrite in chat:"); 404 | Tools.sendMessage(p, "&8<&7Group&8>"); 405 | Tools.sendMessage(p, "&aGroup - the group to set as primary"); 406 | primarygroup.put(p, g); 407 | p.closeInventory(); 408 | } else if (name.equals("Clone")) { 409 | Tools.sendMessage(p, "&eWrite in chat:"); 410 | Tools.sendMessage(p, "&8<&7Name&8>"); 411 | Tools.sendMessage(p, "&aName - user name/UUID to clone onto"); 412 | clone.put(p, g); 413 | p.closeInventory(); 414 | } else if (name.equals("Promote")) { 415 | openTracks(p, g, "Promote"); 416 | } else if (name.equals("Demote")) { 417 | openTracks(p, g, "Demote"); 418 | } 419 | } 420 | } 421 | } 422 | 423 | @SuppressWarnings("deprecation") 424 | public static void open(Player player, String message) { 425 | if (!Tools.isOnline(message)) { 426 | UUID uuid = Bukkit.getOfflinePlayer(message).getUniqueId(); 427 | try { 428 | open(player, l.getUserManager().loadUser(uuid).get()); 429 | } catch (InterruptedException | ExecutionException e) { 430 | // TODO Auto-generated catch block 431 | e.printStackTrace(); 432 | } 433 | } else 434 | open(player, l.getUserManager().getUser(message)); 435 | } 436 | 437 | } 438 | -------------------------------------------------------------------------------- /src/main/java/com/bghddevelopment/LuckPemsGUI/users/Parents.java: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright (c) BGHDDevelopment. 3 | * Please refer to the plugin page or GitHub page for our open-source license. 4 | * If you have any questions please email ceo@bghddevelopment or reach us on Discord 5 | */ 6 | 7 | package com.bghddevelopment.LuckPemsGUI.users; 8 | 9 | import java.util.Arrays; 10 | import java.util.HashMap; 11 | import java.util.Map; 12 | 13 | import com.bghddevelopment.LuckPemsGUI.LuckPermsGUI; 14 | import com.bghddevelopment.LuckPemsGUI.util.Tools; 15 | import net.luckperms.api.LuckPerms; 16 | import net.luckperms.api.LuckPermsProvider; 17 | import net.luckperms.api.context.DefaultContextKeys; 18 | import net.luckperms.api.model.user.User; 19 | import net.luckperms.api.node.Node; 20 | import net.luckperms.api.node.NodeType; 21 | import net.luckperms.api.node.types.InheritanceNode; 22 | import org.bukkit.Bukkit; 23 | import org.bukkit.ChatColor; 24 | import org.bukkit.Material; 25 | import org.bukkit.entity.Player; 26 | import org.bukkit.event.EventHandler; 27 | import org.bukkit.event.Listener; 28 | import org.bukkit.event.inventory.InventoryClickEvent; 29 | import org.bukkit.event.player.AsyncPlayerChatEvent; 30 | import org.bukkit.inventory.Inventory; 31 | import org.bukkit.inventory.ItemStack; 32 | 33 | public class Parents implements Listener { 34 | 35 | public static Map addParent = new HashMap<>(); 36 | public static Map addTempParent = new HashMap<>(); 37 | 38 | @EventHandler 39 | public void onaddParent(AsyncPlayerChatEvent e) { 40 | if (!addParent.containsKey(e.getPlayer())) return; 41 | String message = e.getMessage(); 42 | User g = addParent.get(e.getPlayer()); 43 | 44 | Tools.sendCommand(e.getPlayer(), "lp user "+g.getUsername()+" parent add "+message); 45 | addParent.remove(e.getPlayer()); 46 | Bukkit.getScheduler().scheduleSyncDelayedTask(LuckPermsGUI.getInstance(), () -> { 47 | EditUser.open(e.getPlayer(), g); 48 | }, 5); 49 | e.setCancelled(true); 50 | } 51 | 52 | @EventHandler 53 | public void onaddTempParent(AsyncPlayerChatEvent e) { 54 | if (!addTempParent.containsKey(e.getPlayer())) return; 55 | String message = e.getMessage(); 56 | User g = addTempParent.get(e.getPlayer()); 57 | 58 | Tools.sendCommand(e.getPlayer(), "lp user "+g.getUsername()+" parent addtemp "+message); 59 | addTempParent.remove(e.getPlayer()); 60 | Bukkit.getScheduler().scheduleSyncDelayedTask(LuckPermsGUI.getInstance(), () -> { 61 | EditUser.open(e.getPlayer(), g); 62 | }, 5); 63 | e.setCancelled(true); 64 | } 65 | 66 | static LuckPerms l = LuckPermsProvider.get(); 67 | 68 | public static void open(Player p, User user, int page) { 69 | Inventory myInventory = Bukkit.createInventory(null, 54, ChatColor.AQUA+"LuckPerms user parents"); 70 | Tools.onAsync(() -> { 71 | 72 | 73 | // ----------------------- INFO ------------------------------ 74 | ItemStack info = Tools.button(Material.ARMOR_STAND, 75 | "&6Info", 76 | Arrays.asList( 77 | "&cName: &e"+user.getUsername(), 78 | "&cUUID: &e"+user.getUniqueId(), 79 | "&cGroup: &e"+user.getPrimaryGroup(), 80 | "&cCounts:", 81 | "&c Nodes: &e"+user.getNodes().size(), 82 | "&c Permissions: &e"+user.getDistinctNodes().size(), 83 | "&c Prefixes: &e"+user.getCachedData().getMetaData().getPrefixes().size(), 84 | "&c Suffixes: &e"+user.getCachedData().getMetaData().getSuffixes().size(), 85 | "&cCached data:", 86 | "&c Current prefix: &e"+user.getCachedData().getMetaData().getPrefix(), 87 | "&c Current suffix: &e"+user.getCachedData().getMetaData().getSuffix() 88 | ), 89 | 1); 90 | myInventory.setItem(4, info); 91 | // ----------------------- INFO ------------------------------ 92 | 93 | int sk = 0; 94 | int i = 9; 95 | 96 | int from = 45*page-1; 97 | int to = 45*(page+1)-1; 98 | for (Node permission : user.getDistinctNodes()) { 99 | if (permission.getType() != NodeType.INHERITANCE) continue; 100 | if (from <= sk && sk < to) { 101 | InheritanceNode parent = ((InheritanceNode)permission); 102 | String expiration = permission.hasExpiry() ? Tools.getTime(permission.getExpiry().toEpochMilli()) : "Never"; 103 | String server = permission.getContexts().getAnyValue(DefaultContextKeys.SERVER_KEY).orElse("global"); 104 | String world = permission.getContexts().getAnyValue(DefaultContextKeys.WORLD_KEY).orElse("global"); 105 | ItemStack item = Tools.button(Material.TNT, 106 | "&6"+parent.getGroupName(), 107 | Arrays.asList( 108 | "&cID: &e"+sk, 109 | "&cExpires in: &e"+expiration, 110 | "&cValue: &e"+permission.getValue(), 111 | "&cServer: &e"+server, 112 | "&cWorld: &e"+world, 113 | "&eClick to remove" 114 | ), 1); 115 | myInventory.setItem(i, item); 116 | i++; 117 | } 118 | sk++; 119 | } 120 | 121 | if (to < sk) { 122 | ItemStack next = Tools.button(Material.SIGN, "&6Next", Arrays.asList("&eNext page", "&cCurrent: &e"+page), 1); 123 | myInventory.setItem(53, next); 124 | } 125 | 126 | ItemStack back = Tools.button(Material.BARRIER, "&6Back", Arrays.asList(""), 1); 127 | myInventory.setItem(8, back); 128 | 129 | }); 130 | p.openInventory(myInventory); 131 | } 132 | 133 | @EventHandler 134 | public void onInventoryClickEvent(InventoryClickEvent e) { 135 | Player p = (Player) e.getWhoClicked(); 136 | 137 | Inventory inv = e.getClickedInventory(); 138 | ItemStack item = e.getCurrentItem(); 139 | if (inv != null && item != null) 140 | if (e.getView().getTitle().equals(ChatColor.AQUA+"LuckPerms user parents")) { 141 | e.setCancelled(true); 142 | if (item.hasItemMeta()) 143 | if (item.getItemMeta().hasDisplayName()) { 144 | 145 | String group = ChatColor.stripColor(inv.getItem(4).getItemMeta().getLore().get(0).split(" ")[1]); 146 | User g = l.getUserManager().getUser(group); 147 | 148 | String name = ChatColor.stripColor(item.getItemMeta().getDisplayName()); 149 | if (name.equals("Next")) { 150 | int current = Integer.parseInt(ChatColor.stripColor(inv.getItem(53).getItemMeta().getLore().get(1).split(" ")[1])); 151 | open(p, g, current+1); 152 | } else if (name.equals("Back")) { 153 | EditUser.open(p, g); 154 | } else if (!name.equals("Info")) { 155 | 156 | int id = Integer.parseInt(ChatColor.stripColor(item.getItemMeta().getLore().get(0).split(" ")[1])); 157 | 158 | int sk = 0; 159 | for (Node permission : g.getDistinctNodes()) { 160 | if (permission.getType() != NodeType.INHERITANCE) continue; 161 | 162 | InheritanceNode parent = ((InheritanceNode)permission); 163 | 164 | String server = permission.getContexts().getAnyValue(DefaultContextKeys.SERVER_KEY).orElse("global"); 165 | String world = permission.getContexts().getAnyValue(DefaultContextKeys.WORLD_KEY).orElse("global"); 166 | 167 | if (sk == id) { 168 | if (permission.hasExpiry()) 169 | Tools.sendCommand(p, "lp user " + g.getUsername() + " parent removetemp " + '"' + parent.getGroupName() + '"' + " " + server + " " + world); 170 | else 171 | Tools.sendCommand(p, "lp user " + g.getUsername() + " parent remove " + '"' + parent.getGroupName() + '"' + " " + server + " " + world); 172 | break; 173 | } 174 | sk++; 175 | } 176 | 177 | int current = 0; 178 | if (inv.getItem(53) != null) 179 | current = Integer.parseInt(ChatColor.stripColor(inv.getItem(53).getItemMeta().getLore().get(1).split(" ")[1])); 180 | 181 | int page = current; 182 | Bukkit.getScheduler().runTaskLater(LuckPermsGUI.getInstance(), () -> { 183 | open(p, g, page); 184 | }, 5); 185 | } 186 | } 187 | } 188 | } 189 | } 190 | -------------------------------------------------------------------------------- /src/main/java/com/bghddevelopment/LuckPemsGUI/users/Permissions.java: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright (c) BGHDDevelopment. 3 | * Please refer to the plugin page or GitHub page for our open-source license. 4 | * If you have any questions please email ceo@bghddevelopment or reach us on Discord 5 | */ 6 | 7 | package com.bghddevelopment.LuckPemsGUI.users; 8 | 9 | import java.util.Arrays; 10 | import java.util.HashMap; 11 | import java.util.Map; 12 | 13 | import net.luckperms.api.LuckPerms; 14 | import net.luckperms.api.LuckPermsProvider; 15 | import net.luckperms.api.context.DefaultContextKeys; 16 | import net.luckperms.api.model.user.User; 17 | import net.luckperms.api.node.Node; 18 | import net.luckperms.api.node.NodeType; 19 | import org.bukkit.Bukkit; 20 | import org.bukkit.ChatColor; 21 | import org.bukkit.Material; 22 | import org.bukkit.entity.Player; 23 | import org.bukkit.event.EventHandler; 24 | import org.bukkit.event.Listener; 25 | import org.bukkit.event.inventory.InventoryClickEvent; 26 | import org.bukkit.event.player.AsyncPlayerChatEvent; 27 | import org.bukkit.inventory.Inventory; 28 | import org.bukkit.inventory.ItemStack; 29 | import com.bghddevelopment.LuckPemsGUI.LuckPermsGUI; 30 | import com.bghddevelopment.LuckPemsGUI.util.Tools; 31 | 32 | public class Permissions implements Listener { 33 | 34 | public static Map addPermission = new HashMap<>(); 35 | public static Map addTempPermission = new HashMap<>(); 36 | public static Map checkIfHas = new HashMap<>(); 37 | 38 | @EventHandler 39 | public void onPermissionAdd(AsyncPlayerChatEvent e) { 40 | if (!addPermission.containsKey(e.getPlayer())) return; 41 | String message = e.getMessage(); 42 | User g = addPermission.get(e.getPlayer()); 43 | 44 | Tools.sendCommand(e.getPlayer(), "lp user "+g.getUsername()+" permission set "+message); 45 | addPermission.remove(e.getPlayer()); 46 | Bukkit.getScheduler().scheduleSyncDelayedTask(LuckPermsGUI.getInstance(), () -> { 47 | EditUser.open(e.getPlayer(), g); 48 | }, 5); 49 | e.setCancelled(true); 50 | } 51 | 52 | @EventHandler 53 | public void onTempPermissionAdd(AsyncPlayerChatEvent e) { 54 | if (!addTempPermission.containsKey(e.getPlayer())) return; 55 | String message = e.getMessage(); 56 | User g = addTempPermission.get(e.getPlayer()); 57 | 58 | Tools.sendCommand(e.getPlayer(), "lp user "+g.getUsername()+" permission settemp "+message); 59 | addTempPermission.remove(e.getPlayer()); 60 | Bukkit.getScheduler().scheduleSyncDelayedTask(LuckPermsGUI.getInstance(), () -> { 61 | EditUser.open(e.getPlayer(), g); 62 | }, 5); 63 | e.setCancelled(true); 64 | } 65 | 66 | @EventHandler 67 | public void onPermissionCheck(AsyncPlayerChatEvent e) { 68 | if (!checkIfHas.containsKey(e.getPlayer())) return; 69 | String message = e.getMessage(); 70 | User g = checkIfHas.get(e.getPlayer()); 71 | 72 | Tools.sendCommand(e.getPlayer(), "lp user "+g.getUsername()+" permission check "+message); 73 | checkIfHas.remove(e.getPlayer()); 74 | Bukkit.getScheduler().scheduleSyncDelayedTask(LuckPermsGUI.getInstance(), () -> { 75 | EditUser.open(e.getPlayer(), g); 76 | }, 5); 77 | e.setCancelled(true); 78 | } 79 | 80 | static LuckPerms l = LuckPermsProvider.get(); 81 | 82 | public static void open(Player p, User user, int page) { 83 | Inventory myInventory = Bukkit.createInventory(null, 54, ChatColor.AQUA+"LuckPerms user permissions"); 84 | Tools.onAsync(() -> { 85 | 86 | // ----------------------- INFO ------------------------------ 87 | ItemStack info = Tools.button(Material.ARMOR_STAND, 88 | "&6Info", 89 | Arrays.asList( 90 | "&cName: &e"+user.getUsername(), 91 | "&cUUID: &e"+user.getUniqueId(), 92 | "&cGroup: &e"+user.getPrimaryGroup(), 93 | "&cCounts:", 94 | "&c Nodes: &e"+user.getNodes().size(), 95 | "&c Permissions: &e"+user.getDistinctNodes().size(), 96 | "&c Prefixes: &e"+user.getCachedData().getMetaData().getPrefixes().size(), 97 | "&c Suffixes: &e"+user.getCachedData().getMetaData().getSuffixes().size(), 98 | "&cCached data:", 99 | "&c Current prefix: &e"+user.getCachedData().getMetaData().getPrefix(), 100 | "&c Current suffix: &e"+user.getCachedData().getMetaData().getSuffix() 101 | ), 102 | 1); 103 | myInventory.setItem(4, info); 104 | // ----------------------- INFO ------------------------------ 105 | 106 | int sk = 0; 107 | int i = 9; 108 | 109 | int from = 45*page-1; 110 | int to = 45*(page+1)-1; 111 | for (Node permission : user.getDistinctNodes()) { 112 | if (permission.getType() == NodeType.META) continue; 113 | if (permission.getType() == NodeType.PREFIX) continue; 114 | if (permission.getType() == NodeType.SUFFIX) continue; 115 | if (permission.getType() == NodeType.CHAT_META) continue; 116 | if (permission.getType() == NodeType.WEIGHT) continue; 117 | if (from <= sk && sk < to) { 118 | String expiration = permission.hasExpiry() ? Tools.getTime(permission.getExpiry().toEpochMilli()) : "Never"; 119 | String server = permission.getContexts().getAnyValue(DefaultContextKeys.SERVER_KEY).orElse("global"); 120 | String world = permission.getContexts().getAnyValue(DefaultContextKeys.WORLD_KEY).orElse("global"); 121 | ItemStack item = Tools.button(Material.TNT, 122 | "&6"+permission.getKey(), 123 | Arrays.asList( 124 | "&cID: &e"+sk, 125 | "&cExpires in: &e"+expiration, 126 | "&cValue: &e"+permission.getValue(), 127 | "&cServer: &e"+server, 128 | "&cWorld: &e"+world, 129 | "&eClick to remove" 130 | ), 1); 131 | myInventory.setItem(i, item); 132 | i++; 133 | } 134 | sk++; 135 | } 136 | 137 | if (to < sk) { 138 | ItemStack next = Tools.button(Material.SIGN, "&6Next", Arrays.asList("&eNext page", "&cCurrent: &e"+page), 1); 139 | myInventory.setItem(53, next); 140 | } 141 | 142 | ItemStack back = Tools.button(Material.BARRIER, "&6Back", Arrays.asList(""), 1); 143 | myInventory.setItem(8, back); 144 | 145 | }); 146 | p.openInventory(myInventory); 147 | } 148 | 149 | @EventHandler 150 | public void onInventoryClickEvent(InventoryClickEvent e) { 151 | Player p = (Player) e.getWhoClicked(); 152 | 153 | Inventory inv = e.getClickedInventory(); 154 | ItemStack item = e.getCurrentItem(); 155 | if (inv != null && item != null) 156 | if (e.getView().getTitle().equals(ChatColor.AQUA+"LuckPerms user permissions")) { 157 | e.setCancelled(true); 158 | if (item.hasItemMeta()) 159 | if (item.getItemMeta().hasDisplayName()) { 160 | 161 | String group = ChatColor.stripColor(inv.getItem(4).getItemMeta().getLore().get(0).split(" ")[1]); 162 | User g = l.getUserManager().getUser(group); 163 | 164 | String name = ChatColor.stripColor(item.getItemMeta().getDisplayName()); 165 | if (name.equals("Next")) { 166 | int current = Integer.parseInt(ChatColor.stripColor(inv.getItem(53).getItemMeta().getLore().get(1).split(" ")[1])); 167 | open(p, g, current+1); 168 | } else if (name.equals("Back")) { 169 | EditUser.open(p, g); 170 | } else if (!name.equals("Info")) { 171 | 172 | int id = Integer.parseInt(ChatColor.stripColor(item.getItemMeta().getLore().get(0).split(" ")[1])); 173 | 174 | int sk = 0; 175 | for (Node permission : g.getDistinctNodes()) { 176 | if (permission.getType() == NodeType.META) continue; 177 | if (permission.getType() == NodeType.PREFIX) continue; 178 | if (permission.getType() == NodeType.SUFFIX) continue; 179 | if (permission.getType() == NodeType.CHAT_META) continue; 180 | if (permission.getType() == NodeType.WEIGHT) continue; 181 | if (sk == id) { 182 | String server = permission.getContexts().getAnyValue(DefaultContextKeys.SERVER_KEY).orElse("global"); 183 | String world = permission.getContexts().getAnyValue(DefaultContextKeys.WORLD_KEY).orElse("global"); 184 | 185 | if (permission.hasExpiry()) 186 | Tools.sendCommand(p, "lp user " + g.getUsername() + " permission unsettemp " + '"' + permission.getKey() + '"' + " " + server + " " + world); 187 | else 188 | Tools.sendCommand(p, "lp user " + g.getUsername() + " permission unset " + '"' + permission.getKey() + '"' + " " + server + " " + world); 189 | break; 190 | } 191 | sk++; 192 | } 193 | 194 | int current = 0; 195 | if (inv.getItem(53) != null) 196 | current = Integer.parseInt(ChatColor.stripColor(inv.getItem(53).getItemMeta().getLore().get(1).split(" ")[1])); 197 | 198 | int page = current; 199 | Bukkit.getScheduler().runTaskLater(LuckPermsGUI.getInstance(), () -> { 200 | open(p, g, page); 201 | }, 5); 202 | } 203 | } 204 | } 205 | } 206 | } 207 | -------------------------------------------------------------------------------- /src/main/java/com/bghddevelopment/LuckPemsGUI/users/Prefix.java: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright (c) BGHDDevelopment. 3 | * Please refer to the plugin page or GitHub page for our open-source license. 4 | * If you have any questions please email ceo@bghddevelopment or reach us on Discord 5 | */ 6 | 7 | package com.bghddevelopment.LuckPemsGUI.users; 8 | 9 | import java.util.*; 10 | 11 | import com.bghddevelopment.LuckPemsGUI.LuckPermsGUI; 12 | import com.bghddevelopment.LuckPemsGUI.util.Tools; 13 | import net.luckperms.api.LuckPerms; 14 | import net.luckperms.api.LuckPermsProvider; 15 | import net.luckperms.api.context.DefaultContextKeys; 16 | import net.luckperms.api.model.user.User; 17 | import net.luckperms.api.node.Node; 18 | import net.luckperms.api.node.NodeType; 19 | import net.luckperms.api.node.types.PrefixNode; 20 | import org.bukkit.Bukkit; 21 | import org.bukkit.ChatColor; 22 | import org.bukkit.Material; 23 | import org.bukkit.entity.Player; 24 | import org.bukkit.event.EventHandler; 25 | import org.bukkit.event.Listener; 26 | import org.bukkit.event.inventory.InventoryClickEvent; 27 | import org.bukkit.event.player.AsyncPlayerChatEvent; 28 | import org.bukkit.inventory.Inventory; 29 | import org.bukkit.inventory.ItemStack; 30 | 31 | public class Prefix implements Listener { 32 | 33 | public static Map addPrefix = new HashMap<>(); 34 | public static Map addTempPrefix = new HashMap<>(); 35 | 36 | @EventHandler 37 | public void onaddParent(AsyncPlayerChatEvent e) { 38 | if (!addPrefix.containsKey(e.getPlayer())) return; 39 | String message = e.getMessage(); 40 | User g = addPrefix.get(e.getPlayer()); 41 | 42 | Tools.sendCommand(e.getPlayer(), "lp user "+g.getUsername()+" meta addprefix "+message); 43 | addPrefix.remove(e.getPlayer()); 44 | Bukkit.getScheduler().scheduleSyncDelayedTask(LuckPermsGUI.getInstance(), () -> { 45 | EditUser.open(e.getPlayer(), g); 46 | }, 5); 47 | e.setCancelled(true); 48 | } 49 | 50 | @EventHandler 51 | public void onaddTempParent(AsyncPlayerChatEvent e) { 52 | if (!addTempPrefix.containsKey(e.getPlayer())) return; 53 | String message = e.getMessage(); 54 | User g = addTempPrefix.get(e.getPlayer()); 55 | 56 | Tools.sendCommand(e.getPlayer(), "lp user "+g.getUsername()+" meta addtempprefix "+message); 57 | addTempPrefix.remove(e.getPlayer()); 58 | Bukkit.getScheduler().scheduleSyncDelayedTask(LuckPermsGUI.getInstance(), () -> { 59 | EditUser.open(e.getPlayer(), g); 60 | }, 5); 61 | e.setCancelled(true); 62 | } 63 | 64 | static LuckPerms l = LuckPermsProvider.get(); 65 | 66 | public static void open(Player p, User user, int page) { 67 | Inventory myInventory = Bukkit.createInventory(null, 54, ChatColor.AQUA+"LuckPerms user prefixs"); 68 | Tools.onAsync(() -> { 69 | 70 | 71 | // ----------------------- INFO ------------------------------ 72 | ItemStack info = Tools.button(Material.ARMOR_STAND, 73 | "&6Info", 74 | Arrays.asList( 75 | "&cName: &e"+user.getUsername(), 76 | "&cUUID: &e"+user.getUniqueId(), 77 | "&cGroup: &e"+user.getPrimaryGroup(), 78 | "&cCounts:", 79 | "&c Nodes: &e"+user.getNodes().size(), 80 | "&c Permissions: &e"+user.getDistinctNodes().size(), 81 | "&c Prefixes: &e"+user.getCachedData().getMetaData().getPrefixes().size(), 82 | "&c Suffixes: &e"+user.getCachedData().getMetaData().getSuffixes().size(), 83 | "&cCached data:", 84 | "&c Current prefix: &e"+user.getCachedData().getMetaData().getPrefix(), 85 | "&c Current suffix: &e"+user.getCachedData().getMetaData().getSuffix() 86 | ), 87 | 1); 88 | myInventory.setItem(4, info); 89 | // ----------------------- INFO ------------------------------ 90 | 91 | int sk = 0; 92 | int i = 9; 93 | 94 | int from = 45*page-1; 95 | int to = 45*(page+1)-1; 96 | for (Node permission : user.getDistinctNodes()) { 97 | if (permission.getType() != NodeType.PREFIX) continue; 98 | if (from <= sk && sk < to) { 99 | PrefixNode prefix = ((PrefixNode) permission); 100 | String expiration = permission.hasExpiry() ? Tools.getTime(permission.getExpiry().toEpochMilli()) : "Never"; 101 | String server = permission.getContexts().getAnyValue(DefaultContextKeys.SERVER_KEY).orElse("global"); 102 | String world = permission.getContexts().getAnyValue(DefaultContextKeys.WORLD_KEY).orElse("global"); 103 | ItemStack item = Tools.button(Material.TNT, 104 | "&6"+prefix.getMetaValue(), 105 | Arrays.asList( 106 | "&cID: &e"+sk, 107 | "&cPosition: &e"+prefix.getPriority(), 108 | "&cExpires in: &e"+expiration, 109 | "&cValue: &e"+permission.getValue(), 110 | "&cServer: &e"+server, 111 | "&cWorld: &e"+world, 112 | "&eClick to remove" 113 | ), 1); 114 | myInventory.setItem(i, item); 115 | i++; 116 | } 117 | sk++; 118 | } 119 | 120 | if (to < sk) { 121 | ItemStack next = Tools.button(Material.SIGN, "&6Next", Arrays.asList("&eNext page", "&cCurrent: &e"+page), 1); 122 | myInventory.setItem(53, next); 123 | } 124 | 125 | ItemStack back = Tools.button(Material.BARRIER, "&6Back", Arrays.asList(""), 1); 126 | myInventory.setItem(8, back); 127 | 128 | }); 129 | p.openInventory(myInventory); 130 | } 131 | 132 | @EventHandler 133 | public void onInventoryClickEvent(InventoryClickEvent e) { 134 | Player p = (Player) e.getWhoClicked(); 135 | 136 | Inventory inv = e.getClickedInventory(); 137 | ItemStack item = e.getCurrentItem(); 138 | if (inv != null && item != null) 139 | if (e.getView().getTitle().equals(ChatColor.AQUA+"LuckPerms user prefixs")) { 140 | e.setCancelled(true); 141 | if (item.hasItemMeta()) 142 | if (item.getItemMeta().hasDisplayName()) { 143 | 144 | String group = ChatColor.stripColor(inv.getItem(4).getItemMeta().getLore().get(0).split(" ")[1]); 145 | User g = l.getUserManager().getUser(group); 146 | 147 | String name = ChatColor.stripColor(item.getItemMeta().getDisplayName()); 148 | if (name.equals("Next")) { 149 | int current = Integer.parseInt(ChatColor.stripColor(inv.getItem(53).getItemMeta().getLore().get(1).split(" ")[1])); 150 | open(p, g, current+1); 151 | } else if (name.equals("Back")) { 152 | EditUser.open(p, g); 153 | } else if (!name.equals("Info")) { 154 | 155 | int id = Integer.parseInt(ChatColor.stripColor(item.getItemMeta().getLore().get(0).split(" ")[1])); 156 | 157 | int sk = 0; 158 | for (Node permission : g.getDistinctNodes()) { 159 | if (permission.getType() != NodeType.PREFIX) continue; 160 | if (sk == id) { 161 | PrefixNode prefix = ((PrefixNode) permission); 162 | 163 | String server = permission.getContexts().getAnyValue(DefaultContextKeys.SERVER_KEY).orElse("global"); 164 | String world = permission.getContexts().getAnyValue(DefaultContextKeys.WORLD_KEY).orElse("global"); 165 | 166 | if (permission.hasExpiry()) 167 | Tools.sendCommand(p, "lp user " + g.getUsername() + " meta removetempprefix " + prefix.getPriority() + " " + '"' + prefix.getMetaValue() + '"' + " " + server + " " + world); 168 | else 169 | Tools.sendCommand(p, "lp user " + g.getUsername() + " meta removeprefix " + prefix.getPriority() + " " + '"' + prefix.getMetaValue() + '"' + " " + server + " " + world); 170 | break; 171 | } 172 | sk++; 173 | } 174 | 175 | int current = 0; 176 | if (inv.getItem(53) != null) 177 | current = Integer.parseInt(ChatColor.stripColor(inv.getItem(53).getItemMeta().getLore().get(1).split(" ")[1])); 178 | 179 | int page = current; 180 | Bukkit.getScheduler().runTaskLater(LuckPermsGUI.getInstance(), () -> { 181 | open(p, g, page); 182 | }, 5); 183 | } 184 | } 185 | } 186 | } 187 | } 188 | -------------------------------------------------------------------------------- /src/main/java/com/bghddevelopment/LuckPemsGUI/users/Suffix.java: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright (c) BGHDDevelopment. 3 | * Please refer to the plugin page or GitHub page for our open-source license. 4 | * If you have any questions please email ceo@bghddevelopment or reach us on Discord 5 | */ 6 | 7 | package com.bghddevelopment.LuckPemsGUI.users; 8 | 9 | import java.util.Arrays; 10 | import java.util.HashMap; 11 | import java.util.Map; 12 | 13 | import com.bghddevelopment.LuckPemsGUI.LuckPermsGUI; 14 | import com.bghddevelopment.LuckPemsGUI.util.Tools; 15 | import net.luckperms.api.LuckPerms; 16 | import net.luckperms.api.LuckPermsProvider; 17 | import net.luckperms.api.context.DefaultContextKeys; 18 | import net.luckperms.api.model.user.User; 19 | import net.luckperms.api.node.Node; 20 | import net.luckperms.api.node.NodeType; 21 | import net.luckperms.api.node.types.SuffixNode; 22 | import org.bukkit.Bukkit; 23 | import org.bukkit.ChatColor; 24 | import org.bukkit.Material; 25 | import org.bukkit.entity.Player; 26 | import org.bukkit.event.EventHandler; 27 | import org.bukkit.event.Listener; 28 | import org.bukkit.event.inventory.InventoryClickEvent; 29 | import org.bukkit.event.player.AsyncPlayerChatEvent; 30 | import org.bukkit.inventory.Inventory; 31 | import org.bukkit.inventory.ItemStack; 32 | 33 | public class Suffix implements Listener { 34 | 35 | public static Map addPrefix = new HashMap<>(); 36 | public static Map addTempPrefix = new HashMap<>(); 37 | 38 | @EventHandler 39 | public void onaddParent(AsyncPlayerChatEvent e) { 40 | if (!addPrefix.containsKey(e.getPlayer())) return; 41 | String message = e.getMessage(); 42 | User g = addPrefix.get(e.getPlayer()); 43 | 44 | Tools.sendCommand(e.getPlayer(), "lp user "+g.getUsername()+" meta addsuffix "+message); 45 | addPrefix.remove(e.getPlayer()); 46 | Bukkit.getScheduler().scheduleSyncDelayedTask(LuckPermsGUI.getInstance(), () -> { 47 | EditUser.open(e.getPlayer(), g); 48 | }, 5); 49 | e.setCancelled(true); 50 | } 51 | 52 | @EventHandler 53 | public void onaddTempParent(AsyncPlayerChatEvent e) { 54 | if (!addTempPrefix.containsKey(e.getPlayer())) return; 55 | String message = e.getMessage(); 56 | User g = addTempPrefix.get(e.getPlayer()); 57 | 58 | Tools.sendCommand(e.getPlayer(), "lp user "+g.getUsername()+" meta addtempsuffix "+message); 59 | addTempPrefix.remove(e.getPlayer()); 60 | Bukkit.getScheduler().scheduleSyncDelayedTask(LuckPermsGUI.getInstance(), () -> { 61 | EditUser.open(e.getPlayer(), g); 62 | }, 5); 63 | e.setCancelled(true); 64 | } 65 | 66 | static LuckPerms l = LuckPermsProvider.get(); 67 | 68 | public static void open(Player p, User user, int page) { 69 | Inventory myInventory = Bukkit.createInventory(null, 54, ChatColor.AQUA+"LuckPerms user suffixes"); 70 | Tools.onAsync(() -> { 71 | 72 | 73 | // ----------------------- INFO ------------------------------ 74 | ItemStack info = Tools.button(Material.ARMOR_STAND, 75 | "&6Info", 76 | Arrays.asList( 77 | "&cName: &e"+user.getUsername(), 78 | "&cUUID: &e"+user.getUniqueId(), 79 | "&cGroup: &e"+user.getPrimaryGroup(), 80 | "&cCounts:", 81 | "&c Nodes: &e"+user.getNodes().size(), 82 | "&c Permissions: &e"+user.getDistinctNodes().size(), 83 | "&c Prefixes: &e"+user.getCachedData().getMetaData().getPrefixes().size(), 84 | "&c Suffixes: &e"+user.getCachedData().getMetaData().getSuffixes().size(), 85 | "&cCached data:", 86 | "&c Current prefix: &e"+user.getCachedData().getMetaData().getPrefix(), 87 | "&c Current suffix: &e"+user.getCachedData().getMetaData().getSuffix() 88 | ), 89 | 1); 90 | myInventory.setItem(4, info); 91 | // ----------------------- INFO ------------------------------ 92 | 93 | int sk = 0; 94 | int i = 9; 95 | 96 | int from = 45*page-1; 97 | int to = 45*(page+1)-1; 98 | for (Node permission : user.getDistinctNodes()) { 99 | if (permission.getType() != NodeType.SUFFIX) continue; 100 | if (from <= sk && sk < to) { 101 | SuffixNode suffix = ((SuffixNode) permission); 102 | String expiration = permission.hasExpiry() ? Tools.getTime(permission.getExpiry().toEpochMilli()) : "Never"; 103 | String server = permission.getContexts().getAnyValue(DefaultContextKeys.SERVER_KEY).orElse("global"); 104 | String world = permission.getContexts().getAnyValue(DefaultContextKeys.WORLD_KEY).orElse("global"); 105 | ItemStack item = Tools.button(Material.TNT, 106 | "&6"+suffix.getMetaValue(), 107 | Arrays.asList( 108 | "&cID: &e"+sk, 109 | "&cPosition: &e"+suffix.getPriority(), 110 | "&cExpires in: &e"+expiration, 111 | "&cValue: &e"+permission.getValue(), 112 | "&cServer: &e"+server, 113 | "&cWorld: &e"+world, 114 | "&eClick to remove" 115 | ), 1); 116 | myInventory.setItem(i, item); 117 | i++; 118 | } 119 | sk++; 120 | } 121 | 122 | if (to < sk) { 123 | ItemStack next = Tools.button(Material.SIGN, "&6Next", Arrays.asList("&eNext page", "&cCurrent: &e"+page), 1); 124 | myInventory.setItem(53, next); 125 | } 126 | 127 | ItemStack back = Tools.button(Material.BARRIER, "&6Back", Arrays.asList(""), 1); 128 | myInventory.setItem(8, back); 129 | 130 | }); 131 | p.openInventory(myInventory); 132 | } 133 | 134 | @EventHandler 135 | public void onInventoryClickEvent(InventoryClickEvent e) { 136 | Player p = (Player) e.getWhoClicked(); 137 | 138 | Inventory inv = e.getClickedInventory(); 139 | ItemStack item = e.getCurrentItem(); 140 | if (inv != null && item != null) 141 | if (e.getView().getTitle().equals(ChatColor.AQUA+"LuckPerms user suffixes")) { 142 | e.setCancelled(true); 143 | if (item.hasItemMeta()) 144 | if (item.getItemMeta().hasDisplayName()) { 145 | 146 | String group = ChatColor.stripColor(inv.getItem(4).getItemMeta().getLore().get(0).split(" ")[1]); 147 | User g = l.getUserManager().getUser(group); 148 | 149 | String name = ChatColor.stripColor(item.getItemMeta().getDisplayName()); 150 | if (name.equals("Next")) { 151 | int current = Integer.parseInt(ChatColor.stripColor(inv.getItem(53).getItemMeta().getLore().get(1).split(" ")[1])); 152 | open(p, g, current+1); 153 | } else if (name.equals("Back")) { 154 | EditUser.open(p, g); 155 | } else if (!name.equals("Info")) { 156 | 157 | int id = Integer.parseInt(ChatColor.stripColor(item.getItemMeta().getLore().get(0).split(" ")[1])); 158 | 159 | int sk = 0; 160 | for (Node permission : g.getDistinctNodes()) { 161 | if (permission.getType() != NodeType.SUFFIX) continue; 162 | if (sk == id) { 163 | SuffixNode suffix = ((SuffixNode) permission); 164 | 165 | String server = permission.getContexts().getAnyValue(DefaultContextKeys.SERVER_KEY).orElse("global"); 166 | String world = permission.getContexts().getAnyValue(DefaultContextKeys.WORLD_KEY).orElse("global"); 167 | 168 | if (permission.hasExpiry()) 169 | Tools.sendCommand(p, "lp user " + g.getUsername() + " meta removetempsuffix " + suffix.getPriority() + " " + '"' + suffix.getMetaValue() + '"' + " " + server + " " + world); 170 | else 171 | Tools.sendCommand(p, "lp user " + g.getUsername() + " meta removesuffix " + suffix.getPriority() + " " + '"' + suffix.getMetaValue() + '"' + " " + server + " " + world); 172 | break; 173 | } 174 | sk++; 175 | } 176 | 177 | int current = 0; 178 | if (inv.getItem(53) != null) 179 | current = Integer.parseInt(ChatColor.stripColor(inv.getItem(53).getItemMeta().getLore().get(1).split(" ")[1])); 180 | 181 | int page = current; 182 | Bukkit.getScheduler().runTaskLater(LuckPermsGUI.getInstance(), () -> { 183 | open(p, g, page); 184 | }, 5); 185 | } 186 | } 187 | } 188 | } 189 | } 190 | -------------------------------------------------------------------------------- /src/main/java/com/bghddevelopment/LuckPemsGUI/users/UsersGUI.java: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright (c) BGHDDevelopment. 3 | * Please refer to the plugin page or GitHub page for our open-source license. 4 | * If you have any questions please email ceo@bghddevelopment or reach us on Discord 5 | */ 6 | 7 | package com.bghddevelopment.LuckPemsGUI.users; 8 | 9 | import java.util.ArrayList; 10 | import java.util.Arrays; 11 | import java.util.List; 12 | 13 | import com.bghddevelopment.LuckPemsGUI.LuckPermsGUI; 14 | import com.bghddevelopment.LuckPemsGUI.util.Tools; 15 | import com.bghddevelopment.LuckPemsGUI.util.OpenGUI; 16 | import net.luckperms.api.LuckPerms; 17 | import net.luckperms.api.LuckPermsProvider; 18 | import org.bukkit.Bukkit; 19 | import org.bukkit.ChatColor; 20 | import org.bukkit.Material; 21 | import org.bukkit.entity.Player; 22 | import org.bukkit.event.EventHandler; 23 | import org.bukkit.event.Listener; 24 | import org.bukkit.event.inventory.InventoryClickEvent; 25 | import org.bukkit.event.player.AsyncPlayerChatEvent; 26 | import org.bukkit.inventory.Inventory; 27 | import org.bukkit.inventory.ItemStack; 28 | 29 | public class UsersGUI implements Listener { 30 | 31 | static LuckPerms l = LuckPermsProvider.get(); 32 | 33 | List editUser = new ArrayList<>(); 34 | 35 | @EventHandler 36 | public void onUserEdit(AsyncPlayerChatEvent e) { 37 | if (!editUser.contains(e.getPlayer())) return; 38 | String message = e.getMessage(); 39 | editUser.remove(e.getPlayer()); 40 | 41 | Bukkit.getScheduler().scheduleSyncDelayedTask(LuckPermsGUI.getInstance(), () -> { 42 | EditUser.open(e.getPlayer(), message); 43 | }, 5); 44 | 45 | e.setCancelled(true); 46 | } 47 | 48 | public static void open(Player p) { 49 | Inventory myInventory = Bukkit.createInventory(null, 54, ChatColor.AQUA+"LuckPerms users"); 50 | Tools.onAsync(() -> { 51 | 52 | int sk = 9; 53 | for (Player player : Bukkit.getOnlinePlayers()) { 54 | if (sk >= 53) continue; 55 | ItemStack item = Tools.head(player.getName(), 56 | "&6"+player.getName(), 57 | Arrays.asList("&eClick to edit"), 1); 58 | 59 | myInventory.setItem(sk, item); 60 | sk++; 61 | } 62 | 63 | ItemStack newGroup = Tools.button(Material.PAPER, "&6Edit offline user", Arrays.asList("&eClick to edit offline/online user"), 1); 64 | myInventory.setItem(0, newGroup); 65 | 66 | ItemStack wipe = Tools.button(Material.REDSTONE, "&4Remove ranks", Arrays.asList("&eRemove from all users", "&especific ranks.", "&e(Great for wipes)"), 1); 67 | myInventory.setItem(1, wipe); 68 | 69 | ItemStack back = Tools.button(Material.BARRIER, "&6Back", Arrays.asList(""), 1); 70 | myInventory.setItem(8, back); 71 | 72 | }); 73 | p.openInventory(myInventory); 74 | } 75 | 76 | @EventHandler 77 | public void onInventoryClickEvent(InventoryClickEvent e) { 78 | Player p = (Player) e.getWhoClicked(); 79 | 80 | Inventory inv = e.getClickedInventory(); 81 | ItemStack item = e.getCurrentItem(); 82 | if (inv != null && item != null) 83 | if (e.getView().getTitle().equals(ChatColor.AQUA+"LuckPerms users")) { 84 | e.setCancelled(true); 85 | if (item.hasItemMeta()) 86 | if (item.getItemMeta().hasDisplayName()) { 87 | String name = ChatColor.stripColor(item.getItemMeta().getDisplayName()); 88 | if (name.equals("Back")) { 89 | OpenGUI.openGUI(p); 90 | } else if (name.equals("Edit offline user")) { 91 | Tools.sendMessage(p, "&eWrite in chat:"); 92 | Tools.sendMessage(p, "&8<&7Name&8>"); 93 | Tools.sendMessage(p, "&aName - User name"); 94 | editUser.add(p); 95 | p.closeInventory(); 96 | } else if (name.equals("Remove ranks")) { 97 | Wipe.open(p); 98 | } else EditUser.open(p, l.getUserManager().getUser(name)); 99 | } 100 | } 101 | } 102 | } 103 | -------------------------------------------------------------------------------- /src/main/java/com/bghddevelopment/LuckPemsGUI/users/Wipe.java: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright (c) BGHDDevelopment. 3 | * Please refer to the plugin page or GitHub page for our open-source license. 4 | * If you have any questions please email ceo@bghddevelopment or reach us on Discord 5 | */ 6 | 7 | package com.bghddevelopment.LuckPemsGUI.users; 8 | 9 | import java.util.Arrays; 10 | 11 | import com.bghddevelopment.LuckPemsGUI.util.Tools; 12 | import net.luckperms.api.LuckPerms; 13 | import net.luckperms.api.LuckPermsProvider; 14 | import net.luckperms.api.model.group.Group; 15 | import org.bukkit.Bukkit; 16 | import org.bukkit.ChatColor; 17 | import org.bukkit.Material; 18 | import org.bukkit.entity.Player; 19 | import org.bukkit.event.EventHandler; 20 | import org.bukkit.event.Listener; 21 | import org.bukkit.event.inventory.InventoryClickEvent; 22 | import org.bukkit.inventory.Inventory; 23 | import org.bukkit.inventory.ItemStack; 24 | 25 | public class Wipe implements Listener { 26 | 27 | static LuckPerms l = LuckPermsProvider.get(); 28 | 29 | public static void open(Player p) { 30 | Inventory myInventory = Bukkit.createInventory(null, 54, ChatColor.AQUA + "LuckPerms WIPE"); 31 | Tools.onAsync(() -> { 32 | 33 | int sk = 9; 34 | for (Group group : l.getGroupManager().getLoadedGroups()) { 35 | String name = group.getName(); 36 | ItemStack item = Tools.button(Material.TNT, "&6" + name, Arrays.asList("&eSelect to remove from users"), 1); 37 | myInventory.setItem(sk, item); 38 | sk++; 39 | } 40 | 41 | ItemStack back = Tools.button(Material.BARRIER, "&6Back", Arrays.asList(""), 1); 42 | myInventory.setItem(7, back); 43 | ItemStack confirm = Tools.button(Material.SIGN, "&2&lCONFIRM", Arrays.asList("&ePress when everything selected", "&cThis will take some time!!"), 1); 44 | myInventory.setItem(8, confirm); 45 | 46 | }); 47 | p.openInventory(myInventory); 48 | } 49 | 50 | @EventHandler 51 | public void onInventoryClickEvent(InventoryClickEvent e) { 52 | Player p = (Player) e.getWhoClicked(); 53 | 54 | Inventory inv = e.getClickedInventory(); 55 | ItemStack item = e.getCurrentItem(); 56 | if (inv != null && item != null) 57 | if (e.getView().getTitle().equals(ChatColor.AQUA + "LuckPerms WIPE")) { 58 | e.setCancelled(true); 59 | if (item.hasItemMeta()) 60 | if (item.getItemMeta().hasDisplayName()) { 61 | String name = ChatColor.stripColor(item.getItemMeta().getDisplayName()); 62 | if (name.equals("Back")) { 63 | UsersGUI.open(p); 64 | } else if (name.equals("CONFIRM")) { 65 | for (ItemStack groupItem : inv) { 66 | if (groupItem == null) 67 | continue; 68 | if (groupItem.getType().equals(Material.EMERALD)) { 69 | String groupName = ChatColor.stripColor(groupItem.getItemMeta().getDisplayName()); 70 | Tools.sendConsole("lp bulkupdate users delete \"permission ~~ group." + groupName + "\""); 71 | } 72 | } 73 | UsersGUI.open(p); 74 | Tools.sendMessage(p, "&aAction was completed!"); 75 | } else { 76 | if (item.getType().equals(Material.TNT)) { 77 | item.setType(Material.EMERALD); 78 | } else { 79 | item.setType(Material.TNT); 80 | } 81 | } 82 | } 83 | } 84 | } 85 | } 86 | -------------------------------------------------------------------------------- /src/main/java/com/bghddevelopment/LuckPemsGUI/util/Color.java: -------------------------------------------------------------------------------- 1 | package com.bghddevelopment.LuckPemsGUI.util; 2 | 3 | import org.bukkit.Bukkit; 4 | import org.bukkit.ChatColor; 5 | 6 | import java.util.List; 7 | import java.util.regex.Matcher; 8 | import java.util.regex.Pattern; 9 | import java.util.stream.Collectors; 10 | 11 | public class Color { 12 | 13 | public static String translate(String message) { 14 | 15 | return ChatColor.translateAlternateColorCodes('&', message); 16 | } 17 | } 18 | -------------------------------------------------------------------------------- /src/main/java/com/bghddevelopment/LuckPemsGUI/util/Logger.java: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright (c) BGHDDevelopment. 3 | * Please refer to the plugin page or GitHub page for our open-source license. 4 | * If you have any questions please email ceo@bghddevelopment or reach us on Discord 5 | */ 6 | 7 | package com.bghddevelopment.LuckPemsGUI.util; 8 | 9 | import org.bukkit.Bukkit; 10 | import org.bukkit.ChatColor; 11 | 12 | public class Logger { 13 | public static void log(LogLevel level, String message) { 14 | if (message == null) return; 15 | 16 | switch (level) { 17 | case ERROR: 18 | Bukkit.getConsoleSender().sendMessage(ChatColor.translateAlternateColorCodes('&', "&8[&c&lERROR&r&8] &f" + message)); 19 | break; 20 | case WARNING: 21 | Bukkit.getConsoleSender().sendMessage(ChatColor.translateAlternateColorCodes('&', "&8[&6&lWARNING&r&8] &f" + message)); 22 | break; 23 | case INFO: 24 | Bukkit.getConsoleSender().sendMessage(ChatColor.translateAlternateColorCodes('&', "&8[&e&lINFO&r&8] &f" + message)); 25 | break; 26 | case SUCCESS: 27 | Bukkit.getConsoleSender().sendMessage(ChatColor.translateAlternateColorCodes('&', "&8[&a&lSUCCESS&r&8] &f" + message)); 28 | break; 29 | case OUTLINE: 30 | Bukkit.getConsoleSender().sendMessage(ChatColor.translateAlternateColorCodes('&', "&7" + message)); 31 | break; 32 | } 33 | } 34 | 35 | public enum LogLevel { ERROR, WARNING, INFO, SUCCESS, OUTLINE } 36 | } 37 | 38 | -------------------------------------------------------------------------------- /src/main/java/com/bghddevelopment/LuckPemsGUI/util/Metrics.java: -------------------------------------------------------------------------------- 1 | package com.bghddevelopment.LuckPemsGUI.util; 2 | 3 | import java.io.BufferedReader; 4 | import java.io.ByteArrayOutputStream; 5 | import java.io.DataOutputStream; 6 | import java.io.File; 7 | import java.io.IOException; 8 | import java.io.InputStreamReader; 9 | import java.lang.reflect.Method; 10 | import java.net.URL; 11 | import java.nio.charset.StandardCharsets; 12 | import java.util.Arrays; 13 | import java.util.Collection; 14 | import java.util.HashSet; 15 | import java.util.Map; 16 | import java.util.Objects; 17 | import java.util.Set; 18 | import java.util.UUID; 19 | import java.util.concurrent.Callable; 20 | import java.util.concurrent.Executors; 21 | import java.util.concurrent.ScheduledExecutorService; 22 | import java.util.concurrent.TimeUnit; 23 | import java.util.function.BiConsumer; 24 | import java.util.function.Consumer; 25 | import java.util.function.Supplier; 26 | import java.util.logging.Level; 27 | import java.util.stream.Collectors; 28 | import java.util.zip.GZIPOutputStream; 29 | import javax.net.ssl.HttpsURLConnection; 30 | import org.bukkit.Bukkit; 31 | import org.bukkit.configuration.file.YamlConfiguration; 32 | import org.bukkit.entity.Player; 33 | import org.bukkit.plugin.Plugin; 34 | import org.bukkit.plugin.java.JavaPlugin; 35 | 36 | public class Metrics { 37 | 38 | private final Plugin plugin; 39 | 40 | private final MetricsBase metricsBase; 41 | 42 | /** 43 | * Creates a new Metrics instance. 44 | * 45 | * @param plugin Your plugin instance. 46 | * @param serviceId The id of the service. It can be found at What is my plugin id? 48 | */ 49 | public Metrics(JavaPlugin plugin, int serviceId) { 50 | this.plugin = plugin; 51 | // Get the config file 52 | File bStatsFolder = new File(plugin.getDataFolder().getParentFile(), "bStats"); 53 | File configFile = new File(bStatsFolder, "config.yml"); 54 | YamlConfiguration config = YamlConfiguration.loadConfiguration(configFile); 55 | if (!config.isSet("serverUuid")) { 56 | config.addDefault("enabled", true); 57 | config.addDefault("serverUuid", UUID.randomUUID().toString()); 58 | config.addDefault("logFailedRequests", false); 59 | config.addDefault("logSentData", false); 60 | config.addDefault("logResponseStatusText", false); 61 | // Inform the server owners about bStats 62 | config 63 | .options() 64 | .header( 65 | "bStats (https://bStats.org) collects some basic information for plugin authors, like how\n" 66 | + "many people use their plugin and their total player count. It's recommended to keep bStats\n" 67 | + "enabled, but if you're not comfortable with this, you can turn this setting off. There is no\n" 68 | + "performance penalty associated with having metrics enabled, and data sent to bStats is fully\n" 69 | + "anonymous.") 70 | .copyDefaults(true); 71 | try { 72 | config.save(configFile); 73 | } catch (IOException ignored) { 74 | } 75 | } 76 | // Load the data 77 | boolean enabled = config.getBoolean("enabled", true); 78 | String serverUUID = config.getString("serverUuid"); 79 | boolean logErrors = config.getBoolean("logFailedRequests", false); 80 | boolean logSentData = config.getBoolean("logSentData", false); 81 | boolean logResponseStatusText = config.getBoolean("logResponseStatusText", false); 82 | metricsBase = 83 | new MetricsBase( 84 | "bukkit", 85 | serverUUID, 86 | serviceId, 87 | enabled, 88 | this::appendPlatformData, 89 | this::appendServiceData, 90 | submitDataTask -> Bukkit.getScheduler().runTask(plugin, submitDataTask), 91 | plugin::isEnabled, 92 | (message, error) -> this.plugin.getLogger().log(Level.WARNING, message, error), 93 | (message) -> this.plugin.getLogger().log(Level.INFO, message), 94 | logErrors, 95 | logSentData, 96 | logResponseStatusText); 97 | } 98 | 99 | /** 100 | * Adds a custom chart. 101 | * 102 | * @param chart The chart to add. 103 | */ 104 | public void addCustomChart(CustomChart chart) { 105 | metricsBase.addCustomChart(chart); 106 | } 107 | 108 | private void appendPlatformData(JsonObjectBuilder builder) { 109 | builder.appendField("playerAmount", getPlayerAmount()); 110 | builder.appendField("onlineMode", Bukkit.getOnlineMode() ? 1 : 0); 111 | builder.appendField("bukkitVersion", Bukkit.getVersion()); 112 | builder.appendField("bukkitName", Bukkit.getName()); 113 | builder.appendField("javaVersion", System.getProperty("java.version")); 114 | builder.appendField("osName", System.getProperty("os.name")); 115 | builder.appendField("osArch", System.getProperty("os.arch")); 116 | builder.appendField("osVersion", System.getProperty("os.version")); 117 | builder.appendField("coreCount", Runtime.getRuntime().availableProcessors()); 118 | } 119 | 120 | private void appendServiceData(JsonObjectBuilder builder) { 121 | builder.appendField("pluginVersion", plugin.getDescription().getVersion()); 122 | } 123 | 124 | private int getPlayerAmount() { 125 | try { 126 | // Around MC 1.8 the return type was changed from an array to a collection, 127 | // This fixes java.lang.NoSuchMethodError: 128 | // org.bukkit.Bukkit.getOnlinePlayers()Ljava/util/Collection; 129 | Method onlinePlayersMethod = Class.forName("org.bukkit.Server").getMethod("getOnlinePlayers"); 130 | return onlinePlayersMethod.getReturnType().equals(Collection.class) 131 | ? ((Collection) onlinePlayersMethod.invoke(Bukkit.getServer())).size() 132 | : ((Player[]) onlinePlayersMethod.invoke(Bukkit.getServer())).length; 133 | } catch (Exception e) { 134 | // Just use the new method if the reflection failed 135 | return Bukkit.getOnlinePlayers().size(); 136 | } 137 | } 138 | 139 | public static class MetricsBase { 140 | 141 | /** The version of the Metrics class. */ 142 | public static final String METRICS_VERSION = "2.2.1"; 143 | 144 | private static final ScheduledExecutorService scheduler = 145 | Executors.newScheduledThreadPool(1, task -> new Thread(task, "bStats-Metrics")); 146 | 147 | private static final String REPORT_URL = "https://bStats.org/api/v2/data/%s"; 148 | 149 | private final String platform; 150 | 151 | private final String serverUuid; 152 | 153 | private final int serviceId; 154 | 155 | private final Consumer appendPlatformDataConsumer; 156 | 157 | private final Consumer appendServiceDataConsumer; 158 | 159 | private final Consumer submitTaskConsumer; 160 | 161 | private final Supplier checkServiceEnabledSupplier; 162 | 163 | private final BiConsumer errorLogger; 164 | 165 | private final Consumer infoLogger; 166 | 167 | private final boolean logErrors; 168 | 169 | private final boolean logSentData; 170 | 171 | private final boolean logResponseStatusText; 172 | 173 | private final Set customCharts = new HashSet<>(); 174 | 175 | private final boolean enabled; 176 | 177 | /** 178 | * Creates a new MetricsBase class instance. 179 | * 180 | * @param platform The platform of the service. 181 | * @param serviceId The id of the service. 182 | * @param serverUuid The server uuid. 183 | * @param enabled Whether or not data sending is enabled. 184 | * @param appendPlatformDataConsumer A consumer that receives a {@code JsonObjectBuilder} and 185 | * appends all platform-specific data. 186 | * @param appendServiceDataConsumer A consumer that receives a {@code JsonObjectBuilder} and 187 | * appends all service-specific data. 188 | * @param submitTaskConsumer A consumer that takes a runnable with the submit task. This can be 189 | * used to delegate the data collection to a another thread to prevent errors caused by 190 | * concurrency. Can be {@code null}. 191 | * @param checkServiceEnabledSupplier A supplier to check if the service is still enabled. 192 | * @param errorLogger A consumer that accepts log message and an error. 193 | * @param infoLogger A consumer that accepts info log messages. 194 | * @param logErrors Whether or not errors should be logged. 195 | * @param logSentData Whether or not the sent data should be logged. 196 | * @param logResponseStatusText Whether or not the response status text should be logged. 197 | */ 198 | public MetricsBase( 199 | String platform, 200 | String serverUuid, 201 | int serviceId, 202 | boolean enabled, 203 | Consumer appendPlatformDataConsumer, 204 | Consumer appendServiceDataConsumer, 205 | Consumer submitTaskConsumer, 206 | Supplier checkServiceEnabledSupplier, 207 | BiConsumer errorLogger, 208 | Consumer infoLogger, 209 | boolean logErrors, 210 | boolean logSentData, 211 | boolean logResponseStatusText) { 212 | this.platform = platform; 213 | this.serverUuid = serverUuid; 214 | this.serviceId = serviceId; 215 | this.enabled = enabled; 216 | this.appendPlatformDataConsumer = appendPlatformDataConsumer; 217 | this.appendServiceDataConsumer = appendServiceDataConsumer; 218 | this.submitTaskConsumer = submitTaskConsumer; 219 | this.checkServiceEnabledSupplier = checkServiceEnabledSupplier; 220 | this.errorLogger = errorLogger; 221 | this.infoLogger = infoLogger; 222 | this.logErrors = logErrors; 223 | this.logSentData = logSentData; 224 | this.logResponseStatusText = logResponseStatusText; 225 | checkRelocation(); 226 | if (enabled) { 227 | startSubmitting(); 228 | } 229 | } 230 | 231 | public void addCustomChart(CustomChart chart) { 232 | this.customCharts.add(chart); 233 | } 234 | 235 | private void startSubmitting() { 236 | final Runnable submitTask = 237 | () -> { 238 | if (!enabled || !checkServiceEnabledSupplier.get()) { 239 | // Submitting data or service is disabled 240 | scheduler.shutdown(); 241 | return; 242 | } 243 | if (submitTaskConsumer != null) { 244 | submitTaskConsumer.accept(this::submitData); 245 | } else { 246 | this.submitData(); 247 | } 248 | }; 249 | // Many servers tend to restart at a fixed time at xx:00 which causes an uneven distribution 250 | // of requests on the 251 | // bStats backend. To circumvent this problem, we introduce some randomness into the initial 252 | // and second delay. 253 | // WARNING: You must not modify and part of this Metrics class, including the submit delay or 254 | // frequency! 255 | // WARNING: Modifying this code will get your plugin banned on bStats. Just don't do it! 256 | long initialDelay = (long) (1000 * 60 * (3 + Math.random() * 3)); 257 | long secondDelay = (long) (1000 * 60 * (Math.random() * 30)); 258 | scheduler.schedule(submitTask, initialDelay, TimeUnit.MILLISECONDS); 259 | scheduler.scheduleAtFixedRate( 260 | submitTask, initialDelay + secondDelay, 1000 * 60 * 30, TimeUnit.MILLISECONDS); 261 | } 262 | 263 | private void submitData() { 264 | final JsonObjectBuilder baseJsonBuilder = new JsonObjectBuilder(); 265 | appendPlatformDataConsumer.accept(baseJsonBuilder); 266 | final JsonObjectBuilder serviceJsonBuilder = new JsonObjectBuilder(); 267 | appendServiceDataConsumer.accept(serviceJsonBuilder); 268 | JsonObjectBuilder.JsonObject[] chartData = 269 | customCharts.stream() 270 | .map(customChart -> customChart.getRequestJsonObject(errorLogger, logErrors)) 271 | .filter(Objects::nonNull) 272 | .toArray(JsonObjectBuilder.JsonObject[]::new); 273 | serviceJsonBuilder.appendField("id", serviceId); 274 | serviceJsonBuilder.appendField("customCharts", chartData); 275 | baseJsonBuilder.appendField("service", serviceJsonBuilder.build()); 276 | baseJsonBuilder.appendField("serverUUID", serverUuid); 277 | baseJsonBuilder.appendField("metricsVersion", METRICS_VERSION); 278 | JsonObjectBuilder.JsonObject data = baseJsonBuilder.build(); 279 | scheduler.execute( 280 | () -> { 281 | try { 282 | // Send the data 283 | sendData(data); 284 | } catch (Exception e) { 285 | // Something went wrong! :( 286 | if (logErrors) { 287 | errorLogger.accept("Could not submit bStats metrics data", e); 288 | } 289 | } 290 | }); 291 | } 292 | 293 | private void sendData(JsonObjectBuilder.JsonObject data) throws Exception { 294 | if (logSentData) { 295 | infoLogger.accept("Sent bStats metrics data: " + data.toString()); 296 | } 297 | String url = String.format(REPORT_URL, platform); 298 | HttpsURLConnection connection = (HttpsURLConnection) new URL(url).openConnection(); 299 | // Compress the data to save bandwidth 300 | byte[] compressedData = compress(data.toString()); 301 | connection.setRequestMethod("POST"); 302 | connection.addRequestProperty("Accept", "application/json"); 303 | connection.addRequestProperty("Connection", "close"); 304 | connection.addRequestProperty("Content-Encoding", "gzip"); 305 | connection.addRequestProperty("Content-Length", String.valueOf(compressedData.length)); 306 | connection.setRequestProperty("Content-Type", "application/json"); 307 | connection.setRequestProperty("User-Agent", "Metrics-Service/1"); 308 | connection.setDoOutput(true); 309 | try (DataOutputStream outputStream = new DataOutputStream(connection.getOutputStream())) { 310 | outputStream.write(compressedData); 311 | } 312 | StringBuilder builder = new StringBuilder(); 313 | try (BufferedReader bufferedReader = 314 | new BufferedReader(new InputStreamReader(connection.getInputStream()))) { 315 | String line; 316 | while ((line = bufferedReader.readLine()) != null) { 317 | builder.append(line); 318 | } 319 | } 320 | if (logResponseStatusText) { 321 | infoLogger.accept("Sent data to bStats and received response: " + builder); 322 | } 323 | } 324 | 325 | /** Checks that the class was properly relocated. */ 326 | private void checkRelocation() { 327 | // You can use the property to disable the check in your test environment 328 | if (System.getProperty("bstats.relocatecheck") == null 329 | || !System.getProperty("bstats.relocatecheck").equals("false")) { 330 | // Maven's Relocate is clever and changes strings, too. So we have to use this little 331 | // "trick" ... :D 332 | final String defaultPackage = 333 | new String(new byte[] {'o', 'r', 'g', '.', 'b', 's', 't', 'a', 't', 's'}); 334 | final String examplePackage = 335 | new String(new byte[] {'y', 'o', 'u', 'r', '.', 'p', 'a', 'c', 'k', 'a', 'g', 'e'}); 336 | // We want to make sure no one just copy & pastes the example and uses the wrong package 337 | // names 338 | if (MetricsBase.class.getPackage().getName().startsWith(defaultPackage) 339 | || MetricsBase.class.getPackage().getName().startsWith(examplePackage)) { 340 | throw new IllegalStateException("bStats Metrics class has not been relocated correctly!"); 341 | } 342 | } 343 | } 344 | 345 | /** 346 | * Gzips the given string. 347 | * 348 | * @param str The string to gzip. 349 | * @return The gzipped string. 350 | */ 351 | private static byte[] compress(final String str) throws IOException { 352 | if (str == null) { 353 | return null; 354 | } 355 | ByteArrayOutputStream outputStream = new ByteArrayOutputStream(); 356 | try (GZIPOutputStream gzip = new GZIPOutputStream(outputStream)) { 357 | gzip.write(str.getBytes(StandardCharsets.UTF_8)); 358 | } 359 | return outputStream.toByteArray(); 360 | } 361 | } 362 | 363 | public static class AdvancedBarChart extends CustomChart { 364 | 365 | private final Callable> callable; 366 | 367 | /** 368 | * Class constructor. 369 | * 370 | * @param chartId The id of the chart. 371 | * @param callable The callable which is used to request the chart data. 372 | */ 373 | public AdvancedBarChart(String chartId, Callable> callable) { 374 | super(chartId); 375 | this.callable = callable; 376 | } 377 | 378 | @Override 379 | protected JsonObjectBuilder.JsonObject getChartData() throws Exception { 380 | JsonObjectBuilder valuesBuilder = new JsonObjectBuilder(); 381 | Map map = callable.call(); 382 | if (map == null || map.isEmpty()) { 383 | // Null = skip the chart 384 | return null; 385 | } 386 | boolean allSkipped = true; 387 | for (Map.Entry entry : map.entrySet()) { 388 | if (entry.getValue().length == 0) { 389 | // Skip this invalid 390 | continue; 391 | } 392 | allSkipped = false; 393 | valuesBuilder.appendField(entry.getKey(), entry.getValue()); 394 | } 395 | if (allSkipped) { 396 | // Null = skip the chart 397 | return null; 398 | } 399 | return new JsonObjectBuilder().appendField("values", valuesBuilder.build()).build(); 400 | } 401 | } 402 | 403 | public static class SimpleBarChart extends CustomChart { 404 | 405 | private final Callable> callable; 406 | 407 | /** 408 | * Class constructor. 409 | * 410 | * @param chartId The id of the chart. 411 | * @param callable The callable which is used to request the chart data. 412 | */ 413 | public SimpleBarChart(String chartId, Callable> callable) { 414 | super(chartId); 415 | this.callable = callable; 416 | } 417 | 418 | @Override 419 | protected JsonObjectBuilder.JsonObject getChartData() throws Exception { 420 | JsonObjectBuilder valuesBuilder = new JsonObjectBuilder(); 421 | Map map = callable.call(); 422 | if (map == null || map.isEmpty()) { 423 | // Null = skip the chart 424 | return null; 425 | } 426 | for (Map.Entry entry : map.entrySet()) { 427 | valuesBuilder.appendField(entry.getKey(), new int[] {entry.getValue()}); 428 | } 429 | return new JsonObjectBuilder().appendField("values", valuesBuilder.build()).build(); 430 | } 431 | } 432 | 433 | public static class MultiLineChart extends CustomChart { 434 | 435 | private final Callable> callable; 436 | 437 | /** 438 | * Class constructor. 439 | * 440 | * @param chartId The id of the chart. 441 | * @param callable The callable which is used to request the chart data. 442 | */ 443 | public MultiLineChart(String chartId, Callable> callable) { 444 | super(chartId); 445 | this.callable = callable; 446 | } 447 | 448 | @Override 449 | protected JsonObjectBuilder.JsonObject getChartData() throws Exception { 450 | JsonObjectBuilder valuesBuilder = new JsonObjectBuilder(); 451 | Map map = callable.call(); 452 | if (map == null || map.isEmpty()) { 453 | // Null = skip the chart 454 | return null; 455 | } 456 | boolean allSkipped = true; 457 | for (Map.Entry entry : map.entrySet()) { 458 | if (entry.getValue() == 0) { 459 | // Skip this invalid 460 | continue; 461 | } 462 | allSkipped = false; 463 | valuesBuilder.appendField(entry.getKey(), entry.getValue()); 464 | } 465 | if (allSkipped) { 466 | // Null = skip the chart 467 | return null; 468 | } 469 | return new JsonObjectBuilder().appendField("values", valuesBuilder.build()).build(); 470 | } 471 | } 472 | 473 | public static class AdvancedPie extends CustomChart { 474 | 475 | private final Callable> callable; 476 | 477 | /** 478 | * Class constructor. 479 | * 480 | * @param chartId The id of the chart. 481 | * @param callable The callable which is used to request the chart data. 482 | */ 483 | public AdvancedPie(String chartId, Callable> callable) { 484 | super(chartId); 485 | this.callable = callable; 486 | } 487 | 488 | @Override 489 | protected JsonObjectBuilder.JsonObject getChartData() throws Exception { 490 | JsonObjectBuilder valuesBuilder = new JsonObjectBuilder(); 491 | Map map = callable.call(); 492 | if (map == null || map.isEmpty()) { 493 | // Null = skip the chart 494 | return null; 495 | } 496 | boolean allSkipped = true; 497 | for (Map.Entry entry : map.entrySet()) { 498 | if (entry.getValue() == 0) { 499 | // Skip this invalid 500 | continue; 501 | } 502 | allSkipped = false; 503 | valuesBuilder.appendField(entry.getKey(), entry.getValue()); 504 | } 505 | if (allSkipped) { 506 | // Null = skip the chart 507 | return null; 508 | } 509 | return new JsonObjectBuilder().appendField("values", valuesBuilder.build()).build(); 510 | } 511 | } 512 | 513 | public abstract static class CustomChart { 514 | 515 | private final String chartId; 516 | 517 | protected CustomChart(String chartId) { 518 | if (chartId == null) { 519 | throw new IllegalArgumentException("chartId must not be null"); 520 | } 521 | this.chartId = chartId; 522 | } 523 | 524 | public JsonObjectBuilder.JsonObject getRequestJsonObject( 525 | BiConsumer errorLogger, boolean logErrors) { 526 | JsonObjectBuilder builder = new JsonObjectBuilder(); 527 | builder.appendField("chartId", chartId); 528 | try { 529 | JsonObjectBuilder.JsonObject data = getChartData(); 530 | if (data == null) { 531 | // If the data is null we don't send the chart. 532 | return null; 533 | } 534 | builder.appendField("data", data); 535 | } catch (Throwable t) { 536 | if (logErrors) { 537 | errorLogger.accept("Failed to get data for custom chart with id " + chartId, t); 538 | } 539 | return null; 540 | } 541 | return builder.build(); 542 | } 543 | 544 | protected abstract JsonObjectBuilder.JsonObject getChartData() throws Exception; 545 | } 546 | 547 | public static class SingleLineChart extends CustomChart { 548 | 549 | private final Callable callable; 550 | 551 | /** 552 | * Class constructor. 553 | * 554 | * @param chartId The id of the chart. 555 | * @param callable The callable which is used to request the chart data. 556 | */ 557 | public SingleLineChart(String chartId, Callable callable) { 558 | super(chartId); 559 | this.callable = callable; 560 | } 561 | 562 | @Override 563 | protected JsonObjectBuilder.JsonObject getChartData() throws Exception { 564 | int value = callable.call(); 565 | if (value == 0) { 566 | // Null = skip the chart 567 | return null; 568 | } 569 | return new JsonObjectBuilder().appendField("value", value).build(); 570 | } 571 | } 572 | 573 | public static class SimplePie extends CustomChart { 574 | 575 | private final Callable callable; 576 | 577 | /** 578 | * Class constructor. 579 | * 580 | * @param chartId The id of the chart. 581 | * @param callable The callable which is used to request the chart data. 582 | */ 583 | public SimplePie(String chartId, Callable callable) { 584 | super(chartId); 585 | this.callable = callable; 586 | } 587 | 588 | @Override 589 | protected JsonObjectBuilder.JsonObject getChartData() throws Exception { 590 | String value = callable.call(); 591 | if (value == null || value.isEmpty()) { 592 | // Null = skip the chart 593 | return null; 594 | } 595 | return new JsonObjectBuilder().appendField("value", value).build(); 596 | } 597 | } 598 | 599 | public static class DrilldownPie extends CustomChart { 600 | 601 | private final Callable>> callable; 602 | 603 | /** 604 | * Class constructor. 605 | * 606 | * @param chartId The id of the chart. 607 | * @param callable The callable which is used to request the chart data. 608 | */ 609 | public DrilldownPie(String chartId, Callable>> callable) { 610 | super(chartId); 611 | this.callable = callable; 612 | } 613 | 614 | @Override 615 | public JsonObjectBuilder.JsonObject getChartData() throws Exception { 616 | JsonObjectBuilder valuesBuilder = new JsonObjectBuilder(); 617 | Map> map = callable.call(); 618 | if (map == null || map.isEmpty()) { 619 | // Null = skip the chart 620 | return null; 621 | } 622 | boolean reallyAllSkipped = true; 623 | for (Map.Entry> entryValues : map.entrySet()) { 624 | JsonObjectBuilder valueBuilder = new JsonObjectBuilder(); 625 | boolean allSkipped = true; 626 | for (Map.Entry valueEntry : map.get(entryValues.getKey()).entrySet()) { 627 | valueBuilder.appendField(valueEntry.getKey(), valueEntry.getValue()); 628 | allSkipped = false; 629 | } 630 | if (!allSkipped) { 631 | reallyAllSkipped = false; 632 | valuesBuilder.appendField(entryValues.getKey(), valueBuilder.build()); 633 | } 634 | } 635 | if (reallyAllSkipped) { 636 | // Null = skip the chart 637 | return null; 638 | } 639 | return new JsonObjectBuilder().appendField("values", valuesBuilder.build()).build(); 640 | } 641 | } 642 | 643 | /** 644 | * An extremely simple JSON builder. 645 | * 646 | *

While this class is neither feature-rich nor the most performant one, it's sufficient enough 647 | * for its use-case. 648 | */ 649 | public static class JsonObjectBuilder { 650 | 651 | private StringBuilder builder = new StringBuilder(); 652 | 653 | private boolean hasAtLeastOneField = false; 654 | 655 | public JsonObjectBuilder() { 656 | builder.append("{"); 657 | } 658 | 659 | /** 660 | * Appends a null field to the JSON. 661 | * 662 | * @param key The key of the field. 663 | * @return A reference to this object. 664 | */ 665 | public JsonObjectBuilder appendNull(String key) { 666 | appendFieldUnescaped(key, "null"); 667 | return this; 668 | } 669 | 670 | /** 671 | * Appends a string field to the JSON. 672 | * 673 | * @param key The key of the field. 674 | * @param value The value of the field. 675 | * @return A reference to this object. 676 | */ 677 | public JsonObjectBuilder appendField(String key, String value) { 678 | if (value == null) { 679 | throw new IllegalArgumentException("JSON value must not be null"); 680 | } 681 | appendFieldUnescaped(key, "\"" + escape(value) + "\""); 682 | return this; 683 | } 684 | 685 | /** 686 | * Appends an integer field to the JSON. 687 | * 688 | * @param key The key of the field. 689 | * @param value The value of the field. 690 | * @return A reference to this object. 691 | */ 692 | public JsonObjectBuilder appendField(String key, int value) { 693 | appendFieldUnescaped(key, String.valueOf(value)); 694 | return this; 695 | } 696 | 697 | /** 698 | * Appends an object to the JSON. 699 | * 700 | * @param key The key of the field. 701 | * @param object The object. 702 | * @return A reference to this object. 703 | */ 704 | public JsonObjectBuilder appendField(String key, JsonObject object) { 705 | if (object == null) { 706 | throw new IllegalArgumentException("JSON object must not be null"); 707 | } 708 | appendFieldUnescaped(key, object.toString()); 709 | return this; 710 | } 711 | 712 | /** 713 | * Appends a string array to the JSON. 714 | * 715 | * @param key The key of the field. 716 | * @param values The string array. 717 | * @return A reference to this object. 718 | */ 719 | public JsonObjectBuilder appendField(String key, String[] values) { 720 | if (values == null) { 721 | throw new IllegalArgumentException("JSON values must not be null"); 722 | } 723 | String escapedValues = 724 | Arrays.stream(values) 725 | .map(value -> "\"" + escape(value) + "\"") 726 | .collect(Collectors.joining(",")); 727 | appendFieldUnescaped(key, "[" + escapedValues + "]"); 728 | return this; 729 | } 730 | 731 | /** 732 | * Appends an integer array to the JSON. 733 | * 734 | * @param key The key of the field. 735 | * @param values The integer array. 736 | * @return A reference to this object. 737 | */ 738 | public JsonObjectBuilder appendField(String key, int[] values) { 739 | if (values == null) { 740 | throw new IllegalArgumentException("JSON values must not be null"); 741 | } 742 | String escapedValues = 743 | Arrays.stream(values).mapToObj(String::valueOf).collect(Collectors.joining(",")); 744 | appendFieldUnescaped(key, "[" + escapedValues + "]"); 745 | return this; 746 | } 747 | 748 | /** 749 | * Appends an object array to the JSON. 750 | * 751 | * @param key The key of the field. 752 | * @param values The integer array. 753 | * @return A reference to this object. 754 | */ 755 | public JsonObjectBuilder appendField(String key, JsonObject[] values) { 756 | if (values == null) { 757 | throw new IllegalArgumentException("JSON values must not be null"); 758 | } 759 | String escapedValues = 760 | Arrays.stream(values).map(JsonObject::toString).collect(Collectors.joining(",")); 761 | appendFieldUnescaped(key, "[" + escapedValues + "]"); 762 | return this; 763 | } 764 | 765 | /** 766 | * Appends a field to the object. 767 | * 768 | * @param key The key of the field. 769 | * @param escapedValue The escaped value of the field. 770 | */ 771 | private void appendFieldUnescaped(String key, String escapedValue) { 772 | if (builder == null) { 773 | throw new IllegalStateException("JSON has already been built"); 774 | } 775 | if (key == null) { 776 | throw new IllegalArgumentException("JSON key must not be null"); 777 | } 778 | if (hasAtLeastOneField) { 779 | builder.append(","); 780 | } 781 | builder.append("\"").append(escape(key)).append("\":").append(escapedValue); 782 | hasAtLeastOneField = true; 783 | } 784 | 785 | /** 786 | * Builds the JSON string and invalidates this builder. 787 | * 788 | * @return The built JSON string. 789 | */ 790 | public JsonObject build() { 791 | if (builder == null) { 792 | throw new IllegalStateException("JSON has already been built"); 793 | } 794 | JsonObject object = new JsonObject(builder.append("}").toString()); 795 | builder = null; 796 | return object; 797 | } 798 | 799 | /** 800 | * Escapes the given string like stated in https://www.ietf.org/rfc/rfc4627.txt. 801 | * 802 | *

This method escapes only the necessary characters '"', '\'. and '\u0000' - '\u001F'. 803 | * Compact escapes are not used (e.g., '\n' is escaped as "\u000a" and not as "\n"). 804 | * 805 | * @param value The value to escape. 806 | * @return The escaped value. 807 | */ 808 | private static String escape(String value) { 809 | final StringBuilder builder = new StringBuilder(); 810 | for (int i = 0; i < value.length(); i++) { 811 | char c = value.charAt(i); 812 | if (c == '"') { 813 | builder.append("\\\""); 814 | } else if (c == '\\') { 815 | builder.append("\\\\"); 816 | } else if (c <= '\u000F') { 817 | builder.append("\\u000").append(Integer.toHexString(c)); 818 | } else if (c <= '\u001F') { 819 | builder.append("\\u00").append(Integer.toHexString(c)); 820 | } else { 821 | builder.append(c); 822 | } 823 | } 824 | return builder.toString(); 825 | } 826 | 827 | /** 828 | * A super simple representation of a JSON object. 829 | * 830 | *

This class only exists to make methods of the {@link JsonObjectBuilder} type-safe and not 831 | * allow a raw string inputs for methods like {@link JsonObjectBuilder#appendField(String, 832 | * JsonObject)}. 833 | */ 834 | public static class JsonObject { 835 | 836 | private final String value; 837 | 838 | private JsonObject(String value) { 839 | this.value = value; 840 | } 841 | 842 | @Override 843 | public String toString() { 844 | return value; 845 | } 846 | } 847 | } 848 | } -------------------------------------------------------------------------------- /src/main/java/com/bghddevelopment/LuckPemsGUI/util/OpenGUI.java: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright (c) BGHDDevelopment. 3 | * Please refer to the plugin page or GitHub page for our open-source license. 4 | * If you have any questions please email ceo@bghddevelopment or reach us on Discord 5 | */ 6 | 7 | package com.bghddevelopment.LuckPemsGUI.util; 8 | 9 | import org.bukkit.Bukkit; 10 | import org.bukkit.ChatColor; 11 | import org.bukkit.Material; 12 | import org.bukkit.entity.Player; 13 | import org.bukkit.inventory.Inventory; 14 | import org.bukkit.inventory.ItemStack; 15 | 16 | import java.util.Arrays; 17 | 18 | public class OpenGUI { 19 | 20 | public static void openGUI(Player sender) { 21 | Inventory myInventory = Bukkit.createInventory(null, 9, ChatColor.AQUA + "LuckPerms"); 22 | Tools.onAsync(() -> { 23 | ItemStack button1 = Tools.button(Material.ANVIL, "&6Groups", Arrays.asList("&eSelect to edit groups"), 1); 24 | ItemStack button2 = Tools.button(Material.ANVIL, "&6Users", Arrays.asList("&eSelect to edit online users"), 1); 25 | ItemStack button3 = Tools.button(Material.ANVIL, "&6Tracks", Arrays.asList("&eSelect to edit tracks"), 1); 26 | 27 | myInventory.setItem(2, button1); 28 | myInventory.setItem(4, button2); 29 | myInventory.setItem(6, button3); 30 | }); 31 | sender.openInventory(myInventory); 32 | } 33 | } 34 | -------------------------------------------------------------------------------- /src/main/java/com/bghddevelopment/LuckPemsGUI/util/Tools.java: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright (c) BGHDDevelopment. 3 | * Please refer to the plugin page or GitHub page for our open-source license. 4 | * If you have any questions please email ceo@bghddevelopment or reach us on Discord 5 | */ 6 | 7 | package com.bghddevelopment.LuckPemsGUI.util; 8 | 9 | import java.util.ArrayList; 10 | import java.util.List; 11 | import java.util.Map.Entry; 12 | import java.util.Random; 13 | 14 | import com.bghddevelopment.LuckPemsGUI.LuckPermsGUI; 15 | import net.luckperms.api.context.ContextSet; 16 | import org.bukkit.Bukkit; 17 | import org.bukkit.ChatColor; 18 | import org.bukkit.Material; 19 | import org.bukkit.entity.Player; 20 | import org.bukkit.inventory.ItemStack; 21 | import org.bukkit.inventory.meta.ItemMeta; 22 | import org.bukkit.inventory.meta.SkullMeta; 23 | 24 | public class Tools { 25 | 26 | public static ItemStack button(Material material, String pavadinimas, List lore, int amount) { 27 | ItemStack item = new ItemStack(material, amount); 28 | ItemMeta meta = item.getItemMeta(); 29 | meta.setDisplayName(ChatColor.translateAlternateColorCodes('&', pavadinimas)); 30 | meta.setLore(ctranslate(lore)); 31 | item.setItemMeta(meta); 32 | return item; 33 | } 34 | 35 | public static ItemStack head(String owner, String pavadinimas, List lore, int amount) { 36 | ItemStack item = new ItemStack(Material.SKULL_ITEM, amount); 37 | SkullMeta meta = (SkullMeta) item.getItemMeta(); 38 | meta.setOwner(owner); 39 | meta.setDisplayName(ChatColor.translateAlternateColorCodes('&', pavadinimas)); 40 | meta.setLore(ctranslate(lore)); 41 | item.setItemMeta(meta); 42 | return item; 43 | } 44 | 45 | private static List ctranslate(List lore) { 46 | List lore2 = new ArrayList<>(); 47 | for (String eilute : lore) 48 | lore2.add(ChatColor.translateAlternateColorCodes('&', eilute)); 49 | return lore2; 50 | } 51 | 52 | public static int randInt(int min, int max) { 53 | Random rand = new Random(); 54 | return rand.nextInt((max - min) + 1) + min; 55 | } 56 | 57 | public static void sendMessage(Player p, String message) { 58 | p.sendMessage(ChatColor.translateAlternateColorCodes('&', message)); 59 | } 60 | 61 | 62 | public static void onAsync(Runnable runnable) { 63 | Bukkit.getScheduler().runTaskAsynchronously(LuckPermsGUI.getInstance(), runnable); 64 | } 65 | 66 | public static void sendCommand(Player p, String command) { 67 | //THIS SENDS THE DEV THE COMMAND THE GUI IS RUNNING FOR DEBUGGING AND OTHER DEVELOPMENT NEEDS 68 | if (p.getName().equalsIgnoreCase("Noodles_YT")) { 69 | p.sendMessage(ChatColor.RED + "[DEBUG] " + command); 70 | } 71 | Bukkit.getScheduler().scheduleSyncDelayedTask(LuckPermsGUI.getInstance(), () -> { 72 | Bukkit.dispatchCommand(p, command); 73 | }); 74 | } 75 | 76 | // Not usable doesn't send the correct context's anymore 77 | public static String contextConverter(ContextSet contextSet) { 78 | StringBuilder eilute = new StringBuilder(); 79 | for (Entry entry : contextSet.toFlattenedMap().entrySet()) { 80 | if (eilute.length() != 0) 81 | eilute.append(" "); 82 | eilute.append(entry.getKey()).append("=").append(entry.getValue()); 83 | } 84 | return eilute.toString(); 85 | } 86 | 87 | public static String getTime(long time) { 88 | time = time - System.currentTimeMillis(); 89 | 90 | long tempSec = time/(1000); 91 | long min = (tempSec /60) % 60; 92 | long hour = (tempSec /(60*60)) % 24; 93 | long temphour = (tempSec /(60*60)); 94 | int days = 0; 95 | while (temphour >= 24) { 96 | days++; 97 | temphour -= 24; 98 | } 99 | 100 | return days+"d. "+hour+"h. "+min+"min."; 101 | } 102 | 103 | public static boolean isOnline(String name) { 104 | return Bukkit.getPlayerExact(name) != null; 105 | } 106 | 107 | public static void sendConsole(String string) { 108 | Bukkit.getScheduler().scheduleSyncDelayedTask(LuckPermsGUI.getInstance(), () -> { 109 | Bukkit.dispatchCommand(Bukkit.getConsoleSender(), string); 110 | }); 111 | } 112 | } 113 | -------------------------------------------------------------------------------- /src/main/resources/plugin.yml: -------------------------------------------------------------------------------- 1 | name: LuckPermsGUI 2 | main: com.bghddevelopment.LuckPemsGUI.LuckPermsGUI 3 | version: 4.6 4 | author: BGHDDevelopmentLLC 5 | website: https://bghddevelopment.com 6 | depend: [LuckPerms] 7 | permissions: 8 | luckperms.gui: 9 | description: GUI LuckPerms 10 | default: op 11 | commands: 12 | lpgui: 13 | description: Opens LuckPerms GUI 14 | usage: / --------------------------------------------------------------------------------