mirror of
https://github.com/Sheldan/abstracto.git
synced 2026-01-01 15:28:35 +00:00
[AB-xxx] more instrumenting changes
This commit is contained in:
@@ -351,19 +351,21 @@ public class AUserExperienceServiceBean implements AUserExperienceService {
|
||||
.build();
|
||||
boolean userChangesLevel = !Objects.equals(newLevel.getLevel(), aUserExperience.getCurrentLevel().getLevel());
|
||||
Integer oldLevel = aUserExperience.getCurrentLevel() != null ? aUserExperience.getCurrentLevel().getLevel() : 0;
|
||||
if(userChangesLevel) {
|
||||
if (userChangesLevel) {
|
||||
log.info("User {} in server {} changed level. New {}, Old {}.", member.getIdLong(),
|
||||
member.getGuild().getIdLong(), newLevel.getLevel(),
|
||||
oldLevel);
|
||||
aUserExperience.setCurrentLevel(newLevel);
|
||||
AExperienceRole calculatedNewRole = experienceRoleService.calculateRole(roles, newLevel.getLevel());
|
||||
Long oldRoleId = aUserExperience.getCurrentExperienceRole() != null && aUserExperience.getCurrentExperienceRole().getRole() != null ? aUserExperience.getCurrentExperienceRole().getRole().getId() : null;
|
||||
Long oldRoleId = aUserExperience.getCurrentExperienceRole() != null && aUserExperience.getCurrentExperienceRole().getRole() != null ?
|
||||
aUserExperience.getCurrentExperienceRole().getRole().getId() : null;
|
||||
Long newRoleId = calculatedNewRole != null && calculatedNewRole.getRole() != null ? calculatedNewRole.getRole().getId() : null;
|
||||
result.setOldRoleId(oldRoleId);
|
||||
result.setNewRoleId(newRoleId);
|
||||
if(message != null
|
||||
if (message != null
|
||||
&& aUserExperience.getLevelUpNotification()
|
||||
&& featureModeService.featureModeActive(ExperienceFeatureDefinition.EXPERIENCE, serverId, ExperienceFeatureMode.LEVEL_UP_NOTIFICATION)) {
|
||||
&&
|
||||
featureModeService.featureModeActive(ExperienceFeatureDefinition.EXPERIENCE, serverId, ExperienceFeatureMode.LEVEL_UP_NOTIFICATION)) {
|
||||
LevelUpNotificationModel model = LevelUpNotificationModel
|
||||
.builder()
|
||||
.memberDisplay(MemberDisplay.fromMember(member))
|
||||
@@ -376,16 +378,19 @@ public class AUserExperienceServiceBean implements AUserExperienceService {
|
||||
.build();
|
||||
MessageToSend messageToSend = templateService.renderEmbedTemplate("experience_level_up_notification", model, serverId);
|
||||
FutureUtils.toSingleFutureGeneric(channelService.sendMessageToSendToChannel(messageToSend, message.getChannel())).thenAccept(unused -> {
|
||||
log.info("Sent level up notification to user {} in server {} in channel {}.", member.getIdLong(), serverId, message.getChannel().getIdLong());
|
||||
log.info("Sent level up notification to user {} in server {} in channel {}.", member.getIdLong(), serverId,
|
||||
message.getChannel().getIdLong());
|
||||
}).exceptionally(throwable -> {
|
||||
log.warn("Failed to send level up notification to user {} in server {} in channel {}.", member.getIdLong(), serverId, message.getChannel().getIdLong());
|
||||
log.warn("Failed to send level up notification to user {} in server {} in channel {}.", member.getIdLong(), serverId,
|
||||
message.getChannel().getIdLong());
|
||||
return null;
|
||||
});
|
||||
}
|
||||
aUserExperience.setCurrentExperienceRole(calculatedNewRole);
|
||||
}
|
||||
aUserExperience.setMessageCount(aUserExperience.getMessageCount() + 1L);
|
||||
if(userChangesLevel && featureModeService.featureModeActive(ExperienceFeatureDefinition.EXPERIENCE, server, ExperienceFeatureMode.LEVEL_ACTION)) {
|
||||
if (userChangesLevel &&
|
||||
featureModeService.featureModeActive(ExperienceFeatureDefinition.EXPERIENCE, server, ExperienceFeatureMode.LEVEL_ACTION)) {
|
||||
levelActionService.applyLevelActionsToUser(aUserExperience, oldLevel)
|
||||
.thenAccept(unused -> {
|
||||
log.info("Executed level actions for user {}.", userInServerId);
|
||||
@@ -395,31 +400,36 @@ public class AUserExperienceServiceBean implements AUserExperienceService {
|
||||
return null;
|
||||
});
|
||||
}
|
||||
if(aUserExperienceOptional.isEmpty()) {
|
||||
if (aUserExperienceOptional.isEmpty()) {
|
||||
userExperienceManagementService.saveUser(aUserExperience);
|
||||
}
|
||||
if(!Objects.equals(result.getOldRoleId(), result.getNewRoleId())) {
|
||||
if(result.getOldRoleId() != null && result.getNewRoleId() != null) {
|
||||
if (!Objects.equals(result.getOldRoleId(), result.getNewRoleId())) {
|
||||
if (result.getOldRoleId() != null && result.getNewRoleId() != null) {
|
||||
roleService.updateRolesIds(member, Arrays.asList(result.getOldRoleId()), Arrays.asList(result.getNewRoleId())).thenAccept(unused -> {
|
||||
log.debug("Removed role {} from and added role {} to member {} in server {}.", result.getOldRoleId(), result.getNewRoleId(), member.getIdLong(), member.getGuild().getIdLong());
|
||||
log.debug("Removed role {} from and added role {} to member {} in server {}.", result.getOldRoleId(), result.getNewRoleId(),
|
||||
member.getIdLong(), member.getGuild().getIdLong());
|
||||
}).exceptionally(throwable -> {
|
||||
log.warn("Failed to remove role {} from and add role {} to member {} in server {}.", result.getOldRoleId(), result.getNewRoleId(), member.getIdLong(), member.getGuild().getIdLong(), throwable);
|
||||
log.warn("Failed to remove role {} from and add role {} to member {} in server {}.", result.getOldRoleId(), result.getNewRoleId(),
|
||||
member.getIdLong(), member.getGuild().getIdLong(), throwable);
|
||||
return null;
|
||||
});
|
||||
} else {
|
||||
if(result.getOldRoleId() != null) {
|
||||
if (result.getOldRoleId() != null) {
|
||||
roleService.removeRoleFromMemberAsync(member, result.getOldRoleId()).thenAccept(unused -> {
|
||||
log.debug("Removed role {} from member {} in server {}.", result.getOldRoleId(), member.getIdLong(), member.getGuild().getIdLong());
|
||||
log.debug("Removed role {} from member {} in server {}.", result.getOldRoleId(), member.getIdLong(),
|
||||
member.getGuild().getIdLong());
|
||||
}).exceptionally(throwable -> {
|
||||
log.warn("Failed to remove role {} from member {} in server {}.", result.getOldRoleId(), member.getIdLong(), member.getGuild().getIdLong(), throwable);
|
||||
log.warn("Failed to remove role {} from member {} in server {}.", result.getOldRoleId(), member.getIdLong(),
|
||||
member.getGuild().getIdLong(), throwable);
|
||||
return null;
|
||||
});
|
||||
}
|
||||
if(result.getNewRoleId() != null) {
|
||||
if (result.getNewRoleId() != null) {
|
||||
roleService.addRoleToMemberAsync(member, result.getNewRoleId()).thenAccept(unused -> {
|
||||
log.debug("Added role {} to member {} in server {}.", result.getNewRoleId(), member.getIdLong(), member.getGuild().getIdLong());
|
||||
}).exceptionally(throwable -> {
|
||||
log.warn("Failed to add role {} to member {} in server {}.", result.getOldRoleId(), member.getIdLong(), member.getGuild().getIdLong(), throwable);
|
||||
log.warn("Failed to add role {} to member {} in server {}.", result.getOldRoleId(), member.getIdLong(),
|
||||
member.getGuild().getIdLong(), throwable);
|
||||
return null;
|
||||
});
|
||||
}
|
||||
@@ -432,6 +442,7 @@ public class AUserExperienceServiceBean implements AUserExperienceService {
|
||||
newSpan.end();
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean experienceGainEnabledInChannel(MessageChannel messageChannel) {
|
||||
|
||||
@@ -267,27 +267,27 @@ public class InteractionServiceBean implements InteractionService {
|
||||
Span newSpan = tracer.nextSpan().name("send-message-to-interaction");
|
||||
try (Tracer.SpanInScope ws = this.tracer.withSpan(newSpan.start())) {
|
||||
ReplyCallbackAction action = null;
|
||||
if(messageToSend.getUseComponentsV2()) {
|
||||
if (messageToSend.getUseComponentsV2()) {
|
||||
action = callback.replyComponents(messageToSend.getComponents()).useComponentsV2();
|
||||
} else {
|
||||
if(messageToSend.getMessages() != null && !messageToSend.getMessages().isEmpty()) {
|
||||
if (messageToSend.getMessages() != null && !messageToSend.getMessages().isEmpty()) {
|
||||
metricService.incrementCounter(MESSAGE_SEND_METRIC);
|
||||
action = callback.reply(messageToSend.getMessages().get(0));
|
||||
}
|
||||
if(messageToSend.getEmbeds() != null && !messageToSend.getEmbeds().isEmpty()) {
|
||||
if(action != null) {
|
||||
if (messageToSend.getEmbeds() != null && !messageToSend.getEmbeds().isEmpty()) {
|
||||
if (action != null) {
|
||||
action = action.addEmbeds(messageToSend.getEmbeds().subList(0, Math.min(10, messageToSend.getEmbeds().size())));
|
||||
} else {
|
||||
action = callback.replyEmbeds(messageToSend.getEmbeds());
|
||||
}
|
||||
}
|
||||
if(messageToSend.hasFilesToSend()) {
|
||||
if (messageToSend.hasFilesToSend()) {
|
||||
List<FileUpload> attachedFiles = messageToSend
|
||||
.getAttachedFiles()
|
||||
.stream()
|
||||
.map(AttachedFile::convertToFileUpload)
|
||||
.collect(Collectors.toList());
|
||||
if(action != null) {
|
||||
if (action != null) {
|
||||
action.setFiles(attachedFiles);
|
||||
} else {
|
||||
metricService.incrementCounter(MESSAGE_SEND_METRIC);
|
||||
@@ -297,31 +297,32 @@ public class InteractionServiceBean implements InteractionService {
|
||||
// this should be last, because we are "faking" a message, by inserting a ., in case there has not been a reply yet
|
||||
// we could also throw an exception, but we are allowing this to go through
|
||||
List<ActionRow> actionRows = messageToSend.getActionRows();
|
||||
if(actionRows != null && !actionRows.isEmpty()) {
|
||||
if(action == null) {
|
||||
if (actionRows != null && !actionRows.isEmpty()) {
|
||||
if (action == null) {
|
||||
action = callback.reply(".");
|
||||
}
|
||||
action = action.setComponents(actionRows);
|
||||
AServer server;
|
||||
if(ContextUtils.isGuildKnown(callback)) {
|
||||
if (ContextUtils.isGuildKnown(callback)) {
|
||||
server = serverManagementService.loadServer(callback.getGuild().getIdLong());
|
||||
} else {
|
||||
server = null;
|
||||
}
|
||||
actionRows.forEach(components -> components.forEach(component -> {
|
||||
if(component instanceof ActionComponent) {
|
||||
String id = ((ActionComponent)component).getId();
|
||||
if (component instanceof ActionComponent) {
|
||||
String id = ((ActionComponent) component).getId();
|
||||
MessageToSend.ComponentConfig payload = messageToSend.getComponentPayloads().get(id);
|
||||
if(payload != null && payload.getPersistCallback()) {
|
||||
componentPayloadManagementService.createPayload(id, payload.getPayload(), payload.getPayloadType(), payload.getComponentOrigin(), server, payload.getComponentType());
|
||||
if (payload != null && payload.getPersistCallback()) {
|
||||
componentPayloadManagementService.createPayload(id, payload.getPayload(), payload.getPayloadType(),
|
||||
payload.getComponentOrigin(), server, payload.getComponentType());
|
||||
}
|
||||
}
|
||||
}));
|
||||
}
|
||||
}
|
||||
|
||||
if(messageToSend.getEphemeral()) {
|
||||
if(ContextUtils.hasGuild(callback)) {
|
||||
if (messageToSend.getEphemeral()) {
|
||||
if (ContextUtils.hasGuild(callback)) {
|
||||
log.info("Sending ephemeral message to interaction in guild {} in channel {} for user {}.",
|
||||
callback.getGuild().getIdLong(), callback.getChannel().getId(),
|
||||
callback.getUser().getIdLong());
|
||||
@@ -329,11 +330,11 @@ public class InteractionServiceBean implements InteractionService {
|
||||
log.info("Sending ephemeral message to user {}.", callback.getUser().getIdLong());
|
||||
}
|
||||
metricService.incrementCounter(EPHEMERAL_MESSAGES_SEND);
|
||||
if(action != null) {
|
||||
if (action != null) {
|
||||
action = action.setEphemeral(messageToSend.getEphemeral());
|
||||
}
|
||||
}
|
||||
if(ContextUtils.isGuildKnown(callback)) {
|
||||
if (ContextUtils.isGuildKnown(callback)) {
|
||||
Set<Message.MentionType> allowedMentions = allowedMentionService.getAllowedMentionsFor(callback.getMessageChannel(), messageToSend);
|
||||
if (action != null) {
|
||||
action = action.setAllowedMentions(allowedMentions);
|
||||
@@ -346,7 +347,6 @@ public class InteractionServiceBean implements InteractionService {
|
||||
return action.submit();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public CompletableFuture<InteractionHook> replyMessage(String templateKey, Object model, IReplyCallback callback) {
|
||||
|
||||
@@ -19,23 +19,31 @@ import dev.sheldan.abstracto.core.interaction.slash.payload.SlashCommandConfirma
|
||||
import dev.sheldan.abstracto.core.metric.service.CounterMetric;
|
||||
import dev.sheldan.abstracto.core.metric.service.MetricService;
|
||||
import dev.sheldan.abstracto.core.metric.service.MetricTag;
|
||||
import dev.sheldan.abstracto.core.metric.service.MetricUtils;
|
||||
import dev.sheldan.abstracto.core.models.database.AServer;
|
||||
import dev.sheldan.abstracto.core.service.ConfigService;
|
||||
import dev.sheldan.abstracto.core.service.management.ServerManagementService;
|
||||
import dev.sheldan.abstracto.core.utils.ContextUtils;
|
||||
import dev.sheldan.abstracto.scheduling.model.JobParameters;
|
||||
import dev.sheldan.abstracto.scheduling.service.SchedulerService;
|
||||
import java.time.Instant;
|
||||
import java.time.temporal.ChronoUnit;
|
||||
import java.util.Date;
|
||||
import java.util.HashMap;
|
||||
import java.util.Map;
|
||||
import java.util.concurrent.ConcurrentHashMap;
|
||||
import dev.sheldan.abstracto.core.utils.ContextUtils;
|
||||
import dev.sheldan.abstracto.core.metric.service.MetricUtils;
|
||||
import io.micrometer.observation.Observation;
|
||||
import io.micrometer.observation.ObservationRegistry;
|
||||
import io.micrometer.tracing.Span;
|
||||
import io.micrometer.tracing.Tracer;
|
||||
import java.time.Instant;
|
||||
import java.time.temporal.ChronoUnit;
|
||||
import java.util.ArrayList;
|
||||
import java.util.Arrays;
|
||||
import java.util.Date;
|
||||
import java.util.HashMap;
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
import java.util.Optional;
|
||||
import java.util.concurrent.CompletableFuture;
|
||||
import java.util.concurrent.ConcurrentHashMap;
|
||||
import java.util.stream.Collectors;
|
||||
import javax.annotation.Nonnull;
|
||||
import javax.annotation.PostConstruct;
|
||||
import lombok.Getter;
|
||||
import lombok.extern.slf4j.Slf4j;
|
||||
import net.dv8tion.jda.api.events.interaction.command.CommandAutoCompleteInteractionEvent;
|
||||
@@ -50,15 +58,6 @@ import org.springframework.stereotype.Component;
|
||||
import org.springframework.transaction.annotation.Propagation;
|
||||
import org.springframework.transaction.annotation.Transactional;
|
||||
|
||||
import javax.annotation.Nonnull;
|
||||
import javax.annotation.PostConstruct;
|
||||
import java.util.ArrayList;
|
||||
import java.util.Arrays;
|
||||
import java.util.List;
|
||||
import java.util.Optional;
|
||||
import java.util.concurrent.CompletableFuture;
|
||||
import java.util.stream.Collectors;
|
||||
|
||||
@Component
|
||||
@Slf4j
|
||||
public class SlashCommandListenerBean extends ListenerAdapter {
|
||||
@@ -124,7 +123,7 @@ public class SlashCommandListenerBean extends ListenerAdapter {
|
||||
.build();
|
||||
|
||||
public List<Command> getSlashCommands() {
|
||||
if(commands == null || commands.isEmpty()) {
|
||||
if (commands == null || commands.isEmpty()) {
|
||||
return new ArrayList<>();
|
||||
}
|
||||
return commands.stream()
|
||||
@@ -138,8 +137,10 @@ public class SlashCommandListenerBean extends ListenerAdapter {
|
||||
Observation observation = Observation.createNotStarted("slash-command-received", this.observationRegistry);
|
||||
observation.observe(() -> {
|
||||
try {
|
||||
if(commands == null || commands.isEmpty()) return;
|
||||
if(ContextUtils.hasGuild(event.getInteraction())) {
|
||||
if (commands == null || commands.isEmpty()) {
|
||||
return;
|
||||
}
|
||||
if (ContextUtils.hasGuild(event.getInteraction())) {
|
||||
log.debug("Executing slash command in guild {} from user {}.", event.getGuild().getIdLong(), event.getUser().getIdLong());
|
||||
} else {
|
||||
log.debug("Executing slash command by user {}", event.getUser().getIdLong());
|
||||
@@ -158,6 +159,7 @@ public class SlashCommandListenerBean extends ListenerAdapter {
|
||||
});
|
||||
} catch (Exception exception) {
|
||||
log.error("Failed to process slash command interaction event.", exception);
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
@@ -165,7 +167,7 @@ public class SlashCommandListenerBean extends ListenerAdapter {
|
||||
@Transactional
|
||||
public CompletableFuture<Void> executeListenerLogic(SlashCommandInteractionEvent event) {
|
||||
Optional<Command> potentialCommand = findCommand(event);
|
||||
if(potentialCommand.isPresent()) {
|
||||
if (potentialCommand.isPresent()) {
|
||||
Command command = potentialCommand.get();
|
||||
metricService.incrementCounter(SLASH_COMMANDS_PROCESSED_COUNTER);
|
||||
try {
|
||||
@@ -195,8 +197,11 @@ public class SlashCommandListenerBean extends ListenerAdapter {
|
||||
@Override
|
||||
public void onCommandAutoCompleteInteraction(@Nonnull CommandAutoCompleteInteractionEvent event) {
|
||||
try {
|
||||
if(commands == null || commands.isEmpty()) return;
|
||||
CompletableFuture.runAsync(() -> self.executeAutCompleteListenerLogic(event), MetricUtils.wrapExecutor(slashCommandAutoCompleteExecutor)).exceptionally(throwable -> {
|
||||
if (commands == null || commands.isEmpty()) {
|
||||
return;
|
||||
}
|
||||
CompletableFuture.runAsync(() -> self.executeAutCompleteListenerLogic(event), MetricUtils.wrapExecutor(slashCommandAutoCompleteExecutor))
|
||||
.exceptionally(throwable -> {
|
||||
log.error("Failed to execute listener logic in async auto complete interaction event.", throwable);
|
||||
return null;
|
||||
});
|
||||
@@ -212,13 +217,15 @@ public class SlashCommandListenerBean extends ListenerAdapter {
|
||||
try {
|
||||
List<String> fullRepliesList = command.performAutoComplete(event);
|
||||
List<String> replies = fullRepliesList.subList(0, Math.min(fullRepliesList.size(), OptionData.MAX_CHOICES));
|
||||
event.replyChoiceStrings(replies).queue(unused -> {},
|
||||
event.replyChoiceStrings(replies).queue(unused -> {
|
||||
},
|
||||
throwable -> {
|
||||
if(ContextUtils.hasGuild(event)) {
|
||||
if (ContextUtils.hasGuild(event)) {
|
||||
log.error("Failed to respond to complete of command {} in guild {} by user {}.",
|
||||
command.getConfiguration().getName(), event.getGuild().getIdLong(), event.getUser().getIdLong());
|
||||
} else {
|
||||
log.error("Failed to resp ond to complete of command {} for user {}.", command.getConfiguration().getName(), event.getUser().getIdLong());
|
||||
log.error("Failed to resp ond to complete of command {} for user {}.", command.getConfiguration().getName(),
|
||||
event.getUser().getIdLong());
|
||||
}
|
||||
});
|
||||
} catch (Exception exception) {
|
||||
@@ -228,8 +235,9 @@ public class SlashCommandListenerBean extends ListenerAdapter {
|
||||
}
|
||||
|
||||
@Transactional
|
||||
public void continueSlashCommand(Long interactionId, ButtonInteractionEvent buttonInteractionEvent, SlashCommandConfirmationPayload slashCommandConfirmationPayload) {
|
||||
if(COMMANDS_WAITING_FOR_CONFIRMATION.containsKey(interactionId)) {
|
||||
public void continueSlashCommand(Long interactionId, ButtonInteractionEvent buttonInteractionEvent,
|
||||
SlashCommandConfirmationPayload slashCommandConfirmationPayload) {
|
||||
if (COMMANDS_WAITING_FOR_CONFIRMATION.containsKey(interactionId)) {
|
||||
DriedSlashCommand driedSlashCommand = COMMANDS_WAITING_FOR_CONFIRMATION.get(interactionId);
|
||||
Command commandInstance = driedSlashCommand.getCommand();
|
||||
String commandName = commandInstance.getConfiguration().getName();
|
||||
@@ -250,23 +258,28 @@ public class SlashCommandListenerBean extends ListenerAdapter {
|
||||
return null;
|
||||
});
|
||||
} else {
|
||||
log.warn("Interaction was not found in internal map - not continuing interaction from user {} in server {}.", buttonInteractionEvent.getUser().getIdLong(), buttonInteractionEvent.getGuild().getIdLong());
|
||||
log.warn("Interaction was not found in internal map - not continuing interaction from user {} in server {}.",
|
||||
buttonInteractionEvent.getUser().getIdLong(), buttonInteractionEvent.getGuild().getIdLong());
|
||||
}
|
||||
}
|
||||
|
||||
@Transactional
|
||||
public void cleanupSlashCommandConfirmation(SlashCommandConfirmationPayload slashCommandConfirmationPayload, ButtonInteractionEvent buttonInteractionEvent) {
|
||||
log.debug("Cleaning up component {} and {}.", slashCommandConfirmationPayload.getConfirmationPayloadId(), slashCommandConfirmationPayload.getAbortPayloadId());
|
||||
componentPayloadManagementService.deletePayloads(Arrays.asList(slashCommandConfirmationPayload.getAbortPayloadId(), slashCommandConfirmationPayload.getConfirmationPayloadId()));
|
||||
public void cleanupSlashCommandConfirmation(SlashCommandConfirmationPayload slashCommandConfirmationPayload,
|
||||
ButtonInteractionEvent buttonInteractionEvent) {
|
||||
log.debug("Cleaning up component {} and {}.", slashCommandConfirmationPayload.getConfirmationPayloadId(),
|
||||
slashCommandConfirmationPayload.getAbortPayloadId());
|
||||
componentPayloadManagementService.deletePayloads(
|
||||
Arrays.asList(slashCommandConfirmationPayload.getAbortPayloadId(), slashCommandConfirmationPayload.getConfirmationPayloadId()));
|
||||
}
|
||||
|
||||
@Transactional
|
||||
public void removeSlashCommandConfirmationInteraction(Long interactionId, String confirmationPayload, String abortPayload) {
|
||||
if(COMMANDS_WAITING_FOR_CONFIRMATION.containsKey(interactionId)) {
|
||||
if (COMMANDS_WAITING_FOR_CONFIRMATION.containsKey(interactionId)) {
|
||||
DriedSlashCommand removedSlashCommand = COMMANDS_WAITING_FOR_CONFIRMATION.remove(interactionId);
|
||||
SlashCommandInteractionEvent event = removedSlashCommand.getEvent();
|
||||
event.getInteraction().getHook().deleteOriginal().queue();
|
||||
log.info("Remove interaction for command {} in server {} from user {}.", removedSlashCommand.getCommand().getConfiguration().getName(), event.getGuild().getIdLong(), event.getUser().getIdLong());
|
||||
log.info("Remove interaction for command {} in server {} from user {}.", removedSlashCommand.getCommand().getConfiguration().getName(),
|
||||
event.getGuild().getIdLong(), event.getUser().getIdLong());
|
||||
} else {
|
||||
log.info("Did not find interaction to clean up.");
|
||||
}
|
||||
@@ -274,9 +287,9 @@ public class SlashCommandListenerBean extends ListenerAdapter {
|
||||
}
|
||||
|
||||
@Transactional(rollbackFor = AbstractoRunTimeException.class)
|
||||
public void executeCommand(SlashCommandInteractionEvent event, Command command, ConditionResult conditionResult) {
|
||||
public CompletableFuture<Void> executeCommand(SlashCommandInteractionEvent event, Command command, ConditionResult conditionResult) {
|
||||
String commandName = command.getConfiguration().getName();
|
||||
if(command.getConfiguration().isRequiresConfirmation() && conditionResult.isResult()) {
|
||||
if (command.getConfiguration().isRequiresConfirmation() && conditionResult.isResult()) {
|
||||
DriedSlashCommand slashCommand = DriedSlashCommand
|
||||
.builder()
|
||||
.command(command)
|
||||
@@ -310,6 +323,7 @@ public class SlashCommandListenerBean extends ListenerAdapter {
|
||||
.commandName(commandName)
|
||||
.build();
|
||||
Long userId = event.getUser().getIdLong();
|
||||
CompletableFuture<Void> replyFuture =
|
||||
interactionService.replyEmbed(COMMAND_CONFIRMATION_MESSAGE_TEMPLATE_KEY, model, event).thenAccept(interactionHook -> {
|
||||
log.info("Sent confirmation for command {} in server {} for user {}.", commandName, serverId, userId);
|
||||
}).exceptionally(throwable -> {
|
||||
@@ -317,12 +331,14 @@ public class SlashCommandListenerBean extends ListenerAdapter {
|
||||
return null;
|
||||
});
|
||||
scheduleConfirmationDeletion(event.getIdLong(), confirmationId, abortId, serverId);
|
||||
return replyFuture;
|
||||
} else {
|
||||
CompletableFuture<CommandResult> commandOutput;
|
||||
if(conditionResult.isResult()) {
|
||||
if (conditionResult.isResult()) {
|
||||
commandOutput = command.executeSlash(event).thenApply(commandResult -> {
|
||||
if(ContextUtils.hasGuild(event)) {
|
||||
log.info("Command {} in server {} was executed by user {}.", command.getConfiguration().getName(), event.getGuild().getIdLong(), event.getUser().getIdLong());
|
||||
if (ContextUtils.hasGuild(event)) {
|
||||
log.info("Command {} in server {} was executed by user {}.", command.getConfiguration().getName(), event.getGuild().getIdLong(),
|
||||
event.getUser().getIdLong());
|
||||
} else {
|
||||
log.info("Command {} was executed by user {}.", command.getConfiguration().getName(), event.getUser().getId());
|
||||
}
|
||||
@@ -331,7 +347,7 @@ public class SlashCommandListenerBean extends ListenerAdapter {
|
||||
} else {
|
||||
commandOutput = CompletableFuture.completedFuture(CommandResult.fromCondition(conditionResult));
|
||||
}
|
||||
commandOutput.thenAccept(commandResult -> {
|
||||
return commandOutput.thenAccept(commandResult -> {
|
||||
self.executePostCommandListener(command, event, commandResult);
|
||||
}).exceptionally(throwable -> {
|
||||
log.error("Error while handling post execution of command {}", commandName, throwable);
|
||||
|
||||
@@ -219,18 +219,18 @@ public class ChannelServiceBean implements ChannelService {
|
||||
try (Tracer.SpanInScope ws = this.tracer.withSpan(newSpan.start())) {
|
||||
newSpan.tag("channel.id", textChannel.getIdLong());
|
||||
messageToSend.setEphemeral(false);
|
||||
if(textChannel instanceof GuildMessageChannel guildMessageChannel) {
|
||||
if (textChannel instanceof GuildMessageChannel guildMessageChannel) {
|
||||
long maxFileSize = guildMessageChannel.getGuild().getMaxFileSize();
|
||||
// in this case, we cannot upload the file, so we need to fail
|
||||
messageToSend.getAttachedFiles().forEach(attachedFile -> {
|
||||
if(attachedFile.getFile().length() > maxFileSize) {
|
||||
if (attachedFile.getFile().length() > maxFileSize) {
|
||||
throw new UploadFileTooLargeException(attachedFile.getFile().length(), maxFileSize);
|
||||
}
|
||||
});
|
||||
}
|
||||
List<CompletableFuture<Message>> futures = new ArrayList<>();
|
||||
List<MessageCreateAction> allMessageActions = new ArrayList<>();
|
||||
if(messageToSend.getUseComponentsV2() && messageToSend.getComponents() != null && !messageToSend.getComponents().isEmpty()) {
|
||||
if (messageToSend.getUseComponentsV2() && messageToSend.getComponents() != null && !messageToSend.getComponents().isEmpty()) {
|
||||
metricService.incrementCounter(MESSAGE_SEND_METRIC);
|
||||
allMessageActions.add(textChannel.sendMessageComponents(messageToSend.getComponents()).useComponentsV2());
|
||||
} else {
|
||||
@@ -239,16 +239,16 @@ public class ChannelServiceBean implements ChannelService {
|
||||
metricService.incrementCounter(MESSAGE_SEND_METRIC);
|
||||
String text = messageToSend.getMessages().get(i);
|
||||
List<MessageEmbed> messageEmbeds = new ArrayList<>();
|
||||
while(embedIterator.hasNext()) {
|
||||
while (embedIterator.hasNext()) {
|
||||
MessageEmbed embedToAdd = embedIterator.next();
|
||||
if((currentEmbedLength(messageEmbeds) + embedToAdd.getLength()) >= MessageEmbed.EMBED_MAX_LENGTH_BOT) {
|
||||
if ((currentEmbedLength(messageEmbeds) + embedToAdd.getLength()) >= MessageEmbed.EMBED_MAX_LENGTH_BOT) {
|
||||
break;
|
||||
}
|
||||
messageEmbeds.add(embedToAdd);
|
||||
embedIterator.remove();
|
||||
}
|
||||
MessageCreateAction messageAction = textChannel.sendMessage(text);
|
||||
if(!messageEmbeds.isEmpty()) {
|
||||
if (!messageEmbeds.isEmpty()) {
|
||||
messageAction.setEmbeds(messageEmbeds);
|
||||
}
|
||||
allMessageActions.add(messageAction);
|
||||
@@ -257,9 +257,9 @@ public class ChannelServiceBean implements ChannelService {
|
||||
// reset the iterator, because if the if in the above while iterator loop applied, we already took it out from the iterator
|
||||
// but we didnt add it yet, so it would be lost
|
||||
embedIterator = messageToSend.getEmbeds().iterator();
|
||||
while(embedIterator.hasNext()) {
|
||||
while (embedIterator.hasNext()) {
|
||||
MessageEmbed embedToAdd = embedIterator.next();
|
||||
if((currentEmbedLength(messageEmbeds) + embedToAdd.getLength()) >= MessageEmbed.EMBED_MAX_LENGTH_BOT && !messageEmbeds.isEmpty()) {
|
||||
if ((currentEmbedLength(messageEmbeds) + embedToAdd.getLength()) >= MessageEmbed.EMBED_MAX_LENGTH_BOT && !messageEmbeds.isEmpty()) {
|
||||
allMessageActions.add(textChannel.sendMessageEmbeds(messageEmbeds));
|
||||
metricService.incrementCounter(MESSAGE_SEND_METRIC);
|
||||
messageEmbeds = new ArrayList<>();
|
||||
@@ -267,13 +267,13 @@ public class ChannelServiceBean implements ChannelService {
|
||||
messageEmbeds.add(embedToAdd);
|
||||
}
|
||||
|
||||
if(!messageEmbeds.isEmpty()) {
|
||||
if (!messageEmbeds.isEmpty()) {
|
||||
allMessageActions.add(textChannel.sendMessageEmbeds(messageEmbeds));
|
||||
metricService.incrementCounter(MESSAGE_SEND_METRIC);
|
||||
}
|
||||
|
||||
List<ActionRow> actionRows = messageToSend.getActionRows();
|
||||
if(!actionRows.isEmpty()) {
|
||||
if (!actionRows.isEmpty()) {
|
||||
List<List<ActionRow>> groupedActionRows = ListUtils.partition(actionRows, ComponentService.MAX_BUTTONS_PER_ROW);
|
||||
for (int i = 0; i < allMessageActions.size(); i++) {
|
||||
allMessageActions.set(i, allMessageActions.get(i).setComponents(groupedActionRows.get(i)));
|
||||
@@ -283,7 +283,7 @@ public class ChannelServiceBean implements ChannelService {
|
||||
allMessageActions.add(textChannel.sendMessage(".").setComponents(groupedActionRows.get(i)));
|
||||
}
|
||||
AServer server = null;
|
||||
if(textChannel instanceof GuildChannel) {
|
||||
if (textChannel instanceof GuildChannel) {
|
||||
GuildChannel channel = (GuildChannel) textChannel;
|
||||
server = serverManagementService.loadServer(channel.getGuild());
|
||||
}
|
||||
@@ -293,20 +293,21 @@ public class ChannelServiceBean implements ChannelService {
|
||||
String id = ((ActionComponent) component).getId();
|
||||
MessageToSend.ComponentConfig payload = messageToSend.getComponentPayloads().get(id);
|
||||
if (payload != null && payload.getPersistCallback()) {
|
||||
componentPayloadManagementService.createPayload(id, payload.getPayload(), payload.getPayloadType(), payload.getComponentOrigin(), server, payload.getComponentType());
|
||||
componentPayloadManagementService.createPayload(id, payload.getPayload(), payload.getPayloadType(),
|
||||
payload.getComponentOrigin(), server, payload.getComponentType());
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if(messageToSend.hasFilesToSend()) {
|
||||
if (messageToSend.hasFilesToSend()) {
|
||||
List<FileUpload> attachedFiles = messageToSend
|
||||
.getAttachedFiles()
|
||||
.stream()
|
||||
.map(AttachedFile::convertToFileUpload)
|
||||
.collect(Collectors.toList());
|
||||
if(!allMessageActions.isEmpty()) {
|
||||
if (!allMessageActions.isEmpty()) {
|
||||
// in case there has not been a message, we need to increment it
|
||||
allMessageActions.set(0, allMessageActions.get(0).addFiles(attachedFiles));
|
||||
} else {
|
||||
@@ -314,19 +315,20 @@ public class ChannelServiceBean implements ChannelService {
|
||||
allMessageActions.add(textChannel.sendFiles(attachedFiles));
|
||||
}
|
||||
}
|
||||
}
|
||||
Set<Message.MentionType> allowedMentions = allowedMentionService.getAllowedMentionsFor(textChannel, messageToSend);
|
||||
allMessageActions.forEach(messageAction -> {
|
||||
if(messageToSend.getReferencedMessageId() != null) {
|
||||
if (messageToSend.getReferencedMessageId() != null) {
|
||||
messageAction = messageAction.setMessageReference(messageToSend.getReferencedMessageId());
|
||||
if(messageToSend.getMessageConfig() != null && !messageToSend.getMessageConfig().getMentionsReferencedMessage()) {
|
||||
if (messageToSend.getMessageConfig() != null && !messageToSend.getMessageConfig().getMentionsReferencedMessage()) {
|
||||
messageAction = messageAction.mentionRepliedUser(false);
|
||||
}
|
||||
}
|
||||
futures.add(messageAction.setAllowedMentions(allowedMentions).submit());
|
||||
});
|
||||
}
|
||||
return futures;
|
||||
}
|
||||
}
|
||||
|
||||
private Integer currentEmbedLength(List<MessageEmbed> messageEmbeds) {
|
||||
return messageEmbeds.stream().mapToInt(MessageEmbed::getLength).sum();
|
||||
|
||||
Reference in New Issue
Block a user