use of net.robinfriedli.aiode.discord.MessageService in project aiode by robinfriedli.
the class PermissionExceptionHandler method handleException.
@Override
public Result handleException(Throwable uncaughtException, PermissionException exceptionToHandle) {
if (Aiode.isInitialised()) {
Aiode aiode = Aiode.get();
ExecutionContext executionContext = ExecutionContext.Current.get();
if (executionContext != null) {
MessageService messageService = aiode.getMessageService();
Permission permission = exceptionToHandle.getPermission();
TextChannel channel = executionContext.getChannel();
Guild guild = executionContext.getGuild();
Aiode.LOGGER.warn(String.format("Bot is missing permission %s on guild %s", permission, guild));
messageService.send("Bot is missing permission: " + permission.getName(), channel);
return Result.HANDLED;
}
}
return Result.UNHANDLED;
}
use of net.robinfriedli.aiode.discord.MessageService in project aiode by robinfriedli.
the class ExceptionUtils method handleTrackLoadingException.
public static void handleTrackLoadingException(Throwable e, Logger logger, @Nullable ExecutionContext executionContext, @Nullable MessageChannel messageChannel) {
if (e instanceof InterruptedException || ExceptionUtils.getRootCause(e) instanceof InterruptedException) {
logger.warn("Suppressed InterruptedException " + e + " while loading tracks.");
return;
}
String commandContextSuffix = executionContext != null ? " (started by command: " + executionContext.getId() + ")" : "";
String msg = "Exception while loading tracks" + commandContextSuffix;
if (Aiode.isShuttingDown()) {
logger.warn(String.format("Suppressed error because it happened during shutdown: %s: %s", msg, e));
return;
}
logger.error(msg, e);
if (messageChannel != null) {
EmbedBuilder embedBuilder = ExceptionUtils.buildErrorEmbed(e);
embedBuilder.setDescription("There has been an error while loading some tracks. Please try again.");
if (executionContext != null) {
embedBuilder.addField("CommandContext ID", executionContext.getId(), false);
}
MessageService messageService = Aiode.get().getMessageService();
messageService.send(embedBuilder.build(), messageChannel);
}
}
use of net.robinfriedli.aiode.discord.MessageService in project aiode by robinfriedli.
the class QueueWidget method reset.
@Override
public void reset() {
MessageService messageService = Aiode.get().getMessageService();
Guild guild = getGuild().get();
MessageChannel channel = getChannel().get();
DiscordEntity.Message message = getMessage();
EmbedBuilder embedBuilder = audioPlayback.getAudioQueue().buildMessageEmbed(audioPlayback, guild);
MessageEmbed messageEmbed = messageService.buildEmbed(embedBuilder);
messageService.executeMessageAction(channel, c -> c.editMessageById(message.getId(), messageEmbed), Permission.MESSAGE_EMBED_LINKS);
}
use of net.robinfriedli.aiode.discord.MessageService in project aiode by robinfriedli.
the class ConnectCommand method awaitPrivateMessage.
private void awaitPrivateMessage(ClientSession clientSession, long userId, Guild guild, User user, int attemptNumber) {
CompletableFuture<PrivateMessageReceivedEvent> futurePrivateMessage = getManager().getEventWaiter().awaitEvent(PrivateMessageReceivedEvent.class, event -> event.getAuthor().getIdLong() == userId).orTimeout(1, TimeUnit.MINUTES);
CompletableFutures.handleWhenComplete(futurePrivateMessage, (event, error) -> {
try {
MessageService messageService = getMessageService();
if (event != null) {
String token = event.getMessage().getContentRaw();
UUID sessionId;
try {
sessionId = UUID.fromString(token);
} catch (IllegalArgumentException e) {
String message = String.format("'%s' is not a valid token. ", token);
if (attemptNumber >= RETRY_COUNT) {
messageService.sendError(message + "Maximum retry count reached.", user);
} else {
messageService.sendError(message + String.format("Attempt %d / %d", attemptNumber, RETRY_COUNT), user);
awaitPrivateMessage(clientSession, userId, guild, user, attemptNumber + 1);
}
return;
}
QueryBuilderFactory queryBuilderFactory = getQueryBuilderFactory();
MutexSyncMode<UUID> mutexSyncMode = new MutexSyncMode<>(sessionId, TOKEN_SYNC);
HibernateInvoker.create().invokeConsumer(Mode.create().with(mutexSyncMode), session -> {
Optional<GeneratedToken> foundGeneratedToken = queryBuilderFactory.find(GeneratedToken.class).where((cb, root) -> cb.equal(root.get("token"), sessionId)).build(session).uniqueResultOptional();
if (foundGeneratedToken.isEmpty()) {
String message = "Token is invalid. Make sure it matches the token generated by your web client. Tokens may not be shared or reused. ";
if (attemptNumber >= RETRY_COUNT) {
messageService.sendError(message + "Maximum retry count reached.", user);
} else {
messageService.sendError(message + String.format("Attempt %d / %d", attemptNumber, RETRY_COUNT), user);
awaitPrivateMessage(clientSession, userId, guild, user, attemptNumber + 1);
}
return;
}
GeneratedToken generatedToken = foundGeneratedToken.get();
Long existingSessionCount = queryBuilderFactory.select(ClientSession.class, (from, cb) -> cb.count(from.get("pk")), Long.class).where((cb, root) -> cb.equal(root.get("sessionId"), sessionId)).build(session).uniqueResult();
if (existingSessionCount > 0) {
messageService.sendError("A session with this ID already exists. You are probably already signed in, try reloading your web client. If your client still can't sign in try generating a new token using the reload button and then try the connect command again.", user);
return;
}
clientSession.setLastRefresh(LocalDateTime.now());
clientSession.setSessionId(sessionId);
clientSession.setIpAddress(generatedToken.getIp());
session.persist(clientSession);
session.delete(generatedToken);
messageService.sendSuccess(String.format("Okay, a session connected to guild '%s' " + "has been prepared. You may return to the web client to complete the setup. The client should " + "connect automatically, else you can continue manually.", guild.getName()), user);
});
} else if (error != null) {
if (error instanceof TimeoutException) {
messageService.sendError("Your connection attempt timed out", user);
} else {
EmbedBuilder exceptionEmbed = ExceptionUtils.buildErrorEmbed(error);
exceptionEmbed.setTitle("Exception");
exceptionEmbed.setDescription("There has been an error awaiting private message to establish connection");
LoggerFactory.getLogger(getClass()).error("unexpected exception while awaiting private message", error);
sendMessage(exceptionEmbed.build());
}
setFailed(true);
}
} finally {
USERS_WITH_PENDING_CONNECTION.remove(userId);
}
}, e -> {
LoggerFactory.getLogger(getClass()).error("Unexpected error in whenComplete of event handler", e);
EmbedBuilder embedBuilder = ExceptionUtils.buildErrorEmbed(e).setTitle("Exception").setDescription("There has been an unexpected exception while trying to establish the connection");
getMessageService().send(embedBuilder.build(), user);
});
}
use of net.robinfriedli.aiode.discord.MessageService in project aiode by robinfriedli.
the class AbstractPaginationWidget method prepareInitialMessage.
@Override
public CompletableFuture<Message> prepareInitialMessage() {
EmbedBuilder embedBuilder = prepareEmbedBuilderForPage();
MessageService messageService = Aiode.get().getMessageService();
return messageService.send(embedBuilder, getChannel().get());
}
Aggregations