Skip to content

Commit 921172c

Browse files
Make staff command permissions a little stricter
1 parent 6ba31f7 commit 921172c

4 files changed

Lines changed: 96 additions & 3 deletions

File tree

src/main/java/technobot/commands/staff/ClearCommand.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -31,7 +31,7 @@ public ClearCommand(TechnoBot bot) {
3131
this.args.add(new OptionData(OptionType.INTEGER, "amount", "Number of messages to clear", true)
3232
.setMinValue(1)
3333
.setMaxValue(100));
34-
this.permission = Permission.MESSAGE_MANAGE;
34+
this.permission = Permission.MANAGE_SERVER;
3535
}
3636

3737
@Override
Lines changed: 93 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,93 @@
1+
package technobot.commands.staff;
2+
3+
import net.dv8tion.jda.api.EmbedBuilder;
4+
import net.dv8tion.jda.api.Permission;
5+
import net.dv8tion.jda.api.entities.Member;
6+
import net.dv8tion.jda.api.entities.Role;
7+
import net.dv8tion.jda.api.entities.User;
8+
import net.dv8tion.jda.api.events.interaction.command.SlashCommandInteractionEvent;
9+
import net.dv8tion.jda.api.interactions.commands.OptionMapping;
10+
import net.dv8tion.jda.api.interactions.commands.OptionType;
11+
import net.dv8tion.jda.api.interactions.commands.build.OptionData;
12+
import technobot.TechnoBot;
13+
import technobot.commands.Category;
14+
import technobot.commands.Command;
15+
import technobot.util.CommandUtils;
16+
import technobot.util.embeds.EmbedColor;
17+
import technobot.util.embeds.EmbedUtils;
18+
19+
import java.util.Date;
20+
21+
/**
22+
* Command that adds a muted role to a user in the guild.
23+
*
24+
* @author TechnoVision
25+
*/
26+
public class MuteCommand extends Command {
27+
28+
public MuteCommand(TechnoBot bot) {
29+
super(bot);
30+
this.name = "mute";
31+
this.description = "Kicks a user from your server.";
32+
this.category = Category.STAFF;
33+
this.args.add(new OptionData(OptionType.USER, "user", "The user to kick", true));
34+
this.args.add(new OptionData(OptionType.STRING, "reason", "Reason for the kick"));
35+
this.permission = Permission.MANAGE_ROLES;
36+
}
37+
38+
@Override
39+
public void execute(SlashCommandInteractionEvent event) {
40+
event.deferReply().queue();
41+
// Get command and member data
42+
User user = event.getOption("user").getAsUser();
43+
Member target = event.getOption("user").getAsMember();
44+
if (target == null) {
45+
event.getHook().sendMessageEmbeds(EmbedUtils.createError("That user is not in this server!")).queue();
46+
return;
47+
} else if (target.getIdLong() == event.getJDA().getSelfUser().getIdLong()) {
48+
event.getHook().sendMessageEmbeds(EmbedUtils.createError("Do you seriously expect me to kick myself?")).queue();
49+
return;
50+
}
51+
OptionMapping reasonOption = event.getOption("reason");
52+
String reason = reasonOption != null ? reasonOption.getAsString() : "Unspecified";
53+
54+
// Check that bot has necessary permissions
55+
Role botRole = event.getGuild().getBotRole();
56+
if (!CommandUtils.hasPermission(botRole, this.permission) || target.isOwner()) {
57+
event.getHook().sendMessageEmbeds(EmbedUtils.createError("I couldn't kick that user. Please check my permissions and role position.")).queue();
58+
return;
59+
}
60+
61+
// Check if bot has a higher role than user
62+
int botPos = botRole.getPosition();
63+
for (Role role : target.getRoles()) {
64+
if (role.getPosition() >= botPos) {
65+
event.getHook().sendMessageEmbeds(EmbedUtils.createError("I couldn't kick that user. Please check my permissions and role position.")).queue();
66+
return;
67+
}
68+
}
69+
70+
// Kick user from guild
71+
user.openPrivateChannel().queue(privateChannel -> {
72+
// Private message user with reason for kick
73+
EmbedBuilder embed = new EmbedBuilder()
74+
.setColor(EmbedColor.ERROR.color)
75+
.setTitle(EmbedUtils.RED_X + " You were kicked!")
76+
.addField("Server", event.getGuild().getName(), false)
77+
.addField("Reason", reason, false)
78+
.setTimestamp(new Date().toInstant());
79+
privateChannel.sendMessageEmbeds(embed.build()).queue(
80+
message -> target.kick(reason).queue(),
81+
failure -> target.kick(reason).queue()
82+
);
83+
}, fail -> target.kick(reason).queue());
84+
85+
// Send confirmation message
86+
event.getHook().sendMessageEmbeds(new EmbedBuilder()
87+
.setAuthor(user.getAsTag() + " has been kicked", null, user.getEffectiveAvatarUrl())
88+
.setDescription("**Reason:** " + reason)
89+
.setColor(EmbedColor.DEFAULT.color)
90+
.build()
91+
).queue();
92+
}
93+
}

src/main/java/technobot/commands/staff/RemoveWarnCommand.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -29,7 +29,7 @@ public RemoveWarnCommand(TechnoBot bot) {
2929
this.category = Category.STAFF;
3030
this.args.add(new OptionData(OptionType.USER, "user", "User to clear ALL warnings for"));
3131
this.args.add(new OptionData(OptionType.INTEGER, "id", "ID number for the warning to remove").setMinValue(1));
32-
this.permission = Permission.MODERATE_MEMBERS;
32+
this.permission = Permission.MANAGE_ROLES;
3333
}
3434

3535
@Override

src/main/java/technobot/commands/staff/WarnCommand.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -32,7 +32,7 @@ public WarnCommand(TechnoBot bot) {
3232
this.category = Category.STAFF;
3333
this.args.add(new OptionData(OptionType.USER, "user", "The user to warn", true));
3434
this.args.add(new OptionData(OptionType.STRING, "reason", "Reason for the warning"));
35-
this.permission = Permission.MODERATE_MEMBERS;
35+
this.permission = Permission.MANAGE_ROLES;
3636
}
3737

3838
@Override

0 commit comments

Comments
 (0)