Skip to content

Commit 0bb56bf

Browse files
committed
feat: permissions-based commands
1 parent 127b15b commit 0bb56bf

23 files changed

Lines changed: 229 additions & 21 deletions

src/main/java/net/modgarden/gardenbot/GardenBotEvents.java

Lines changed: 17 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,7 @@
2929
import net.modgarden.gardenbot.interaction.dispatcher.ButtonDispatcher;
3030
import net.modgarden.gardenbot.interaction.dispatcher.ModalDispatcher;
3131
import net.modgarden.gardenbot.interaction.dispatcher.SlashCommandDispatcher;
32+
import net.modgarden.gardenbot.response.Response;
3233
import net.modgarden.gardenbot.util.MessageCacheUtil;
3334
import net.modgarden.gardenbot.util.SchedulerUtil;
3435
import org.jetbrains.annotations.NotNull;
@@ -38,7 +39,14 @@
3839
public class GardenBotEvents extends ListenerAdapter {
3940
@Override
4041
public void onSlashCommandInteraction(@NotNull SlashCommandInteractionEvent event) {
41-
var response = SlashCommandDispatcher.dispatch(new SlashCommandInteraction(event));
42+
Response response;
43+
try {
44+
response = SlashCommandDispatcher.dispatch(new SlashCommandInteraction(event));
45+
} catch (HypertextException e) {
46+
GardenBot.LOG.error("", e);
47+
return;
48+
}
49+
4250
response.replyToSlashCommand(event).queue();
4351
}
4452

@@ -60,7 +68,14 @@ public void onButtonInteraction(@NotNull ButtonInteractionEvent event) {
6068

6169
@Override
6270
public void onModalInteraction(@NotNull ModalInteractionEvent event) {
63-
var response = ModalDispatcher.dispatch(new ModalInteraction(event));
71+
Response response;
72+
try {
73+
response = ModalDispatcher.dispatch(new ModalInteraction(event));
74+
} catch (HypertextException e) {
75+
GardenBot.LOG.error("", e);
76+
return;
77+
}
78+
6479
response.replyToModal(event).queue();
6580
}
6681

src/main/java/net/modgarden/gardenbot/client/mod_garden/user/ModGardenUser.java

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@
55
public record ModGardenUser(
66
String id,
77
String username,
8+
String permissions,
89
List<String> events,
910
List<String> projects,
1011
List<String> roles,

src/main/java/net/modgarden/gardenbot/command/admin/AdminSlashCommand.java

Lines changed: 21 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,25 +2,44 @@
22

33
import net.dv8tion.jda.api.entities.Role;
44
import net.modgarden.gardenbot.GardenBot;
5+
import net.modgarden.gardenbot.client.ModGarden;
6+
import net.modgarden.gardenbot.client.exception.HypertextException;
7+
import net.modgarden.gardenbot.client.mod_garden.user.ModGardenUser;
58
import net.modgarden.gardenbot.command.SlashCommand;
69
import net.modgarden.gardenbot.command.SlashCommandOption;
710
import net.modgarden.gardenbot.interaction.SlashCommandInteraction;
811
import net.modgarden.gardenbot.response.MessageResponse;
912
import net.modgarden.gardenbot.response.Response;
13+
import net.modgarden.gardenbot.util.permission.PermissionPredicate;
14+
import net.modgarden.gardenbot.util.permission.Permissions;
15+
import org.jetbrains.annotations.Nullable;
1016

1117
import java.util.List;
1218

1319
import static net.modgarden.gardenbot.GardenBot.IS_DEV_ENV;
1420
import static net.modgarden.gardenbot.command.sudo.SudoCommand.SUDO_ROLE_ID;
1521

1622
public abstract class AdminSlashCommand extends SlashCommand {
17-
1823
public AdminSlashCommand(String name, String description, SlashCommandOption... options) {
1924
super(name, description, options);
2025
}
2126

27+
protected @Nullable PermissionPredicate requiredPermissions() {
28+
return null;
29+
}
30+
2231
@Override
23-
public final Response respondInternal(SlashCommandInteraction interaction) {
32+
public final Response respondInternal(SlashCommandInteraction interaction) throws HypertextException {
33+
PermissionPredicate permissionPredicate = this.requiredPermissions();
34+
35+
if (permissionPredicate != null && interaction.event().getMember() != null) {
36+
ModGardenUser user = ModGarden.getUserByDiscordUser(interaction.event().getUser());
37+
38+
if (user != null) {
39+
permissionPredicate.test(new Permissions(user.permissions()));
40+
}
41+
}
42+
2443
if (interaction.event().getMember() == null || !hasPermission(interaction.event().getMember().getRoles())) {
2544
return new MessageResponse("You do not have the permissions to execute this command.");
2645
}

src/main/java/net/modgarden/gardenbot/command/admin/event/AdminAddEventRoleCommand.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -32,7 +32,7 @@
3232
import org.jetbrains.annotations.NotNull;
3333
import org.jetbrains.annotations.Nullable;
3434

35-
public class AdminAddEventRoleCommand extends AdminSlashCommand {
35+
public class AdminAddEventRoleCommand extends AdminEventSlashCommand {
3636
public AdminAddEventRoleCommand() {
3737
super(
3838
"add_role",

src/main/java/net/modgarden/gardenbot/command/admin/event/AdminEventCreateCommand.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -25,7 +25,7 @@
2525
import java.util.List;
2626
import java.util.Map;
2727

28-
public class AdminEventCreateCommand extends AdminSlashCommand {
28+
public class AdminEventCreateCommand extends AdminEventSlashCommand {
2929
public AdminEventCreateCommand() {
3030
super(
3131
"create",
Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,23 @@
1+
package net.modgarden.gardenbot.command.admin.event;
2+
3+
import net.modgarden.gardenbot.command.SlashCommandOption;
4+
import net.modgarden.gardenbot.command.admin.AdminSlashCommand;
5+
import net.modgarden.gardenbot.util.permission.Permission;
6+
import net.modgarden.gardenbot.util.permission.PermissionPredicate;
7+
import org.jetbrains.annotations.Nullable;
8+
9+
public abstract class AdminEventSlashCommand extends AdminSlashCommand {
10+
public AdminEventSlashCommand(
11+
String name,
12+
String description,
13+
SlashCommandOption... options
14+
) {
15+
super(name, description, options);
16+
}
17+
18+
@Nullable
19+
@Override
20+
protected PermissionPredicate requiredPermissions() {
21+
return PermissionPredicate.all(Permission.EDIT_EVENT);
22+
}
23+
}

src/main/java/net/modgarden/gardenbot/command/admin/event/AdminListEventRolesCommand.java

Lines changed: 10 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -22,9 +22,12 @@
2222
import net.modgarden.gardenbot.response.EmbedResponse;
2323
import net.modgarden.gardenbot.response.MessageResponse;
2424
import net.modgarden.gardenbot.response.Response;
25+
import net.modgarden.gardenbot.util.permission.Permission;
26+
import net.modgarden.gardenbot.util.permission.PermissionPredicate;
2527
import org.jetbrains.annotations.NotNull;
28+
import org.jetbrains.annotations.Nullable;
2629

27-
public class AdminListEventRolesCommand extends AdminSlashCommand {
30+
public class AdminListEventRolesCommand extends AdminEventSlashCommand {
2831
public AdminListEventRolesCommand() {
2932
super(
3033
"list_roles",
@@ -96,4 +99,10 @@ public List<Command.Choice> getAutoCompleteChoices(String focusedOption, User us
9699
// TODO: This...
97100
return Collections.emptyList();
98101
}
102+
103+
@Nullable
104+
@Override
105+
protected PermissionPredicate requiredPermissions() {
106+
return PermissionPredicate.any(Permission.LIST_USER_INFO, Permission.EDIT_EVENT);
107+
}
99108
}

src/main/java/net/modgarden/gardenbot/command/admin/event/AdminModifyEventCommand.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -32,7 +32,7 @@
3232
import org.jetbrains.annotations.NotNull;
3333
import org.jetbrains.annotations.Nullable;
3434

35-
public class AdminModifyEventCommand extends AdminSlashCommand {
35+
public class AdminModifyEventCommand extends AdminEventSlashCommand {
3636
public AdminModifyEventCommand() {
3737
super(
3838
"modify",

src/main/java/net/modgarden/gardenbot/command/admin/event/AdminRemoveEventRoleCommand.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,7 @@
2424
import net.modgarden.gardenbot.util.NullableWrapper;
2525
import org.jetbrains.annotations.NotNull;
2626

27-
public class AdminRemoveEventRoleCommand extends AdminSlashCommand {
27+
public class AdminRemoveEventRoleCommand extends AdminEventSlashCommand {
2828
public AdminRemoveEventRoleCommand() {
2929
super(
3030
"remove_role",

src/main/java/net/modgarden/gardenbot/command/admin/role/AdminRoleAddUserCommand.java

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,7 @@
11
package net.modgarden.gardenbot.command.admin.role;
22

3+
import static net.modgarden.gardenbot.command.admin.role.AdminRoleRemoveUserCommand.checkRoleAbility;
4+
35
import java.sql.SQLException;
46
import java.util.List;
57
import java.util.Objects;
@@ -24,7 +26,7 @@
2426
import net.modgarden.gardenbot.response.Response;
2527
import org.jetbrains.annotations.NotNull;
2628

27-
public class AdminRoleAddUserCommand extends AdminSlashCommand {
29+
public class AdminRoleAddUserCommand extends AdminRoleSlashCommand {
2830
public AdminRoleAddUserCommand() {
2931
super(
3032
"add_user",
@@ -99,6 +101,9 @@ public Response respond(SlashCommandInteraction interaction) throws HypertextExc
99101
throw new BadRequestException("No user was specified");
100102
}
101103

104+
MessageResponse x = checkRoleAbility(interaction, role);
105+
if (x != null) return x;
106+
102107
ModGarden.addUserRole(user, role);
103108

104109
if (discordUser != null && role.integrations().discord() != null) {

0 commit comments

Comments
 (0)