Skip to content

Commit f03aa15

Browse files
committed
Use optional for form attachment info
1 parent fd0b13f commit f03aa15

File tree

10 files changed

+97
-60
lines changed

10 files changed

+97
-60
lines changed

src/main/java/net/discordjug/javabot/systems/staff_commands/forms/FormInteractionManager.java

Lines changed: 15 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@
1616
import net.discordjug.javabot.systems.staff_commands.forms.dao.FormsRepository;
1717
import net.discordjug.javabot.systems.staff_commands.forms.model.FormData;
1818
import net.discordjug.javabot.systems.staff_commands.forms.model.FormField;
19+
import net.discordjug.javabot.util.ExceptionLogger;
1920
import net.dv8tion.jda.api.EmbedBuilder;
2021
import net.dv8tion.jda.api.components.actionrow.ActionRow;
2122
import net.dv8tion.jda.api.components.actionrow.ActionRowChildComponent;
@@ -76,9 +77,11 @@ public class FormInteractionManager implements ButtonHandler, ModalHandler {
7677
public void closeForm(Guild guild, FormData form) {
7778
formsRepo.closeForm(form);
7879

79-
if (form.isAttached()) {
80-
TextChannel formChannel = guild.getTextChannelById(form.getMessageChannel().get());
81-
formChannel.retrieveMessageById(form.getMessageId().get()).queue(msg -> {
80+
form.getAttachmentInfo().ifPresent(info -> {
81+
long messageChannelId = info.messageChannelId();
82+
long messageId = info.messageId();
83+
TextChannel formChannel = guild.getTextChannelById(messageChannelId);
84+
formChannel.retrieveMessageById(messageId).queue(msg -> {
8285
mapFormMessageButtons(msg, btn -> {
8386
String cptId = btn.getCustomId();
8487
String[] split = ComponentIdBuilder.split(cptId);
@@ -88,8 +91,8 @@ public void closeForm(Guild guild, FormData form) {
8891
}
8992
return btn;
9093
});
91-
}, _ -> {});
92-
}
94+
}, ExceptionLogger::capture);
95+
});
9396
}
9497

9598
@Override
@@ -191,9 +194,11 @@ public void mapFormMessageButtons(Message msg, Function<Button, Button> mapper)
191194
public void reopenForm(Guild guild, FormData form) {
192195
formsRepo.reopenForm(form);
193196

194-
if (form.isAttached()) {
195-
TextChannel formChannel = guild.getTextChannelById(form.getMessageChannel().get());
196-
formChannel.retrieveMessageById(form.getMessageId().get()).queue(msg -> {
197+
form.getAttachmentInfo().ifPresent(info -> {
198+
long messageChannelId = info.messageChannelId();
199+
long messageId = info.messageId();
200+
TextChannel formChannel = guild.getTextChannelById(messageChannelId);
201+
formChannel.retrieveMessageById(messageId).queue(msg -> {
197202
mapFormMessageButtons(msg, btn -> {
198203
String cptId = btn.getCustomId();
199204
String[] split = ComponentIdBuilder.split(cptId);
@@ -203,8 +208,8 @@ public void reopenForm(Guild guild, FormData form) {
203208
}
204209
return btn;
205210
});
206-
}, _ -> {});
207-
}
211+
}, ExceptionLogger::capture);
212+
});
208213
}
209214

210215
/**

src/main/java/net/discordjug/javabot/systems/staff_commands/forms/commands/AttachFormSubcommand.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -75,7 +75,7 @@ public void execute(SlashCommandInteractionEvent event) {
7575
}
7676
FormData form = formOpt.get();
7777

78-
if (form.isAttached()) {
78+
if (form.getAttachmentInfo().isPresent()) {
7979
event.getHook()
8080
.sendMessage("The form seems to already be attached to a message. Detach it before continuing.")
8181
.queue();

src/main/java/net/discordjug/javabot/systems/staff_commands/forms/commands/DeleteFormSubcommand.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -52,7 +52,7 @@ public void execute(SlashCommandInteractionEvent event) {
5252
event.deferReply(true).queue();
5353
FormData form = formOpt.get();
5454

55-
if (form.isAttached()) {
55+
if (form.getAttachmentInfo().isPresent()) {
5656
event.getHook().sendMessage(
5757
"This form is attached to a message. Use `details` subcommand to check the message this form is attached to, or `detach` subcommand to detach the message before deleting.")
5858
.queue();

src/main/java/net/discordjug/javabot/systems/staff_commands/forms/commands/DetachFormSubcommand.java

Lines changed: 26 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -62,7 +62,7 @@ public void execute(SlashCommandInteractionEvent event) {
6262
}
6363
FormData form = formOpt.get();
6464

65-
if (!form.isAttached()) {
65+
if (form.getAttachmentInfo().isEmpty()) {
6666
event.getHook().sendMessage("This form doesn't seem to be attached to a message").queue();
6767
return;
6868
}
@@ -86,30 +86,33 @@ public void handleAutoComplete(CommandAutoCompleteInteractionEvent event, AutoCo
8686
* @param guild guild this form is contained in
8787
*/
8888
public static void detachFromMessage(FormData form, Guild guild) {
89-
if (!form.isAttached()) return;
90-
TextChannel formChannel = guild.getTextChannelById(form.getMessageChannel().get());
91-
if (formChannel != null) {
92-
formChannel.retrieveMessageById(form.getMessageId().get()).queue(msg -> {
93-
List<ActionRow> components = msg.getComponents().stream().map(msgComponent -> {
94-
ActionRow row = msgComponent.asActionRow();
95-
List<ActionRowChildComponentUnion> cpts = row.getComponents().stream().filter(cpt -> {
96-
if (cpt instanceof Button btn) {
97-
String cptId = btn.getCustomId();
98-
String[] split = ComponentIdBuilder.split(cptId);
99-
if (split[0].equals(FormInteractionManager.FORM_COMPONENT_ID)) {
100-
return !split[1].equals(Long.toString(form.id()));
89+
form.getAttachmentInfo().ifPresent(info -> {
90+
long messageChannelId = info.messageChannelId();
91+
long messageId = info.messageId();
92+
TextChannel formChannel = guild.getTextChannelById(messageChannelId);
93+
if (formChannel != null) {
94+
formChannel.retrieveMessageById(messageId).queue(msg -> {
95+
List<ActionRow> components = msg.getComponents().stream().map(msgComponent -> {
96+
ActionRow row = msgComponent.asActionRow();
97+
List<ActionRowChildComponentUnion> cpts = row.getComponents().stream().filter(cpt -> {
98+
if (cpt instanceof Button btn) {
99+
String cptId = btn.getCustomId();
100+
String[] split = ComponentIdBuilder.split(cptId);
101+
if (split[0].equals(FormInteractionManager.FORM_COMPONENT_ID)) {
102+
return !split[1].equals(Long.toString(form.id()));
103+
}
101104
}
105+
return true;
106+
}).toList();
107+
if (cpts.isEmpty()) {
108+
return null;
102109
}
103-
return true;
104-
}).toList();
105-
if (cpts.isEmpty()) {
106-
return null;
107-
}
108-
return ActionRow.of(cpts);
109-
}).filter(Objects::nonNull).toList();
110-
msg.editMessageComponents(components).queue();
111-
}, e -> ExceptionLogger.capture(e));
112-
}
110+
return ActionRow.of(cpts);
111+
}).filter(Objects::nonNull).toList();
112+
msg.editMessageComponents(components).queue();
113+
}, ExceptionLogger::capture);
114+
}
115+
});
113116
}
114117

115118
}

src/main/java/net/discordjug/javabot/systems/staff_commands/forms/commands/DetailsFormSubcommand.java

Lines changed: 15 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@
44

55
import net.discordjug.javabot.data.config.BotConfig;
66
import net.discordjug.javabot.systems.staff_commands.forms.dao.FormsRepository;
7+
import net.discordjug.javabot.systems.staff_commands.forms.model.FormAttachmentInfo;
78
import net.discordjug.javabot.systems.staff_commands.forms.model.FormData;
89
import net.dv8tion.jda.api.EmbedBuilder;
910
import net.dv8tion.jda.api.entities.Guild;
@@ -15,6 +16,7 @@
1516
import net.dv8tion.jda.api.interactions.commands.OptionType;
1617
import net.dv8tion.jda.api.interactions.commands.build.OptionData;
1718
import net.dv8tion.jda.api.interactions.commands.build.SubcommandData;
19+
import net.dv8tion.jda.api.utils.MarkdownUtil;
1820
import net.dv8tion.jda.api.utils.TimeFormat;
1921
import xyz.dynxsty.dih4jda.interactions.AutoCompletable;
2022

@@ -81,16 +83,20 @@ private EmbedBuilder createFormDetailsEmbed(FormData form, Guild guild) {
8183

8284
String channelMention;
8385
String messageLink;
84-
if (form.isAttached()) {
85-
long channelId = form.getMessageChannel().get();
86+
Optional<FormAttachmentInfo> attachmentInfoOptonal = form.getAttachmentInfo();
87+
88+
channelMention = attachmentInfoOptonal.map(info -> {
89+
long channelId = info.messageChannelId();
8690
TextChannel channel = guild.getTextChannelById(channelId);
87-
channelMention = channel != null ? channel.getAsMention() : "`" + channelId + "`";
88-
messageLink = String.format("[Link](https://discord.com/channels/%s/%s/%s)", guild.getId(),
89-
form.getMessageChannel().get(), form.getMessageId().get());
90-
} else {
91-
channelMention = "*Not attached*";
92-
messageLink = "*Not attached*";
93-
}
91+
return channel != null ? channel.getAsMention() : "`" + channelId + "`";
92+
}).orElse("*Not attached*");
93+
94+
messageLink = attachmentInfoOptonal.map(attachmentInfo -> {
95+
long messageId = attachmentInfo.messageId();
96+
long channelId = attachmentInfo.messageChannelId();
97+
return MarkdownUtil.maskedLink("Link",
98+
String.format("https://discord.com/channels/%s/%s/%s", guild.getId(), channelId, messageId));
99+
}).orElse("*Not attached*");
94100

95101
String submissionsChannelMention;
96102
TextChannel submissionsChannel = guild.getTextChannelById(form.submitChannel());

src/main/java/net/discordjug/javabot/systems/staff_commands/forms/commands/ModifyFormSubcommand.java

Lines changed: 16 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@
66
import net.discordjug.javabot.data.config.BotConfig;
77
import net.discordjug.javabot.systems.staff_commands.forms.FormInteractionManager;
88
import net.discordjug.javabot.systems.staff_commands.forms.dao.FormsRepository;
9+
import net.discordjug.javabot.systems.staff_commands.forms.model.FormAttachmentInfo;
910
import net.discordjug.javabot.systems.staff_commands.forms.model.FormData;
1011
import net.dv8tion.jda.api.events.interaction.command.CommandAutoCompleteInteractionEvent;
1112
import net.dv8tion.jda.api.events.interaction.command.SlashCommandInteractionEvent;
@@ -83,9 +84,21 @@ public void execute(SlashCommandInteractionEvent event) {
8384

8485
boolean onetime = event.getOption("onetime", oldForm.onetime(), OptionMapping::getAsBoolean);
8586

86-
FormData newForm = new FormData(oldForm.id(), oldForm.fields(), title, submitChannel, submitMessage,
87-
oldForm.getMessageId().orElse(null), oldForm.getMessageChannel().orElse(null), expiration,
88-
oldForm.closed(), onetime);
87+
Long messageId;
88+
Long messageChannel;
89+
90+
Optional<FormAttachmentInfo> infoOptional = oldForm.getAttachmentInfo();
91+
if (infoOptional.isPresent()) {
92+
FormAttachmentInfo info = infoOptional.get();
93+
messageId = info.messageId();
94+
messageChannel = info.messageChannelId();
95+
} else {
96+
messageChannel = null;
97+
messageId = null;
98+
}
99+
100+
FormData newForm = new FormData(oldForm.id(), oldForm.fields(), title, submitChannel, submitMessage, messageId,
101+
messageChannel, expiration, oldForm.closed(), onetime);
89102

90103
formsRepo.updateForm(newForm);
91104

src/main/java/net/discordjug/javabot/systems/staff_commands/forms/commands/RemoveFieldFormSubcommand.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -54,7 +54,7 @@ public void execute(SlashCommandInteractionEvent event) {
5454
}
5555
FormData form = formOpt.get();
5656

57-
if (form.isAttached() && form.fields().size() <= 1) {
57+
if (form.getAttachmentInfo().isPresent() && form.fields().size() <= 1) {
5858
event.getHook().sendMessage(
5959
"Can't remove the last field from an attached form. Detach the form before removing the field")
6060
.queue();

src/main/java/net/discordjug/javabot/systems/staff_commands/forms/dao/FormsRepository.java

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@
1919

2020
import lombok.NonNull;
2121
import lombok.RequiredArgsConstructor;
22+
import net.discordjug.javabot.systems.staff_commands.forms.model.FormAttachmentInfo;
2223
import net.discordjug.javabot.systems.staff_commands.forms.model.FormData;
2324
import net.discordjug.javabot.systems.staff_commands.forms.model.FormField;
2425
import net.discordjug.javabot.systems.staff_commands.forms.model.FormUser;
@@ -200,13 +201,16 @@ public boolean hasSubmitted(User user, FormData form) {
200201
public void insertForm(@NonNull FormData data) {
201202
Objects.requireNonNull(data);
202203
jdbcTemplate.update(con -> {
204+
205+
Optional<FormAttachmentInfo> attachmentInfoOptional = data.getAttachmentInfo();
206+
203207
PreparedStatement statement = con.prepareStatement(
204208
"insert into `forms` (title, submit_message, submit_channel, message_id, message_channel, expiration, onetime) values (?, ?, ?, ?, ?, ?, ?)");
205209
statement.setString(1, data.title());
206210
statement.setString(2, data.submitMessage());
207211
statement.setLong(3, data.submitChannel());
208-
statement.setObject(4, data.getMessageId().orElse(null));
209-
statement.setObject(5, data.getMessageChannel().orElse(null));
212+
statement.setObject(4, attachmentInfoOptional.map(FormAttachmentInfo::messageId).orElse(null));
213+
statement.setObject(5, attachmentInfoOptional.map(FormAttachmentInfo::messageChannelId).orElse(null));
210214
statement.setTimestamp(6,
211215
data.hasExpirationTime() ? new Timestamp(data.expiration().toEpochMilli()) : null);
212216
statement.setBoolean(7, data.onetime());
Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
package net.discordjug.javabot.systems.staff_commands.forms.model;
2+
3+
/**
4+
* Contains information about form's attachment state. In other words, if the
5+
* form is attached to a message, this records contains the message's and its
6+
* channel IDs.
7+
*
8+
* @see FormData
9+
*/
10+
public record FormAttachmentInfo(long messageId, long messageChannelId) {
11+
}

src/main/java/net/discordjug/javabot/systems/staff_commands/forms/model/FormData.java

Lines changed: 5 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -49,8 +49,11 @@ public record FormData(long id, List<FormField> fields, String title, long submi
4949
}
5050
}
5151

52-
public boolean isAttached() {
53-
return messageChannel != null && messageId != null;
52+
public Optional<FormAttachmentInfo> getAttachmentInfo() {
53+
if (messageChannel != null && messageId != null) {
54+
return Optional.of(new FormAttachmentInfo(messageId, messageChannel));
55+
}
56+
return Optional.empty();
5457
}
5558

5659
/**
@@ -87,14 +90,6 @@ public boolean hasExpired() {
8790
return hasExpirationTime() && expiration.isBefore(Instant.now());
8891
}
8992

90-
public Optional<Long> getMessageId() {
91-
return Optional.ofNullable(messageId);
92-
}
93-
94-
public Optional<Long> getMessageChannel() {
95-
return Optional.ofNullable(messageChannel);
96-
}
97-
9893
@Override
9994
public String toString() {
10095
String prefix;

0 commit comments

Comments
 (0)