Skip to content

Commit a299dca

Browse files
Fix leveling reward vulnerabilities and /roles grammar
1 parent e2c833a commit a299dca

4 files changed

Lines changed: 30 additions & 6 deletions

File tree

src/main/java/technobot/commands/levels/LevelingCommand.java

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -145,6 +145,13 @@ public void execute(SlashCommandInteractionEvent event) {
145145
int level = event.getOption("level").getAsInt();
146146
String reward = event.getOption("role").getAsRole().getId();
147147

148+
// Check if role can be given by TechnoBot
149+
Role role = event.getGuild().getRoleById(reward);
150+
int botPos = event.getGuild().getBotRole().getPosition();
151+
if (role == null || role.getPosition() >= botPos || role.isManaged()) {
152+
event.getHook().sendMessageEmbeds(EmbedUtils.createError("I cannot reward that role! Please check my permissions and role position.")).queue();
153+
return;
154+
}
148155
Integer x = config.getRewards().get(reward);
149156
if (x != null && x == level) {
150157
config.removeReward(reward);

src/main/java/technobot/commands/levels/RewardsCommand.java

Lines changed: 13 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,10 @@
11
package technobot.commands.levels;
22

3+
import com.mongodb.client.model.Filters;
4+
import com.mongodb.client.model.Updates;
35
import net.dv8tion.jda.api.EmbedBuilder;
46
import net.dv8tion.jda.api.events.interaction.command.SlashCommandInteractionEvent;
7+
import org.bson.conversions.Bson;
58
import technobot.TechnoBot;
69
import technobot.commands.Category;
710
import technobot.commands.Command;
@@ -28,6 +31,7 @@ public RewardsCommand(TechnoBot bot) {
2831

2932
@Override
3033
public void execute(SlashCommandInteractionEvent event) {
34+
event.deferReply().queue();
3135
LinkedHashMap<String, Integer> rewards = new LinkedHashMap<>();
3236
GuildData.get(event.getGuild()).config.getRewards().entrySet()
3337
.stream()
@@ -36,17 +40,23 @@ public void execute(SlashCommandInteractionEvent event) {
3640

3741
StringBuilder content = new StringBuilder();
3842
for (Map.Entry<String,Integer> reward : rewards.entrySet()) {
39-
content.append("Level ").append(reward.getValue()).append(" ----> <@&").append(reward.getKey()).append(">\n");
43+
if (event.getGuild().getRoleById(reward.getKey()) != null) {
44+
content.append("Level ").append(reward.getValue()).append(" ----> <@&").append(reward.getKey()).append(">\n");
45+
} else {
46+
// Remove any deleted roles from database
47+
Bson filter = Filters.eq("guild", event.getGuild().getIdLong());
48+
bot.database.config.updateOne(filter, Updates.unset("rewards."+reward.getKey()));
49+
}
4050
}
4151

4252
if (!content.isEmpty()) {
4353
EmbedBuilder embed = new EmbedBuilder()
4454
.setColor(EmbedColor.DEFAULT.color)
4555
.setTitle(":crown: Leveling Rewards")
4656
.setDescription(content);
47-
event.replyEmbeds(embed.build()).queue();
57+
event.getHook().sendMessageEmbeds(embed.build()).queue();
4858
return;
4959
}
50-
event.replyEmbeds(EmbedUtils.createDefault(EmbedUtils.BLUE_X + " No leveling rewards have been set for this server!")).queue();
60+
event.getHook().sendMessageEmbeds(EmbedUtils.createDefault(EmbedUtils.BLUE_X + " No leveling rewards have been set for this server!")).queue();
5161
}
5262
}

src/main/java/technobot/commands/utility/RolesCommand.java

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -30,7 +30,9 @@ public void execute(SlashCommandInteractionEvent event) {
3030
for (Role role : event.getGuild().getRoles()) {
3131
int amount = guild.getMembersWithRoles(role).size();
3232
if (role.getName().equals("@everyone")) amount = guild.getMemberCount();
33-
content.append(role.getAsMention()).append(" ").append(amount).append(" Members\n");
33+
content.append(role.getAsMention()).append(" ").append(amount).append(" Member");
34+
if (amount > 1 || amount == 0) content.append("s");
35+
content.append("\n");
3436
}
3537

3638
EmbedBuilder embed = new EmbedBuilder()

src/main/java/technobot/listeners/LevelingListener.java

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

33
import com.mongodb.client.model.Filters;
44
import com.mongodb.client.model.Updates;
5+
import net.dv8tion.jda.api.Permission;
56
import net.dv8tion.jda.api.entities.ChannelType;
67
import net.dv8tion.jda.api.entities.Member;
78
import net.dv8tion.jda.api.entities.Role;
@@ -12,6 +13,7 @@
1213
import technobot.TechnoBot;
1314
import technobot.data.GuildData;
1415
import technobot.data.cache.Leveling;
16+
import technobot.util.UtilityMethods;
1517
import technobot.util.placeholders.Placeholder;
1618
import technobot.util.placeholders.PlaceholderFactory;
1719

@@ -111,8 +113,11 @@ public void onMessageReceived(@Nonnull MessageReceivedEvent event) {
111113
if (level >= rewardLevel) {
112114
// Only give role if user doesn't already have it
113115
Role role = event.getGuild().getRoleById(reward.getKey());
114-
if (role != null && !memberRoles.contains(role)) {
115-
event.getGuild().addRoleToMember(event.getAuthor(), role).queue();
116+
Role botRole = event.getGuild().getBotRole();
117+
if (role != null && !memberRoles.contains(role) && !role.isManaged()) {
118+
if (role.getPosition() < botRole.getPosition() && UtilityMethods.hasPermission(event.getGuild().getBotRole(), Permission.MANAGE_ROLES)) {
119+
event.getGuild().addRoleToMember(event.getAuthor(), role).queue();
120+
}
116121
}
117122
}
118123
}

0 commit comments

Comments
 (0)