From 9567b388d3a3ff5e07072ad0ff8ed4b39c054c9e Mon Sep 17 00:00:00 2001 From: Chudy#1294 Date: Wed, 14 Feb 2024 15:26:54 +0100 Subject: [PATCH 1/2] =?UTF-8?q?adding=20a=20base=20ticket=20code=20?= =?UTF-8?q?=F0=9F=98=8A?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../eternalcode/discordapp/DiscordApp.java | 13 ++- .../discordapp/config/AppConfig.java | 3 + .../ticket/TicketButtonController.java | 43 ++++++++++ .../ticket/command/TicketCommand.java | 24 ++++++ .../command/alias/StartTicketCommand.java | 80 +++++++++++++++++++ 5 files changed, 160 insertions(+), 3 deletions(-) create mode 100644 src/main/java/com/eternalcode/discordapp/ticket/TicketButtonController.java create mode 100644 src/main/java/com/eternalcode/discordapp/ticket/command/TicketCommand.java create mode 100644 src/main/java/com/eternalcode/discordapp/ticket/command/alias/StartTicketCommand.java diff --git a/src/main/java/com/eternalcode/discordapp/DiscordApp.java b/src/main/java/com/eternalcode/discordapp/DiscordApp.java index 61ebef55..212bf7f4 100644 --- a/src/main/java/com/eternalcode/discordapp/DiscordApp.java +++ b/src/main/java/com/eternalcode/discordapp/DiscordApp.java @@ -43,6 +43,8 @@ import com.eternalcode.discordapp.review.GitHubReviewService; import com.eternalcode.discordapp.review.GitHubReviewTask; import com.eternalcode.discordapp.review.command.GitHubReviewCommand; +import com.eternalcode.discordapp.ticket.TicketButtonController; +import com.eternalcode.discordapp.ticket.command.TicketCommand; import com.eternalcode.discordapp.user.UserRepositoryImpl; import com.jagrosh.jdautilities.command.CommandClient; import com.jagrosh.jdautilities.command.CommandClientBuilder; @@ -61,7 +63,6 @@ import java.io.File; import java.sql.SQLException; import java.time.Duration; -import java.time.Instant; import java.util.EnumSet; import java.util.Timer; @@ -144,7 +145,10 @@ public static void main(String... args) throws InterruptedException { // Leveling new LevelCommand(levelService), - new LeaderboardCommand(leaderboardService) + new LeaderboardCommand(leaderboardService), + + // Ticket + new TicketCommand(config) ) .build(); @@ -168,7 +172,10 @@ public static void main(String... args) throws InterruptedException { new CodeGameAnswerController(codeImageGameData, codeGameConfiguration, data, experienceService), // leaderboard - new LeaderboardButtonController(leaderboardService) + new LeaderboardButtonController(leaderboardService), + + // Ticket + new TicketButtonController() ) .setAutoReconnect(true) diff --git a/src/main/java/com/eternalcode/discordapp/config/AppConfig.java b/src/main/java/com/eternalcode/discordapp/config/AppConfig.java index 44a1ffd0..03176e53 100644 --- a/src/main/java/com/eternalcode/discordapp/config/AppConfig.java +++ b/src/main/java/com/eternalcode/discordapp/config/AppConfig.java @@ -40,6 +40,9 @@ public class AppConfig implements CdnConfig { @Description("# The settings of review system") public ReviewSystem reviewSystem = new ReviewSystem(); + @Description("# Ticket category channel id") + public long ticketCategoryId = 1079787699336134859L; + @Override public Resource resource(File folder) { return Source.of(folder, "config.yml"); diff --git a/src/main/java/com/eternalcode/discordapp/ticket/TicketButtonController.java b/src/main/java/com/eternalcode/discordapp/ticket/TicketButtonController.java new file mode 100644 index 00000000..be4ed287 --- /dev/null +++ b/src/main/java/com/eternalcode/discordapp/ticket/TicketButtonController.java @@ -0,0 +1,43 @@ +package com.eternalcode.discordapp.ticket; + +import com.eternalcode.discordapp.config.AppConfig; +import net.dv8tion.jda.api.EmbedBuilder; +import net.dv8tion.jda.api.entities.Member; +import net.dv8tion.jda.api.entities.channel.concrete.Category; +import net.dv8tion.jda.api.entities.channel.concrete.TextChannel; +import net.dv8tion.jda.api.events.interaction.component.ButtonInteractionEvent; +import net.dv8tion.jda.api.hooks.ListenerAdapter; +import net.dv8tion.jda.api.requests.restaction.ChannelAction; + +import java.awt.*; + +public class TicketButtonController extends ListenerAdapter { + + AppConfig appConfig; + + @Override + public void onButtonInteraction(ButtonInteractionEvent event) { + if (event.getComponentId().equals("create_ticket")) { + long ticketCategoryId = appConfig.ticketCategoryId; + Category ticketCategory = event.getGuild().getCategoryById(ticketCategoryId); + Member member = event.getMember(); + assert member != null; + + if (event.getGuild().getTextChannelsByName(member.getId(), true).isEmpty()) { + event.reply("Posiadasz juz otwarty ticket bratku essa"); + } + + ChannelAction ticketAction = ticketCategory.createTextChannel(member.getId()); + TextChannel ticket = ticketAction.complete(); + + EmbedBuilder embedBuilder = new EmbedBuilder().setTitle("Twój ticket został utworzony") + .setColor(Color.GREEN) + .setDescription("Tutaj możesz zgłaszać swoje problemy."); + + ticket.sendMessageEmbeds(embedBuilder.build()) + .queue(); + + event.reply("Twój ticket został utworzony.").setEphemeral(true).queue(); + } + } +} diff --git a/src/main/java/com/eternalcode/discordapp/ticket/command/TicketCommand.java b/src/main/java/com/eternalcode/discordapp/ticket/command/TicketCommand.java new file mode 100644 index 00000000..27c4ff76 --- /dev/null +++ b/src/main/java/com/eternalcode/discordapp/ticket/command/TicketCommand.java @@ -0,0 +1,24 @@ +package com.eternalcode.discordapp.ticket.command; + +import com.eternalcode.discordapp.config.AppConfig; +import com.eternalcode.discordapp.ticket.command.alias.StartTicketCommand; +import com.jagrosh.jdautilities.command.SlashCommand; +import com.jagrosh.jdautilities.command.SlashCommandEvent; +import net.dv8tion.jda.api.Permission; + +public class TicketCommand extends SlashCommand { + public TicketCommand(AppConfig appConfig) { + this.name = "ticket"; + this.help = "huj"; + this.userPermissions = new Permission[]{ Permission.MESSAGE_MANAGE }; + + this.children = new SlashCommand[]{ + new StartTicketCommand(appConfig) + }; + } + + @Override + public void execute(SlashCommandEvent event) { + /* This method is empty because uses children for sub-commands. */ + } +} diff --git a/src/main/java/com/eternalcode/discordapp/ticket/command/alias/StartTicketCommand.java b/src/main/java/com/eternalcode/discordapp/ticket/command/alias/StartTicketCommand.java new file mode 100644 index 00000000..287fb28b --- /dev/null +++ b/src/main/java/com/eternalcode/discordapp/ticket/command/alias/StartTicketCommand.java @@ -0,0 +1,80 @@ +package com.eternalcode.discordapp.ticket.command.alias; + +import com.eternalcode.discordapp.config.AppConfig; +import com.jagrosh.jdautilities.command.SlashCommand; +import com.jagrosh.jdautilities.command.SlashCommandEvent; +import net.dv8tion.jda.api.EmbedBuilder; +import net.dv8tion.jda.api.Permission; +import net.dv8tion.jda.api.entities.Message; +import net.dv8tion.jda.api.entities.MessageEmbed; +import net.dv8tion.jda.api.entities.channel.middleman.MessageChannel; +import net.dv8tion.jda.api.entities.emoji.Emoji; +import net.dv8tion.jda.api.interactions.commands.OptionType; +import net.dv8tion.jda.api.interactions.commands.build.OptionData; +import net.dv8tion.jda.api.interactions.components.buttons.Button; + +import java.awt.*; +import java.time.Instant; +import java.util.List; + +public class StartTicketCommand extends SlashCommand { + private final AppConfig appConfig; + + public StartTicketCommand(AppConfig appConfig) { + this.appConfig = appConfig; + this.name = "start"; + this.help = "Starter ticket command"; + + this.userPermissions = new Permission[]{Permission.ADMINISTRATOR}; + + this.options = List.of( + new OptionData(OptionType.CHANNEL, "channel", + "channel to which the message is to be sent") + .setRequired(true) + ); + } + + @Override + protected void execute(SlashCommandEvent event) { + long optionChannelId = event.getOption("channel").getAsChannel().getIdLong(); + MessageChannel optionChannel = event.getGuild().getTextChannelById(optionChannelId); + + if (optionChannel != null) { + MessageEmbed ticketMessage = new EmbedBuilder() + .setTitle("Ticket") + .setColor(Color.decode(appConfig.embedSettings.successEmbed.color)) + .setThumbnail(appConfig.embedSettings.successEmbed.thumbnail) + .setTimestamp(Instant.now()) + .build(); + + Button firstButton = Button.success("create_ticket", "Otwórz bilet"); + + optionChannel.sendMessageEmbeds(ticketMessage) + .setActionRow(firstButton) + .queue(); + + MessageEmbed build = new EmbedBuilder() + .setTitle("Wiadomośc została wysłana") + .setColor(Color.decode(appConfig.embedSettings.successEmbed.color)) + .setThumbnail(appConfig.embedSettings.successEmbed.thumbnail) + .setTimestamp(Instant.now()) + .build(); + + event.replyEmbeds(build) + .setEphemeral(true) + .queue(); + } else { + MessageEmbed errorMessage = new EmbedBuilder() + .setTitle("Błąd") + .setColor(Color.decode(appConfig.embedSettings.errorEmbed.color)) + .setThumbnail(appConfig.embedSettings.errorEmbed.thumbnail) + .setTimestamp(Instant.now()) + .setDescription("Podany kanał nie jest kanałem tekstowym") + .build(); + + event.replyEmbeds(errorMessage) + .setEphemeral(true) + .queue(); + } + } +} From 803ecc4e0261756b2a4f20c989e63c9ada447e03 Mon Sep 17 00:00:00 2001 From: Chudy#1294 Date: Sat, 17 Feb 2024 20:50:23 +0100 Subject: [PATCH 2/2] =?UTF-8?q?adding=20a=20base=20ticket=20code=20?= =?UTF-8?q?=F0=9F=98=8A?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- gradle/wrapper/gradle-wrapper.properties | 2 +- .../eternalcode/discordapp/DiscordApp.java | 2 +- .../discordapp/config/AppConfig.java | 19 +++++++- .../LeaderboardButtonController.java | 4 ++ .../leaderboard/LeaderboardCommand.java | 4 +- .../ticket/TicketButtonController.java | 45 +++++++++++-------- .../command/alias/StartTicketCommand.java | 10 ++--- 7 files changed, 54 insertions(+), 32 deletions(-) diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties index 744c64d1..3499ded5 100644 --- a/gradle/wrapper/gradle-wrapper.properties +++ b/gradle/wrapper/gradle-wrapper.properties @@ -1,6 +1,6 @@ distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-8.4-bin.zip +distributionUrl=https\://services.gradle.org/distributions/gradle-8.5-bin.zip networkTimeout=10000 zipStoreBase=GRADLE_USER_HOME zipStorePath=wrapper/dists diff --git a/src/main/java/com/eternalcode/discordapp/DiscordApp.java b/src/main/java/com/eternalcode/discordapp/DiscordApp.java index 212bf7f4..b1798355 100644 --- a/src/main/java/com/eternalcode/discordapp/DiscordApp.java +++ b/src/main/java/com/eternalcode/discordapp/DiscordApp.java @@ -175,7 +175,7 @@ public static void main(String... args) throws InterruptedException { new LeaderboardButtonController(leaderboardService), // Ticket - new TicketButtonController() + new TicketButtonController(config) ) .setAutoReconnect(true) diff --git a/src/main/java/com/eternalcode/discordapp/config/AppConfig.java b/src/main/java/com/eternalcode/discordapp/config/AppConfig.java index 03176e53..3b688b92 100644 --- a/src/main/java/com/eternalcode/discordapp/config/AppConfig.java +++ b/src/main/java/com/eternalcode/discordapp/config/AppConfig.java @@ -40,8 +40,23 @@ public class AppConfig implements CdnConfig { @Description("# The settings of review system") public ReviewSystem reviewSystem = new ReviewSystem(); - @Description("# Ticket category channel id") - public long ticketCategoryId = 1079787699336134859L; + @Description("# The settings of review system") + public TicketSystem ticketSystem = new TicketSystem(); + + @Contextual + public static class TicketSystem { + @Description("# Ticket category channel id") + public long ticketCategoryId = 1079787699336134859L; + + @Description("# Ticket starter title embed message") + public String ticketEmbedTitleMessage = "Ticket "; + + @Description("# Ticket starter description embed message") + public String ticketEmbedDescriptionMessage = "Tutaj otworzysz swój ticket"; + + @Description("# Ticket starter button message") + public String ticketButtonMessage = "Open ticket"; + } @Override public Resource resource(File folder) { diff --git a/src/main/java/com/eternalcode/discordapp/leveling/leaderboard/LeaderboardButtonController.java b/src/main/java/com/eternalcode/discordapp/leveling/leaderboard/LeaderboardButtonController.java index 15e1b193..29815505 100644 --- a/src/main/java/com/eternalcode/discordapp/leveling/leaderboard/LeaderboardButtonController.java +++ b/src/main/java/com/eternalcode/discordapp/leveling/leaderboard/LeaderboardButtonController.java @@ -28,6 +28,10 @@ public void onButtonInteraction(ButtonInteractionEvent event) { String componentId = event.getComponentId(); long messageId = event.getMessage().getIdLong(); + if (!event.getMessage().getContentRaw().startsWith("👑 Leaderboard")) { + return; + } + int totalRecords = this.leaderboardService.getTotalRecords(); int totalPages = this.leaderboardService.getTotalPages(totalRecords); diff --git a/src/main/java/com/eternalcode/discordapp/leveling/leaderboard/LeaderboardCommand.java b/src/main/java/com/eternalcode/discordapp/leveling/leaderboard/LeaderboardCommand.java index e3a534ba..00da04b2 100644 --- a/src/main/java/com/eternalcode/discordapp/leveling/leaderboard/LeaderboardCommand.java +++ b/src/main/java/com/eternalcode/discordapp/leveling/leaderboard/LeaderboardCommand.java @@ -52,8 +52,8 @@ public void execute(SlashCommandEvent event) { } Button firstButton = Button.success("leaderboard_first", "First") - .withEmoji(Emoji.fromUnicode("U+23EE")) - .withDisabled(page == 1); + .withEmoji(Emoji.fromUnicode("U+23EE")) + .withDisabled(page == 1); Button prevButton = Button.primary("leaderboard_prev", "Previous") .withEmoji(Emoji.fromFormatted("U+25C0")) diff --git a/src/main/java/com/eternalcode/discordapp/ticket/TicketButtonController.java b/src/main/java/com/eternalcode/discordapp/ticket/TicketButtonController.java index be4ed287..6b76df25 100644 --- a/src/main/java/com/eternalcode/discordapp/ticket/TicketButtonController.java +++ b/src/main/java/com/eternalcode/discordapp/ticket/TicketButtonController.java @@ -2,42 +2,49 @@ import com.eternalcode.discordapp.config.AppConfig; import net.dv8tion.jda.api.EmbedBuilder; -import net.dv8tion.jda.api.entities.Member; + import net.dv8tion.jda.api.entities.channel.concrete.Category; -import net.dv8tion.jda.api.entities.channel.concrete.TextChannel; +import net.dv8tion.jda.api.entities.channel.middleman.MessageChannel; import net.dv8tion.jda.api.events.interaction.component.ButtonInteractionEvent; import net.dv8tion.jda.api.hooks.ListenerAdapter; -import net.dv8tion.jda.api.requests.restaction.ChannelAction; import java.awt.*; +import java.util.Objects; public class TicketButtonController extends ListenerAdapter { AppConfig appConfig; + public TicketButtonController(AppConfig appConfig) { + this.appConfig = appConfig; + } + @Override public void onButtonInteraction(ButtonInteractionEvent event) { if (event.getComponentId().equals("create_ticket")) { - long ticketCategoryId = appConfig.ticketCategoryId; - Category ticketCategory = event.getGuild().getCategoryById(ticketCategoryId); - Member member = event.getMember(); - assert member != null; - - if (event.getGuild().getTextChannelsByName(member.getId(), true).isEmpty()) { - event.reply("Posiadasz juz otwarty ticket bratku essa"); + MessageChannel channel = event.getChannel(); + Category category = Objects.requireNonNull(event.getGuild()).getCategoryById(this.appConfig.ticketSystem.ticketCategoryId); + + if (category != null) { + EmbedBuilder embedBuilder = new EmbedBuilder() + .setTitle("Błąd") + .setColor(Color.decode(this.appConfig.embedSettings.errorEmbed.color)) + .setDescription("Kategoria nie jest podana w configu."); + event.replyEmbeds(embedBuilder.build()); } - ChannelAction ticketAction = ticketCategory.createTextChannel(member.getId()); - TextChannel ticket = ticketAction.complete(); - - EmbedBuilder embedBuilder = new EmbedBuilder().setTitle("Twój ticket został utworzony") - .setColor(Color.GREEN) - .setDescription("Tutaj możesz zgłaszać swoje problemy."); + if (!event.getGuild().getTextChannelsByName(event.getMember().getId(), false).isEmpty()) { + EmbedBuilder embedBuilder = new EmbedBuilder() + .setTitle("Błąd") + .setColor(Color.decode(this.appConfig.embedSettings.errorEmbed.color)) + .setDescription("Posiadasz już otwarty ticket."); + event.replyEmbeds(embedBuilder.build()); + } - ticket.sendMessageEmbeds(embedBuilder.build()) + category.createTextChannel(event.getMember().getId()) + .flatMap(ticket -> channel.sendMessageFormat("Twój ticket jest tutaj ---> %s", ticket)) .queue(); - - event.reply("Twój ticket został utworzony.").setEphemeral(true).queue(); } } } + diff --git a/src/main/java/com/eternalcode/discordapp/ticket/command/alias/StartTicketCommand.java b/src/main/java/com/eternalcode/discordapp/ticket/command/alias/StartTicketCommand.java index 287fb28b..89492957 100644 --- a/src/main/java/com/eternalcode/discordapp/ticket/command/alias/StartTicketCommand.java +++ b/src/main/java/com/eternalcode/discordapp/ticket/command/alias/StartTicketCommand.java @@ -5,10 +5,8 @@ import com.jagrosh.jdautilities.command.SlashCommandEvent; import net.dv8tion.jda.api.EmbedBuilder; import net.dv8tion.jda.api.Permission; -import net.dv8tion.jda.api.entities.Message; import net.dv8tion.jda.api.entities.MessageEmbed; import net.dv8tion.jda.api.entities.channel.middleman.MessageChannel; -import net.dv8tion.jda.api.entities.emoji.Emoji; import net.dv8tion.jda.api.interactions.commands.OptionType; import net.dv8tion.jda.api.interactions.commands.build.OptionData; import net.dv8tion.jda.api.interactions.components.buttons.Button; @@ -24,9 +22,7 @@ public StartTicketCommand(AppConfig appConfig) { this.appConfig = appConfig; this.name = "start"; this.help = "Starter ticket command"; - this.userPermissions = new Permission[]{Permission.ADMINISTRATOR}; - this.options = List.of( new OptionData(OptionType.CHANNEL, "channel", "channel to which the message is to be sent") @@ -38,16 +34,16 @@ public StartTicketCommand(AppConfig appConfig) { protected void execute(SlashCommandEvent event) { long optionChannelId = event.getOption("channel").getAsChannel().getIdLong(); MessageChannel optionChannel = event.getGuild().getTextChannelById(optionChannelId); - if (optionChannel != null) { MessageEmbed ticketMessage = new EmbedBuilder() - .setTitle("Ticket") + .setTitle(this.appConfig.ticketSystem.ticketEmbedTitleMessage) + .setDescription(this.appConfig.ticketSystem.ticketEmbedDescriptionMessage) .setColor(Color.decode(appConfig.embedSettings.successEmbed.color)) .setThumbnail(appConfig.embedSettings.successEmbed.thumbnail) .setTimestamp(Instant.now()) .build(); - Button firstButton = Button.success("create_ticket", "Otwórz bilet"); + Button firstButton = Button.success("create_ticket", this.appConfig.ticketSystem.ticketButtonMessage); optionChannel.sendMessageEmbeds(ticketMessage) .setActionRow(firstButton)