More syncing roles stuff

This commit is contained in:
Teriuihi 2021-09-12 01:26:44 +02:00
parent 1aa1563ec1
commit 420d044153
7 changed files with 122 additions and 11 deletions

View File

@ -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() {

View File

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

View File

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

View File

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

View File

@ -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";

View File

@ -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<DiscordRole> 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);
}
}

View File

@ -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<DiscordRole> roles, boolean added) {
public void updateDiscord(List<DiscordRole> 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<DiscordRole> 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