sxcybot

Discord bot for OSRS based channels
git clone git://git.wimdupont.com/sxcybot.git
Log | Files | Refs | README | LICENSE

commit 0bfb0130d093d1c44ebe6406d985ae81c6142de6
parent ad26becc348c3254a70921d67c145f114ea6f05f
Author: Wim Dupont <wim@wimdupont.com>
Date:   Sat,  5 Oct 2024 13:38:32 +0200

roles by discordid

Diffstat:
Msrc/main/java/com/wimdupont/sxcybot/listeners/AdminCommandListener.java | 9++++++---
Msrc/main/java/com/wimdupont/sxcybot/listeners/GuildMemberEventListener.java | 14+++++++++++---
Msrc/main/java/com/wimdupont/sxcybot/listeners/admin/RoleAssignListener.java | 64+++++++++++++++++++++++++++++++++++++++++++++-------------------
Msrc/main/java/com/wimdupont/sxcybot/listeners/admin/role/AddRoleListener.java | 31+++++++++++++++++--------------
Msrc/main/java/com/wimdupont/sxcybot/listeners/admin/role/DeleteRoleListener.java | 21++++++++++++++++-----
Msrc/main/java/com/wimdupont/sxcybot/listeners/admin/role/UpdateRoleListener.java | 40++++++++++++++++++++++++++++------------
Msrc/main/java/com/wimdupont/sxcybot/repository/guild/GuildRoleRepository.java | 2+-
Msrc/main/java/com/wimdupont/sxcybot/repository/guild/dao/GuildEventDmer.java | 20++++++++++----------
Msrc/main/java/com/wimdupont/sxcybot/repository/guild/dao/GuildRole.java | 20++++++++++----------
Msrc/main/java/com/wimdupont/sxcybot/services/guild/GuildRoleService.java | 27++++++++++++++++++++++++---
Asrc/main/resources/db/migration/V1_22__guild_role_id.sql | 7+++++++
11 files changed, 175 insertions(+), 80 deletions(-)

