commit d43e96b3e032effd3b788d034e427ecb9c2b9b1c Author: jakub Date: Mon Jun 17 13:56:41 2024 +0200 pp diff --git a/.idea/.gitignore b/.idea/.gitignore new file mode 100644 index 0000000..26d3352 --- /dev/null +++ b/.idea/.gitignore @@ -0,0 +1,3 @@ +# Default ignored files +/shelf/ +/workspace.xml diff --git a/.idea/artifacts/DiscordAuthorizator_jar.xml b/.idea/artifacts/DiscordAuthorizator_jar.xml new file mode 100644 index 0000000..648e32c --- /dev/null +++ b/.idea/artifacts/DiscordAuthorizator_jar.xml @@ -0,0 +1,24 @@ + + + $USER_HOME$/mineconomia/dev-server/plugins + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/compiler.xml b/.idea/compiler.xml new file mode 100644 index 0000000..a4b69fd --- /dev/null +++ b/.idea/compiler.xml @@ -0,0 +1,14 @@ + + + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/discord.xml b/.idea/discord.xml new file mode 100644 index 0000000..d8e9561 --- /dev/null +++ b/.idea/discord.xml @@ -0,0 +1,7 @@ + + + + + \ No newline at end of file diff --git a/.idea/encodings.xml b/.idea/encodings.xml new file mode 100644 index 0000000..aa00ffa --- /dev/null +++ b/.idea/encodings.xml @@ -0,0 +1,7 @@ + + + + + + + \ No newline at end of file diff --git a/.idea/inspectionProfiles/Project_Default.xml b/.idea/inspectionProfiles/Project_Default.xml new file mode 100644 index 0000000..79937a3 --- /dev/null +++ b/.idea/inspectionProfiles/Project_Default.xml @@ -0,0 +1,7 @@ + + + + \ No newline at end of file diff --git a/.idea/jarRepositories.xml b/.idea/jarRepositories.xml new file mode 100644 index 0000000..861936a --- /dev/null +++ b/.idea/jarRepositories.xml @@ -0,0 +1,30 @@ + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/misc.xml b/.idea/misc.xml new file mode 100644 index 0000000..4731638 --- /dev/null +++ b/.idea/misc.xml @@ -0,0 +1,14 @@ + + + + + + + + + + \ No newline at end of file diff --git a/.idea/modules.xml b/.idea/modules.xml new file mode 100644 index 0000000..9f9bacd --- /dev/null +++ b/.idea/modules.xml @@ -0,0 +1,8 @@ + + + + + + + + \ No newline at end of file diff --git a/.idea/uiDesigner.xml b/.idea/uiDesigner.xml new file mode 100644 index 0000000..2b63946 --- /dev/null +++ b/.idea/uiDesigner.xml @@ -0,0 +1,124 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/vcs.xml b/.idea/vcs.xml new file mode 100644 index 0000000..94a25f7 --- /dev/null +++ b/.idea/vcs.xml @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git a/DiscordAuthorizator.iml b/DiscordAuthorizator.iml new file mode 100644 index 0000000..a589521 --- /dev/null +++ b/DiscordAuthorizator.iml @@ -0,0 +1,13 @@ + + + + + + + SPIGOT + + 1 + + + + \ No newline at end of file diff --git a/pom.xml b/pom.xml new file mode 100644 index 0000000..2f76c9e --- /dev/null +++ b/pom.xml @@ -0,0 +1,83 @@ + + + 4.0.0 + + xyz.soukup + DiscordAuthorizator + 1.0-SNAPSHOT + jar + + DiscordAuthorizator + + + 1.8 + UTF-8 + + + + + + org.apache.maven.plugins + maven-compiler-plugin + 3.8.1 + + 17 + 17 + --enable-preview + + + + org.apache.maven.plugins + maven-shade-plugin + 3.2.4 + + + package + + shade + + + + + + + + src/main/resources + true + + + + + + + spigotmc-repo + https://hub.spigotmc.org/nexus/content/repositories/snapshots/ + + + sonatype + https://oss.sonatype.org/content/groups/public/ + + + + + + org.spigotmc + spigot-api + 1.18.2-R0.1-SNAPSHOT + provided + + + net.dv8tion + JDA + 5.0.0-beta.23 + + + club.minnced + opus-java + + + + + diff --git a/src/main/java/xyz/soukup/discordauthorizator/DiscordAuthorizator.java b/src/main/java/xyz/soukup/discordauthorizator/DiscordAuthorizator.java new file mode 100644 index 0000000..503580e --- /dev/null +++ b/src/main/java/xyz/soukup/discordauthorizator/DiscordAuthorizator.java @@ -0,0 +1,126 @@ +package xyz.soukup.discordauthorizator; + +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.interactions.commands.DefaultMemberPermissions; +import net.dv8tion.jda.api.interactions.commands.OptionType; +import net.dv8tion.jda.api.interactions.commands.build.Commands; +import net.dv8tion.jda.api.requests.GatewayIntent; +import net.md_5.bungee.api.ChatColor; +import org.bukkit.Bukkit; +import org.bukkit.configuration.file.FileConfiguration; +import org.bukkit.entity.Player; +import org.bukkit.plugin.java.JavaPlugin; +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.util.logging.Logger; +public final class DiscordAuthorizator extends JavaPlugin { + public static HashMap playerColor = new HashMap<>(); + public static HashMap playerRole = 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 = JDABuilder.createDefault(config.getString("token")) + .addEventListeners(new link()) + .addEventListeners(new authorize()) + .addEventListeners(new DiscordSendMessage()) + .addEventListeners(new voting()) + .enableIntents(GatewayIntent.GUILD_MEMBERS) + .enableIntents(GatewayIntent.GUILD_MESSAGES) + .enableIntents(GatewayIntent.MESSAGE_CONTENT) + .build(); + jda.updateCommands().addCommands( + Commands.slash("authorize", "autorizuje novou ip"), + Commands.slash("link", "propojí discord s minecraftem"), + Commands.slash("add-votes", "prida hlas ") + .setDefaultPermissions(DefaultMemberPermissions.enabledFor(Permission.ALL_PERMISSIONS)) + .addOption(OptionType.USER, "hrac", "hrac", true) + .addOption(OptionType.INTEGER, "votes", "bb", true), + Commands.slash("hlasy", "zobrazí počet hlasy") + .addOption(OptionType.USER, "hrac", "hrac", false), + Commands.slash("hlasovat", "spustí hlasování") + .addOption(OptionType.STRING, "popis", "o čem se bude hlasovat", true) + + ).queue(); + jda.getPresence().setActivity(Activity.customStatus("Nikdo na serveru")); + Bukkit.getPluginManager().registerEvents(new playerLogin(),this ); + Bukkit.getPluginManager().registerEvents(new playerLeave(),this ); + Bukkit.getPluginManager().registerEvents(new playerDie(),this ); + + Bukkit.getPluginManager().registerEvents(new ChatEvent(), this); + Objects.requireNonNull(this.getCommand("msg")).setExecutor(new msg()); + Objects.requireNonNull(this.getCommand("msg")).setTabCompleter(new msg()); + Objects.requireNonNull(this.getCommand("r")).setExecutor(new r()); + 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(); + User user = (User) voteData.get("author"); + int yes = (int) voteData.get("yes"); + int no = (int) voteData.get("no"); + String description = (String) voteData.get("description"); + EmbedBuilder eb = new EmbedBuilder(); + eb.setAuthor("Hlasování hráče " + user.getName() , null, user.getAvatarUrl()); + eb.setTitle("Hlasování předčasně skončilo kvůli restartu"); + eb.setColor(Color.MAGENTA); + eb.setDescription(description + "\n\n```Pro: "+ yes +"\nProti: "+ no +"```"); + message.editMessageComponents().queue(); + message.editMessageEmbeds(eb.build()).queue(); + } + jda.shutdown(); + } + public static JDA getJDA() { + return jda; + } + public static ChatColor convertToChatColor(Color color) { + // Extract RGB components + int red = color.getRed(); + int green = color.getGreen(); + int blue = color.getBlue(); + + // Convert RGB to hexadecimal string + String hex = String.format("#%02x%02x%02x", red, green, blue); + + // Return ChatColor from hex string + return ChatColor.of(hex); + } + public static void updateStatus(){ + Collection players =Bukkit.getOnlinePlayers(); + String status = switch (players.size()) { + case 0 -> "nikdo na serveru"; + case 1 -> "1 hráč na serveru"; + case 2, 3, 4 -> players.size() + " hráči na serveru"; + default -> players.size() + " hráčů na serveru"; + }; + jda.getPresence().setActivity(Activity.customStatus(status)); + } + +} diff --git a/src/main/java/xyz/soukup/discordauthorizator/commands/authorize.java b/src/main/java/xyz/soukup/discordauthorizator/commands/authorize.java new file mode 100644 index 0000000..fc1b344 --- /dev/null +++ b/src/main/java/xyz/soukup/discordauthorizator/commands/authorize.java @@ -0,0 +1,29 @@ +package xyz.soukup.discordauthorizator.commands; + +import net.dv8tion.jda.api.events.interaction.command.SlashCommandInteractionEvent; +import net.dv8tion.jda.api.hooks.ListenerAdapter; +import org.bukkit.configuration.file.FileConfiguration; +import xyz.soukup.discordauthorizator.DiscordAuthorizator; +import xyz.soukup.discordauthorizator.events.playerLogin; + +import java.util.List; + +public class authorize extends ListenerAdapter { + public void onSlashCommandInteraction(SlashCommandInteractionEvent event) { + if (event.getName().equals("authorize")) { + 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 new file mode 100644 index 0000000..08039e4 --- /dev/null +++ b/src/main/java/xyz/soukup/discordauthorizator/commands/link.java @@ -0,0 +1,75 @@ +package xyz.soukup.discordauthorizator.commands; + +import net.dv8tion.jda.api.EmbedBuilder; +import net.dv8tion.jda.api.entities.MessageEmbed; +import net.dv8tion.jda.api.events.interaction.ModalInteractionEvent; +import net.dv8tion.jda.api.events.interaction.command.SlashCommandInteractionEvent; +import net.dv8tion.jda.api.hooks.ListenerAdapter; +import net.dv8tion.jda.api.interactions.components.ActionRow; +import net.dv8tion.jda.api.interactions.components.text.TextInput; +import net.dv8tion.jda.api.interactions.components.text.TextInputStyle; +import net.dv8tion.jda.api.interactions.modals.Modal; +import net.dv8tion.jda.api.interactions.modals.ModalMapping; +import org.bukkit.configuration.file.FileConfiguration; +import xyz.soukup.discordauthorizator.DiscordAuthorizator; +import xyz.soukup.discordauthorizator.events.playerLogin; + +import java.awt.*; +import java.util.List; +import java.util.Objects; + +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) + .setPlaceholder("PVPMaster666") + .setMaxLength(16) // or setRequiredRange(10, 100) + .build(); + + TextInput body = TextInput.create("code", "Verifikační kód", TextInputStyle.PARAGRAPH) + .setPlaceholder("1234") + .setMaxLength(4) + .setMinLength(4) + .build(); + + Modal modal = Modal.create("linkdialog", "Propojení minecraft účtu") + .addComponents(ActionRow.of(subject), ActionRow.of(body)) + .build(); + + event.replyModal(modal).queue(); + } +} + public void onModalInteraction(ModalInteractionEvent event) { + if (event.getModalId().equals("linkdialog")) { + List answers = event.getValues(); + if (playerLogin.playersToVerify.containsKey(answers.get(0).getAsString())){ + if (Objects.equals(playerLogin.playersToVerify.get(answers.get(0).getAsString()).get(1), answers.get(1).getAsString())){ + 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(); + playerLogin.playersToVerify.remove(answers.get(0).getAsString()); + MessageEmbed embed = new EmbedBuilder() + .setTitle("Propojeno.") + .setDescription("Přejeme příjemné hraní") + .setColor(Color.GREEN) + .build(); + DiscordAuthorizator.getPlugin(DiscordAuthorizator.class).saveConfig(); + event.replyEmbeds(embed).setEphemeral(true).queue(); + }else { + MessageEmbed embed = new EmbedBuilder() + .setTitle("Špatný kód.") + .setColor(Color.RED) + .build(); + event.replyEmbeds(embed).setEphemeral(true).queue(); + } + }else{ + MessageEmbed embed = new EmbedBuilder() + .setTitle("Daný nick není ve verifikačním procesu.") + .setColor(Color.RED) + .build(); + event.replyEmbeds(embed).setEphemeral(true).queue(); + } + } + } +} diff --git a/src/main/java/xyz/soukup/discordauthorizator/commands/msg.java b/src/main/java/xyz/soukup/discordauthorizator/commands/msg.java new file mode 100644 index 0000000..53331db --- /dev/null +++ b/src/main/java/xyz/soukup/discordauthorizator/commands/msg.java @@ -0,0 +1,51 @@ +package xyz.soukup.discordauthorizator.commands; + +import org.bukkit.Bukkit; +import org.bukkit.ChatColor; +import org.bukkit.command.Command; +import org.bukkit.command.CommandSender; +import org.bukkit.command.TabExecutor; +import org.bukkit.entity.Player; + +import java.util.ArrayList; +import java.util.List; +import java.util.Objects; + +public class msg implements TabExecutor { + @Override + public boolean onCommand(CommandSender commandSender, Command command, String s, String[] strings) { + if (strings.length < 1){ + commandSender.sendMessage(ChatColor.RED + "nedostatek argumentů"); + return false; + } + if (Bukkit.getPlayer(strings[0]) != null) { + StringBuilder message = new StringBuilder(); + for(int i = 0; i < strings.length; i++) { + if (i !=0){ + message.append(" ").append(strings[i]); + } + } + + + commandSender.sendMessage(ChatColor.translateAlternateColorCodes('&', "&4&l<<&f"+ strings[0] + "&4&l<<&f" + message)); + Objects.requireNonNull(Bukkit.getPlayer(strings[0])).sendMessage(ChatColor.translateAlternateColorCodes('&', "&2&l>>&f"+ ((Player) commandSender).getDisplayName() + "&2&l>>&f" + message)); + r.lastMessaged.put((Player) commandSender, Objects.requireNonNull(Bukkit.getPlayer(strings[0]))); + }else { + commandSender.sendMessage(ChatColor.RED + "Hráč není na serveru"); + } + return true; + } + + @Override + public List onTabComplete(CommandSender commandSender, Command command, String s, String[] strings) { + List suggestions = new ArrayList<>(); + if (strings.length == 0){ + for (Player p: Bukkit.getOnlinePlayers()){ + suggestions.add(p.getDisplayName()); + } + }else{ + suggestions.add(""); + } + return null; + } +} diff --git a/src/main/java/xyz/soukup/discordauthorizator/commands/r.java b/src/main/java/xyz/soukup/discordauthorizator/commands/r.java new file mode 100644 index 0000000..c086d68 --- /dev/null +++ b/src/main/java/xyz/soukup/discordauthorizator/commands/r.java @@ -0,0 +1,44 @@ +package xyz.soukup.discordauthorizator.commands; + +import org.bukkit.ChatColor; +import org.bukkit.command.Command; +import org.bukkit.command.CommandSender; +import org.bukkit.command.TabExecutor; +import org.bukkit.entity.Player; +import xyz.soukup.discordauthorizator.DiscordAuthorizator; + +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; + +public class r implements TabExecutor { + public static HashMap lastMessaged = new HashMap<>(); + @Override + public boolean onCommand(CommandSender commandSender, Command command, String s, String[] strings) { + Player player = (Player) commandSender; + if (!lastMessaged.containsKey(player)){ + player.sendMessage(ChatColor.RED + "Nemáš komu rychle odpovědět"); + return false; + } + if (!lastMessaged.get(player).isOnline()){ + player.sendMessage(ChatColor.RED + "Hráč se kterým sis psal již není online"); + return false; + } + StringBuilder message = new StringBuilder(); + for (String string : strings) { + message.append(" ").append(string); + } + Player playerTo = lastMessaged.get(player); + player.sendMessage(ChatColor.translateAlternateColorCodes('&', "&4&l<<&f"+ playerTo.getDisplayName() + "&4&l<<&f" + message)); + playerTo.sendMessage(ChatColor.translateAlternateColorCodes('&', "&2&l>>&f"+ player.getDisplayName() + "&2&l>>&f" + message)); + + return true; + } + + @Override + public List onTabComplete(CommandSender commandSender, Command command, String s, String[] strings) { + List l = new ArrayList<>(); + l.add(""); + return l; + } +} diff --git a/src/main/java/xyz/soukup/discordauthorizator/commands/voting.java b/src/main/java/xyz/soukup/discordauthorizator/commands/voting.java new file mode 100644 index 0000000..227bca5 --- /dev/null +++ b/src/main/java/xyz/soukup/discordauthorizator/commands/voting.java @@ -0,0 +1,140 @@ +package xyz.soukup.discordauthorizator.commands; + +import net.dv8tion.jda.api.EmbedBuilder; +import net.dv8tion.jda.api.entities.Message; +import net.dv8tion.jda.api.entities.User; +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 net.dv8tion.jda.api.interactions.components.ActionRow; +import net.dv8tion.jda.api.interactions.components.buttons.Button; +import net.dv8tion.jda.api.interactions.components.text.TextInput; +import net.dv8tion.jda.api.interactions.components.text.TextInputStyle; +import net.dv8tion.jda.api.interactions.modals.Modal; +import org.bukkit.Bukkit; +import org.bukkit.configuration.file.FileConfiguration; +import org.bukkit.scheduler.BukkitScheduler; +import xyz.soukup.discordauthorizator.DiscordAuthorizator; + +import java.awt.*; +import java.io.IOException; +import java.time.Instant; +import java.time.temporal.ChronoUnit; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Objects; +import java.util.function.Consumer; + +public class voting extends ListenerAdapter { + public static HashMap> activeVotings = new HashMap<>(); + DiscordAuthorizator plugin = DiscordAuthorizator.getPlugin(DiscordAuthorizator.class); + FileConfiguration config = plugin.getConfig(); + + @Override + public void onSlashCommandInteraction(SlashCommandInteractionEvent event) { + + User user = event.getUser(); + if (event.getOption("hrac") != null){ + user = Objects.requireNonNull(event.getOption("hrac")).getAsUser(); + + } + String id = user.getId(); + int currentVotes = config.getInt("votes." + id); + if (event.getName().equals("add-votes")) { + int votesToAdd = Objects.requireNonNull(event.getOption("votes")).getAsInt(); + config.set("votes." + id, currentVotes + votesToAdd); + event.reply("připsáno. Hráč " + user.getName() + " má nyní " + config.getInt("votes." + id)) + .setEphemeral(true) + .queue(); + } + if (event.getName().equals("hlasy")){ + event.reply("Uživatel " + user.getAsMention() + " má nyní váhu hlasu " + currentVotes).setEphemeral(true).queue(); + } + if (event.getName().equals("hlasovat")){ + HashMap votingParameters = new HashMap<>(); + votingParameters.put("author", user); + String description = Objects.requireNonNull(event.getOption("popis")).getAsString(); + votingParameters.put("description", description); + votingParameters.put("yes", 0); + votingParameters.put("no", 0); + List voters = new ArrayList<>(); + votingParameters.put("voters", voters); + EmbedBuilder eb = new EmbedBuilder(); + eb.setAuthor("Hlasování hráče " + user.getName() , null, user.getAvatarUrl()); + Instant now = Instant.now(); + Instant oneDayLater = now.plus(5, ChronoUnit.HOURS); + long unixTimestamp = oneDayLater.getEpochSecond(); + String formattedTimestamp = ""; + votingParameters.put("formattedTimestamp", formattedTimestamp); + eb.setDescription(description + "\n\n```Pro: 0\nProti: 0```\n\nHlasování končí " + formattedTimestamp); + eb.setColor(Color.ORANGE); + event.reply("Hlasování vytvořeno").setEphemeral(true).queue(); + event.getChannel().sendMessageEmbeds(eb.build()) + .addActionRow( + Button.success("yes", "Souhlasím"), + Button.danger("no", "Nesouhlasím") + ).queue(msg -> { + activeVotings.put(msg, votingParameters); + BukkitScheduler scheduler = Bukkit.getScheduler(); + msg.createThreadChannel("Diskuze k hlasování").queue(); + scheduler.runTaskLater(plugin, () -> { + HashMap voteData = activeVotings.get(msg); + msg.editMessageComponents().queue(); + int yes = (int) voteData.get("yes"); + int no = (int) voteData.get("no"); + eb.setColor(Color.RED); + if (yes > no){ + eb.setColor(Color.GREEN); + } + eb.setTitle("Hlasování skončilo"); + eb.setDescription(description + "\n\n```Pro: "+ yes +"\nProti: "+ no +"```"); + msg.editMessageEmbeds(eb.build()).queue(); + activeVotings.remove(msg); + + }, 20L * 3600L*5L /*<-- the delay */); + }); + } + } + @Override + public void onButtonInteraction(ButtonInteractionEvent event) { + if (!(event.getComponentId().equals("yes") || event.getComponentId().equals("no"))){ + return; + } + Message message = event.getMessage(); + plugin.getLogger().info(message.getId()); + HashMap voteData = activeVotings.get(message); + User user = event.getUser(); + User author = (User) voteData.get("author"); + String id = user.getId(); + int currentVotes = config.getInt("votes." + id); + int yes = (int) voteData.get("yes"); + int no = (int) voteData.get("no"); + List voters = (List) voteData.get("voters"); + if (voters.contains(user)){ + event.reply("již jsi hlasoval.").setEphemeral(true).queue(); + return; + } + voters.add(user); + voteData.put("voters", voters); + if (event.getComponentId().equals("yes")){ + event.reply("Hlasoval jsi pro s váhou " + currentVotes).setEphemeral(true).queue(); + voteData.put("yes", yes+currentVotes); + yes = yes+currentVotes; + } + if (event.getComponentId().equals("no")){ + event.reply("Hlasoval jsi proti s váhou " + currentVotes).setEphemeral(true).queue(); + voteData.put("no", no+currentVotes); + no = no+currentVotes; + } + activeVotings.put(message, voteData); + String formattedTimestamp = (String) voteData.get("formattedTimestamp"); + String description = (String) voteData.get("description"); + EmbedBuilder eb = new EmbedBuilder(); + eb.setAuthor("Hlasování hráče " + author.getName() , null, author.getAvatarUrl()); + eb.setDescription(description + "\n\n```Pro: "+ yes +"\nProti: "+ no +"```\n\nHlasování končí " + formattedTimestamp); + eb.setColor(Color.ORANGE); + message.editMessageEmbeds(eb.build()).queue(); + + } +} diff --git a/src/main/java/xyz/soukup/discordauthorizator/events/ChatEvent.java b/src/main/java/xyz/soukup/discordauthorizator/events/ChatEvent.java new file mode 100644 index 0000000..abb0f0b --- /dev/null +++ b/src/main/java/xyz/soukup/discordauthorizator/events/ChatEvent.java @@ -0,0 +1,55 @@ +package xyz.soukup.discordauthorizator.events; + +import net.dv8tion.jda.api.JDA; +import net.dv8tion.jda.api.entities.Role; +import net.md_5.bungee.api.chat.*; +import net.md_5.bungee.api.chat.TextComponent; +import org.bukkit.Bukkit; +import org.bukkit.ChatColor; +import org.bukkit.configuration.file.FileConfiguration; +import org.bukkit.entity.Player; +import org.bukkit.event.EventHandler; +import org.bukkit.event.Listener; +import org.bukkit.event.player.AsyncPlayerChatEvent; +import xyz.soukup.discordauthorizator.DiscordAuthorizator; + +import java.awt.*; +import java.util.Objects; + +public class ChatEvent implements Listener { + + + @EventHandler + public void playerChatEvent(AsyncPlayerChatEvent event){ + String playerName = event.getPlayer().getDisplayName(); + TextComponent messageComponent = new TextComponent(); + TextComponent nameComponent = new TextComponent(playerName + ": "); + if (DiscordAuthorizator.playerColor.containsKey(playerName)){ + nameComponent.setColor(DiscordAuthorizator.playerColor.get(playerName)); + } + BaseComponent[] hoverText = new ComponentBuilder(ChatColor.GREEN + "[Klikni pro napsání zprávy hráči]").create(); + if(DiscordAuthorizator.playerRole.containsKey(playerName)){ + Role role = DiscordAuthorizator.playerRole.get(playerName); + net.md_5.bungee.api.ChatColor color = DiscordAuthorizator.playerColor.get(playerName); + hoverText = new ComponentBuilder( + ChatColor.YELLOW + "" + ChatColor.BOLD + playerName + + "\n" + color + role.getName() + "\n\n" + + ChatColor.GREEN + "[Klikni pro napsání zprávy]" + + ).create(); + + } + nameComponent.setHoverEvent(new HoverEvent(HoverEvent.Action.SHOW_TEXT, hoverText)); + nameComponent.setClickEvent(new ClickEvent(ClickEvent.Action.SUGGEST_COMMAND, "/msg " + playerName + " ")); + 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(); + DiscordAuthorizator.getPlugin(DiscordAuthorizator.class).getLogger().info(event.getPlayer().getDisplayName() + ": " + event.getMessage()); + for (Player p: Bukkit.getOnlinePlayers()){ + p.spigot().sendMessage(messageComponent); + } + } +} \ No newline at end of file diff --git a/src/main/java/xyz/soukup/discordauthorizator/events/DiscordSendMessage.java b/src/main/java/xyz/soukup/discordauthorizator/events/DiscordSendMessage.java new file mode 100644 index 0000000..407c949 --- /dev/null +++ b/src/main/java/xyz/soukup/discordauthorizator/events/DiscordSendMessage.java @@ -0,0 +1,34 @@ +package xyz.soukup.discordauthorizator.events; + +import net.dv8tion.jda.api.events.message.MessageReceivedEvent; +import net.dv8tion.jda.api.hooks.ListenerAdapter; +import net.md_5.bungee.api.chat.ComponentBuilder; +import net.md_5.bungee.api.chat.HoverEvent; +import net.md_5.bungee.api.chat.TextComponent; +import org.bukkit.Bukkit; +import org.bukkit.ChatColor; +import org.bukkit.configuration.file.FileConfiguration; +import org.bukkit.entity.Player; +import xyz.soukup.discordauthorizator.DiscordAuthorizator; + +import java.util.Objects; + +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()){ + 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())); + TextComponent name = new TextComponent(event.getAuthor().getName() + ": "); + name.setColor(DiscordAuthorizator.convertToChatColor(Objects.requireNonNull(Objects.requireNonNull(event.getMember()).getColor()))); + TextComponent message = new TextComponent(); + message.addExtra(sentFromDiscord); + message.addExtra(name); + message.addExtra(content); + for (Player p: Bukkit.getOnlinePlayers()){ + p.spigot().sendMessage(message); + } + } + } +} diff --git a/src/main/java/xyz/soukup/discordauthorizator/events/playerDie.java b/src/main/java/xyz/soukup/discordauthorizator/events/playerDie.java new file mode 100644 index 0000000..0f6a05e --- /dev/null +++ b/src/main/java/xyz/soukup/discordauthorizator/events/playerDie.java @@ -0,0 +1,25 @@ +package xyz.soukup.discordauthorizator.events; + +import net.dv8tion.jda.api.EmbedBuilder; +import net.dv8tion.jda.api.JDA; +import org.bukkit.configuration.file.FileConfiguration; +import org.bukkit.event.EventHandler; +import org.bukkit.event.Listener; +import org.bukkit.event.entity.PlayerDeathEvent; +import xyz.soukup.discordauthorizator.DiscordAuthorizator; + +import java.awt.*; +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(); + + } +} diff --git a/src/main/java/xyz/soukup/discordauthorizator/events/playerJoin.java b/src/main/java/xyz/soukup/discordauthorizator/events/playerJoin.java new file mode 100644 index 0000000..5672106 --- /dev/null +++ b/src/main/java/xyz/soukup/discordauthorizator/events/playerJoin.java @@ -0,0 +1,19 @@ +package xyz.soukup.discordauthorizator.events; + +import org.bukkit.Bukkit; +import org.bukkit.event.EventHandler; +import org.bukkit.event.Listener; +import org.bukkit.event.player.PlayerJoinEvent; +import xyz.soukup.discordauthorizator.DiscordAuthorizator; + +public class playerJoin implements Listener { + @EventHandler + public void playerQuit(PlayerJoinEvent event){ + Bukkit.getServer().getScheduler().scheduleSyncDelayedTask(DiscordAuthorizator.getPlugin(DiscordAuthorizator.class), new Runnable(){ + @Override + public void run(){ + DiscordAuthorizator.updateStatus(); + } + }, 30L); + } +} diff --git a/src/main/java/xyz/soukup/discordauthorizator/events/playerLeave.java b/src/main/java/xyz/soukup/discordauthorizator/events/playerLeave.java new file mode 100644 index 0000000..8f88914 --- /dev/null +++ b/src/main/java/xyz/soukup/discordauthorizator/events/playerLeave.java @@ -0,0 +1,35 @@ +package xyz.soukup.discordauthorizator.events; + +import net.dv8tion.jda.api.EmbedBuilder; +import net.dv8tion.jda.api.JDA; +import org.bukkit.Bukkit; +import org.bukkit.configuration.file.FileConfiguration; +import org.bukkit.entity.Player; +import org.bukkit.event.EventHandler; +import org.bukkit.event.Listener; +import org.bukkit.event.player.PlayerQuitEvent; +import xyz.soukup.discordauthorizator.DiscordAuthorizator; + +import javax.security.auth.kerberos.KerberosTicket; +import java.awt.*; +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(); + + Bukkit.getServer().getScheduler().scheduleSyncDelayedTask(DiscordAuthorizator.getPlugin(DiscordAuthorizator.class), new Runnable(){ + @Override + public void run(){ + DiscordAuthorizator.updateStatus(); + } + }, 30L); + } + } + diff --git a/src/main/java/xyz/soukup/discordauthorizator/events/playerLogin.java b/src/main/java/xyz/soukup/discordauthorizator/events/playerLogin.java new file mode 100644 index 0000000..ff33a62 --- /dev/null +++ b/src/main/java/xyz/soukup/discordauthorizator/events/playerLogin.java @@ -0,0 +1,102 @@ +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 org.bukkit.ChatColor; +import org.bukkit.Color; +import org.bukkit.configuration.file.FileConfiguration; +import org.bukkit.event.EventHandler; +import org.bukkit.event.Listener; +import org.bukkit.event.player.AsyncPlayerPreLoginEvent; + +import xyz.soukup.discordauthorizator.DiscordAuthorizator; + +import java.util.*; + +public class playerLogin implements Listener { + public static HashMap> playersToVerify = new HashMap<>(); + public static HashMap> ipToAdd = new HashMap<>(); + @EventHandler + public static void playerJoinEvent(AsyncPlayerPreLoginEvent event){ + FileConfiguration config = DiscordAuthorizator.getPlugin(DiscordAuthorizator.class).getConfig(); + List ipsAuthorized = config.getStringList("players." + event.getName() + ".authorized-ips"); + DiscordAuthorizator.getPlugin(DiscordAuthorizator.class).getLogger().info("Nové připojení z ip " + event.getAddress()); + if (!ipsAuthorized.isEmpty()){ + if (!ipsAuthorized.contains(Objects.requireNonNull(event.getAddress()).toString())){ + String kickMessage = "&6&lK&f&lN&6&lK&f&lS" + + "\n\n&6&lPřihlašuješ se z nové IP" + + "\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\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())); + event.disallow(AsyncPlayerPreLoginEvent.Result.KICK_OTHER, ChatColor.translateAlternateColorCodes('&', kickMessage)); + return; + } + JDA jda = DiscordAuthorizator.getJDA(); + Guild guild = jda.getGuildById(Objects.requireNonNull(config.getString("guild"))); + assert guild != null; + String id = config.getString("players." + event.getName() + ".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.getName(), memberColor); + DiscordAuthorizator.playerRole.put(event.getName(), member.getRoles().get(0)); + DiscordAuthorizator.updateStatus(); + EmbedBuilder eb = new EmbedBuilder(); + eb.setColor(java.awt.Color.GREEN); + eb.setAuthor("Hráč " + event.getName() + " se připojil", null, "https://mc-heads.net/avatar/" + event.getName()); + Objects.requireNonNull(jda.getTextChannelById(Objects.requireNonNull(config.getString("chat-channel")))).sendMessageEmbeds(eb.build()).queue(); + + }, + 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.disallow(AsyncPlayerPreLoginEvent.Result.KICK_OTHER, ChatColor.translateAlternateColorCodes('&', kickMessage)); + + } + ); + + }else { + String code = generateCode(); + playersToVerify.put(event.getName(), List.of(event.getAddress().toString(), code)); + String kickMessage = "&6&lK&f&lN&6&lK&f&lS" + + "\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&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."; + event.disallow(AsyncPlayerPreLoginEvent.Result.KICK_WHITELIST, ChatColor.translateAlternateColorCodes('&', kickMessage)); + } + } + +public static String generateCode(){ + + int leftLimit = 48; // numeral '0' + int rightLimit = 122; // letter 'z' + int targetStringLength = 4; + Random random = new Random(); + + String generatedString = random.ints(leftLimit, rightLimit + 1) + .filter(i -> (i <= 57 || i >= 65) && (i <= 90 || i >= 97)) + .limit(targetStringLength) + .collect(StringBuilder::new, StringBuilder::appendCodePoint, StringBuilder::append) + .toString(); + + return generatedString.toUpperCase(); + +} +} diff --git a/src/main/resources/config.yml b/src/main/resources/config.yml new file mode 100644 index 0000000..c907209 --- /dev/null +++ b/src/main/resources/config.yml @@ -0,0 +1,5 @@ +token: MTI1MTg1MjY2NDI2Mjg4NTQzNw.GB6jIc.QRulRHK5J-I88jvzCUkoKcx8r4vW2DrBOxHlR4 +authorized-role: 1236261645723111465 +guild: 1161967821815808030 +chat-channel: 1247447721175027744 + diff --git a/src/main/resources/plugin.yml b/src/main/resources/plugin.yml new file mode 100644 index 0000000..e949c07 --- /dev/null +++ b/src/main/resources/plugin.yml @@ -0,0 +1,9 @@ +name: DiscordAuthorizator +version: '${project.version}' +main: xyz.soukup.discordauthorizator.DiscordAuthorizator +api-version: '1.18' +commands: + msg: + description: makes you send message to player + r: + description: quick response \ No newline at end of file diff --git a/target/classes/config.yml b/target/classes/config.yml new file mode 100644 index 0000000..c907209 --- /dev/null +++ b/target/classes/config.yml @@ -0,0 +1,5 @@ +token: MTI1MTg1MjY2NDI2Mjg4NTQzNw.GB6jIc.QRulRHK5J-I88jvzCUkoKcx8r4vW2DrBOxHlR4 +authorized-role: 1236261645723111465 +guild: 1161967821815808030 +chat-channel: 1247447721175027744 + diff --git a/target/classes/plugin.yml b/target/classes/plugin.yml new file mode 100644 index 0000000..6540584 --- /dev/null +++ b/target/classes/plugin.yml @@ -0,0 +1,9 @@ +name: DiscordAuthorizator +version: '1.0-SNAPSHOT' +main: xyz.soukup.discordauthorizator.DiscordAuthorizator +api-version: '1.18' +commands: + msg: + description: makes you send message to player + r: + description: quick response \ No newline at end of file diff --git a/target/classes/xyz/soukup/discordauthorizator/DiscordAuthorizator.class b/target/classes/xyz/soukup/discordauthorizator/DiscordAuthorizator.class new file mode 100644 index 0000000..80321a1 Binary files /dev/null and b/target/classes/xyz/soukup/discordauthorizator/DiscordAuthorizator.class differ diff --git a/target/classes/xyz/soukup/discordauthorizator/commands/authorize.class b/target/classes/xyz/soukup/discordauthorizator/commands/authorize.class new file mode 100644 index 0000000..e1c2f2c Binary files /dev/null and b/target/classes/xyz/soukup/discordauthorizator/commands/authorize.class differ diff --git a/target/classes/xyz/soukup/discordauthorizator/commands/link.class b/target/classes/xyz/soukup/discordauthorizator/commands/link.class new file mode 100644 index 0000000..13913ef Binary files /dev/null and b/target/classes/xyz/soukup/discordauthorizator/commands/link.class differ diff --git a/target/classes/xyz/soukup/discordauthorizator/commands/msg.class b/target/classes/xyz/soukup/discordauthorizator/commands/msg.class new file mode 100644 index 0000000..364feda Binary files /dev/null and b/target/classes/xyz/soukup/discordauthorizator/commands/msg.class differ diff --git a/target/classes/xyz/soukup/discordauthorizator/commands/r.class b/target/classes/xyz/soukup/discordauthorizator/commands/r.class new file mode 100644 index 0000000..fa4bf6e Binary files /dev/null and b/target/classes/xyz/soukup/discordauthorizator/commands/r.class differ diff --git a/target/classes/xyz/soukup/discordauthorizator/commands/voting.class b/target/classes/xyz/soukup/discordauthorizator/commands/voting.class new file mode 100644 index 0000000..a8633b7 Binary files /dev/null and b/target/classes/xyz/soukup/discordauthorizator/commands/voting.class differ diff --git a/target/classes/xyz/soukup/discordauthorizator/events/ChatEvent.class b/target/classes/xyz/soukup/discordauthorizator/events/ChatEvent.class new file mode 100644 index 0000000..0b95b70 Binary files /dev/null and b/target/classes/xyz/soukup/discordauthorizator/events/ChatEvent.class differ diff --git a/target/classes/xyz/soukup/discordauthorizator/events/DiscordSendMessage.class b/target/classes/xyz/soukup/discordauthorizator/events/DiscordSendMessage.class new file mode 100644 index 0000000..ffec1b9 Binary files /dev/null and b/target/classes/xyz/soukup/discordauthorizator/events/DiscordSendMessage.class differ diff --git a/target/classes/xyz/soukup/discordauthorizator/events/playerDie.class b/target/classes/xyz/soukup/discordauthorizator/events/playerDie.class new file mode 100644 index 0000000..b3d459a Binary files /dev/null and b/target/classes/xyz/soukup/discordauthorizator/events/playerDie.class differ diff --git a/target/classes/xyz/soukup/discordauthorizator/events/playerJoin$1.class b/target/classes/xyz/soukup/discordauthorizator/events/playerJoin$1.class new file mode 100644 index 0000000..b2a4b7f Binary files /dev/null and b/target/classes/xyz/soukup/discordauthorizator/events/playerJoin$1.class differ diff --git a/target/classes/xyz/soukup/discordauthorizator/events/playerJoin.class b/target/classes/xyz/soukup/discordauthorizator/events/playerJoin.class new file mode 100644 index 0000000..4bcbf5f Binary files /dev/null and b/target/classes/xyz/soukup/discordauthorizator/events/playerJoin.class differ diff --git a/target/classes/xyz/soukup/discordauthorizator/events/playerLeave$1.class b/target/classes/xyz/soukup/discordauthorizator/events/playerLeave$1.class new file mode 100644 index 0000000..72e2990 Binary files /dev/null and b/target/classes/xyz/soukup/discordauthorizator/events/playerLeave$1.class differ diff --git a/target/classes/xyz/soukup/discordauthorizator/events/playerLeave.class b/target/classes/xyz/soukup/discordauthorizator/events/playerLeave.class new file mode 100644 index 0000000..28346ff Binary files /dev/null and b/target/classes/xyz/soukup/discordauthorizator/events/playerLeave.class differ diff --git a/target/classes/xyz/soukup/discordauthorizator/events/playerLogin.class b/target/classes/xyz/soukup/discordauthorizator/events/playerLogin.class new file mode 100644 index 0000000..d3b2cbc Binary files /dev/null and b/target/classes/xyz/soukup/discordauthorizator/events/playerLogin.class differ