[AB-47] adding feature to define custom actions once members reach a certain level

This commit is contained in:
Sheldan
2024-02-28 21:26:42 +01:00
parent c11ddd84ab
commit 93b02d37ed
43 changed files with 1476 additions and 53 deletions

View File

@@ -3,18 +3,14 @@ package dev.sheldan.abstracto.core.command.handler;
import dev.sheldan.abstracto.core.command.Command;
import dev.sheldan.abstracto.core.command.CommandConstants;
import dev.sheldan.abstracto.core.command.config.Parameter;
import dev.sheldan.abstracto.core.command.exception.AbstractoTemplatedException;
import dev.sheldan.abstracto.core.command.execution.ParameterPieceType;
import dev.sheldan.abstracto.core.command.execution.UnparsedCommandParameterPiece;
import dev.sheldan.abstracto.core.command.handler.provided.RoleParameterHandler;
import dev.sheldan.abstracto.core.utils.ParseUtils;
import net.dv8tion.jda.api.entities.Message;
import net.dv8tion.jda.api.entities.Role;
import org.apache.commons.lang3.math.NumberUtils;
import org.springframework.stereotype.Component;
import java.util.List;
import java.util.regex.Matcher;
@Component
public class RoleParameterHandlerImpl implements RoleParameterHandler {
@Override
@@ -25,29 +21,7 @@ public class RoleParameterHandlerImpl implements RoleParameterHandler {
@Override
public Object handle(UnparsedCommandParameterPiece input, CommandParameterIterators iterators, Parameter param, Message context, Command command) {
String inputString = ((String) input.getValue()).trim();
Matcher matcher = Message.MentionType.ROLE.getPattern().matcher(inputString);
Role foundRole;
if(matcher.matches() && iterators.getRoleIterator().hasNext()) {
foundRole = iterators.getRoleIterator().next();
} else {
if(NumberUtils.isParsable(inputString)) {
long roleId = Long.parseLong(inputString);
foundRole = context.getGuild().getRoleById(roleId);
} else {
List<Role> roles = context.getGuild().getRolesByName(inputString, true);
if(roles.isEmpty()) {
throw new AbstractoTemplatedException("No role found with name.", "no_role_found_by_name_exception");
}
if(roles.size() > 1) {
throw new AbstractoTemplatedException("Multiple roles found with name.", "multiple_roles_found_by_name_exception");
}
foundRole = roles.get(0);
}
}
if(foundRole != null && foundRole.isPublicRole()) {
throw new AbstractoTemplatedException("Public role cannot be used for role parameter.", "everyone_role_not_allowed_exception");
}
return foundRole;
return ParseUtils.parseRoleFromText(inputString, context.getGuild());
}
@Override

View File

@@ -16,6 +16,7 @@ import dev.sheldan.abstracto.core.utils.CompletableFutureList;
import dev.sheldan.abstracto.core.utils.FileService;
import lombok.extern.slf4j.Slf4j;
import net.dv8tion.jda.api.EmbedBuilder;
import net.dv8tion.jda.api.Permission;
import net.dv8tion.jda.api.entities.*;
import net.dv8tion.jda.api.entities.channel.concrete.Category;
import net.dv8tion.jda.api.entities.channel.concrete.TextChannel;
@@ -727,6 +728,26 @@ public class ChannelServiceBean implements ChannelService {
}
}
@Override
public CompletableFuture<Void> addMemberViewToChannel(Guild guild, Long channelId, Long memberId, Collection<Permission> permissions) {
return guild.getGuildChannelById(channelId)
.getPermissionContainer()
.getPermissionContainer()
.getManager()
.putMemberPermissionOverride(memberId, permissions, new ArrayList<>())
.submit();
}
@Override
public CompletableFuture<Void> removeChannelOverrideForMember(Guild guild, Long channelId, Long memberId) {
return guild
.getGuildChannelById(channelId)
.getPermissionContainer()
.getManager()
.removePermissionOverride(memberId)
.submit();
}
@PostConstruct
public void postConstruct() {

View File

@@ -40,6 +40,9 @@ public class RoleServiceBean implements RoleService {
@Autowired
private RoleManagementService roleManagementService;
@Autowired
private MemberService memberService;
@Autowired
private MetricService metricService;
@@ -97,6 +100,22 @@ public class RoleServiceBean implements RoleService {
return updateRolesObj(member, rolesObjToRemove, rolesObjToAdd);
}
@Override
public CompletableFuture<Void> updateRolesIds(AUserInAServer aUserInAServer, List<Long> rolesToAdd, List<Long> rolesToRemove) {
Guild guild = guildService.getGuildById(aUserInAServer.getServerReference().getId());
List<Role> rolesObjToAdd = rolesToAdd
.stream()
.map(guild::getRoleById)
.toList();
List<Role> rolesObjToRemove = rolesToRemove
.stream()
.map(guild::getRoleById)
.toList();
Member member = memberService.getMemberInServer(aUserInAServer);
return guild.modifyMemberRoles(member, rolesObjToAdd, rolesObjToRemove).submit();
}
@Override
public CompletableFuture<Void> updateRolesObj(Member member, List<Role> rolesToRemove, List<Role> rolesToAdd) {
return member.getGuild().modifyMemberRoles(member, rolesToAdd, rolesToRemove).submit();
@@ -129,6 +148,16 @@ public class RoleServiceBean implements RoleService {
return removeRoleFromUserFuture(guild, role, member.getIdLong());
}
@Override
public CompletableFuture<Void> removeRoleFromMemberAsync(AUserInAServer user, ARole role) {
Optional<Guild> guildById = guildService.getGuildByIdOptional(user.getServerReference().getId());
if(guildById.isPresent()) {
return removeRoleFromUserFuture(guildById.get(), role, user.getUserReference().getId());
} else {
throw new GuildNotFoundException(user.getServerReference().getId());
}
}
@Override
public CompletableFuture<Void> removeRoleFromMemberAsync(Member member, Long roleId) {
Role role = member.getGuild().getRoleById(roleId);

View File

@@ -3,6 +3,7 @@ package dev.sheldan.abstracto.core.service;
import dev.sheldan.abstracto.core.models.database.AChannel;
import dev.sheldan.abstracto.core.models.database.AServer;
import dev.sheldan.abstracto.core.templating.model.MessageToSend;
import net.dv8tion.jda.api.Permission;
import net.dv8tion.jda.api.entities.*;
import net.dv8tion.jda.api.entities.channel.concrete.TextChannel;
import net.dv8tion.jda.api.entities.channel.concrete.ThreadChannel;
@@ -11,6 +12,7 @@ import net.dv8tion.jda.api.entities.channel.middleman.GuildMessageChannel;
import net.dv8tion.jda.api.entities.channel.middleman.MessageChannel;
import net.dv8tion.jda.api.requests.restaction.MessageCreateAction;
import java.util.Collection;
import java.util.List;
import java.util.Optional;
import java.util.concurrent.CompletableFuture;
@@ -79,4 +81,7 @@ public interface ChannelService {
CompletableFuture<Void> setSlowModeInChannel(TextChannel textChannel, Integer seconds);
List<CompletableFuture<Message>> sendFileToChannel(String fileContent, String fileNameTemplate, String messageTemplate, Object model, MessageChannel channel);
List<CompletableFuture<Message>> sendFileToChannel(String fileContent, String fileName, MessageChannel channel);
CompletableFuture<Void> addMemberViewToChannel(Guild guild, Long channelId, Long memberId, Collection<Permission> permissions);
CompletableFuture<Void> removeChannelOverrideForMember(Guild guild, Long channelId, Long memberId);
}

View File

@@ -17,12 +17,14 @@ public interface RoleService {
CompletableFuture<Void> addRoleToUserAsync(AUserInAServer aUserInAServer, ARole role);
CompletableFuture<Void> addRoleToMemberAsync(Member member, Long roleId);
CompletableFuture<Void> updateRolesIds(Member member, List<Long> rolesToRemove, List<Long> rolesToAdd);
CompletableFuture<Void> updateRolesIds(AUserInAServer aUserInAServer, List<Long> rolesToAdd, List<Long> rolesToRemove);
CompletableFuture<Void> updateRolesObj(Member member, List<Role> rolesToRemove, List<Role> rolesToAdd);
CompletableFuture<Void> addRoleToMemberAsync(Member member, Role role);
void addRoleToMember(Member member, ARole role);
CompletableFuture<Void> addRoleToMemberAsync(Member member, ARole role);
void removeRoleFromMember(Member member, ARole role);
CompletableFuture<Void> removeRoleFromMemberAsync(Member member, ARole role);
CompletableFuture<Void> removeRoleFromMemberAsync(AUserInAServer user, ARole role);
CompletableFuture<Void> removeRoleFromMemberAsync(Member member, Long roleId);
CompletableFuture<Void> addRoleToMemberAsync(Guild guild, Long userId, Role roleById);
CompletableFuture<Void> removeRoleFromUserAsync(Guild guild, Long userId, Role roleById);

View File

@@ -1,9 +1,18 @@
package dev.sheldan.abstracto.core.utils;
import dev.sheldan.abstracto.core.command.exception.AbstractoTemplatedException;
import dev.sheldan.abstracto.core.exception.DurationFormatException;
import net.dv8tion.jda.api.entities.Guild;
import net.dv8tion.jda.api.entities.ISnowflake;
import net.dv8tion.jda.api.entities.Message;
import net.dv8tion.jda.api.entities.Role;
import net.dv8tion.jda.api.entities.channel.middleman.GuildChannel;
import net.dv8tion.jda.api.utils.cache.SnowflakeCacheView;
import org.apache.commons.lang3.math.NumberUtils;
import java.time.Duration;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.regex.Matcher;
@@ -44,4 +53,64 @@ public class ParseUtils {
}
return start;
}
public static Role parseRoleFromText(String text, Guild guild) {
Role role;
Matcher matcher = Message.MentionType.ROLE.getPattern().matcher(text);
if(matcher.matches()) {
String roleId = matcher.group(1);
role = guild.getRoleById(roleId);
} else {
if(NumberUtils.isParsable(text)) {
role = guild.getRoleById(text);
} else {
List<Role> roles = guild.getRolesByName(text, true);
if(roles.isEmpty()) {
throw new AbstractoTemplatedException("No role found with name.", "no_role_found_by_name_exception");
}
if(roles.size() > 1) {
throw new AbstractoTemplatedException("Multiple roles found with name.", "multiple_roles_found_by_name_exception");
}
role = roles.get(0);
}
}
if(role != null && role.isPublicRole()) {
throw new AbstractoTemplatedException("Public role cannot be used for role parameter.", "everyone_role_not_allowed_exception");
}
return role;
}
public static GuildChannel parseGuildChannelFromText(String text, Guild guild) {
Matcher matcher = Message.MentionType.CHANNEL.getPattern().matcher(text);
GuildChannel textChannel;
if(matcher.matches()) {
String channelId = matcher.group(1);
textChannel = guild.getChannelById(GuildChannel.class, channelId);
} else {
if(NumberUtils.isParsable(text)) {
long channelId = Long.parseLong(text);
return guild.getGuildChannelById(channelId);
} else {
List<ISnowflake> potentialMatches = new ArrayList<>();
potentialMatches.addAll(getByName(guild.getTextChannelCache(), text));
potentialMatches.addAll(getByName(guild.getCategoryCache(), text));
potentialMatches.addAll(getByName(guild.getVoiceChannelCache(), text));
potentialMatches.addAll(getByName(guild.getThreadChannelCache(), text));
potentialMatches.addAll(getByName(guild.getForumChannelCache(), text));
potentialMatches.addAll(getByName(guild.getStageChannelCache(), text));
if(potentialMatches.isEmpty()) {
throw new AbstractoTemplatedException("No channel found with name.", "no_channel_found_by_name_exception");
}
if(potentialMatches.size() > 1) {
throw new AbstractoTemplatedException("Multiple channels found..", "multiple_channels_found_by_name_exception");
}
return guild.getGuildChannelById(potentialMatches.get(0).getId());
}
}
return textChannel;
}
private static <T extends ISnowflake> List<T> getByName(SnowflakeCacheView<T> cache, String name) {
return cache.getElementsByName(name, true);
}
}