[FEAT] Access control denied roles, and ban members from discord/mc on ban

This commit is contained in:
2023-10-29 15:42:58 +02:00
parent 0ea9cbed84
commit e4f2462c0c
6 changed files with 68 additions and 3 deletions

View File

@@ -6,6 +6,7 @@ package com.hypherionmc.sdlink.core.accounts;
import com.hypherionmc.sdlink.core.config.SDLinkConfig; import com.hypherionmc.sdlink.core.config.SDLinkConfig;
import com.hypherionmc.sdlink.core.database.SDLinkAccount; import com.hypherionmc.sdlink.core.database.SDLinkAccount;
import com.hypherionmc.sdlink.core.discord.BotController;
import com.hypherionmc.sdlink.core.managers.CacheManager; import com.hypherionmc.sdlink.core.managers.CacheManager;
import com.hypherionmc.sdlink.core.managers.RoleManager; import com.hypherionmc.sdlink.core.managers.RoleManager;
import com.hypherionmc.sdlink.core.messaging.Result; import com.hypherionmc.sdlink.core.messaging.Result;
@@ -33,6 +34,7 @@ import java.util.ArrayList;
import java.util.List; import java.util.List;
import java.util.Optional; import java.util.Optional;
import java.util.UUID; import java.util.UUID;
import java.util.concurrent.TimeUnit;
import java.util.concurrent.atomic.AtomicBoolean; import java.util.concurrent.atomic.AtomicBoolean;
import static com.hypherionmc.sdlink.core.managers.DatabaseManager.sdlinkDatabase; import static com.hypherionmc.sdlink.core.managers.DatabaseManager.sdlinkDatabase;
@@ -269,6 +271,9 @@ public class MinecraftAccount {
case "rolesNotLoaded" -> { case "rolesNotLoaded" -> {
return Result.error("Server has required roles configured, but no discord roles were loaded. Please notify the server owner"); return Result.error("Server has required roles configured, but no discord roles were loaded. Please notify the server owner");
} }
case "accessDeniedByRole" -> {
return Result.error(SDLinkConfig.INSTANCE.accessControl.verificationMessages.roleDenied);
}
case "rolesNotFound" -> { case "rolesNotFound" -> {
return Result.error(SDLinkConfig.INSTANCE return Result.error(SDLinkConfig.INSTANCE
.accessControl .accessControl
@@ -308,9 +313,15 @@ public class MinecraftAccount {
Profiler profiler = Profiler.getProfiler("checkRequiredRoles"); Profiler profiler = Profiler.getProfiler("checkRequiredRoles");
profiler.start("Checking Required Roles"); profiler.start("Checking Required Roles");
AtomicBoolean anyFound = new AtomicBoolean(false); AtomicBoolean anyFound = new AtomicBoolean(false);
AtomicBoolean deniedFound = new AtomicBoolean(false);
Optional<Member> member = CacheManager.getDiscordMembers().stream().filter(m -> m.getId().equals(account.getDiscordID())).findFirst(); Optional<Member> member = CacheManager.getDiscordMembers().stream().filter(m -> m.getId().equals(account.getDiscordID())).findFirst();
member.ifPresent(m -> m.getRoles().forEach(r -> { member.ifPresent(m -> m.getRoles().forEach(r -> {
if (RoleManager.getDeniedRoles().stream().anyMatch(role -> r.getIdLong() == role.getIdLong())) {
if (!deniedFound.get())
deniedFound.set(true);
}
if (RoleManager.getVerificationRoles().stream().anyMatch(role -> role.getIdLong() == r.getIdLong())) { if (RoleManager.getVerificationRoles().stream().anyMatch(role -> role.getIdLong() == r.getIdLong())) {
if (!anyFound.get()) { if (!anyFound.get()) {
anyFound.set(true); anyFound.set(true);
@@ -319,6 +330,9 @@ public class MinecraftAccount {
})); }));
profiler.stop(); profiler.stop();
if (deniedFound.get())
return Result.error("accessDeniedByRole");
if (!anyFound.get()) if (!anyFound.get())
return Result.error("rolesNotFound"); return Result.error("rolesNotFound");
@@ -329,6 +343,22 @@ public class MinecraftAccount {
return Result.success("pass"); return Result.success("pass");
} }
public void banDiscordMember() {
if (!SDLinkConfig.INSTANCE.accessControl.banMemberOnMinecraftBan)
return;
DiscordUser user = getDiscordUser();
if (user == null)
return;
try {
BotController.INSTANCE.getJDA().getGuilds().get(0).ban(UserSnowflake.fromId(user.getUserId()), 7, TimeUnit.DAYS).queue();
} catch (Exception e) {
e.printStackTrace();
}
}
public String getUsername() { public String getUsername() {
return username; return username;
} }

View File

@@ -24,7 +24,7 @@ public class SDLinkConfig extends ModuleConfig {
// DO NOT REMOVE TRANSIENT HERE... OTHERWISE, THE STUPID CONFIG LIBRARY // DO NOT REMOVE TRANSIENT HERE... OTHERWISE, THE STUPID CONFIG LIBRARY
// WILL TRY TO WRITE THESE TO THE CONFIG // WILL TRY TO WRITE THESE TO THE CONFIG
public transient static SDLinkConfig INSTANCE; public transient static SDLinkConfig INSTANCE;
public transient static int configVer = 11; public transient static int configVer = 12;
@Path("general") @Path("general")
@SpecComment("General Mod Config") @SpecComment("General Mod Config")

View File

@@ -24,6 +24,10 @@ public class AccessControl {
@SpecComment("Optional: The player requires any of these roles to be able to join your server") @SpecComment("Optional: The player requires any of these roles to be able to join your server")
public List<String> requiredRoles = new ArrayList<>(); public List<String> requiredRoles = new ArrayList<>();
@Path("deniedRoles")
@SpecComment("Optional: Players with these roles will never be allowed access to your server")
public List<String> deniedRoles = new ArrayList<>();
@Path("verifiedRole") @Path("verifiedRole")
@SpecComment("Optional: Role name or ID to assign to verified player accounts") @SpecComment("Optional: Role name or ID to assign to verified player accounts")
public String verifiedRole = ""; public String verifiedRole = "";
@@ -32,6 +36,14 @@ public class AccessControl {
@SpecComment("Configure messages shown to players when they don't meet verification requirements") @SpecComment("Configure messages shown to players when they don't meet verification requirements")
public AccessMessages verificationMessages = new AccessMessages(); public AccessMessages verificationMessages = new AccessMessages();
@Path("banPlayerOnDiscordBan")
@SpecComment("Should players with verified accounts, be banned from Minecraft if they get banned on discord")
public boolean banPlayerOnDiscordBan = false;
@Path("banMemberOnMinecraftBan")
@SpecComment("Should members with verified accounts, be banned from discord when they are banned on Minecraft")
public boolean banMemberOnMinecraftBan = false;
public static class AccessMessages { public static class AccessMessages {
@Path("accountVerification") @Path("accountVerification")
@@ -46,6 +58,10 @@ public class AccessControl {
@SpecComment("Message to show when player doesn't have one of the required roles. Use {roles} to display the names of configured roles") @SpecComment("Message to show when player doesn't have one of the required roles. Use {roles} to display the names of configured roles")
public String requireRoles = "Sorry, but you require any of the following roles: {roles}"; public String requireRoles = "Sorry, but you require any of the following roles: {roles}";
@Path("roleDenied")
@SpecComment("Message to show when player has a role from the deniedRoles list")
public String roleDenied = "Sorry, but you are not allowed to access this server.";
} }
} }

View File

@@ -160,7 +160,9 @@ public class DiscordEventHandler extends ListenerAdapter {
if (acc != null) { if (acc != null) {
sdlinkDatabase.remove(a, SDLinkAccount.class); sdlinkDatabase.remove(a, SDLinkAccount.class);
SDLinkPlatform.minecraftHelper.banPlayer(acc); if (SDLinkConfig.INSTANCE.accessControl.banPlayerOnDiscordBan) {
SDLinkPlatform.minecraftHelper.banPlayer(acc);
}
sdlinkDatabase.reloadCollection("verifiedaccounts"); sdlinkDatabase.reloadCollection("verifiedaccounts");
} }
}); });

View File

@@ -23,7 +23,7 @@ import java.util.concurrent.atomic.AtomicInteger;
public class PermissionChecker { public class PermissionChecker {
// Invite URL for bot shown in server logs // Invite URL for bot shown in server logs
private static final String DISCORD_INVITE = "https://discord.com/api/oauth2/authorize?client_id={bot_id}&permissions=2953276432&scope=bot%20applications.commands"; private static final String DISCORD_INVITE = "https://discord.com/api/oauth2/authorize?client_id={bot_id}&permissions=2953276436&scope=bot%20applications.commands";
// Base Permissions required by the bot to operate // Base Permissions required by the bot to operate
private static final List<Permission> BOT_PERMS = new ArrayList<>() {{ private static final List<Permission> BOT_PERMS = new ArrayList<>() {{
@@ -49,6 +49,10 @@ public class PermissionChecker {
* Run the permission checker to see if the bot has all the required permissions * Run the permission checker to see if the bot has all the required permissions
*/ */
public static void checkBotSetup() { public static void checkBotSetup() {
if (SDLinkConfig.INSTANCE.accessControl.banMemberOnMinecraftBan) {
BOT_PERMS.add(Permission.BAN_MEMBERS);
}
StringBuilder builder = new StringBuilder(); StringBuilder builder = new StringBuilder();
builder.append("\r\n").append("******************* Simple Discord Link Errors *******************").append("\r\n"); builder.append("\r\n").append("******************* Simple Discord Link Errors *******************").append("\r\n");
AtomicInteger errCount = new AtomicInteger(); AtomicInteger errCount = new AtomicInteger();

View File

@@ -22,6 +22,8 @@ import java.util.concurrent.atomic.AtomicInteger;
public class RoleManager { public class RoleManager {
private static final Set<Role> verificationRoles = new HashSet<>(); private static final Set<Role> verificationRoles = new HashSet<>();
private static final Set<Role> deniedRoles = new HashSet<>();
private static Role verifiedRole = null; private static Role verifiedRole = null;
/** /**
@@ -38,6 +40,13 @@ public class RoleManager {
verificationRoles.add(role); verificationRoles.add(role);
}); });
SDLinkConfig.INSTANCE.accessControl.deniedRoles.forEach(r -> {
Role role = getRole(errCount, builder, "Access Control Role", r);
if (role != null)
deniedRoles.add(role);
});
if (!SDLinkUtils.isNullOrEmpty(SDLinkConfig.INSTANCE.accessControl.verifiedRole)) { if (!SDLinkUtils.isNullOrEmpty(SDLinkConfig.INSTANCE.accessControl.verifiedRole)) {
verifiedRole = getRole(errCount, builder, "Verified Player Role", SDLinkConfig.INSTANCE.accessControl.verifiedRole); verifiedRole = getRole(errCount, builder, "Verified Player Role", SDLinkConfig.INSTANCE.accessControl.verifiedRole);
} }
@@ -87,4 +96,8 @@ public class RoleManager {
public static Role getVerifiedRole() { public static Role getVerifiedRole() {
return verifiedRole; return verifiedRole;
} }
public static Set<Role> getDeniedRoles() {
return deniedRoles;
}
} }