diff --git a/src/main/java/com/wimdupont/sxcybot/listeners/AdminCommandListener.java b/src/main/java/com/wimdupont/sxcybot/listeners/AdminCommandListener.java @@ -30,6 +30,7 @@ public class AdminCommandListener extends ListenerAdapter { private static final int GENERAL = 3; private static final int SUB_ADMIN = 5; private static final int STAFF_ROLE = 10; + private static final int TEACHER = 20; private final EditRuleListener editRuleListener; private final EditBanlistListener editBanlistListener; @@ -72,7 +73,7 @@ public class AdminCommandListener extends ListenerAdapter { editBanlistListener.process(event); } case ROLE -> { - isPrivileged(roleStream, event, SUB_ADMIN); + isPrivileged(roleStream, event, TEACHER); roleAssignListener.process(event); } case BANLIST -> { @@ -103,12 +104,14 @@ public class AdminCommandListener extends ListenerAdapter { private void isPrivileged(Stream<Role> roleStream, MessageReceivedEvent event, int elevation) throws InsufficientPrivilegesException { List<GuildRole> guildRoles = guildRoleService.findAllByElevationLessThanEqual(elevation); if (roleStream.noneMatch(hasPrivilege(event, guildRoles))) - throw new InsufficientPrivilegesException(guildRoles.stream().map(GuildRole::getName).toList()); + throw new InsufficientPrivilegesException(guildRoles.stream().map(GuildRole::getDiscordId).toList()); } private Predicate<Role> hasPrivilege(MessageReceivedEvent event, List<GuildRole> guildRoles) { return f -> f.hasPermission(Permission.ADMINISTRATOR) || (event.getMember() != null && event.getMember().isOwner()) - || guildRoles.stream().map(GuildRole::getName).anyMatch(e -> e.equalsIgnoreCase(f.getName())); + || guildRoles.stream() + .map(GuildRole::getDiscordId) + .anyMatch(e -> e.equalsIgnoreCase(f.getId())); } } diff --git a/src/main/java/com/wimdupont/sxcybot/listeners/GuildMemberEventListener.java b/src/main/java/com/wimdupont/sxcybot/listeners/GuildMemberEventListener.java @@ -28,11 +28,19 @@ public class GuildMemberEventListener extends ListenerAdapter { guildEventDmerService.findAll().forEach(guildEventDmer -> event.getGuild().loadMembers().onSuccess(memberList -> { if (!memberList.isEmpty()) { - Optional<Member> member = memberList.stream().filter(f -> guildEventDmer.getName().equalsIgnoreCase(f.getUser().getName())).findFirst(); + Optional<Member> member = memberList.stream() + .filter(f -> guildEventDmer.getDiscordUserId().equalsIgnoreCase(f.getUser().getId())) + .findFirst(); if (member.isPresent()) { try { - PrivateChannel privateChannel = member.get().getUser().openPrivateChannel().complete(true); - privateChannel.sendMessage(String.format("**%s** has been removed from channel _%s_", event.getUser().getName(), event.getGuild().getName())).queue(); + PrivateChannel privateChannel = member.get() + .getUser() + .openPrivateChannel() + .complete(true); + privateChannel.sendMessage(String.format("**%s** has been removed from channel _%s_", + event.getUser().getName(), + event.getGuild().getName())) + .queue(); } catch (RateLimitedException e) { LOGGER.error(e.getMessage(), e); } diff --git a/src/main/java/com/wimdupont/sxcybot/listeners/admin/RoleAssignListener.java b/src/main/java/com/wimdupont/sxcybot/listeners/admin/RoleAssignListener.java @@ -8,7 +8,6 @@ import com.wimdupont.sxcybot.util.Constants; import com.wimdupont.sxcybot.util.DiscordMemberFinderUtil; import net.dv8tion.jda.api.EmbedBuilder; import net.dv8tion.jda.api.entities.Role; -import net.dv8tion.jda.api.entities.channel.concrete.PrivateChannel; import net.dv8tion.jda.api.events.message.MessageReceivedEvent; import net.dv8tion.jda.api.exceptions.RateLimitedException; import org.slf4j.Logger; @@ -17,8 +16,6 @@ import org.springframework.stereotype.Component; import java.awt.Color; import java.util.Comparator; -import java.util.List; -import java.util.Optional; @Component public class RoleAssignListener implements Listener { @@ -40,54 +37,83 @@ public class RoleAssignListener implements Listener { public void process(MessageReceivedEvent event) { if (event.getMember() != null) { try { - PrivateChannel privateChannel = event.getMember().getUser().openPrivateChannel().complete(true); - EmbedBuilder embedBuilder = new EmbedBuilder(); + var privateChannel = event.getMember().getUser() + .openPrivateChannel() + .complete(true); + var embedBuilder = new EmbedBuilder(); embedBuilder.setColor(Color.RED); discordMemberFinderUtil.onMemberFoundVerification(event, embedBuilder, privateChannel, member -> { embedBuilder.clearFields(); embedBuilder.setTitle("Type the numbers of the roles to add separated by a whitespace. If the member already has any role, it will get removed instead."); - List<GuildRole> rolesToAdd = guildRoleService.findAllByElevationGreaterThanEqual(Constants.ADDED_ROLE_ELEVATION) - .stream().sorted(Comparator.nullsLast(Comparator.comparing(GuildRole::getOrderValue))).toList(); + var rolesToAdd = guildRoleService.findAllByElevationGreaterThanEqual(Constants.ADDED_ROLE_ELEVATION).stream() + .sorted(Comparator.nullsLast(Comparator.comparing(GuildRole::getOrderValue))) + .toList(); for (GuildRole guildRole : rolesToAdd) { - embedBuilder.addField(String.valueOf(guildRole.getOrderValue()), String.valueOf(guildRole.getName()), true); + embedBuilder.addField(String.valueOf(guildRole.getOrderValue()), + event.getGuild().getRoles().stream() + .filter(f -> f.getId().equals(guildRole.getDiscordId())) + .map(Role::getName) + .findFirst() + .orElseThrow(), + true); } privateChannel.sendMessageEmbeds(embedBuilder.build()).queue(); eventWaiter.waitForPrivateChannelEvent(roleReceiver -> { - String roleMessage = roleReceiver.getMessage().getContentRaw(); + var roleMessage = roleReceiver.getMessage().getContentRaw(); String[] roleNumbers = roleMessage.split(" "); embedBuilder.clearFields(); embedBuilder.setTitle("Role assigner:"); for (String roleNumber : roleNumbers) { try { - Optional<GuildRole> discordRole = rolesToAdd.stream().filter(f -> Integer.parseInt(roleNumber) == f.getOrderValue()).findFirst(); + var discordRole = rolesToAdd.stream() + .filter(f -> Integer.parseInt(roleNumber) == f.getOrderValue()) + .findFirst(); if (discordRole.isPresent()) { - Optional<Role> role = event.getGuild().getRoles().stream().filter(f -> discordRole.get().getName().equalsIgnoreCase(f.getName())).findFirst(); + var role = event.getGuild().getRoles().stream() + .filter(f -> discordRole.get().getDiscordId().equalsIgnoreCase(f.getId())) + .findFirst(); if (role.isPresent()) { String action; if (member.getRoles().contains(role.get())) { - event.getGuild().removeRoleFromMember(member, role.get()).queue(); + event.getGuild() + .removeRoleFromMember(member, role.get()) + .queue(); action = "removed"; } else { - event.getGuild().addRoleToMember(member, role.get()).queue(); + event.getGuild() + .addRoleToMember(member, role.get()) + .queue(); action = "assigned"; } - embedBuilder.addField(String.format("\"%s\" has been successfully %s.", discordRole.get().getName(), action), "", false); + embedBuilder.addField(String.format("\"%s\" has been successfully %s.", + role.get().getName(), + action), "", false); event.getChannel().sendMessage(String.format("Role \"%s\" has been %s to %s by %s", - role.get().getName(), action, member.getUser(), event.getMember().getUser().getName())).queue(); + role.get().getName(), + action, + member.getUser(), + event.getMember().getUser().getName())) + .queue(); } else { - privateChannel.sendMessage("No such role is available in the channel, please contact your channel owner.").queue(); + privateChannel.sendMessage("No such role is available in the channel, please contact your channel owner.") + .queue(); } } else { - privateChannel.sendMessage(String.format("%s is not in the suggested list, please try again later.", roleNumber)).queue(); + privateChannel.sendMessage(String.format("%s is not in the suggested list, please try again later.", + roleNumber)) + .queue(); } } catch (NumberFormatException e) { - privateChannel.sendMessage(String.format("%s is not a valid number, please try again later.", roleNumber)).queue(); + privateChannel.sendMessage(String.format("%s is not a valid number, please try again later.", + roleNumber)) + .queue(); } } if (embedBuilder.getFields().isEmpty()) { embedBuilder.addField("No roles changed.", "", false); } - privateChannel.sendMessageEmbeds(embedBuilder.build()).queue(); + privateChannel.sendMessageEmbeds(embedBuilder.build()) + .queue(); }, event, privateChannel); }); } catch (RateLimitedException e) { diff --git a/src/main/java/com/wimdupont/sxcybot/listeners/admin/role/AddRoleListener.java b/src/main/java/com/wimdupont/sxcybot/listeners/admin/role/AddRoleListener.java @@ -6,13 +6,10 @@ import com.wimdupont.sxcybot.repository.guild.dao.GuildRole; import com.wimdupont.sxcybot.services.guild.GuildRoleService; import com.wimdupont.sxcybot.util.Constants; import com.wimdupont.sxcybot.util.JdaUtil; -import net.dv8tion.jda.api.entities.Role; -import net.dv8tion.jda.api.entities.channel.concrete.PrivateChannel; import net.dv8tion.jda.api.events.message.MessageReceivedEvent; import org.springframework.stereotype.Component; import java.util.Comparator; -import java.util.Optional; @Component public class AddRoleListener implements PrivateListener { @@ -28,31 +25,37 @@ public class AddRoleListener implements PrivateListener { @Override public void process(MessageReceivedEvent privateMessageReceivedEvent, MessageReceivedEvent event) { - PrivateChannel privateChannel = privateMessageReceivedEvent.getChannel().asPrivateChannel(); + var privateChannel = privateMessageReceivedEvent.getChannel().asPrivateChannel(); privateChannel.sendMessage("Name of the role you want to add?").queue(); eventWaiter.waitForPrivateChannelEvent(nameReceiver -> { - String roleName = nameReceiver.getMessage().getContentRaw(); - Optional<Role> role = event.getGuild().getRoles().stream() + var roleName = nameReceiver.getMessage().getContentRaw(); + var role = event.getGuild().getRoles().stream() .filter(f -> roleName.equalsIgnoreCase(f.getName())) .findFirst(); if (role.isPresent()) { - int orderValue = guildRoleService.findAll().stream() + var orderValue = guildRoleService.findAll().stream() .filter(f -> f.getOrderValue() != null) .max(Comparator.comparing(GuildRole::getOrderValue)) .map(GuildRole::getOrderValue) .orElse(0) + 1; - GuildRole roleToAdd = GuildRole.Builder.newBuilder() - .name(roleName) + var roleToAdd = GuildRole.Builder.newBuilder() + .discordId(role.get().getId()) .orderValue(orderValue) .elevation(Constants.ADDED_ROLE_ELEVATION) .build(); - GuildRole guildRole = guildRoleService.save(roleToAdd); - privateChannel.sendMessage(String.format("Role %s has been successfully added.", guildRole.getName())).queue(); + guildRoleService.save(roleToAdd); + privateChannel.sendMessage(String.format("Role %s has been successfully added.", + roleName)) + .queue(); event.getChannel().sendMessage(String.format("Role %s has been added by %s.", - guildRole.getName(), JdaUtil.getUser(event) - )).queue(); + roleName, + JdaUtil.getUser(event))) + .queue(); } else { - privateChannel.sendMessage(String.format("Role with name %s is not available in the channel, please contact a channel owner to have it added.", roleName)).queue(); + privateChannel.sendMessage(String.format("Role with name %s is not available in the channel, " + + "please contact a channel owner to have it added.", + roleName)) + .queue(); } }, privateMessageReceivedEvent, privateChannel); diff --git a/src/main/java/com/wimdupont/sxcybot/listeners/admin/role/DeleteRoleListener.java b/src/main/java/com/wimdupont/sxcybot/listeners/admin/role/DeleteRoleListener.java @@ -30,18 +30,29 @@ public class DeleteRoleListener implements PrivateListener { privateChannel.sendMessage("Name of the role you want to delete?").queue(); eventWaiter.waitForPrivateChannelEvent(nameReceiver -> { try { - GuildRole guildRole = guildRoleService.findByName(nameReceiver.getMessage().getContentRaw()); + var guildRole = guildRoleService.findByName( + event.getGuild().getRoles(), + nameReceiver.getMessage().getContentRaw()); if (guildRole.getElevation() == Constants.ADDED_ROLE_ELEVATION) { guildRoleService.delete(guildRole); - guildRoleService.findAll().stream().filter(f -> f.getOrderValue() != null && f.getOrderValue() > guildRole.getOrderValue()).toList() + guildRoleService.findAll().stream() + .filter(f -> f.getOrderValue() != null) + .filter(f -> f.getOrderValue() > guildRole.getOrderValue()) .forEach(role -> { role.setOrderValue(role.getOrderValue() - 1); guildRoleService.save(role); }); - privateChannel.sendMessage(String.format("%s successfully deleted.", guildRole)).queue(); - event.getChannel().sendMessage(String.format("Role %s has been deleted by %s", guildRole, JdaUtil.getUser(event))).queue(); + privateChannel.sendMessage(String.format("%s successfully deleted.", guildRole)) + .queue(); + event.getChannel() + .sendMessage(String.format("Role %s has been deleted by %s", + guildRole, + JdaUtil.getUser(event))) + .queue(); } else { - privateChannel.sendMessage(String.format("Only roles that can be added with the %srole command can be deleted.", Commands.COMMAND_PREFIX)).queue(); + privateChannel.sendMessage(String.format("Only roles that can be added with the %srole command can be deleted.", + Commands.COMMAND_PREFIX)) + .queue(); } } catch (EntityNotFoundException e) { privateChannel.sendMessage(e.getMessage()).queue(); diff --git a/src/main/java/com/wimdupont/sxcybot/listeners/admin/role/UpdateRoleListener.java b/src/main/java/com/wimdupont/sxcybot/listeners/admin/role/UpdateRoleListener.java @@ -8,7 +8,6 @@ import com.wimdupont.sxcybot.services.guild.GuildRoleService; import com.wimdupont.sxcybot.util.Constants; import com.wimdupont.sxcybot.util.Constants.Commands; import com.wimdupont.sxcybot.util.JdaUtil; -import net.dv8tion.jda.api.entities.channel.concrete.PrivateChannel; import net.dv8tion.jda.api.events.message.MessageReceivedEvent; import org.springframework.stereotype.Component; @@ -26,23 +25,40 @@ public class UpdateRoleListener implements PrivateListener { @Override public void process(MessageReceivedEvent privateMessageReceivedEvent, MessageReceivedEvent event) { - PrivateChannel privateChannel = privateMessageReceivedEvent.getChannel().asPrivateChannel(); + var privateChannel = privateMessageReceivedEvent.getChannel().asPrivateChannel(); privateChannel.sendMessage("Type the name of the role you want to update.").queue(); eventWaiter.waitForPrivateChannelEvent(oldRoleNameReceiver -> { - String roleName = oldRoleNameReceiver.getMessage().getContentRaw(); + var roleName = oldRoleNameReceiver.getMessage().getContentRaw(); privateChannel.sendMessage("Type the new name for the role.").queue(); eventWaiter.waitForPrivateChannelEvent(newRoleNameReceiver -> { try { - GuildRole oldRole = guildRoleService.findByName(roleName); - if (oldRole.getElevation() == Constants.ADDED_ROLE_ELEVATION) { - GuildRole guildRoleToUpdate = guildRoleService.findByName(roleName); - guildRoleToUpdate.setName(newRoleNameReceiver.getMessage().getContentRaw()); - - GuildRole guildRole = guildRoleService.save(guildRoleToUpdate); - newRoleNameReceiver.getChannel().sendMessage(guildRole + " edited").queue(); - event.getChannel().sendMessage(String.format("Role %s has been changed to %s by %s", roleName, newRoleNameReceiver.getMessage().getContentRaw(), JdaUtil.getUser(event))).queue(); + var newRoleName = newRoleNameReceiver.getMessage().getContentRaw(); + GuildRole roleToUpdate = guildRoleService.findByName( + event.getGuild().getRoles(), + roleName); + if (roleToUpdate.getElevation() == Constants.ADDED_ROLE_ELEVATION) { + var discordId = guildRoleService.discordIdByName( + event.getGuild().getRoles(), + newRoleName); + if (discordId.isPresent()) { + roleToUpdate.setDiscordId(discordId.get()); + GuildRole guildRole = guildRoleService.save(roleToUpdate); + newRoleNameReceiver.getChannel().sendMessage(guildRole + " edited").queue(); + event.getChannel() + .sendMessage(String.format("Role %s has been changed to %s by %s", + roleName, + newRoleNameReceiver.getMessage().getContentRaw(), + JdaUtil.getUser(event))) + .queue(); + } else { + privateChannel.sendMessage(String.format("Role with name %s not found.", + newRoleName)) + .queue(); + } } else { - privateChannel.sendMessage(String.format("Only roles that can be added with the %srole command can be updated.", Commands.COMMAND_PREFIX)).queue(); + privateChannel.sendMessage(String.format("Only roles that can be added with the %srole command can be updated.", + Commands.COMMAND_PREFIX)) + .queue(); } } catch (EntityNotFoundException exc) { oldRoleNameReceiver.getChannel().sendMessage(exc.getMessage()).queue(); diff --git a/src/main/java/com/wimdupont/sxcybot/repository/guild/GuildRoleRepository.java b/src/main/java/com/wimdupont/sxcybot/repository/guild/GuildRoleRepository.java @@ -14,5 +14,5 @@ public interface GuildRoleRepository extends JpaRepository<GuildRole, String> { List<GuildRole> findByElevationGreaterThanEqual(Integer elevation); - Optional<GuildRole> findByName(String name); + Optional<GuildRole> findByDiscordId(String discordId); } diff --git a/src/main/java/com/wimdupont/sxcybot/repository/guild/dao/GuildEventDmer.java b/src/main/java/com/wimdupont/sxcybot/repository/guild/dao/GuildEventDmer.java @@ -12,11 +12,11 @@ public class GuildEventDmer { @UuidGenerator private String id; - private String name; + private String discordUserId; private GuildEventDmer(Builder builder) { setId(builder.id); - setName(builder.name); + setDiscordUserId(builder.discordUserId); } public String getId() { @@ -27,12 +27,12 @@ public class GuildEventDmer { this.id = id; } - public String getName() { - return name; + public String getDiscordUserId() { + return discordUserId; } - public void setName(String name) { - this.name = name; + public void setDiscordUserId(String discordUserId) { + this.discordUserId = discordUserId; } @SuppressWarnings("unused") @@ -41,7 +41,7 @@ public class GuildEventDmer { public static final class Builder { private String id; - private String name; + private String discordUserId; private Builder() { } @@ -55,8 +55,8 @@ public class GuildEventDmer { return this; } - public Builder name(String val) { - name = val; + public Builder discordUserId(String val) { + discordUserId = val; return this; } @@ -69,7 +69,7 @@ public class GuildEventDmer { public String toString() { return "GuildEventDmer{" + "id='" + id + '\'' + - ", name='" + name + '\'' + + ", discordUserId='" + discordUserId + '\'' + '}'; } } diff --git a/src/main/java/com/wimdupont/sxcybot/repository/guild/dao/GuildRole.java b/src/main/java/com/wimdupont/sxcybot/repository/guild/dao/GuildRole.java @@ -11,7 +11,7 @@ public class GuildRole { @Id @UuidGenerator private String id; - private String name; + private String discordId; private Integer orderValue; private int elevation; @@ -21,7 +21,7 @@ public class GuildRole { private GuildRole(Builder builder) { setId(builder.id); - setName(builder.name); + setDiscordId(builder.discordId); setOrderValue(builder.orderValue); setElevation(builder.elevation); } @@ -34,12 +34,12 @@ public class GuildRole { this.id = id; } - public String getName() { - return name; + public String getDiscordId() { + return discordId; } - public void setName(String name) { - this.name = name; + public void setDiscordId(String discordId) { + this.discordId = discordId; } public Integer getOrderValue() { @@ -60,7 +60,7 @@ public class GuildRole { public static final class Builder { private String id; - private String name; + private String discordId; private Integer orderValue; private int elevation; @@ -76,8 +76,8 @@ public class GuildRole { return this; } - public Builder name(String val) { - name = val; + public Builder discordId(String val) { + discordId = val; return this; } @@ -100,7 +100,7 @@ public class GuildRole { public String toString() { return "GuildRole{" + "id='" + id + '\'' + - ", name='" + name + '\'' + + ", discordId='" + discordId + '\'' + ", orderValue=" + orderValue + ", elevation=" + elevation + '}'; diff --git a/src/main/java/com/wimdupont/sxcybot/services/guild/GuildRoleService.java b/src/main/java/com/wimdupont/sxcybot/services/guild/GuildRoleService.java @@ -3,10 +3,13 @@ package com.wimdupont.sxcybot.services.guild; import com.wimdupont.sxcybot.exceptions.EntityNotFoundException; import com.wimdupont.sxcybot.repository.guild.GuildRoleRepository; import com.wimdupont.sxcybot.repository.guild.dao.GuildRole; +import net.dv8tion.jda.api.entities.ISnowflake; +import net.dv8tion.jda.api.entities.Role; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; import java.util.List; +import java.util.Optional; @Service @Transactional @@ -26,9 +29,9 @@ public class GuildRoleService { return guildRoleRepository.findByElevationGreaterThanEqual(elevation); } - public GuildRole findByName(String name) throws EntityNotFoundException { - return guildRoleRepository.findByName(name).orElseThrow( - () -> new EntityNotFoundException(String.format("No role found with name %s.", name))); + public GuildRole findByDiscordId(String discordId) throws EntityNotFoundException { + return guildRoleRepository.findByDiscordId(discordId).orElseThrow( + () -> new EntityNotFoundException(String.format("No role found with discordId %s.", discordId))); } public GuildRole save(GuildRole guildRole) { @@ -42,4 +45,22 @@ public class GuildRoleService { public List<GuildRole> findAll() { return guildRoleRepository.findAll(); } + + public GuildRole findByName(List<Role> roles, + String roleName) + throws EntityNotFoundException { + var discordId = discordIdByName(roles, roleName); + if (discordId.isPresent()) { + return findByDiscordId(discordId.get()); + } + throw new EntityNotFoundException(String.format("No role found with discordId %s.", discordId)); + } + + public Optional<String> discordIdByName(List<Role> roles, + String roleName) { + return roles.stream() + .filter(f -> roleName.equalsIgnoreCase(f.getName())) + .map(ISnowflake::getId) + .findFirst(); + } } diff --git a/src/main/resources/db/migration/V1_22__guild_role_id.sql b/src/main/resources/db/migration/V1_22__guild_role_id.sql @@ -0,0 +1,7 @@ +DELETE FROM guild_role; +ALTER TABLE guild_role ADD COLUMN IF NOT EXISTS discord_id VARCHAR(30) UNIQUE NOT NULL; +ALTER TABLE guild_role DROP COLUMN IF EXISTS name; + +DELETE FROM guild_event_dmer; +ALTER TABLE guild_event_dmer ADD COLUMN IF NOT EXISTS discord_user_id VARCHAR(30) UNIQUE NOT NULL; +ALTER TABLE guild_event_dmer DROP COLUMN IF EXISTS name;