From af1ec4a2c8bb07a61a6d3697e959180bce870b2e Mon Sep 17 00:00:00 2001 From: jakub Date: Wed, 17 Jul 2024 10:52:01 +0200 Subject: [PATCH] Webhook implementation --- .idea/artifacts/DiscordAuthorizator_jar.xml | 22 ++--- .idea/inspectionProfiles/Project_Default.xml | 3 + pom.xml | 5 ++ .../DiscordAuthorizator.java | 75 +++++++++++++++--- .../soukup/discordauthorizator/WebHooks.java | 38 +++++++++ .../commands/authorize.java | 19 +++++ .../discordauthorizator/commands/link.java | 23 ++++-- .../discordauthorizator/events/ChatEvent.java | 6 +- .../events/DiscordSendMessage.java | 26 +++++- .../events/initializeCrossChat.java | 48 +++++++++++ .../discordauthorizator/events/playerDie.java | 15 ++-- .../events/playerJoin.java | 37 +++++---- .../events/playerLeave.java | 16 ++-- .../events/playerLogin.java | 35 +++++++- src/main/resources/config.yml | 13 +-- target/classes/config.yml | 4 +- .../DiscordAuthorizator.class | Bin 10218 -> 12912 bytes .../commands/authorize.class | Bin 2931 -> 3589 bytes .../discordauthorizator/commands/link.class | Bin 7424 -> 8419 bytes .../events/ChatEvent.class | Bin 5546 -> 4889 bytes .../events/DiscordSendMessage.class | Bin 4322 -> 5400 bytes .../events/playerDie.class | Bin 2934 -> 2458 bytes .../events/playerJoin$1.class | Bin 860 -> 860 bytes .../events/playerJoin.class | Bin 6505 -> 6036 bytes .../events/playerLeave$1.class | Bin 866 -> 866 bytes .../events/playerLeave.class | Bin 3439 -> 2977 bytes .../events/playerLogin.class | Bin 8275 -> 11284 bytes 27 files changed, 315 insertions(+), 70 deletions(-) create mode 100644 src/main/java/xyz/soukup/discordauthorizator/WebHooks.java create mode 100644 src/main/java/xyz/soukup/discordauthorizator/events/initializeCrossChat.java diff --git a/.idea/artifacts/DiscordAuthorizator_jar.xml b/.idea/artifacts/DiscordAuthorizator_jar.xml index 648e32c..7bc10cc 100644 --- a/.idea/artifacts/DiscordAuthorizator_jar.xml +++ b/.idea/artifacts/DiscordAuthorizator_jar.xml @@ -1,24 +1,26 @@ - $USER_HOME$/mineconomia/dev-server/plugins + $USER_HOME$/Plocha/dev-server/plugins + - - - - - - - + + + + + + + + - - + + \ No newline at end of file diff --git a/.idea/inspectionProfiles/Project_Default.xml b/.idea/inspectionProfiles/Project_Default.xml index 79937a3..e522458 100644 --- a/.idea/inspectionProfiles/Project_Default.xml +++ b/.idea/inspectionProfiles/Project_Default.xml @@ -1,6 +1,9 @@ diff --git a/pom.xml b/pom.xml index 2f76c9e..752f829 100644 --- a/pom.xml +++ b/pom.xml @@ -79,5 +79,10 @@ + + club.minnced + discord-webhooks + 0.8.4 + diff --git a/src/main/java/xyz/soukup/discordauthorizator/DiscordAuthorizator.java b/src/main/java/xyz/soukup/discordauthorizator/DiscordAuthorizator.java index 2a19d44..6df4ca9 100644 --- a/src/main/java/xyz/soukup/discordauthorizator/DiscordAuthorizator.java +++ b/src/main/java/xyz/soukup/discordauthorizator/DiscordAuthorizator.java @@ -4,10 +4,8 @@ import net.dv8tion.jda.api.EmbedBuilder; import net.dv8tion.jda.api.JDA; import net.dv8tion.jda.api.JDABuilder; import net.dv8tion.jda.api.Permission; -import net.dv8tion.jda.api.entities.Activity; -import net.dv8tion.jda.api.entities.Message; -import net.dv8tion.jda.api.entities.Role; -import net.dv8tion.jda.api.entities.User; +import net.dv8tion.jda.api.entities.*; +import net.dv8tion.jda.api.entities.channel.concrete.TextChannel; import net.dv8tion.jda.api.interactions.commands.DefaultMemberPermissions; import net.dv8tion.jda.api.interactions.commands.OptionType; import net.dv8tion.jda.api.interactions.commands.build.Commands; @@ -21,33 +19,41 @@ import xyz.soukup.discordauthorizator.commands.*; import xyz.soukup.discordauthorizator.events.*; import java.awt.*; -import java.util.Collection; -import java.util.HashMap; -import java.util.Map; -import java.util.Objects; +import java.net.URI; +import java.net.URISyntaxException; +import java.util.*; +import java.util.List; import java.util.logging.Logger; public final class DiscordAuthorizator extends JavaPlugin { public static HashMap playerColor = new HashMap<>(); public static HashMap playerRole = new HashMap<>(); + public static HashMap webHooks = new HashMap<>(); private static JDA jda; @Override public void onEnable() { saveDefaultConfig(); + DiscordAuthorizator plugin = this; + FileConfiguration config = plugin.getConfig(); + Logger logger = Bukkit.getLogger(); + logger.info("Plugin DiscordAuthorizator starting..."); + //JDA Inicializace jda = JDABuilder.createDefault(config.getString("token")) .addEventListeners(new link()) .addEventListeners(new authorize()) .addEventListeners(new DiscordSendMessage()) .addEventListeners(new voting()) + .addEventListeners(new initializeCrossChat()) .enableIntents(GatewayIntent.GUILD_MEMBERS) .enableIntents(GatewayIntent.GUILD_MESSAGES) .enableIntents(GatewayIntent.MESSAGE_CONTENT) + .build(); jda.updateCommands().addCommands( Commands.slash("authorize", "autorizuje novou ip"), @@ -63,24 +69,30 @@ public final class DiscordAuthorizator extends JavaPlugin { ).queue(); jda.getPresence().setActivity(Activity.customStatus("Nikdo na serveru")); + + //Event Inicializace Bukkit.getPluginManager().registerEvents(new playerLogin(),this ); Bukkit.getPluginManager().registerEvents(new playerLeave(),this ); Bukkit.getPluginManager().registerEvents(new playerJoin(), this); Bukkit.getPluginManager().registerEvents(new playerDie(),this ); - Bukkit.getPluginManager().registerEvents(new ChatEvent(), this); + + //Command Inicializace Objects.requireNonNull(this.getCommand("msg")).setExecutor(new msg()); - Objects.requireNonNull(this.getCommand("msg")).setTabCompleter(new msg()); Objects.requireNonNull(this.getCommand("r")).setExecutor(new r()); + + + //TAB Complete Initialize + Objects.requireNonNull(this.getCommand("msg")).setTabCompleter(new msg()); Objects.requireNonNull(this.getCommand("r")).setTabCompleter(new r()); } + + @Override public void onDisable() { saveConfig(); - - for(Map.Entry> entry : voting.activeVotings.entrySet()) { HashMap voteData = entry.getValue(); Message message = entry.getKey(); @@ -96,11 +108,19 @@ public final class DiscordAuthorizator extends JavaPlugin { message.editMessageComponents().queue(); message.editMessageEmbeds(eb.build()).queue(); } + + for (String webhookUrl : webHooks.values()){ + deleteWebhook(getWebhookID(webhookUrl)); + } + jda.shutdown(); } public static JDA getJDA() { return jda; } + + + public static ChatColor convertToChatColor(Color color) { // Extract RGB components int red = color.getRed(); @@ -124,4 +144,35 @@ public final class DiscordAuthorizator extends JavaPlugin { jda.getPresence().setActivity(Activity.customStatus(status)); } + public static String getWebhookID(String webhookUrl){ + try { + // Parse the webhook URL + URI uri = new URI(webhookUrl); + String[] parts = uri.getPath().split("/"); + + // The ID and token are the last two parts of the path + String webhookId = parts[parts.length - 2]; + + System.out.println("Webhook ID: " + webhookId); + + // Now you can use these to delete the webhook + return webhookId; + } catch (URISyntaxException e) { + return null; + } + } + + private static void deleteWebhook(String webhookId) { + + jda.retrieveWebhookById(webhookId).queue(webhook -> { + webhook.delete().queue( + success -> System.out.println("Webhook deleted successfully!"), + failure -> System.err.println("Failed to delete webhook: " + failure.getMessage()) + ); + }, failure -> { + System.err.println("Failed to retrieve webhook: " + failure.getMessage()); + }); + } + + } diff --git a/src/main/java/xyz/soukup/discordauthorizator/WebHooks.java b/src/main/java/xyz/soukup/discordauthorizator/WebHooks.java new file mode 100644 index 0000000..24b3a86 --- /dev/null +++ b/src/main/java/xyz/soukup/discordauthorizator/WebHooks.java @@ -0,0 +1,38 @@ +package xyz.soukup.discordauthorizator; + +import club.minnced.discord.webhook.WebhookClient; +import club.minnced.discord.webhook.send.WebhookEmbed; +import club.minnced.discord.webhook.send.WebhookMessage; +import club.minnced.discord.webhook.send.WebhookMessageBuilder; + +public class WebHooks { + + public static void send(String WebHookURL, String name, String avatarURL, WebhookEmbed embed){ + WebhookClient client = WebhookClient.withUrl(WebHookURL); + WebhookMessage message = new WebhookMessageBuilder() + .addEmbeds(embed) + .setUsername(name) + .setAvatarUrl(avatarURL) + .build(); + client.send(message); + } + public static void send(String WebHookURL, String name, String avatarURL, String content){ + WebhookClient client = WebhookClient.withUrl(WebHookURL); + WebhookMessage message = new WebhookMessageBuilder() + .setContent(content) + .setUsername(name) + .setAvatarUrl(avatarURL) + .build(); + client.send(message); + } + public static void sendToAll(String name, String avatarURL, WebhookEmbed embed){ + for (String url : DiscordAuthorizator.webHooks.values()){ + send(url, name, avatarURL, embed); + } + } + public static void sendToAll(String name, String avatarURL, String content){ + for (String url : DiscordAuthorizator.webHooks.values()){ + send(url, name, avatarURL, content); + } + } +} diff --git a/src/main/java/xyz/soukup/discordauthorizator/commands/authorize.java b/src/main/java/xyz/soukup/discordauthorizator/commands/authorize.java index fc1b344..d6ce9d2 100644 --- a/src/main/java/xyz/soukup/discordauthorizator/commands/authorize.java +++ b/src/main/java/xyz/soukup/discordauthorizator/commands/authorize.java @@ -1,6 +1,7 @@ package xyz.soukup.discordauthorizator.commands; import net.dv8tion.jda.api.events.interaction.command.SlashCommandInteractionEvent; +import net.dv8tion.jda.api.events.interaction.component.ButtonInteractionEvent; import net.dv8tion.jda.api.hooks.ListenerAdapter; import org.bukkit.configuration.file.FileConfiguration; import xyz.soukup.discordauthorizator.DiscordAuthorizator; @@ -26,4 +27,22 @@ public class authorize extends ListenerAdapter { } } + public void onButtonInteraction(ButtonInteractionEvent event) { + if (!event.getComponentId().equals("addIP")){ + return; + } + if (playerLogin.ipToAdd.containsKey(event.getUser().getId())){ + List pp = playerLogin.ipToAdd.get(event.getUser().getId()); + FileConfiguration config = DiscordAuthorizator.getPlugin(DiscordAuthorizator.class).getConfig(); + List ipList = config.getStringList("players." + pp.get(0) + ".authorized-ips"); + ipList.add(pp.get(1)); + + config.set("players." + pp.get(0) + ".authorized-ips", ipList); + DiscordAuthorizator.getPlugin(DiscordAuthorizator.class).saveConfig(); + event.reply("IP přidána").setEphemeral(true).queue(); + }else{ + event.reply("Nemáš žádné IP adresy k přidání").setEphemeral(true).queue(); + } + } + } diff --git a/src/main/java/xyz/soukup/discordauthorizator/commands/link.java b/src/main/java/xyz/soukup/discordauthorizator/commands/link.java index 08039e4..92d75bf 100644 --- a/src/main/java/xyz/soukup/discordauthorizator/commands/link.java +++ b/src/main/java/xyz/soukup/discordauthorizator/commands/link.java @@ -18,22 +18,27 @@ import java.awt.*; import java.util.List; import java.util.Objects; +import static xyz.soukup.discordauthorizator.DiscordAuthorizator.getJDA; + public class link extends ListenerAdapter { public void onSlashCommandInteraction(SlashCommandInteractionEvent event) { if (event.getName().equals("link")) { - TextInput subject = TextInput.create("username", "Tvůj minecraft nicK:", TextInputStyle.SHORT) + TextInput username = TextInput.create("username", "Tvůj minecraft nicK:", TextInputStyle.SHORT) .setPlaceholder("PVPMaster666") .setMaxLength(16) // or setRequiredRange(10, 100) .build(); - TextInput body = TextInput.create("code", "Verifikační kód", TextInputStyle.PARAGRAPH) + TextInput code = TextInput.create("code", "Verifikační kód", TextInputStyle.SHORT) .setPlaceholder("1234") .setMaxLength(4) .setMinLength(4) .build(); - + TextInput invitedby = TextInput.create("invitedby", "Jak si na nás narazil?", TextInputStyle.PARAGRAPH) + .setPlaceholder("kámoš, server list, spolupráce, jiný discord...") + .setMaxLength(100) + .build(); Modal modal = Modal.create("linkdialog", "Propojení minecraft účtu") - .addComponents(ActionRow.of(subject), ActionRow.of(body)) + .addComponents(ActionRow.of(username), ActionRow.of(code), ActionRow.of(invitedby)) .build(); event.replyModal(modal).queue(); @@ -47,7 +52,9 @@ public class link extends ListenerAdapter { FileConfiguration config = DiscordAuthorizator.getPlugin(DiscordAuthorizator.class).getConfig(); config.set("players." + answers.get(0).getAsString() + ".authorized-ips", List.of(playerLogin.playersToVerify.get(answers.get(0).getAsString()).get(0))); config.set("players." +answers.get(0).getAsString() + ".discord", event.getUser().getId()); - Objects.requireNonNull(event.getGuild()).addRoleToMember(Objects.requireNonNull(event.getMember()), Objects.requireNonNull(event.getGuild().getRoleById("1236632859200983141"))).queue(); + if (Objects.requireNonNull(event.getGuild()).getId().equals(config.getString("guild"))){ + Objects.requireNonNull(event.getGuild()).addRoleToMember(Objects.requireNonNull(event.getMember()), Objects.requireNonNull(event.getGuild().getRoleById("1236632859200983141"))).queue(); + } playerLogin.playersToVerify.remove(answers.get(0).getAsString()); MessageEmbed embed = new EmbedBuilder() .setTitle("Propojeno.") @@ -56,6 +63,12 @@ public class link extends ListenerAdapter { .build(); DiscordAuthorizator.getPlugin(DiscordAuthorizator.class).saveConfig(); event.replyEmbeds(embed).setEphemeral(true).queue(); + Objects.requireNonNull(getJDA().getTextChannelById(Objects.requireNonNull(config.getString("admin-channel")))).sendMessage("**Nový hráč!** " + + "\nDiscord: `" + event.getUser().getName() + + "` \nMinecraft: `" + answers.get(0).getAsString() + + "` \nGuild: `" + event.getGuild().getName() + + "` \nOdkud: `" + answers.get(2).getAsString() + "`" + ).queue(); }else { MessageEmbed embed = new EmbedBuilder() .setTitle("Špatný kód.") diff --git a/src/main/java/xyz/soukup/discordauthorizator/events/ChatEvent.java b/src/main/java/xyz/soukup/discordauthorizator/events/ChatEvent.java index abb0f0b..00fc93b 100644 --- a/src/main/java/xyz/soukup/discordauthorizator/events/ChatEvent.java +++ b/src/main/java/xyz/soukup/discordauthorizator/events/ChatEvent.java @@ -12,6 +12,7 @@ import org.bukkit.event.EventHandler; import org.bukkit.event.Listener; import org.bukkit.event.player.AsyncPlayerChatEvent; import xyz.soukup.discordauthorizator.DiscordAuthorizator; +import xyz.soukup.discordauthorizator.WebHooks; import java.awt.*; import java.util.Objects; @@ -44,9 +45,8 @@ public class ChatEvent implements Listener { messageComponent.addExtra(nameComponent); messageComponent.addExtra(ChatColor.WHITE + event.getMessage()); event.setCancelled(true); - JDA jda = DiscordAuthorizator.getJDA(); - FileConfiguration config = DiscordAuthorizator.getPlugin(DiscordAuthorizator.class).getConfig(); - Objects.requireNonNull(jda.getTextChannelById(Objects.requireNonNull(config.getString("chat-channel")))).sendMessage("**" + playerName +"**: " + event.getMessage()).queue(); + String avatar = "https://mc-heads.net/avatar/" + playerName; + WebHooks.sendToAll(playerName, avatar, event.getMessage()); DiscordAuthorizator.getPlugin(DiscordAuthorizator.class).getLogger().info(event.getPlayer().getDisplayName() + ": " + event.getMessage()); for (Player p: Bukkit.getOnlinePlayers()){ p.spigot().sendMessage(messageComponent); diff --git a/src/main/java/xyz/soukup/discordauthorizator/events/DiscordSendMessage.java b/src/main/java/xyz/soukup/discordauthorizator/events/DiscordSendMessage.java index 407c949..514e79b 100644 --- a/src/main/java/xyz/soukup/discordauthorizator/events/DiscordSendMessage.java +++ b/src/main/java/xyz/soukup/discordauthorizator/events/DiscordSendMessage.java @@ -1,5 +1,6 @@ package xyz.soukup.discordauthorizator.events; +import net.dv8tion.jda.api.entities.User; import net.dv8tion.jda.api.events.message.MessageReceivedEvent; import net.dv8tion.jda.api.hooks.ListenerAdapter; import net.md_5.bungee.api.chat.ComponentBuilder; @@ -13,15 +14,25 @@ import xyz.soukup.discordauthorizator.DiscordAuthorizator; import java.util.Objects; +import static xyz.soukup.discordauthorizator.WebHooks.send; + public class DiscordSendMessage extends ListenerAdapter { public void onMessageReceived(MessageReceivedEvent event){ FileConfiguration config = DiscordAuthorizator.getPlugin(DiscordAuthorizator.class).getConfig(); - if (event.getChannel().getId().equals(config.getString("chat-channel")) && !event.getAuthor().isBot()){ + if (DiscordAuthorizator.webHooks.containsKey(event.getChannel().getId()) && !event.getAuthor().isBot()){ TextComponent content = new TextComponent(event.getMessage().getContentStripped()); TextComponent sentFromDiscord = new TextComponent(net.md_5.bungee.api.ChatColor.DARK_PURPLE + "[D] "); - sentFromDiscord.setHoverEvent(new HoverEvent(HoverEvent.Action.SHOW_TEXT, new ComponentBuilder(ChatColor.LIGHT_PURPLE + "Odesláno z discordu").create())); + sentFromDiscord.setHoverEvent(new HoverEvent(HoverEvent.Action.SHOW_TEXT, new ComponentBuilder(ChatColor.LIGHT_PURPLE + "Odesláno z oficiálního discordu").create())); + if (!event.getGuild().getId().equals(config.getString("guild"))){ + sentFromDiscord.setText(net.md_5.bungee.api.ChatColor.DARK_PURPLE + "[PD] "); + sentFromDiscord.setHoverEvent(new HoverEvent(HoverEvent.Action.SHOW_TEXT, new ComponentBuilder(ChatColor.LIGHT_PURPLE + "Odesláno z partnerského discordu").create())); + + } TextComponent name = new TextComponent(event.getAuthor().getName() + ": "); - name.setColor(DiscordAuthorizator.convertToChatColor(Objects.requireNonNull(Objects.requireNonNull(event.getMember()).getColor()))); + if (Objects.requireNonNull(event.getMember()).getColor() != null){ + + name.setColor(DiscordAuthorizator.convertToChatColor(Objects.requireNonNull(Objects.requireNonNull(event.getMember()).getColor()))); + } TextComponent message = new TextComponent(); message.addExtra(sentFromDiscord); message.addExtra(name); @@ -29,6 +40,15 @@ public class DiscordSendMessage extends ListenerAdapter { for (Player p: Bukkit.getOnlinePlayers()){ p.spigot().sendMessage(message); } + User author = event.getAuthor(); + String serverNickname = config.getString("channels." + event.getChannel().getId()); + for(String channel : DiscordAuthorizator.webHooks.keySet()){ + if (channel.equals(event.getChannel().getId())){ + continue; + } + + send(DiscordAuthorizator.webHooks.get(channel), author.getName() + " (" + serverNickname +")", author.getAvatarUrl(), event.getMessage().getContentRaw()); + } } } } diff --git a/src/main/java/xyz/soukup/discordauthorizator/events/initializeCrossChat.java b/src/main/java/xyz/soukup/discordauthorizator/events/initializeCrossChat.java new file mode 100644 index 0000000..08dee6c --- /dev/null +++ b/src/main/java/xyz/soukup/discordauthorizator/events/initializeCrossChat.java @@ -0,0 +1,48 @@ +package xyz.soukup.discordauthorizator.events; + +import net.dv8tion.jda.api.JDA; +import net.dv8tion.jda.api.entities.Guild; +import net.dv8tion.jda.api.entities.channel.concrete.TextChannel; +import net.dv8tion.jda.api.events.session.ReadyEvent; +import net.dv8tion.jda.api.hooks.ListenerAdapter; +import org.bukkit.Bukkit; +import org.bukkit.configuration.file.FileConfiguration; +import org.jetbrains.annotations.NotNull; +import xyz.soukup.discordauthorizator.DiscordAuthorizator; + +import java.util.HashMap; +import java.util.Objects; +import java.util.Set; +import java.util.logging.Logger; + +import static xyz.soukup.discordauthorizator.DiscordAuthorizator.webHooks; + +public class initializeCrossChat extends ListenerAdapter { + @Override + public void onReady(@NotNull ReadyEvent event){ + JDA jda = DiscordAuthorizator.getJDA(); + DiscordAuthorizator plugin = DiscordAuthorizator.getPlugin(DiscordAuthorizator.class); + FileConfiguration config = plugin.getConfig(); + Logger logger = plugin.getLogger(); + + + //JDA CrossChat WebHook Initialization + Set channels = Objects.requireNonNull(config.getConfigurationSection("channels")).getKeys(false); + for(String channelID : channels){ + logger.info(channelID); + TextChannel channel = jda.getTextChannelById(channelID); + String channelNickname = config.getString("channels." + channelID); + if (channel == null){ + logger.info("not exist"); + continue; + } + channel.createWebhook("Server KNKS").queue((createdWebhook)->{ + Guild guild = createdWebhook.getGuild(); + String name = guild.getName(); + webHooks.put(channelID, createdWebhook.getUrl()); + logger.info("Vytvořen webhook pro: " + name + " Nickname: " + channelNickname); + }); + + } + } +} diff --git a/src/main/java/xyz/soukup/discordauthorizator/events/playerDie.java b/src/main/java/xyz/soukup/discordauthorizator/events/playerDie.java index 0f6a05e..6f2b489 100644 --- a/src/main/java/xyz/soukup/discordauthorizator/events/playerDie.java +++ b/src/main/java/xyz/soukup/discordauthorizator/events/playerDie.java @@ -1,5 +1,7 @@ package xyz.soukup.discordauthorizator.events; +import club.minnced.discord.webhook.send.WebhookEmbed; +import club.minnced.discord.webhook.send.WebhookEmbedBuilder; import net.dv8tion.jda.api.EmbedBuilder; import net.dv8tion.jda.api.JDA; import org.bukkit.configuration.file.FileConfiguration; @@ -7,6 +9,7 @@ import org.bukkit.event.EventHandler; import org.bukkit.event.Listener; import org.bukkit.event.entity.PlayerDeathEvent; import xyz.soukup.discordauthorizator.DiscordAuthorizator; +import xyz.soukup.discordauthorizator.WebHooks; import java.awt.*; import java.util.Objects; @@ -14,12 +17,12 @@ import java.util.Objects; public class playerDie implements Listener { @EventHandler public void playerDied(PlayerDeathEvent event){ - JDA jda = DiscordAuthorizator.getJDA(); - EmbedBuilder eb = new EmbedBuilder(); - eb.setColor(Color.DARK_GRAY); - eb.setAuthor(event.getDeathMessage(), null, "https://mc-heads.net/avatar/" + event.getEntity().getDisplayName()); - FileConfiguration config = DiscordAuthorizator.getPlugin(DiscordAuthorizator.class).getConfig(); - Objects.requireNonNull(jda.getTextChannelById(Objects.requireNonNull(config.getString("chat-channel")))).sendMessageEmbeds(eb.build()).queue(); + String playerName = event.getEntity().getDisplayName(); + WebhookEmbedBuilder eb = new WebhookEmbedBuilder(); + eb.setColor(0x424242); + String avatar = "https://mc-heads.net/avatar/" + playerName; + eb.setAuthor(new WebhookEmbed.EmbedAuthor(Objects.requireNonNull(event.getDeathMessage()), avatar, avatar)); + WebHooks.sendToAll(playerName, avatar, eb.build()); } } diff --git a/src/main/java/xyz/soukup/discordauthorizator/events/playerJoin.java b/src/main/java/xyz/soukup/discordauthorizator/events/playerJoin.java index 2c26144..ed0999f 100644 --- a/src/main/java/xyz/soukup/discordauthorizator/events/playerJoin.java +++ b/src/main/java/xyz/soukup/discordauthorizator/events/playerJoin.java @@ -1,10 +1,13 @@ package xyz.soukup.discordauthorizator.events; +import club.minnced.discord.webhook.send.WebhookEmbed; +import club.minnced.discord.webhook.send.WebhookEmbedBuilder; import net.dv8tion.jda.api.EmbedBuilder; import net.dv8tion.jda.api.JDA; import net.dv8tion.jda.api.entities.Guild; +import net.dv8tion.jda.api.entities.Webhook; +import net.md_5.bungee.api.ChatColor; import org.bukkit.Bukkit; -import org.bukkit.ChatColor; import org.bukkit.Color; import org.bukkit.configuration.file.FileConfiguration; import org.bukkit.event.EventHandler; @@ -12,12 +15,14 @@ import org.bukkit.event.Listener; import org.bukkit.event.player.AsyncPlayerPreLoginEvent; import org.bukkit.event.player.PlayerJoinEvent; import xyz.soukup.discordauthorizator.DiscordAuthorizator; +import xyz.soukup.discordauthorizator.WebHooks; import java.util.Objects; public class playerJoin implements Listener { @EventHandler public void playerQuit(PlayerJoinEvent event){ + String playerName = event.getPlayer().getDisplayName(); Bukkit.getServer().getScheduler().scheduleSyncDelayedTask(DiscordAuthorizator.getPlugin(DiscordAuthorizator.class), new Runnable(){ @Override public void run(){ @@ -28,28 +33,32 @@ public class playerJoin implements Listener { JDA jda = DiscordAuthorizator.getJDA(); Guild guild = jda.getGuildById(Objects.requireNonNull(config.getString("guild"))); assert guild != null; - String id = config.getString("players." + event.getPlayer().getDisplayName() + ".discord"); + String id = config.getString("players." + playerName + ".discord"); assert id != null; Color color; guild.retrieveMemberById(id).queue( member -> { + net.md_5.bungee.api.ChatColor memberColor = DiscordAuthorizator.convertToChatColor(Objects.requireNonNull(member.getColor())); - DiscordAuthorizator.playerColor.put(event.getPlayer().getDisplayName(), memberColor); - DiscordAuthorizator.playerRole.put(event.getPlayer().getDisplayName(), member.getRoles().get(0)); + DiscordAuthorizator.playerColor.put(playerName, memberColor); + DiscordAuthorizator.playerRole.put(playerName, member.getRoles().get(0)); DiscordAuthorizator.updateStatus(); - EmbedBuilder eb = new EmbedBuilder(); - eb.setColor(java.awt.Color.GREEN); - eb.setAuthor("Hráč " + event.getPlayer().getDisplayName() + " se připojil", null, "https://mc-heads.net/avatar/" + event.getPlayer().getDisplayName()); - Objects.requireNonNull(jda.getTextChannelById(Objects.requireNonNull(config.getString("chat-channel")))).sendMessageEmbeds(eb.build()).queue(); + WebhookEmbedBuilder eb = new WebhookEmbedBuilder(); + eb.setColor(0x36d900); + String avatar = "https://mc-heads.net/avatar/" + playerName; + eb.setAuthor(new WebhookEmbed.EmbedAuthor("Hráč " + playerName + " se připojil", avatar, avatar)); + WebHooks.sendToAll(playerName, avatar, eb.build()); }, throwable -> { - // Error: Member was not found or an error occurred - String kickMessage = "&6&lK&f&lN&6&lK&f&lS" - + "\n\n&c&lNejsi na našem discordu" - + "\n\n&fPro hraní na našem server se musíš připojit na discord:" - + "&bdiscord.gg/EK2n7TEQ4H"; - event.getPlayer().kickPlayer(ChatColor.translateAlternateColorCodes('&', kickMessage)); + net.md_5.bungee.api.ChatColor memberColor = ChatColor.GRAY; + DiscordAuthorizator.playerColor.put(playerName, memberColor); + DiscordAuthorizator.updateStatus(); + WebhookEmbedBuilder eb = new WebhookEmbedBuilder(); + eb.setColor(0x36d900); + String avatar = "https://mc-heads.net/avatar/" + playerName; + eb.setAuthor(new WebhookEmbed.EmbedAuthor("Hráč " + playerName + " se připojil", avatar, avatar)); + WebHooks.sendToAll(playerName, avatar, eb.build()); } ); diff --git a/src/main/java/xyz/soukup/discordauthorizator/events/playerLeave.java b/src/main/java/xyz/soukup/discordauthorizator/events/playerLeave.java index 8f88914..52943e2 100644 --- a/src/main/java/xyz/soukup/discordauthorizator/events/playerLeave.java +++ b/src/main/java/xyz/soukup/discordauthorizator/events/playerLeave.java @@ -1,5 +1,7 @@ package xyz.soukup.discordauthorizator.events; +import club.minnced.discord.webhook.send.WebhookEmbed; +import club.minnced.discord.webhook.send.WebhookEmbedBuilder; import net.dv8tion.jda.api.EmbedBuilder; import net.dv8tion.jda.api.JDA; import org.bukkit.Bukkit; @@ -9,6 +11,7 @@ import org.bukkit.event.EventHandler; import org.bukkit.event.Listener; import org.bukkit.event.player.PlayerQuitEvent; import xyz.soukup.discordauthorizator.DiscordAuthorizator; +import xyz.soukup.discordauthorizator.WebHooks; import javax.security.auth.kerberos.KerberosTicket; import java.awt.*; @@ -17,13 +20,12 @@ import java.util.Objects; public class playerLeave implements Listener { @EventHandler public void playerQuit(PlayerQuitEvent event){ - JDA jda = DiscordAuthorizator.getJDA(); - EmbedBuilder eb = new EmbedBuilder(); - eb.setColor(Color.RED); - eb.setAuthor("Hráč " + event.getPlayer().getDisplayName() + " se odpojil", null, "https://mc-heads.net/avatar/" + event.getPlayer().getDisplayName()); - FileConfiguration config = DiscordAuthorizator.getPlugin(DiscordAuthorizator.class).getConfig(); - Objects.requireNonNull(jda.getTextChannelById(Objects.requireNonNull(config.getString("chat-channel")))).sendMessageEmbeds(eb.build()).queue(); - + String playerName = event.getPlayer().getDisplayName(); + WebhookEmbedBuilder eb = new WebhookEmbedBuilder(); + eb.setColor(0xf50000); + String avatar = "https://mc-heads.net/avatar/" + playerName; + eb.setAuthor(new WebhookEmbed.EmbedAuthor("Hráč " + playerName + " se odpojil", avatar, avatar)); + WebHooks.sendToAll(playerName, avatar, eb.build()); Bukkit.getServer().getScheduler().scheduleSyncDelayedTask(DiscordAuthorizator.getPlugin(DiscordAuthorizator.class), new Runnable(){ @Override public void run(){ diff --git a/src/main/java/xyz/soukup/discordauthorizator/events/playerLogin.java b/src/main/java/xyz/soukup/discordauthorizator/events/playerLogin.java index 4136f71..59a6a7e 100644 --- a/src/main/java/xyz/soukup/discordauthorizator/events/playerLogin.java +++ b/src/main/java/xyz/soukup/discordauthorizator/events/playerLogin.java @@ -3,6 +3,9 @@ package xyz.soukup.discordauthorizator.events; import net.dv8tion.jda.api.EmbedBuilder; import net.dv8tion.jda.api.JDA; import net.dv8tion.jda.api.entities.Guild; +import net.dv8tion.jda.api.entities.User; +import net.dv8tion.jda.api.interactions.components.ActionRow; +import net.dv8tion.jda.api.interactions.components.buttons.Button; import org.bukkit.ChatColor; import org.bukkit.Color; import org.bukkit.configuration.file.FileConfiguration; @@ -12,7 +15,9 @@ import org.bukkit.event.player.AsyncPlayerPreLoginEvent; import xyz.soukup.discordauthorizator.DiscordAuthorizator; +import java.awt.*; import java.util.*; +import java.util.List; public class playerLogin implements Listener { public static HashMap> playersToVerify = new HashMap<>(); @@ -29,12 +34,33 @@ public class playerLogin implements Listener { + "\n\n&fPoslali jsme ti na tvůj discord účet zprávu" + "\n&fKlikni na &3přidat ip &f a připoj se znovu" + "\n\n&6&lZpráva nepřišla?" - + "\n&fMůžeš použít příkaz &3/authorize &f na našem discordu" + + "\n&fMůžeš použít příkaz &3/authorize &f na discordu" + "\n\n\n&7Tvá IP bude uložena, aby jsi se mohl přihlásit" + "\n&7bez nutnosti zadávání hesla.";; - ipToAdd.put(config.getString("players."+ event.getName() + ".discord"), List.of(event.getName(), event.getAddress().toString())); + String userid = config.getString("players."+ event.getName() + ".discord"); + String userAdress = event.getAddress().toString(); + ipToAdd.put(userid, List.of(event.getName(), userAdress)); event.disallow(AsyncPlayerPreLoginEvent.Result.KICK_OTHER, ChatColor.translateAlternateColorCodes('&', kickMessage)); + assert userid != null; + EmbedBuilder embedBuilder = new EmbedBuilder() + .setTitle("Pokus o přihlášení z nové IP") + .setDescription("Pokud to jsi ty potvrď přidání ip níže." + + "\n\n**Nick:** " + event.getName() + + "\n**IP:** ||" + userAdress + "||") + .setColor(java.awt.Color.ORANGE); + DiscordAuthorizator.getPlugin(DiscordAuthorizator.class).getLogger().info("GGGGGG " + userid); + Button button = Button.success("addIP", "Přidat IP"); + DiscordAuthorizator.getJDA().retrieveUserById(userid).queue((user) -> + + user.openPrivateChannel().queue((channel) -> + + channel.sendMessageEmbeds(embedBuilder.build()) + .addActionRow(button) + .queue())); + + + return; } JDA jda = DiscordAuthorizator.getJDA(); @@ -68,12 +94,13 @@ public class playerLogin implements Listener { + "\n\n&cNejsi na whitelistu, &fale můžeš být ;)" + "\n\n" + "\n&f1) Zapamatuj si tento kód: &b" + code - + "\n&f2) Připoj se na náš discord: &bdiscord.gg/EK2n7TEQ4H" + + "\n&f2) Připoj se na náš nebo partnerský discord" + "\n&f3) Našemu discord botovi napiš příkaz &b/link" + "\n&f4) Zadej svůj nick a kód" + "\n&f5) znovu se připoj!" + "\n\n\n&7Tvá IP bude uložena, aby jsi se mohl přihlásit" - + "\n&7bez nutnosti zadávání hesla."; + + "\n&7bez nutnosti zadávání hesla." + + "\n\n&fWEB: &bknks.cz &fDISCORD: &bdiscord.gg/EK2n7TEQ4H"; event.disallow(AsyncPlayerPreLoginEvent.Result.KICK_WHITELIST, ChatColor.translateAlternateColorCodes('&', kickMessage)); } } diff --git a/src/main/resources/config.yml b/src/main/resources/config.yml index c907209..7c53aa5 100644 --- a/src/main/resources/config.yml +++ b/src/main/resources/config.yml @@ -1,5 +1,8 @@ -token: MTI1MTg1MjY2NDI2Mjg4NTQzNw.GB6jIc.QRulRHK5J-I88jvzCUkoKcx8r4vW2DrBOxHlR4 -authorized-role: 1236261645723111465 -guild: 1161967821815808030 -chat-channel: 1247447721175027744 - +token: "TOKEN" +authorized-role: 0000000000000000001 +guild: 0000000000000000001 +chat-channel: 0000000000000000001 +#MUST NOT Contain word "discord" +channels: + 0000000000000000001: "Channel One" + 0000000000000000002: "Channel Two" \ No newline at end of file diff --git a/target/classes/config.yml b/target/classes/config.yml index c907209..9827762 100644 --- a/target/classes/config.yml +++ b/target/classes/config.yml @@ -2,4 +2,6 @@ token: MTI1MTg1MjY2NDI2Mjg4NTQzNw.GB6jIc.QRulRHK5J-I88jvzCUkoKcx8r4vW2DrBOxHlR4 authorized-role: 1236261645723111465 guild: 1161967821815808030 chat-channel: 1247447721175027744 - +channels: + 1261983819809161216: "Území Testů" + 1247447721175027744: "KNKS Discord" \ No newline at end of file diff --git a/target/classes/xyz/soukup/discordauthorizator/DiscordAuthorizator.class b/target/classes/xyz/soukup/discordauthorizator/DiscordAuthorizator.class index f4969c7aaf93ca30e6cec14a31cd39bc7fe7fc53..cf8076270811ec42b6c02e8ec9c53230c5d5757b 100644 GIT binary patch literal 12912 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 delta 3692 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 YuBHHc?5lQ4dZ1UPqRFbOa-mp5f4zD*b^rhX diff --git a/target/classes/xyz/soukup/discordauthorizator/commands/link.class b/target/classes/xyz/soukup/discordauthorizator/commands/link.class index 13913ef4ce695207b5d138bd97e367ddf1a2b815..df33442b0179b2303c1b279c0419fd65cb0e3a9d 100644 GIT binary patch delta 2922 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 diff --git a/target/classes/xyz/soukup/discordauthorizator/events/ChatEvent.class b/target/classes/xyz/soukup/discordauthorizator/events/ChatEvent.class index 0b95b709337c2d88444dc8025875ada3563d9b36..9d22526450f810c20d6ac59222ff9504e138b9f6 100644 GIT binary patch delta 986 zcmXYvX>e0j6vuxzCAsN)x1|ZzHel0IODmI<$T~xm8J+Qie!yX*Bl5uyX&Z_|q0wac z;5hV?8z>4F5X6O|h*VT68q>H{QLDJ&Qg^`>aK(K=1kZaq^X7lfJ@@f`Sh#fV}p+^mm zQMAX*^y(7BnzG>uRw^3T?WwPCS(v+`r>~%JJ<0R4`Fy4)t9i;UsG6mo*?VnOYhYq1 zvocf2T&1X5SjcoOo1e*bWIB6=^?@CzoKT?|vy*DB9M5MCpYw(0ORtfy?ADrn)f`b& zsB}}9ue~V^MB;XJ#0l`N-4scr`Cg$@%kw==N*Ko!0j0wHq-a=LDCF|#RBCxw`_gQt zJ3nnjwvhTyMoK8Z*u#;j0sgd+=+q#`74h|vI(x82+smV-_DKRLyq$SANJwzRu8N*M z^I3^`CpeAg1dZ1T>Oq_fySf*m9&(=LCX#sN}{ zaWUpnwhGNS!xEe)okYYtuK)h-NG5=B^gPM7G7pQT6iw6@T#;g&Hq1`e$Rc4 z*JVPEO7eyj2oO~*yvbXld$OwKZSls5z@xk)rGrv>G4Bd5#Cy_D6XQ7U!tyrrvDga9_I7uWLt>NYOZZf-4*Pi2$8UW6&c`2o{L#ms`BhSy bMam*N`0czHOX%`#iE4hAmHxqB{7vj%2#)Y+ delta 1641 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 JR77(T`Y&+-Bj5l4 delta 1408 zcmYk6`&U#|6vsb@nLGE+%wd2L)IoWQi70|53S%gQW~GQ?n9p*QNl~0p9$H$_TeFAh zseBZrrJ1D(Rs#cNl%=JWW>0&$YOQ{0tyc99WarLuwYuxBy}x_!bG~Pv?>YDGDf%_f zbM~LUlRzauc6)}2R1baznWRfH7%Z5qcKR~ZndE%6TQvBF5-`b>3}d)pnl5FjAxYIa z7TE&1a&@S!Ser;B-0UHjJd=FM2ntlxY%02jQ6`0w(G&?%*Mv5PN}5BFRVDM=TACuO z1g`Lg_E2-HAVYOo>E6Y5A7drOj8jLFCizMkZ!$r0EfWQKdgVOjbEJw%D#tO#@>4FU zAgJmcLEm*$noN~UvwJK^^w{Ibw#ulM7+kM@a%B3ZGsENt$xLn(WT|%|;(+*#sfszzWGq8kN^oA#1tAZb)x^VWHaK&QK*TLtS=xRGX_z zciSXc!&=qtno{Vcly#Dby&-c|xNS~oUD!_&>uvf1Tc{RED{X3qRqox$CX+iQcd=P* zv*tSQ7L2e(NUaU8TM=&YvW0sk9o(nf?)>2o2z-gN2yJRBsfjj6TRfONBzc%e)J*p* z-N-h{qik3E+!K<^aCj)=3CWY}P?y|OygS)tq9jlAjLPv$_wHto$zI7mo>LJ|rMHt8 zOkR}iXQGOE@~lo?lDy18b=i|EUfJc%vJUa82s%qZ~7NLvmcxhrFdOlWsw| zTAp04MkW8QN_`95MtEa5(k7@--N_ZoO4;uF#KT$6nS5%?@tNA6a%vps1%_BMeOa!> z7y3$xy2fy8^Qi-oXzu3R#-`Sl(U!(`i!TKZ5zJM8rsf-bCm5-!)3QAUv!l_q?dwgx zS5wo92X$$s?I#J%iA&oP>fW@$9dGKK9YHE@X)6=h;B8_$67FxHy+S*6(ybWs7t?InETDtZI&(I6+MxH=*N> zs-QFA?59@e>iTKW?$$n**`?(%LOq0ItiH;jIhzH2MD1!-&EW@UE8q$^V?3^%k#NP@_VQGmX9YpCBVfjPUa*&J8yye~a42X6tT=}S z0auLI4`2DYTW{NeE!9*~wDoJ52I-GFUB?;JF_`rXVJky9NPuHxYAJ`&&v4!+i(km* z4|4d6yoAK{SUM+(>%DYXn&N~W`i@?pjsv`_kyBGOaZ)2glhyE^MlM_VtEXb40Zpy{ zR{X{XoYJTIp{|c7=?dqtOu9_`Cb=eM|9d;(3I#a+E9)sW4nEQ@iPN0XK3#Y5vF80e hVJ{@?MZVINOkJ5vEnim!ILaZu(RblnF7X3_e*q3mJVXEh diff --git a/target/classes/xyz/soukup/discordauthorizator/events/playerDie.class b/target/classes/xyz/soukup/discordauthorizator/events/playerDie.class index b3d459a34f964214d1b8b193d93e73ca5f93dac2..fbaf6323c1d41286f2f030420c5b1d1bad335ac6 100644 GIT binary patch literal 2458 zcmbVOe^(nt6umS9z zE;meW)r^huj;JVxzK7D1YJnk=Oci73$AE^IjzQ=QN!zIzWv|hY$`HH4qR~=P?HNx@ zz9*a|!Bu_Pw=)dXgj#NYWSB^%^5LD~J()oaVOYZj9TyR2xcqO93`2C}l5|^iSAjPL z!zi7562PW%q*cpk7-hIuF} zGW5GbUzs%9q2sa9v&#G2FtehO~}37)OM9N}3(r z5y~M){NPDP6l|;DndU!W2lC8>VRuX#Zl4lz5KRoz_`p~BU4{qe#2-pRC;YP(U;iWc zP{)0IM2e;y27xko$u1KX=81ynj^vI!+lrdkk-KIIFpY{!2ntMqCpL&Shp-Le<`z3T7r%q@1?nVwidJZO1nT6)}ER#0)*6%y7R; zl^kh~8UnQl#fikkQ;#ZlQxv5uiL6D-vK3d7>I}oxvyj`3V3k`{Q#d{|o3`gv#ESH3 zA3COK&M&R>ezUf%T;=fAx}aK8b%*=#EQYV~jfQXi0{0!m)JYYV)~?+UM(}cjnzzC$ zq}Dx#pTo-RI0lCXVBD!Z$=PdV&T3hS98~>w;I^IZG%bpx9sx`kFV zF!_2{QbRxg`nEBW=(ymo6J+HZJ^Vf__GwhwTrkdBWXVtgN0O0zHNddx@DuQ0t$jyDf6 z^9SBfL=({i+}X#y(rhA{-p7MOJURg|35^aOMGTh^#~3Csjw$N%3rJv<`n(V9Zg6=A z7{NdR8w4({TU* literal 2934 zcmbVO+ji4N6x|aWWE_zYb4|I^Kof{jxs(D1TE_{O;24^uNrAR>Vh#2rie#iw!1O|| zztGj+XdeQht6eeCF5;&=x{%S3)v*B^ z8Me&xC2m;UZWuS_=0#mGY`h?CsV*^O28U+y$YGO)ypC?@3@0D99~qwGFZeCPlwRF& zP426vgvr0O)F>i8%x1>RnB@I0c2hwK8 z7UzUH;!DdEZXTPF*@Qk6G;Gze4ci%d!W8%eWmFu?aTzv^mM5>@y)s$8Mfp`bXG=kZ zojP`*pCRW76|Xrx_@ZMv)Fc>+wHtdh?A5Uk`xyouw_(ir3ky;iVoBIE+DfXnans^$ z;f@Nfnqz^Tp_eEL-zS9U@rGd7M%=8O#guZT-3T{0sN)dcrmSemSQw9C4>>0{OKwx@ z#$g=M@Q#kb0M)KnITCXL3hA{7UX3q`0#(RS9mg=tuyc_wh>By^xtf)#N&h^>ZRIf> ziJ1y(CdQcxeKU^hFz_xxC!V8{V7Q&K{N==7wyf(oayY5u6i!EM-L(9Mv>DDMx2#y) z^GY4`wL(85WPhBlL$r>_&*6-Y_i;7~M;zRf4Te*le^VT2I6XQbd0qWsGR3=orNqLtmJPucQ@UX*#qX zSKRldD{78i^DXOzQ;cptk+N2Ru}Q;~4vmO5?8Y^WYq+kXiV3Qfv|Afq_yQH!w0Nj0 zQO+anYbL{uMWMjS_Z%H^#IL7x_;*Sir9^JwFdhA)Hm^cBOvno>!7$ypFaBqWuv zV_l{)cHB0@FG;D19iyNT7;m8JIP@)3N+@5fNC`{F!s&KPq`2Qn_@~He9HPQ4Yf36X z{ooshy-lTB-g(1VtQVVto8Ix@P7w!+y9T3vag7><8#XNAY50!e@Jnf@WuxH-hJCMh zrSp$c$3fhsPeKMx-9LEJXCaMsdNb(B=(*wO6R=;yX_Lla8t8$bQI8yO4-I-_XhKqu zVDaC`QYb(?g*Nd!Hs5-J-dgcDY+1&R+2XNfyv1lZuz~@GXBYyOQJgL0p5nxF;4w&@S7l1w;0gFKsM9gD>z-NgA3yYM1j$5$dAVceh(ZYS2b7^Iex<}6p6pdZ* Zu|&@tSs&2vYdog6JpKC?-{VL0{|k`~Y!Lte diff --git a/target/classes/xyz/soukup/discordauthorizator/events/playerJoin$1.class b/target/classes/xyz/soukup/discordauthorizator/events/playerJoin$1.class index f36cdc84717cf235126cdebb02605cec3acf41fa..28e676c1e03e456278ea8ff5bcf38ab3ce02a8da 100644 GIT binary patch delta 23 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 diff --git a/target/classes/xyz/soukup/discordauthorizator/events/playerLeave.class b/target/classes/xyz/soukup/discordauthorizator/events/playerLeave.class index 28346ff66096af84e4db62f8387e26b485f58ca5..cc5c5ed603470286bd1ec001acb4d18d1233a21f 100644 GIT binary patch literal 2977 zcmbVOOIO=Q6#ga{M2s51kcZPeXab2z05$Ihr%idKKn!`9;?ndbTN8V*EVAKKdR50Jzmq%|DY@g|Ni^lq&(=SW`W9)s2}?SS99&u}0!7st`G z$SQBgbR5S3L#NN>lxw>*FPDj7-n1Rgy%ykXiVpRJj*}Qy0OhSm)$v{!mbY^ zIz}-@kwn}@3orzk7Kw`E%f2ql3eDR(&fz>mdr`#-!+DCm)~KR@xQI&{F6+30cPN)0 zu01k*H>d{n%?LF^9>pV5x}FNqS&CLVKVrbKmfQ*3W+?nWPFsYg7#|1a&NZDxf^xq% zmWGpIzDFsY=Uzia|NiYM9Su`1zmEwGlRBm_z1_*?M4gg2U#f5`u$7<8c0c~+7b9Bq zxg|lnL8QNeGExVX=uxypG$t{FSsinj-_)d_EF6Z*aUQ2^)AuPnVwml-sK){^O0RV?qa^X7(Q*?Bi`9J6Ti?ELVYh82c$E$>3ZJ%)4) zZ&XBb!k64p@sOBuEmHRGoN)MJK-%mrsU;awIk#lm%cdt(zd4wY6+!uNA=fgHEJHFX zU8-g=jBKOeWu=V{f>a>1VAvKiFP-&#y{L4hV!SqWkYNumGF)j3Kh)^se&NX1Lu4ZIS+Ar$RB5lLYXkEvu} z=vw5yT;S?#$Y0N->q=jGW_^KE5wQI34t$w}2Va9!l_{VA-725LX}DExL|cxE)eW;m za<|6tOFSi;hLO_{^$cnm zwe4pfgZ&nM{*<2TGtiIE=&45r_#9tQkHJKdoT$lvlbuqo(%E%rPw)oA!ZY-(JjVXT z(bRzr99+lI!pKuv9^;A8XBb+c&S@Z>NGBd6vyQWck#u5o9mWPOY~bn>TqiY{*}wyM)R*j&{zVib3oG#_4)`|i8%-rrsS`se!Z03N|l8PuU(LrO;j z7BMUvGbc^MHl31jY;=qlCBve_!V&UOhWhr7;SADPtRbVL5jw-33sV;j-wnotieU-A z=z5kJ$g=B+i>7ovqbH(uC1@nD#ASa^7sI;tj=aOAVND*8!gY)>%QVc2FlaNYp^2fj z)^6{_D7U%;VO!kGUy~NtkAI%s~DO>6U_6{$ho%bk=`eJd&shUH9f1&uFgkW=xIY$NW+W(^PMXu}qUwfABq`$;6>u5KJOCpg1Ok~{0x zg7kz_$~Kexx9Mm{2g8~PbDZZ~r)bI%Aus?Za&Nh8NTLo>!R(wVXNWG=F~d#cZ3IF@wB?I@}x zgK|Ph!F?mf%phcn9+%um2qh2)7!LmL^D0n}={SxP3=N~IkT7)KqZHj%Xn^~^S>j>V zlL7^XjyV-b@;4%nr*sTsgnZ?5$4YLJuP(ROEQ7W0KC=Mc+9{+WgZt7qJX+0S7{#$h zIggu?cZD=6Ij3-1!xoO_d; zD)*}D#4Chk(#rzZa8^eN1|GO>=>o{e>AnQ zqWf`4&vSE+o{fz-2Ty~qLn2^kOMrAw%_%2u?G>h+ zVh>l1#u_sHaca`-$+i;LzPRKi3c$(0am-PhXZt()G@NJHyOUr?WLZ#p?9DG&kt{#lgK-n-Y3x0e+S!t7es~%Oui?>~=$XNhI)tD3&S?zR z|Avz@7^=q%o@PXUb_PW%3hMj~h*PBd_)0i4s5D??)`-nCuYrdC6jqTDtLbYE_R~P0 zLkk?5$Uh=nl!5yqBVq%|9K4P<$j}tt$D4SIjMa(qHr_!!o$bfFcrV;~Szi6HU-tJ>TMc{D_u+0ifj#KL7v# diff --git a/target/classes/xyz/soukup/discordauthorizator/events/playerLogin.class b/target/classes/xyz/soukup/discordauthorizator/events/playerLogin.class index 06a11bfa0c8b020f600be3733ef9ec4ccc4f3cf7..eabe2c424d800ad3577d0d0ec8b90a7fed7c9dfc 100644 GIT binary patch delta 4546 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 delta 2598 zcmYjTdwkPZ75|>(m;Ca$ZGKG~Xwo*cg|fEvLFvY$jL}j$+CsZRq2)EU(8d}*p(#nq zWD_&N3FtP3JEwx1n=eG&9Ib{vWR$r%H+6#ZJ#`P=)G1EqrgM(zxxaKk|2V&M?|I(u zd8GGje74c`^t%&}0$4`jldd zQ7)VGJh|JICu4bea;w|xv*M7z$MA82J=E719!e6{mdh!7os4Fc8V(PK3CrYK5tNfzC8>7YBk(EAAc%qRU^pI1hMQykVfD&S3w%Z) z>KTfL_Jre!^|79CJo3IhUf7WD#5Nog_#CzqvRAh?ufD0bwQYUNnzrusI_@VJ=Ie)( zk!bC@&|rUTrwjMNs>p)^U%(d$T4XSpkXy3L9CmzJ;43&T4`$b9pTO62d|luhc!&^? z9#23%pWWd*fo}>tf|LA)Xk=%EA3m$RU52t}IdqH)d<)-}@Ap)?9XO=`8Y7g+U7i_o ziQ&oe!ifoWJ4q-pZ?_t5mm4Q=THsNfk#BqU(OJ3IC@h&mlM4wvF7Skc#GQ<77#a%4 zn?s4P15XkT9nogW^G4GB6rR@c1A!mnN3tvD`k;;EtuhhLObH6SY4ZHCao)h>Dek)78vvoYLUigAs~JAz#jx&hMlW7Jk-y%>rRG}!wDDuh(GE0v%stJjIZ8;3!`uNx=6R~=noP6 z^031<`ufc0h!)6a{AIQ}LVKo*Dgr$;U)~;=k~52zXP3HYHqFtgOu$cbWq;A*R4yxm zMN}zQ1&iiZ5pt$mqlRkwBZv{>sP%uwNT+Bm+AZeSsG30h0*cTN@$nFWNu!pfb9H}NkHz{Zv!bdCLig3>5k zoI<*)GL5n^ES|!3X*7<<&CB`vqL4!7e+m6EUYfr*GiPWZ3`0$xaemOq68f?=lwkuTp zn%_2#eHK(s;2;#e6Bx%`RvbtD7$m26?-dzw5@t%(6ZkARD5rMRnCsW3b7K%RD3E&K zV>*KYnu!4NQ>cR<4a|0-0Nt2_VU%GX=JGx+#{pE}7%K5F=HWD|a1J$i6^*!nCU&-h zbTpF(9aO{!Db%+z(%qPkf8#AK?g8}SKX{wDV=Ry3znsEpRO20%+StAd7m;E`c9CtG zXsRlB7yn~dg1lU0Rp$U{WFado#B#H+nHwA5*!d<1+ePfxQK+N-A}V$4*0KK`l;}vj zg~D1+(rgWK@Ykt!JNr~!be7YxrI=Z5%wKBUdab@}68CX+KHpg#D9~#khrD5JUzE3b`lndL zRVP=eks84-6wfNZW zY9K!aI0*xlR6vCcrGs1cy=~IPXZ2U+ZBOHsqr4uDL$i+Jwn=Q{cKFLE?!CmdUCtl_ zNDe#o^7P~?a8sO=MKp5W+{WApG>eM)+XEMsa4%nF(h8H#qiWW=nikTMX>KW9XG$8) u^9pLF6()B*wNksut)WipHn|PdOIv9h`&R$eZG)F?YV_01cG^z;@c$o1XDaFd