From f1cb98da10b3d30a8d4c1b3670ebde2ba5f75060 Mon Sep 17 00:00:00 2001 From: Teriuihi Date: Mon, 20 Sep 2021 03:05:27 +0200 Subject: [PATCH] Sync roles --- .../bot/commands/DiscordLinkCommand.java | 1 + .../bot/listeners/DiscordRoleListener.java | 22 ++++++++--- .../proxydiscordlink/database/Database.java | 37 +++++++++++++++++++ .../minecraft/listeners/LuckpermsEvents.java | 1 + .../minecraft/listeners/PlayerJoin.java | 2 +- .../objects/DiscordLinkPlayer.java | 12 ++---- 6 files changed, 60 insertions(+), 15 deletions(-) diff --git a/src/main/java/com/alttd/proxydiscordlink/bot/commands/DiscordLinkCommand.java b/src/main/java/com/alttd/proxydiscordlink/bot/commands/DiscordLinkCommand.java index 59a13b0..3f6654b 100644 --- a/src/main/java/com/alttd/proxydiscordlink/bot/commands/DiscordLinkCommand.java +++ b/src/main/java/com/alttd/proxydiscordlink/bot/commands/DiscordLinkCommand.java @@ -94,6 +94,7 @@ public class DiscordLinkCommand extends DiscordCommand { DiscordLinkPlayer.addDiscordLinkPlayer(discordLinkPlayer); DiscordLink.getPlugin().getDatabase().syncPlayer(discordLinkPlayer); + DiscordLink.getPlugin().getDatabase().syncRoles(discordLinkPlayer); DiscordLink.getPlugin().getCache().removeCachedPlayer(discordLinkPlayer.getUuid()); } 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 f08c5d8..57cea51 100644 --- a/src/main/java/com/alttd/proxydiscordlink/bot/listeners/DiscordRoleListener.java +++ b/src/main/java/com/alttd/proxydiscordlink/bot/listeners/DiscordRoleListener.java @@ -41,24 +41,26 @@ public class DiscordRoleListener extends ListenerAdapter { if (added_roles.isEmpty()) return; - DiscordLinkPlayer player = DiscordLinkPlayer.getDiscordLinkPlayer(event.getUser().getIdLong()); + DiscordLinkPlayer discordLinkPlayer = DiscordLinkPlayer.getDiscordLinkPlayer(event.getUser().getIdLong()); - if (player == null) { + if (discordLinkPlayer == null) { //TODO mayb ask the player to link to get their in game rank? return; } - player.updateMinecraft(added_roles, true); + discordLinkPlayer.updateMinecraft(added_roles, true); added_roles.forEach(discordRole -> { if (!discordRole.getAnnouncement().isEmpty()) { Component component = miniMessage.parse( discordRole.getAnnouncement(), - Template.of("player", player.getUsername())); + Template.of("player", discordLinkPlayer.getUsername())); DiscordLink.getPlugin().getProxy().getAllPlayers() .forEach(onlinePlayer -> onlinePlayer.sendMessage(component)); } }); + + DiscordLink.getPlugin().getDatabase().syncRoles(discordLinkPlayer); } /** @@ -70,10 +72,18 @@ public class DiscordRoleListener extends ListenerAdapter { .filter(discordRole -> event.getRoles().stream() .anyMatch(role -> role.getIdLong() == discordRole.getId())) .collect(Collectors.toList()); + if (removed_roles.isEmpty()) return; - DiscordLinkPlayer.getDiscordLinkPlayer(event.getUser().getIdLong()) - .updateMinecraft(removed_roles, false); + DiscordLinkPlayer discordLinkPlayer = DiscordLinkPlayer.getDiscordLinkPlayer(event.getUser().getIdLong()); + + if (discordLinkPlayer == null) { + //TODO mayb ask the player to link to get their in game rank? + return; + } + + discordLinkPlayer.updateMinecraft(removed_roles, false); + DiscordLink.getPlugin().getDatabase().syncRoles(discordLinkPlayer); } } diff --git a/src/main/java/com/alttd/proxydiscordlink/database/Database.java b/src/main/java/com/alttd/proxydiscordlink/database/Database.java index 7b6cb33..c942234 100644 --- a/src/main/java/com/alttd/proxydiscordlink/database/Database.java +++ b/src/main/java/com/alttd/proxydiscordlink/database/Database.java @@ -68,6 +68,43 @@ public class Database { } } + public void syncRoles(DiscordLinkPlayer player) { + //Delete all roles + try { + String sql = "DELETE FROM account_roles WHERE uuid = ?"; + + PreparedStatement statement = DatabaseConnection.getConnection().prepareStatement(sql); + statement.setString(1, player.getUuid().toString()); + statement.execute(); + } catch (SQLException exception) { + exception.printStackTrace(); + } + + //Add all roles back + try { + String sql = "INSERT INTO account_roles " + + "VALUES (?, ?) " + + "ON DUPLICATE KEY UPDATE " + + "uuid = ?, " + + "role_name = ?"; + + PreparedStatement statement = DatabaseConnection.getConnection().prepareStatement(sql); + + statement.setString(1, player.getUuid().toString()); + statement.setString(3, player.getUuid().toString()); + + for (String role : player.getRoles()) { + statement.setString(2, role); + statement.setString(4, role); + statement.addBatch(); + } + + statement.executeBatch(); + } catch (SQLException exception) { + exception.printStackTrace(); + } + } + public boolean playerIsLinked(Player player) { //TODO maybe this can be using the discord api instead? (or a cache idk) try { PreparedStatement statement = DatabaseConnection.getConnection() diff --git a/src/main/java/com/alttd/proxydiscordlink/minecraft/listeners/LuckpermsEvents.java b/src/main/java/com/alttd/proxydiscordlink/minecraft/listeners/LuckpermsEvents.java index 69bd6e5..19b7c67 100644 --- a/src/main/java/com/alttd/proxydiscordlink/minecraft/listeners/LuckpermsEvents.java +++ b/src/main/java/com/alttd/proxydiscordlink/minecraft/listeners/LuckpermsEvents.java @@ -42,6 +42,7 @@ public class LuckpermsEvents { return; discordLinkPlayer.updateDiscord(List.of(optional.get()), added); + DiscordLink.getPlugin().getDatabase().syncRoles(discordLinkPlayer); } } diff --git a/src/main/java/com/alttd/proxydiscordlink/minecraft/listeners/PlayerJoin.java b/src/main/java/com/alttd/proxydiscordlink/minecraft/listeners/PlayerJoin.java index f610a67..9180177 100644 --- a/src/main/java/com/alttd/proxydiscordlink/minecraft/listeners/PlayerJoin.java +++ b/src/main/java/com/alttd/proxydiscordlink/minecraft/listeners/PlayerJoin.java @@ -11,7 +11,7 @@ public class PlayerJoin { @Subscribe(order = PostOrder.LATE) public void playerConnected(ServerConnectedEvent event) { - if (event.getPreviousServer().isEmpty()) + if (event.getPreviousServer().isPresent()) return; boolean sync = false; diff --git a/src/main/java/com/alttd/proxydiscordlink/objects/DiscordLinkPlayer.java b/src/main/java/com/alttd/proxydiscordlink/objects/DiscordLinkPlayer.java index 042138f..b1e264f 100644 --- a/src/main/java/com/alttd/proxydiscordlink/objects/DiscordLinkPlayer.java +++ b/src/main/java/com/alttd/proxydiscordlink/objects/DiscordLinkPlayer.java @@ -66,11 +66,9 @@ public class DiscordLinkPlayer { public void updateDiscord(List roles, boolean added) { if (added) - roles.stream().filter(DiscordRole::isUpdateToDiscord).forEach(role -> DiscordLink.getPlugin().getBot().addRole(userId, role.getId(), BotConfig.GUILD_ID)); //TODO test + roles.stream().filter(DiscordRole::isUpdateToDiscord).forEach(role -> DiscordLink.getPlugin().getBot().addRole(userId, role.getId(), BotConfig.GUILD_ID)); else - roles.stream().filter(DiscordRole::isUpdateToDiscord).forEach(role -> DiscordLink.getPlugin().getBot().removeRole(userId, role.getId(), BotConfig.GUILD_ID)); //TODO test - //TODO implement - //TODO SYNC ROLES TO DATABASE + roles.stream().filter(DiscordRole::isUpdateToDiscord).forEach(role -> DiscordLink.getPlugin().getBot().removeRole(userId, role.getId(), BotConfig.GUILD_ID)); } public void updateMinecraft(List roles, boolean added) { @@ -86,15 +84,13 @@ public class DiscordLinkPlayer { user.data().remove(group); }); }); - //TODO implement - //TODO SYNC ROLES TO DATABASE } public void linkedRole(boolean add) { if (add) - DiscordLink.getPlugin().getBot().addRole(userId, BotConfig.LINKED_ROLE_ID, BotConfig.GUILD_ID); //TODO test + DiscordLink.getPlugin().getBot().addRole(userId, BotConfig.LINKED_ROLE_ID, BotConfig.GUILD_ID); else - DiscordLink.getPlugin().getBot().removeRole(userId, BotConfig.LINKED_ROLE_ID, BotConfig.GUILD_ID); //TODO test + DiscordLink.getPlugin().getBot().removeRole(userId, BotConfig.LINKED_ROLE_ID, BotConfig.GUILD_ID); } //Static stuff