Skip to content

Commit 0016fd1

Browse files
committed
add command for running scheduled tasks
1 parent 86931fd commit 0016fd1

File tree

1 file changed

+81
-0
lines changed

1 file changed

+81
-0
lines changed
Lines changed: 81 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,81 @@
1+
package net.discordjug.javabot.systems.staff_commands;
2+
3+
import java.util.ArrayList;
4+
import java.util.List;
5+
import java.util.stream.Collectors;
6+
7+
import org.springframework.scheduling.config.ScheduledTaskHolder;
8+
9+
import net.discordjug.javabot.data.config.BotConfig;
10+
import net.discordjug.javabot.util.Responses;
11+
import net.dv8tion.jda.api.Permission;
12+
import net.dv8tion.jda.api.events.interaction.command.CommandAutoCompleteInteractionEvent;
13+
import net.dv8tion.jda.api.events.interaction.command.SlashCommandInteractionEvent;
14+
import net.dv8tion.jda.api.interactions.AutoCompleteQuery;
15+
import net.dv8tion.jda.api.interactions.commands.Command;
16+
import net.dv8tion.jda.api.interactions.commands.Command.Choice;
17+
import net.dv8tion.jda.api.interactions.commands.DefaultMemberPermissions;
18+
import net.dv8tion.jda.api.interactions.commands.OptionType;
19+
import net.dv8tion.jda.api.interactions.commands.build.Commands;
20+
import xyz.dynxsty.dih4jda.interactions.AutoCompletable;
21+
import xyz.dynxsty.dih4jda.interactions.commands.application.SlashCommand;
22+
import xyz.dynxsty.dih4jda.util.AutoCompleteUtils;
23+
24+
/**
25+
* This command allows manually executing scheduled tasks.
26+
*/
27+
public class RunScheduledTaskCommand extends SlashCommand implements AutoCompletable{
28+
29+
private ScheduledTaskHolder taskHolder;
30+
31+
/**
32+
* The constructor of this class, which sets the corresponding {@link SubcommandData}.
33+
* @param botConfig the configuration of the bot
34+
* @param taskHolder A Spring object managing scheduled tasks
35+
*/
36+
public RunScheduledTaskCommand(BotConfig botConfig, ScheduledTaskHolder taskHolder) {
37+
setCommandData(Commands.slash("run-task", "(ADMIN ONLY) Run scheduled tasks")
38+
.setDefaultPermissions(DefaultMemberPermissions.enabledFor(Permission.ADMINISTRATOR))
39+
.setGuildOnly(true)
40+
.addOption(OptionType.STRING, "name", "Class name of the task", true, true)
41+
);
42+
setRequiredUsers(botConfig.getSystems().getAdminConfig().getAdminUsers());
43+
44+
this.taskHolder = taskHolder;
45+
46+
47+
}
48+
49+
@Override
50+
public void execute(SlashCommandInteractionEvent event) {
51+
String name = event.getOption("name").getAsString();
52+
taskHolder
53+
.getScheduledTasks()
54+
.stream()
55+
.filter(r -> name.equals(r.toString()))
56+
.findAny()
57+
.ifPresentOrElse(r -> {
58+
event.deferReply(true).queue();
59+
try {
60+
r.getTask().getRunnable().run();
61+
Responses.success(event.getHook(), "Task successful", "Task was executed successfully").queue();
62+
//CHECKSTYLE:OFF This is a handler for all sort of failures that could possibly happen
63+
}catch (RuntimeException e) {
64+
//CHECKSTYLE:ON
65+
Responses.error(event, "Task failed with an exception", e.getClass().getName() + (e.getMessage() == null ? "" : ": "+e.getMessage()));
66+
}
67+
}, () -> {
68+
Responses.error(event, "Cannot find task `%s`", name).queue();
69+
});
70+
}
71+
72+
@Override
73+
public void handleAutoComplete(CommandAutoCompleteInteractionEvent event, AutoCompleteQuery target) {
74+
List<Choice> choices = taskHolder
75+
.getScheduledTasks()
76+
.stream()
77+
.map(r -> new Command.Choice(r.toString(), r.toString()))
78+
.collect(Collectors.toCollection(ArrayList::new));
79+
event.replyChoices(AutoCompleteUtils.filterChoices(event, choices)).queue();
80+
}
81+
}

0 commit comments

Comments
 (0)