From 420d0441531cc1ce0b30edb012a073c7425f8f92 Mon Sep 17 00:00:00 2001 From: Teriuihi Date: Sun, 12 Sep 2021 01:26:44 +0200 Subject: [PATCH] More syncing roles stuff --- .../alttd/proxydiscordlink/DiscordLink.java | 2 + .../com/alttd/proxydiscordlink/bot/Bot.java | 31 ++++++++++++ .../bot/api/DiscordModifyRole.java | 11 +++++ .../bot/listeners/DiscordRoleListener.java | 4 +- .../proxydiscordlink/config/BotConfig.java | 2 + .../minecraft/listeners/LuckpermsEvents.java | 47 +++++++++++++++++++ .../objects/DiscordLinkPlayer.java | 36 ++++++++++---- 7 files changed, 122 insertions(+), 11 deletions(-) create mode 100644 src/main/java/com/alttd/proxydiscordlink/bot/api/DiscordModifyRole.java create mode 100644 src/main/java/com/alttd/proxydiscordlink/minecraft/listeners/LuckpermsEvents.java diff --git a/src/main/java/com/alttd/proxydiscordlink/DiscordLink.java b/src/main/java/com/alttd/proxydiscordlink/DiscordLink.java index 247c282..24f159a 100644 --- a/src/main/java/com/alttd/proxydiscordlink/DiscordLink.java +++ b/src/main/java/com/alttd/proxydiscordlink/DiscordLink.java @@ -6,6 +6,7 @@ import com.alttd.proxydiscordlink.config.BotConfig; import com.alttd.proxydiscordlink.config.Config; import com.alttd.proxydiscordlink.database.Database; import com.alttd.proxydiscordlink.database.DatabaseConnection; +import com.alttd.proxydiscordlink.minecraft.listeners.LuckpermsEvents; import com.alttd.proxydiscordlink.minecraft.listeners.PlayerJoin; import com.alttd.proxydiscordlink.minecraft.listeners.PlayerLeave; import com.alttd.proxydiscordlink.util.ALogger; @@ -77,6 +78,7 @@ public class DiscordLink { public void loadEvents() { server.getEventManager().register(this, new PlayerJoin()); server.getEventManager().register(this, new PlayerLeave()); + new LuckpermsEvents().listener(); } public void loadBot() { diff --git a/src/main/java/com/alttd/proxydiscordlink/bot/Bot.java b/src/main/java/com/alttd/proxydiscordlink/bot/Bot.java index bdb7de2..512cd10 100644 --- a/src/main/java/com/alttd/proxydiscordlink/bot/Bot.java +++ b/src/main/java/com/alttd/proxydiscordlink/bot/Bot.java @@ -7,6 +7,9 @@ import com.alttd.proxydiscordlink.util.ALogger; import net.dv8tion.jda.api.EmbedBuilder; import net.dv8tion.jda.api.JDA; import net.dv8tion.jda.api.JDABuilder; +import net.dv8tion.jda.api.entities.Guild; +import net.dv8tion.jda.api.entities.Member; +import net.dv8tion.jda.api.entities.Role; import net.dv8tion.jda.api.entities.TextChannel; import net.dv8tion.jda.api.requests.GatewayIntent; import net.dv8tion.jda.api.utils.MemberCachePolicy; @@ -91,4 +94,32 @@ public class Bot { ALogger.error("caught some exception, " + e); } } + + public boolean addRole(long userId, long roleId, long guildId) { + Guild guild = jda.getGuildById(guildId); + if (guild == null) + return false; + Role role = guild.getRoleById(roleId); + if (role == null) + return false; + Member member = guild.getMemberById(userId); + if (member == null) + return false; + guild.addRoleToMember(member, role).queue(); + return true; + } + + public boolean removeRole(long userId, long roleId, long guildId) { + Guild guild = jda.getGuildById(guildId); + if (guild == null) + return false; + Role role = guild.getRoleById(roleId); + if (role == null) + return false; + Member member = guild.getMemberById(userId); + if (member == null) + return false; + guild.removeRoleFromMember(member, role).queue(); + return true; + } } diff --git a/src/main/java/com/alttd/proxydiscordlink/bot/api/DiscordModifyRole.java b/src/main/java/com/alttd/proxydiscordlink/bot/api/DiscordModifyRole.java new file mode 100644 index 0000000..e7b45e0 --- /dev/null +++ b/src/main/java/com/alttd/proxydiscordlink/bot/api/DiscordModifyRole.java @@ -0,0 +1,11 @@ +package com.alttd.proxydiscordlink.bot.api; + +import com.alttd.proxydiscordlink.DiscordLink; + +public class DiscordModifyRole { + + public static boolean discordAddRole(long userId, long roleId, long guildId) { + return DiscordLink.getPlugin().getBot().addRole(userId, roleId, guildId); + } + +} diff --git a/src/main/java/com/alttd/proxydiscordlink/bot/listeners/DiscordRoleListener.java b/src/main/java/com/alttd/proxydiscordlink/bot/listeners/DiscordRoleListener.java index fbe3d46..dc3924d 100644 --- a/src/main/java/com/alttd/proxydiscordlink/bot/listeners/DiscordRoleListener.java +++ b/src/main/java/com/alttd/proxydiscordlink/bot/listeners/DiscordRoleListener.java @@ -48,7 +48,7 @@ public class DiscordRoleListener extends ListenerAdapter { return; } - player.update(added_roles, true); + player.updateMinecraft(added_roles, true); added_roles.forEach(discordRole -> { if (!discordRole.getAnnouncement().isEmpty()) { Component component = miniMessage.parse( @@ -74,6 +74,6 @@ public class DiscordRoleListener extends ListenerAdapter { return; DiscordLink.getPlugin().getDatabase().getPlayer(event.getUser().getIdLong()) - .update(removed_roles, false); + .updateMinecraft(removed_roles, false); } } diff --git a/src/main/java/com/alttd/proxydiscordlink/config/BotConfig.java b/src/main/java/com/alttd/proxydiscordlink/config/BotConfig.java index 5479427..4aaf26a 100644 --- a/src/main/java/com/alttd/proxydiscordlink/config/BotConfig.java +++ b/src/main/java/com/alttd/proxydiscordlink/config/BotConfig.java @@ -166,10 +166,12 @@ public class BotConfig { public static String BOT_TOKEN = "unconfigured"; public static String COMMAND_CHANNEL = "unconfigured"; + public static long GUILD_ID = -1; private static void settings() { BOT_TOKEN = getString("settings.token", BOT_TOKEN); COMMAND_CHANNEL = getString("settings.command_channel", COMMAND_CHANNEL); + GUILD_ID = getLong("settings.guild-id", GUILD_ID); } public static String SL_MINIMUMRANK = "trainee"; diff --git a/src/main/java/com/alttd/proxydiscordlink/minecraft/listeners/LuckpermsEvents.java b/src/main/java/com/alttd/proxydiscordlink/minecraft/listeners/LuckpermsEvents.java new file mode 100644 index 0000000..54cfc8a --- /dev/null +++ b/src/main/java/com/alttd/proxydiscordlink/minecraft/listeners/LuckpermsEvents.java @@ -0,0 +1,47 @@ +package com.alttd.proxydiscordlink.minecraft.listeners; + +import com.alttd.proxydiscordlink.DiscordLink; +import com.alttd.proxydiscordlink.bot.objects.DiscordRole; +import com.alttd.proxydiscordlink.objects.DiscordLinkPlayer; +import com.alttd.proxydiscordlink.util.Utilities; +import net.luckperms.api.event.EventBus; +import net.luckperms.api.event.node.NodeAddEvent; +import net.luckperms.api.event.node.NodeRemoveEvent; +import net.luckperms.api.model.PermissionHolder; +import net.luckperms.api.model.user.User; +import net.luckperms.api.node.Node; +import net.luckperms.api.node.types.InheritanceNode; + +import java.util.List; +import java.util.Optional; + +public class LuckpermsEvents { + + public void listener() + { + EventBus eventBus = Utilities.getLuckPerms().getEventBus(); + + eventBus.subscribe(DiscordLink.getPlugin(), NodeAddEvent.class, event -> updateRank(event.getTarget(), event.getNode(), true)); + eventBus.subscribe(DiscordLink.getPlugin(), NodeRemoveEvent.class, event -> updateRank(event.getTarget(), event.getNode(), false)); + } + + public void updateRank(PermissionHolder permissionHolder, Node node, boolean added) + { + if (!(node instanceof InheritanceNode inheritanceNode) || !(permissionHolder instanceof User user)) + return; + Optional optional = DiscordRole.getDiscordRoles().stream() + .filter(discordRole -> inheritanceNode + .getGroupName() + .equalsIgnoreCase(discordRole.getLuckpermsName())) + .findFirst(); + + if (optional.isEmpty()) + return; + DiscordLinkPlayer discordLinkPlayer = DiscordLinkPlayer.getDiscordLinkPlayer(user.getUniqueId()); + if (discordLinkPlayer == null) + return; + + discordLinkPlayer.updateMinecraft(List.of(optional.get()), added); + } + +} diff --git a/src/main/java/com/alttd/proxydiscordlink/objects/DiscordLinkPlayer.java b/src/main/java/com/alttd/proxydiscordlink/objects/DiscordLinkPlayer.java index 5d4d85f..9f67d87 100644 --- a/src/main/java/com/alttd/proxydiscordlink/objects/DiscordLinkPlayer.java +++ b/src/main/java/com/alttd/proxydiscordlink/objects/DiscordLinkPlayer.java @@ -1,12 +1,15 @@ package com.alttd.proxydiscordlink.objects; import com.alttd.proxydiscordlink.DiscordLink; +import com.alttd.proxydiscordlink.bot.api.DiscordModifyRole; import com.alttd.proxydiscordlink.bot.objects.DiscordRole; +import com.alttd.proxydiscordlink.config.BotConfig; import com.alttd.proxydiscordlink.database.Database; import com.alttd.proxydiscordlink.util.ALogger; import com.alttd.proxydiscordlink.util.Utilities; import net.luckperms.api.model.user.User; import net.luckperms.api.node.NodeBuilder; +import net.luckperms.api.node.types.InheritanceNode; import net.luckperms.api.node.types.PermissionNode; import java.util.*; @@ -52,10 +55,25 @@ public class DiscordLinkPlayer { return discordUsername; } - public void update(List roles, boolean added) { + public void updateDiscord(List roles, boolean added) { + for (DiscordRole role : roles) { + if (role.getDisplayName().equalsIgnoreCase("nitro")) + isNitro = added; //FIXME this should be a list instead of a bool (separate table for roles they have) + if (List.of("viceroy", "count", "duke", "archduke").contains(role.getDisplayName().toLowerCase())) + isDonor = added; //FIXME this should be a list instead of a bool (separate table for roles they have) + if (!role.isUpdateToMinecraft()) + continue; + //TODO implement + } + roles.forEach(role -> DiscordLink.getPlugin().getBot().addRole(userId, role.getId(), BotConfig.GUILD_ID)); //TODO test + + DiscordLink.getPlugin().getDatabase().syncPlayer(this); + //TODO implement + } + + public void updateMinecraft(List roles, boolean added) { User user = Utilities.getLuckPerms().getUserManager().getUser(getUuid()); - if (user == null) - { + if (user == null) { ALogger.error("Tried updating a user luckperms couldn't find: " + getUuid()); return; } @@ -67,12 +85,12 @@ public class DiscordLinkPlayer { isDonor = added; //FIXME this should be a list instead of a bool (separate table for roles they have) if (!role.isUpdateToMinecraft()) continue; - PermissionNode group = PermissionNode.builder("group." + role.getLuckpermsName()).build(); - if (!user.getNodes().contains(group)) - if (added) - user.getNodes().add(group); - else - user.getNodes().remove(group); + InheritanceNode group = InheritanceNode.builder(role.getLuckpermsName()).build(); + + if (!user.getNodes().contains(group) && added) + user.data().add(group); + else if (!added) + user.data().remove(group); } DiscordLink.getPlugin().getDatabase().syncPlayer(this); //TODO implement