From ab6c20b447e956e13883c2757f7692cea9c2ea85 Mon Sep 17 00:00:00 2001 From: Xyntexx Date: Wed, 17 Mar 2021 00:07:33 +0200 Subject: [PATCH] feat: check for required role at startup --- .../uk/co/angrybee/joe/DiscordClient.java | 181 ++++++++++++------ .../co/angrybee/joe/DiscordWhitelister.java | 14 +- 2 files changed, 122 insertions(+), 73 deletions(-) diff --git a/src/main/java/uk/co/angrybee/joe/DiscordClient.java b/src/main/java/uk/co/angrybee/joe/DiscordClient.java index b55444c..4e15491 100644 --- a/src/main/java/uk/co/angrybee/joe/DiscordClient.java +++ b/src/main/java/uk/co/angrybee/joe/DiscordClient.java @@ -1206,74 +1206,133 @@ public class DiscordClient extends ListenerAdapter } } - public static void StartUpMemberCheck() throws IOException - { - if(!MainConfig.getMainConfig().getBoolean("un-whitelist-on-server-leave")) - return; + public static void RequiredRoleStartupCheck() { + try { + if (!checkForMissingRole) + return; - // Don't attempt to remove members if not connected - if(javaDiscordAPI.getStatus() != JDA.Status.CONNECTED) - return; - - DiscordWhitelister.getPluginLogger().info("Checking Discord IDs for leavers..."); - - Yaml idYaml = new Yaml(); - UserList.SaveStore(); - InputStream inputStream = new FileInputStream(UserList.getUserListFile()); - - PushbackInputStream pushbackInputStream = new PushbackInputStream(inputStream); - int b = pushbackInputStream.read(); - - if(b == -1) - return; - else - pushbackInputStream.unread(b); - - Map> userObject = idYaml.load(pushbackInputStream); - - for(Map.Entry> entry : userObject.entrySet()) - { - // Check if the ID is in any guilds - boolean inGuild = false; - - // Check all guilds - for(int i = 0; i < javaDiscordAPI.getGuilds().size(); i++) - { - if(javaDiscordAPI.getGuilds().get(i).getMemberById(entry.getKey()) != null) - inGuild = true; + if (roleToCheck == null || roleToCheck.equals("")) { + DiscordWhitelister.getPluginLogger().warning("'un-whitelist-if-missing-role' is enabled but " + + "'role-to-check-for' is null or empty, please double check the config"); + return; } - // un-whitelist associated minecraft usernames if not in any guilds - if(!inGuild) - { - for(int i = 0; i < entry.getValue().size(); i++) - { - // un-whitelist - if(!WhitelistedPlayers.usingEasyWhitelist) - { - DiscordClient.ExecuteServerCommand("whitelist remove " + entry.getValue().get(i)); + DiscordWhitelister.getPluginLogger().info("Checking Discord IDs for required roles..."); + + Yaml idYaml = new Yaml(); + UserList.SaveStore(); + InputStream inputStream = new FileInputStream(UserList.getUserListFile()); + + PushbackInputStream pushbackInputStream = new PushbackInputStream(inputStream); + int b = pushbackInputStream.read(); + + if (b == -1) + return; + else + pushbackInputStream.unread(b); + + Map> userObject = idYaml.load(pushbackInputStream); + + for (Map.Entry> entry : userObject.entrySet()) { + // Check if the ID is in any guilds + boolean hasRole = false; + + // Check all guilds + boolean requiredRole = false; + for (int i = 0; i < javaDiscordAPI.getGuilds().size(); i++) { + Member member = javaDiscordAPI.getGuilds().get(i).getMemberById(entry.getKey()); + if (member != null) { + for (Role role : member.getRoles()) { + if (role.getId().equals(roleToCheck)) { + requiredRole = true; + break; + } + } } - else - { - DiscordClient.ExecuteServerCommand("easywl remove " + entry.getValue().get(i)); - } - //remove permissions - RemovePerms(entry.getValue().get(i)); - DiscordWhitelister.getPluginLogger().info("Removed " + entry.getValue().get(i) - + " from the whitelist as Discord ID: " + entry.getKey() + " has left the server."); } - - // Clear entries in user-list - if(userObject.get(entry.getKey()) != null) - { - UserList.getUserList().set(entry.getKey(), null); - - UserList.SaveStore(); - - DiscordWhitelister.getPlugin().getLogger().info("Discord ID: " + entry.getKey() - + " left. Successfully removed their whitelisted entries from the user list."); + if (!requiredRole) { + for (int i = 0; i < entry.getValue().size(); i++) { + // un-whitelist + if (!WhitelistedPlayers.usingEasyWhitelist) { + DiscordClient.ExecuteServerCommand("whitelist remove " + entry.getValue().get(i)); + } else { + DiscordClient.ExecuteServerCommand("easywl remove " + entry.getValue().get(i)); + } + //remove permissions + RemovePerms(entry.getValue().get(i)); + DiscordWhitelister.getPluginLogger().info("Removed " + entry.getValue().get(i) + + " from the whitelist as Discord ID: " + entry.getKey() + " due to missing required role (" + roleToCheck + ")."); + } } } + } catch (IOException e) { + e.printStackTrace(); + } + } + + public static void ServerLeaveStartupCheck() { + try { + if (MainConfig.getMainConfig().getBoolean("un-whitelist-on-server-leave")) { + + // Don't attempt to remove members if not connected + if (javaDiscordAPI.getStatus() != JDA.Status.CONNECTED) + return; + + DiscordWhitelister.getPluginLogger().info("Checking Discord IDs for leavers..."); + + Yaml idYaml = new Yaml(); + UserList.SaveStore(); + InputStream inputStream = new FileInputStream(UserList.getUserListFile()); + + PushbackInputStream pushbackInputStream = new PushbackInputStream(inputStream); + int b = pushbackInputStream.read(); + + if (b == -1) + return; + else + pushbackInputStream.unread(b); + + Map> userObject = idYaml.load(pushbackInputStream); + + for (Map.Entry> entry : userObject.entrySet()) { + // Check if the ID is in any guilds + boolean inGuild = false; + + // Check all guilds + for (int i = 0; i < javaDiscordAPI.getGuilds().size(); i++) { + if (javaDiscordAPI.getGuilds().get(i).getMemberById(entry.getKey()) != null) + inGuild = true; + } + + // un-whitelist associated minecraft usernames if not in any guilds + if (!inGuild) { + for (int i = 0; i < entry.getValue().size(); i++) { + // un-whitelist + if (!WhitelistedPlayers.usingEasyWhitelist) { + DiscordClient.ExecuteServerCommand("whitelist remove " + entry.getValue().get(i)); + } else { + DiscordClient.ExecuteServerCommand("easywl remove " + entry.getValue().get(i)); + } + //remove permissions + RemovePerms(entry.getValue().get(i)); + DiscordWhitelister.getPluginLogger().info("Removed " + entry.getValue().get(i) + + " from the whitelist as Discord ID: " + entry.getKey() + " has left the server."); + } + + // Clear entries in user-list + if (userObject.get(entry.getKey()) != null) { + UserList.getUserList().set(entry.getKey(), null); + + UserList.SaveStore(); + + DiscordWhitelister.getPlugin().getLogger().info("Discord ID: " + entry.getKey() + + " left. Successfully removed their whitelisted entries from the user list."); + } + } + } + } + } catch (IOException e) { + e.printStackTrace(); } } diff --git a/src/main/java/uk/co/angrybee/joe/DiscordWhitelister.java b/src/main/java/uk/co/angrybee/joe/DiscordWhitelister.java index aa74f52..f937a9a 100755 --- a/src/main/java/uk/co/angrybee/joe/DiscordWhitelister.java +++ b/src/main/java/uk/co/angrybee/joe/DiscordWhitelister.java @@ -15,7 +15,6 @@ import uk.co.angrybee.joe.stores.RemovedList; import uk.co.angrybee.joe.stores.UserList; import uk.co.angrybee.joe.stores.WhitelistedPlayers; -import java.io.IOException; import java.util.List; import java.util.logging.Logger; @@ -69,17 +68,8 @@ public class DiscordWhitelister extends JavaPlugin } // Check for leavers if enabled - if(MainConfig.getMainConfig().getBoolean("un-whitelist-on-server-leave")) - { - try - { - DiscordClient.StartUpMemberCheck(); - } - catch (IOException e) - { - e.printStackTrace(); - } - } + DiscordClient.ServerLeaveStartupCheck(); + DiscordClient.RequiredRoleStartupCheck(); this.getCommand("discordwhitelister").setExecutor(new CommandStatus()); this.getCommand("discordwhitelisterabout").setExecutor(new CommandAbout());