Skip to content

Commit 3425fa0

Browse files
committed
Convert FormData into a record and use Instants for expiration
Signed-off-by: Defective <def3ctive4@gmail.com>
1 parent 21d9a42 commit 3425fa0

18 files changed

+156
-222
lines changed

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

Lines changed: 22 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -83,7 +83,7 @@ public void closeForm(Guild guild, FormData form) {
8383
String cptId = btn.getId();
8484
String[] split = ComponentIdBuilder.split(cptId);
8585
if (split[0].equals(FormInteractionManager.FORM_COMPONENT_ID)
86-
&& split[1].equals(Long.toString(form.getId()))) {
86+
&& split[1].equals(Long.toString(form.id()))) {
8787
return btn.asDisabled();
8888
}
8989
return btn;
@@ -103,13 +103,13 @@ public void handleButton(ButtonInteractionEvent event, Button button) {
103103
FormData form = formOpt.get();
104104
if (!checkNotClosed(form)) {
105105
event.reply("This form is not accepting new submissions.").setEphemeral(true).queue();
106-
if (!form.isClosed()) {
106+
if (!form.closed()) {
107107
closeForm(event.getGuild(), form);
108108
}
109109
return;
110110
}
111111

112-
if (form.isOnetime() && formsRepo.hasSubmitted(event.getUser(), form)) {
112+
if (form.onetime() && formsRepo.hasSubmitted(event.getUser(), form)) {
113113
event.reply("You have already submitted this form").setEphemeral(true).queue();
114114
return;
115115
}
@@ -136,12 +136,12 @@ public void handleModal(ModalInteractionEvent event, List<ModalMapping> values)
136136
return;
137137
}
138138

139-
if (form.isOnetime() && formsRepo.hasSubmitted(event.getUser(), form)) {
139+
if (form.onetime() && formsRepo.hasSubmitted(event.getUser(), form)) {
140140
event.getHook().sendMessage("You have already submitted this form").queue();
141141
return;
142142
}
143143

144-
TextChannel channel = event.getGuild().getTextChannelById(form.getSubmitChannel());
144+
TextChannel channel = event.getGuild().getTextChannelById(form.submitChannel());
145145
if (channel == null) {
146146
event.getHook()
147147
.sendMessage("We couldn't receive your submission due to an error. Please contact server staff.")
@@ -154,8 +154,7 @@ public void handleModal(ModalInteractionEvent event, List<ModalMapping> values)
154154
});
155155

156156
event.getHook()
157-
.sendMessage(
158-
form.getSubmitMessage() == null ? "Your submission was received!" : form.getSubmitMessage())
157+
.sendMessage(form.submitMessage() == null ? "Your submission was received!" : form.submitMessage())
159158
.queue();
160159
}
161160

@@ -198,7 +197,7 @@ public void reopenForm(Guild guild, FormData form) {
198197
String cptId = btn.getId();
199198
String[] split = ComponentIdBuilder.split(cptId);
200199
if (split[0].equals(FormInteractionManager.FORM_COMPONENT_ID)
201-
&& split[1].equals(Long.toString(form.getId()))) {
200+
&& split[1].equals(Long.toString(form.id()))) {
202201
return btn.asEnabled();
203202
}
204203
return btn;
@@ -214,7 +213,7 @@ public void reopenForm(Guild guild, FormData form) {
214213
* @return submission modal to be presented to the user.
215214
*/
216215
public static Modal createFormModal(FormData form) {
217-
Modal modal = Modal.create(ComponentIdBuilder.build(FORM_COMPONENT_ID, form.getId()), form.getTitle())
216+
Modal modal = Modal.create(ComponentIdBuilder.build(FORM_COMPONENT_ID, form.id()), form.title())
218217
.addComponents(form.createComponents()).build();
219218
return modal;
220219
}
@@ -226,32 +225,31 @@ public static Modal createFormModal(FormData form) {
226225
* @return an optional containing expiration time,
227226
* {@link FormData#EXPIRATION_PERMANENT} if none given, or an empty
228227
* optional if it's invalid.
228+
* @throws IllegalArgumentException if the date doesn't follow the format.
229229
*/
230-
public static Optional<Long> parseExpiration(SlashCommandInteractionEvent event) {
230+
public static Optional<Instant> parseExpiration(SlashCommandInteractionEvent event)
231+
throws IllegalArgumentException {
231232
String expirationStr = event.getOption("expiration", null, OptionMapping::getAsString);
232-
Optional<Long> expiration;
233+
Optional<Instant> expiration;
233234
if (expirationStr == null) {
234-
expiration = Optional.of(FormData.EXPIRATION_PERMANENT);
235+
expiration = Optional.empty();
235236
} else {
236237
try {
237-
expiration = Optional.of(FormInteractionManager.DATE_FORMAT.parse(expirationStr).getTime());
238+
expiration = Optional.of(FormInteractionManager.DATE_FORMAT.parse(expirationStr).toInstant());
238239
} catch (ParseException e) {
239-
event.getHook().sendMessage("Invalid date. You should follow the format `"
240-
+ FormInteractionManager.DATE_FORMAT_STRING + "`.").setEphemeral(true).queue();
241-
expiration = Optional.empty();
240+
throw new IllegalArgumentException("Invalid date. You should follow the format `"
241+
+ FormInteractionManager.DATE_FORMAT_STRING + "`.");
242242
}
243243
}
244244

245-
if (expiration.isPresent() && expiration.get() != FormData.EXPIRATION_PERMANENT
246-
&& expiration.get() < System.currentTimeMillis()) {
247-
event.getHook().sendMessage("The expiration date shouldn't be in the past").setEphemeral(true).queue();
248-
return Optional.empty();
245+
if (expiration.isPresent() && expiration.get().isBefore(Instant.now())) {
246+
throw new IllegalArgumentException("The expiration date shouldn't be in the past");
249247
}
250248
return expiration;
251249
}
252250

253251
private static boolean checkNotClosed(FormData data) {
254-
if (data.isClosed() || data.hasExpired()) {
252+
if (data.closed() || data.hasExpired()) {
255253
return false;
256254
}
257255

@@ -261,12 +259,12 @@ private static boolean checkNotClosed(FormData data) {
261259
private static MessageEmbed createSubmissionEmbed(FormData form, List<ModalMapping> values, Member author) {
262260
EmbedBuilder builder = new EmbedBuilder().setTitle("New form submission received")
263261
.setAuthor(author.getEffectiveName(), null, author.getEffectiveAvatarUrl()).setTimestamp(Instant.now());
264-
builder.addField("Sender", author.getAsMention(), true).addField("Title", form.getTitle(), true);
262+
builder.addField("Sender", author.getAsMention(), true).addField("Title", form.title(), true);
265263

266-
int len = Math.min(values.size(), form.getFields().size());
264+
int len = Math.min(values.size(), form.fields().size());
267265
for (int i = 0; i < len; i++) {
268266
ModalMapping mapping = values.get(i);
269-
FormField field = form.getFields().get(i);
267+
FormField field = form.fields().get(i);
270268
String value = mapping.getAsString();
271269
builder.addField(field.label(), value == null ? "*Empty*" : "```\n" + value + "\n```", false);
272270
}

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

Lines changed: 2 additions & 2 deletions
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.getFields().size() >= 5) {
57+
if (form.fields().size() >= 5) {
5858
event.getHook().sendMessage("Can't add more than 5 components to a form").queue();
5959
return;
6060
}
@@ -67,7 +67,7 @@ public void execute(SlashCommandInteractionEvent event) {
6767
public void handleAutoComplete(CommandAutoCompleteInteractionEvent event, AutoCompleteQuery target) {
6868
switch (target.getName()) {
6969
case "form-id" -> event.replyChoices(
70-
formsRepo.getAllForms().stream().map(form -> new Choice(form.toString(), form.getId())).toList())
70+
formsRepo.getAllForms().stream().map(form -> new Choice(form.toString(), form.id())).toList())
7171
.queue();
7272
case "style" ->
7373
event.replyChoices(Arrays.stream(TextInputStyle.values()).filter(t -> t != TextInputStyle.UNKNOWN)

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

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -70,7 +70,7 @@ public void execute(SlashCommandInteractionEvent event) {
7070
return;
7171
}
7272

73-
if (form.getFields().isEmpty()) {
73+
if (form.fields().isEmpty()) {
7474
event.getHook().sendMessage("You can't attach a form with no fields.").queue();
7575
return;
7676
}
@@ -111,7 +111,7 @@ public void execute(SlashCommandInteractionEvent event) {
111111
public void handleAutoComplete(CommandAutoCompleteInteractionEvent event, AutoCompleteQuery target) {
112112
switch (target.getName()) {
113113
case "form-id" -> event.replyChoices(
114-
formsRepo.getAllForms().stream().map(form -> new Choice(form.toString(), form.getId())).toList())
114+
formsRepo.getAllForms().stream().map(form -> new Choice(form.toString(), form.id())).toList())
115115
.queue();
116116
case "button-style" -> event.replyChoices(
117117
Set.of(ButtonStyle.DANGER, ButtonStyle.PRIMARY, ButtonStyle.SECONDARY, ButtonStyle.SUCCESS).stream()
@@ -125,9 +125,9 @@ private static void attachFormToMessage(Message message, String buttonLabel, But
125125
List<ActionRow> rows = new ArrayList<>(message.getActionRows());
126126

127127
Button button = Button.of(style,
128-
ComponentIdBuilder.build(FormInteractionManager.FORM_COMPONENT_ID, form.getId()), buttonLabel);
128+
ComponentIdBuilder.build(FormInteractionManager.FORM_COMPONENT_ID, form.id()), buttonLabel);
129129

130-
if (form.isClosed() || form.hasExpired()) {
130+
if (form.closed() || form.hasExpired()) {
131131
button = button.asDisabled();
132132
}
133133

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

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -50,7 +50,7 @@ public void execute(SlashCommandInteractionEvent event) {
5050
}
5151
FormData form = formOpt.get();
5252

53-
if (form.isClosed()) {
53+
if (form.closed()) {
5454
event.reply("This form is already closed").setEphemeral(true).queue();
5555
return;
5656
}
@@ -65,7 +65,7 @@ public void execute(SlashCommandInteractionEvent event) {
6565
@Override
6666
public void handleAutoComplete(CommandAutoCompleteInteractionEvent event, AutoCompleteQuery target) {
6767
event.replyChoices(
68-
formsRepo.getAllForms(false).stream().map(form -> new Choice(form.toString(), form.getId())).toList())
68+
formsRepo.getAllForms(false).stream().map(form -> new Choice(form.toString(), form.id())).toList())
6969
.queue();
7070
}
7171
}

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

Lines changed: 10 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
package net.discordjug.javabot.systems.staff_commands.forms.commands;
22

3+
import java.time.Instant;
34
import java.util.List;
45
import java.util.Optional;
56

@@ -44,14 +45,17 @@ public void execute(SlashCommandInteractionEvent event) {
4445

4546
event.deferReply().setEphemeral(true).queue();
4647
String expirationStr = event.getOption("expiration", null, OptionMapping::getAsString);
47-
Optional<Long> expirationOpt = FormInteractionManager.parseExpiration(event);
48+
Optional<Instant> expirationOpt;
49+
try {
50+
expirationOpt = FormInteractionManager.parseExpiration(event);
51+
} catch (IllegalArgumentException e) {
52+
event.getHook().sendMessage(e.getMessage()).queue();
53+
return;
54+
}
4855

49-
if (expirationOpt.isEmpty()) return;
56+
Instant expiration = expirationOpt.orElse(null);
5057

51-
long expiration = expirationOpt.get();
52-
53-
long formId = System.currentTimeMillis();
54-
FormData form = new FormData(formId, List.of(), event.getOption("title", OptionMapping::getAsString),
58+
FormData form = new FormData(0, List.of(), event.getOption("title", OptionMapping::getAsString),
5559
event.getOption("submit-channel", OptionMapping::getAsChannel).getIdLong(),
5660
event.getOption("submit-message", null, OptionMapping::getAsString), null, null, expiration, false,
5761
event.getOption("onetime", false, OptionMapping::getAsBoolean));

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
@@ -59,7 +59,7 @@ public void execute(SlashCommandInteractionEvent event) {
5959
@Override
6060
public void handleAutoComplete(CommandAutoCompleteInteractionEvent event, AutoCompleteQuery target) {
6161
event.replyChoices(
62-
formsRepo.getAllForms().stream().map(form -> new Choice(form.toString(), form.getId())).toList())
62+
formsRepo.getAllForms().stream().map(form -> new Choice(form.toString(), form.id())).toList())
6363
.queue();
6464
}
6565
}

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

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -68,7 +68,7 @@ public void execute(SlashCommandInteractionEvent event) {
6868
@Override
6969
public void handleAutoComplete(CommandAutoCompleteInteractionEvent event, AutoCompleteQuery target) {
7070
event.replyChoices(
71-
formsRepo.getAllForms().stream().map(form -> new Choice(form.toString(), form.getId())).toList())
71+
formsRepo.getAllForms().stream().map(form -> new Choice(form.toString(), form.id())).toList())
7272
.queue();
7373
}
7474

@@ -89,7 +89,7 @@ public static void detachFromMessage(FormData form, Guild guild) {
8989
String cptId = btn.getId();
9090
String[] split = ComponentIdBuilder.split(cptId);
9191
if (split[0].equals(FormInteractionManager.FORM_COMPONENT_ID)) {
92-
return !split[1].equals(Long.toString(form.getId()));
92+
return !split[1].equals(Long.toString(form.id()));
9393
}
9494
}
9595
return true;

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

Lines changed: 14 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -61,37 +61,40 @@ public void execute(SlashCommandInteractionEvent event) {
6161
@Override
6262
public void handleAutoComplete(CommandAutoCompleteInteractionEvent event, AutoCompleteQuery target) {
6363
event.replyChoices(
64-
formsRepo.getAllForms().stream().map(form -> new Choice(form.toString(), form.getId())).toList())
65-
.queue();
64+
formsRepo.getAllForms().stream().map(form -> new Choice(form.toString(), form.id())).toList()).queue();
6665
}
6766

6867
private EmbedBuilder createFormDetailsEmbed(FormData form, Guild guild) {
6968
EmbedBuilder builder = new EmbedBuilder().setTitle("Form details");
7069

71-
long id = form.getId();
70+
long id = form.id();
7271

7372
addCodeblockField(builder, "ID", id, true);
7473
builder.addField("Created at", String.format("<t:%s>", id / 1000L), true);
7574

7675
String expiration;
7776
builder.addField("Expires at",
78-
form.hasExpirationTime() ? String.format("<t:%s>", form.getExpiration() / 1000L) : "`Never`", true);
77+
form.hasExpirationTime() ? String.format("<t:%s>", form.expiration().toEpochMilli() / 1000L)
78+
: "`Never`",
79+
true);
7980

80-
addCodeblockField(builder, "State", form.isClosed() ? "Closed" : form.hasExpired() ? "Expired" : "Open", false);
81+
addCodeblockField(builder, "State", form.closed() ? "Closed" : form.hasExpired() ? "Expired" : "Open", false);
8182

8283
builder.addField("Attached in",
8384
form.isAttached() ? "<#" + form.getMessageChannel().get() + ">" : "*Not attached*", true);
8485
builder.addField("Attached to",
85-
form.isAttached() ? String.format("[Link](https://discord.com/channels/%s/%s/%s)", guild.getId(),
86-
form.getMessageChannel().get(), form.getMessageId().get()) : "*Not attached*",
86+
form.isAttached()
87+
? String.format("[Link](https://discord.com/channels/%s/%s/%s)", guild.getId(),
88+
form.getMessageChannel().get(), form.getMessageId().get())
89+
: "*Not attached*",
8790
true);
8891

89-
builder.addField("Submissions channel", "<#" + form.getSubmitChannel() + ">", true);
90-
builder.addField("Is one-time", form.isOnetime() ? ":white_check_mark:" : ":x:", true);
92+
builder.addField("Submissions channel", "<#" + form.submitChannel() + ">", true);
93+
builder.addField("Is one-time", form.onetime() ? ":white_check_mark:" : ":x:", true);
9194
addCodeblockField(builder, "Submission message",
92-
form.getSubmitMessage() == null ? "Default" : form.getSubmitMessage(), true);
95+
form.submitMessage() == null ? "Default" : form.submitMessage(), true);
9396

94-
addCodeblockField(builder, "Number of fields", form.getFields().size(), true);
97+
addCodeblockField(builder, "Number of fields", form.fields().size(), true);
9598
addCodeblockField(builder, "Number of submissions", formsRepo.getTotalSubmissionsCount(form), true);
9699

97100
return builder;

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

Lines changed: 18 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
package net.discordjug.javabot.systems.staff_commands.forms.commands;
22

3+
import java.time.Instant;
34
import java.util.Optional;
45

56
import net.discordjug.javabot.systems.staff_commands.forms.FormInteractionManager;
@@ -55,24 +56,28 @@ public void execute(SlashCommandInteractionEvent event) {
5556
}
5657
FormData oldForm = formOpt.get();
5758

58-
String title = event.getOption("title", oldForm.getTitle(), OptionMapping::getAsString);
59-
long submitChannel = event.getOption("submit-channel", oldForm.getSubmitChannel(), OptionMapping::getAsLong);
60-
String submitMessage = event.getOption("submit-message", oldForm.getSubmitMessage(),
61-
OptionMapping::getAsString);
62-
long expiration;
59+
String title = event.getOption("title", oldForm.title(), OptionMapping::getAsString);
60+
long submitChannel = event.getOption("submit-channel", oldForm.submitChannel(), OptionMapping::getAsLong);
61+
String submitMessage = event.getOption("submit-message", oldForm.submitMessage(), OptionMapping::getAsString);
62+
Instant expiration;
6363
if (event.getOption("expiration") == null) {
64-
expiration = oldForm.getExpiration();
64+
expiration = oldForm.expiration();
6565
} else {
66-
Optional<Long> expirationOpt = FormInteractionManager.parseExpiration(event);
67-
if (expirationOpt.isEmpty()) return;
68-
expiration = expirationOpt.get();
66+
Optional<Instant> expirationOpt;
67+
try {
68+
expirationOpt = FormInteractionManager.parseExpiration(event);
69+
} catch (IllegalArgumentException e) {
70+
event.getHook().sendMessage(e.getMessage()).queue();
71+
return;
72+
}
73+
expiration = expirationOpt.orElse(oldForm.expiration());
6974
}
7075

71-
boolean onetime = event.getOption("onetime", oldForm.isOnetime(), OptionMapping::getAsBoolean);
76+
boolean onetime = event.getOption("onetime", oldForm.onetime(), OptionMapping::getAsBoolean);
7277

73-
FormData newForm = new FormData(oldForm.getId(), oldForm.getFields(), title, submitChannel, submitMessage,
78+
FormData newForm = new FormData(oldForm.id(), oldForm.fields(), title, submitChannel, submitMessage,
7479
oldForm.getMessageId().orElse(null), oldForm.getMessageChannel().orElse(null), expiration,
75-
oldForm.isClosed(), onetime);
80+
oldForm.closed(), onetime);
7681

7782
formsRepo.updateForm(newForm);
7883

@@ -82,8 +87,7 @@ public void execute(SlashCommandInteractionEvent event) {
8287
@Override
8388
public void handleAutoComplete(CommandAutoCompleteInteractionEvent event, AutoCompleteQuery target) {
8489
event.replyChoices(
85-
formsRepo.getAllForms().stream().map(form -> new Choice(form.toString(), form.getId())).toList())
86-
.queue();
90+
formsRepo.getAllForms().stream().map(form -> new Choice(form.toString(), form.id())).toList()).queue();
8791
}
8892

8993
}

0 commit comments

Comments
 (0)