11package dev .demonz .zdiscord .discord ;
22
33import dev .demonz .zdiscord .ZDiscord ;
4+ import dev .demonz .zdiscord .modules .TicketModule ;
45import dev .demonz .zdiscord .util .ColorUtil ;
56import dev .demonz .zdiscord .util .EmbedUtil ;
67import dev .demonz .zdiscord .util .StatusEmbedBuilder ;
1011import net .dv8tion .jda .api .entities .Role ;
1112import net .dv8tion .jda .api .entities .channel .concrete .TextChannel ;
1213import net .dv8tion .jda .api .events .interaction .ModalInteractionEvent ;
13- import net .dv8tion .jda .api .events .interaction .command .CommandAutoCompleteInteractionEvent ;
1414import net .dv8tion .jda .api .events .interaction .command .SlashCommandInteractionEvent ;
1515import net .dv8tion .jda .api .events .interaction .component .ButtonInteractionEvent ;
1616import net .dv8tion .jda .api .events .interaction .component .EntitySelectInteractionEvent ;
1717import net .dv8tion .jda .api .events .interaction .component .StringSelectInteractionEvent ;
1818import net .dv8tion .jda .api .hooks .ListenerAdapter ;
19- import net .dv8tion .jda .api .interactions .commands .Command ;
2019import net .dv8tion .jda .api .interactions .components .ActionRow ;
2120import net .dv8tion .jda .api .interactions .components .buttons .Button ;
2221import net .dv8tion .jda .api .interactions .components .selections .EntitySelectMenu ;
3433import java .util .LinkedHashMap ;
3534import java .util .List ;
3635import java .util .Map ;
37- import java .util .stream .Collectors ;
3836
3937
4038public class SetupCommand extends ListenerAdapter {
@@ -69,7 +67,7 @@ public class SetupCommand extends ListenerAdapter {
6967 "Join, quit, death, and advancement events." ));
7068 MODULES .put ("console" , new ModuleInfo ("Console" , "channels.console" ,
7169 "Server console output streamed to Discord." ));
72- MODULES .put ("tickets" , new ModuleInfo ("Tickets" , "channels.ticket-category " ,
70+ MODULES .put ("tickets" , new ModuleInfo ("Tickets" , "tickets.panel-channel " ,
7371 "Support ticket system with private channels." ));
7472 MODULES .put ("staffchat" , new ModuleInfo ("Staff Chat" , "staff-chat.channel" ,
7573 "Private staff communication bridge." ));
@@ -83,8 +81,6 @@ public class SetupCommand extends ListenerAdapter {
8381 "Anonymous confessions via /confess." ));
8482 }
8583
86- private static final List <String > MODULE_NAMES = new ArrayList <>(MODULES .keySet ());
87-
8884 public SetupCommand (ZDiscord plugin ) {
8985 this .plugin = plugin ;
9086 }
@@ -100,34 +96,9 @@ public void onSlashCommandInteraction(SlashCommandInteractionEvent event) {
10096 return ;
10197 }
10298
103- var moduleOption = event .getOption ("module" );
104- var channelOption = event .getOption ("channel" );
105- if (moduleOption != null && channelOption != null ) {
106- String module = moduleOption .getAsString ();
107- TextChannel target = channelOption .getAsChannel ().asTextChannel ();
108- quickSetup (event , module , target );
109- return ;
110- }
11199 showWizardPanel (event );
112100 }
113101
114- @ Override
115- public void onCommandAutoCompleteInteraction (CommandAutoCompleteInteractionEvent event ) {
116- if (!"setup" .equals (event .getName ())) {
117- return ;
118- }
119- if (!"module" .equals (event .getFocusedOption ().getName ())) {
120- return ;
121- }
122- String typed = event .getFocusedOption ().getValue ().toLowerCase ();
123- List <Command .Choice > choices = MODULE_NAMES .stream ()
124- .filter (name -> name .startsWith (typed ))
125- .map (name -> new Command .Choice (name , name ))
126- .limit (25 )
127- .collect (Collectors .toList ());
128- event .replyChoices (choices ).queue ();
129- }
130-
131102 private void showWizardPanel (SlashCommandInteractionEvent event ) {
132103 Guild guild = event .getGuild ();
133104 String guildIcon = guild != null && guild .getIconUrl () != null
@@ -225,6 +196,11 @@ private void handleModuleSelect(StringSelectInteractionEvent event) {
225196 return ;
226197 }
227198
199+ if ("tickets" .equals (module )) {
200+ showTicketChannelPrompt (event );
201+ return ;
202+ }
203+
228204 EmbedBuilder prompt = new EmbedBuilder ()
229205 .setTitle (":gear: Configure " + capitalize (module ))
230206 .setDescription (info .description
@@ -270,16 +246,16 @@ private void handleChannelSelect(EntitySelectInteractionEvent event) {
270246 }
271247 TextChannel channel = (TextChannel ) selectedChannel ;
272248
273- saveToConfig (info .configPath , channel .getId ());
274-
275249 switch (module ) {
276250 case "status" :
251+ saveToConfig (info .configPath , channel .getId ());
277252 handleStatusSetup (event , channel );
278253 return ;
279254 case "tickets" :
280255 handleTicketSetup (event , channel );
281256 return ;
282257 default :
258+ saveToConfig (info .configPath , channel .getId ());
283259 postActivationNotice (channel , info , event .getUser ().getName ());
284260 event .replyEmbeds (EmbedUtil .success (
285261 capitalize (module ) + " has been linked to " + channel .getAsMention () + "." )
@@ -289,6 +265,29 @@ private void handleChannelSelect(EntitySelectInteractionEvent event) {
289265 }
290266 }
291267
268+ private void showTicketChannelPrompt (StringSelectInteractionEvent event ) {
269+ EmbedBuilder prompt = new EmbedBuilder ()
270+ .setTitle (":ticket: Ticket Setup \u2014 Step 1 of 3" )
271+ .setDescription ("Select the text channel where ZDiscord should post the public ticket panel.\n \n "
272+ + "Private tickets will be created in that channel's category. "
273+ + "If the channel is not inside a category, tickets will be created at the server root." )
274+ .setColor (ColorUtil .parseHex ("#5865F2" ))
275+ .setFooter ("Step 1/3 \u2022 Select ticket panel channel" )
276+ .setTimestamp (Instant .now ());
277+
278+ EntitySelectMenu channelMenu = EntitySelectMenu .create (
279+ CHANNEL_MENU_PREFIX + "tickets" , EntitySelectMenu .SelectTarget .CHANNEL )
280+ .setPlaceholder ("Select the ticket panel channel" )
281+ .setMinValues (1 )
282+ .setMaxValues (1 )
283+ .build ();
284+
285+ event .replyEmbeds (prompt .build ())
286+ .addActionRow (channelMenu )
287+ .setEphemeral (true )
288+ .queue ();
289+ }
290+
292291 private void handleStatusSetup (EntitySelectInteractionEvent event , TextChannel channel ) {
293292 StatusEmbedBuilder .StatusContext ctx = StatusEmbedBuilder .StatusContext .capture (
294293 plugin .getBotManager ()::getGuild ,
@@ -321,6 +320,8 @@ private void handleTicketSetup(EntitySelectInteractionEvent event, TextChannel c
321320 saveToConfig ("tickets.panel-channel" , channel .getId ());
322321 if (channel .getParentCategory () != null ) {
323322 saveToConfig ("channels.ticket-category" , channel .getParentCategory ().getId ());
323+ } else {
324+ saveToConfig ("channels.ticket-category" , "" );
324325 }
325326
326327 EmbedBuilder rolePrompt = new EmbedBuilder ()
@@ -670,7 +671,7 @@ private String supportRoleMention(net.dv8tion.jda.api.events.interaction.Generic
670671 if (!list .isEmpty ()) {
671672 roleId = list .get (0 );
672673 }
673- if (roleId == null ) {
674+ if (! TicketModule . isUsableSnowflake ( roleId ) ) {
674675 return "(unset)" ;
675676 }
676677 Guild guild = event .getGuild ();
@@ -772,29 +773,6 @@ private void postTicketPanel(TextChannel channel) {
772773 plugin .getTicketModule ().postPanel (channel );
773774 }
774775
775- private void quickSetup (SlashCommandInteractionEvent event , String module , TextChannel target ) {
776- ModuleInfo info = MODULES .get (module );
777- if (info == null ) {
778- event .reply ("Unknown module: `" + module + "`. Available: "
779- + String .join (", " , MODULE_NAMES )).setEphemeral (true ).queue ();
780- return ;
781- }
782-
783- saveToConfig (info .configPath , target .getId ());
784-
785- if ("tickets" .equals (module ) && target .getParentCategory () != null ) {
786- saveToConfig ("channels.ticket-category" , target .getParentCategory ().getId ());
787- postTicketPanel (target );
788- }
789-
790- postActivationNotice (target , info , event .getUser ().getName ());
791-
792- event .replyEmbeds (EmbedUtil .success (
793- capitalize (module ) + " linked to " + target .getAsMention () + "." )
794- .build ())
795- .setEphemeral (true ).queue ();
796- }
797-
798776 private void postActivationNotice (TextChannel channel , ModuleInfo info , String username ) {
799777 channel .sendMessageEmbeds (EmbedUtil .simple (
800778 info .label + " activated" ,
0 commit comments