Skip to content

Commit

Permalink
feat: add ability to test for all limited roles
Browse files Browse the repository at this point in the history
  • Loading branch information
Xyntexx committed Mar 17, 2021
1 parent dad5e86 commit 579c991
Show file tree
Hide file tree
Showing 2 changed files with 98 additions and 4 deletions.
100 changes: 96 additions & 4 deletions src/main/java/uk/co/angrybee/joe/DiscordClient.java
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,7 @@
import net.dv8tion.jda.api.utils.ChunkingFilter;
import net.dv8tion.jda.api.utils.MemberCachePolicy;
import net.dv8tion.jda.api.utils.cache.CacheFlag;
import org.apache.commons.lang3.ArrayUtils;
import org.bukkit.configuration.file.FileConfiguration;
import org.json.simple.JSONObject;
import org.json.simple.JSONValue;
Expand Down Expand Up @@ -83,6 +84,7 @@ public class DiscordClient extends ListenerAdapter
public static String[] whitelistedRoleNames;

private static boolean checkForMissingRole = false;
private static boolean checkAllRoles = false;
private static String roleToCheck;

public static final char[] validCharacters = {'q', 'w', 'e', 'r', 't', 'y', 'u', 'i', 'o', 'p', 'a', 's', 'd', 'f', 'g', 'h',
Expand Down Expand Up @@ -161,6 +163,7 @@ private static void AssignVars()
}

checkForMissingRole = mainConfig.getBoolean("un-whitelist-if-missing-role");
checkAllRoles = mainConfig.getBoolean("check-all-roles");
roleToCheck = mainConfig.getString("role-to-check-for");
}

Expand Down Expand Up @@ -1108,13 +1111,49 @@ public void onGuildMemberRoleRemove(@Nonnull GuildMemberRoleRemoveEvent e)
CheckForRequiredRole(e);
}

// TODO check users at startup for required role, in case it was removed while the bot was offline
private static void CheckForRequiredRole(GuildMemberRoleRemoveEvent e)
{
if(!checkForMissingRole)
return;

if(roleToCheck == null || roleToCheck.equals(""))
if(checkAllRoles){
String[] allRoles = ArrayUtils.addAll(allowedToAddRemoveRoles, ArrayUtils.addAll(allowedToAddRoles, ArrayUtils.addAll(allowedToAddLimitedRoles, allowedToClearNamesRoles)));

String discordUserId= e.getMember().getId();
List<Role> removedRoles = e.getRoles();
boolean limitedRoleRemoved = false;
for(Role role:removedRoles){
if(Arrays.asList(allowedToAddLimitedRoles).contains(role.getId())){
limitedRoleRemoved = true;
break;
}
}
if(!limitedRoleRemoved){
DiscordWhitelister.getPlugin().getLogger().info(discordUserId + " unrelated role removed. Doing nothing...");
return;
}
DiscordWhitelister.getPlugin().getLogger().info(discordUserId + " weak role removed. Checking remaining roles...");
boolean rolesRemaining= false;
for(int i = 0; i < javaDiscordAPI.getGuilds().size(); i++)
{
Member member = javaDiscordAPI.getGuilds().get(i).getMemberById(discordUserId);
if(member != null){
List<Role> roles = member.getRoles();
for(Role role:roles){
if(Arrays.asList(allRoles).contains(role.getId())){
rolesRemaining = true;
break;
}
}
}
}
if(!rolesRemaining){
DiscordWhitelister.getPlugin().getLogger().info(discordUserId + " has no roles remaining. Removing their whitelisted entries...");
UnWhitelist(discordUserId);
}
else{
DiscordWhitelister.getPlugin().getLogger().info(discordUserId + " has role(s) remaining. Doing nothing...");
}
}else 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");
Expand Down Expand Up @@ -1176,13 +1215,58 @@ public static void RequiredRoleStartupCheck() {
if (!checkForMissingRole)
return;

if (checkAllRoles) {
DiscordWhitelister.getPluginLogger().info("Checking Discord IDs for required roles...");
String[] allRoles = ArrayUtils.addAll(allowedToAddRemoveRoles, ArrayUtils.addAll(allowedToAddRoles, ArrayUtils.addAll(allowedToAddLimitedRoles, allowedToClearNamesRoles)));

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<String, List<String>> userObject = idYaml.load(pushbackInputStream);

for (Map.Entry<String, List<String>> entry : userObject.entrySet()) {
// Check if the ID is in any guilds

// Check all guilds
boolean rolesRemaining = false;
for (int i = 0; i < javaDiscordAPI.getGuilds().size(); i++) {
Member member = javaDiscordAPI.getGuilds().get(i).getMemberById(entry.getKey());
if (member != null) {
List<Role> roles = member.getRoles();
for (Role role : roles) {
if (Arrays.asList(allRoles).contains(role.getId())) {
rolesRemaining = true;
break;
}
}
}
}
if (!rolesRemaining) {
DiscordWhitelister.getPlugin().getLogger().info(entry.getKey() + " has no roles remaining. Removing their whitelisted entries...");
UnWhitelist(entry.getKey());
}
}
return;
}



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;
}

DiscordWhitelister.getPluginLogger().info("Checking Discord IDs for required roles...");
DiscordWhitelister.getPluginLogger().info("Checking Discord IDs for required role " + roleToCheck);

Yaml idYaml = new Yaml();
UserList.SaveStore();
Expand Down Expand Up @@ -1222,6 +1306,14 @@ public static void RequiredRoleStartupCheck() {
DiscordWhitelister.getPluginLogger().info("Removed " + entry.getValue().get(i)
+ " from the whitelist as Discord ID: " + entry.getKey() + " due to missing required role (" + roleToCheck + ").");
}
// Clear entries in user-list
if (userObject.get(entry.getKey()) != null) {
UserList.getUserList().set(entry.getKey(), null);

UserList.SaveStore();

DiscordWhitelister.getPlugin().getLogger().info("Successfully removed " +entry.getKey() + " whitelisted entries from the user list.");
}
}
}
} catch (IOException e) {
Expand Down
2 changes: 2 additions & 0 deletions src/main/java/uk/co/angrybee/joe/configs/MainConfig.java
Original file line number Diff line number Diff line change
Expand Up @@ -163,6 +163,8 @@ private static void CheckEntries()

CheckEntry("un-whitelist-if-missing-role", false);

CheckEntry("check-all-roles", false);

CheckEntry("role-to-check-for", "Twitch Subscriber");

// Remove old role entry if found, move role to new array (for people with v1.3.6 or below)
Expand Down

0 comments on commit 579c991

Please sign in to comment.