use of org.javacord.api.entity.message.Message in project Javacord by BtoBastian.
the class MessageCreateHandler method handle.
private void handle(TextChannel channel, JsonNode packet) {
Message message = api.getOrCreateMessage(channel, packet);
MessageCreateEvent event = new MessageCreateEventImpl(message);
Optional<Server> optionalServer = channel.asServerChannel().map(ServerChannel::getServer);
MessageAuthor author = message.getAuthor();
api.getEventDispatcher().dispatchMessageCreateEvent(optionalServer.map(DispatchQueueSelector.class::cast).orElse(api), optionalServer.orElse(null), channel, author.asUser().orElse(null), author.isWebhook() ? author.getId() : null, event);
}
use of org.javacord.api.entity.message.Message in project Javacord by BtoBastian.
the class MessageReactionAddHandler method handle.
@Override
public void handle(JsonNode packet) {
long channelId = packet.get("channel_id").asLong();
long messageId = packet.get("message_id").asLong();
long userId = packet.get("user_id").asLong();
String serverId = packet.hasNonNull("guild_id") ? packet.get("guild_id").asText() : null;
TextChannel channel;
if (serverId == null) {
// if private channel:
channel = PrivateChannelImpl.getOrCreatePrivateChannel(api, channelId, userId, null);
} else {
channel = api.getTextChannelById(channelId).orElse(null);
}
if (channel == null) {
LoggerUtil.logMissingChannel(logger, channelId);
return;
}
Optional<Server> server = api.getServerById(serverId);
Member member = null;
if (packet.hasNonNull("member") && server.isPresent()) {
member = new MemberImpl(api, (ServerImpl) server.get(), packet.get("member"), null);
}
Optional<Message> message = api.getCachedMessageById(messageId);
Emoji emoji;
JsonNode emojiJson = packet.get("emoji");
if (!emojiJson.has("id") || emojiJson.get("id").isNull()) {
emoji = UnicodeEmojiImpl.fromString(emojiJson.get("name").asText());
} else {
emoji = api.getKnownCustomEmojiOrCreateCustomEmoji(emojiJson);
}
message.ifPresent(msg -> ((MessageImpl) msg).addReaction(emoji, userId == api.getYourself().getId()));
ReactionAddEvent event = new ReactionAddEventImpl(api, messageId, channel, emoji, userId, member);
api.getEventDispatcher().dispatchReactionAddEvent(server.map(DispatchQueueSelector.class::cast).orElse(api), messageId, server.orElse(null), channel, userId, event);
}
use of org.javacord.api.entity.message.Message in project Javacord by BtoBastian.
the class MessageReactionRemoveHandler method handle.
@Override
public void handle(JsonNode packet) {
long messageId = packet.get("message_id").asLong();
long userId = packet.get("user_id").asLong();
Optional<Message> message = api.getCachedMessageById(messageId);
long channelId = packet.get("channel_id").asLong();
TextChannel channel;
if (packet.hasNonNull("guild_id")) {
channel = api.getTextChannelById(channelId).orElse(null);
} else {
// if private channel:
channel = PrivateChannelImpl.getOrCreatePrivateChannel(api, channelId, userId, null);
}
if (channel == null) {
LoggerUtil.logMissingChannel(logger, channelId);
return;
}
Emoji emoji;
JsonNode emojiJson = packet.get("emoji");
if (!emojiJson.has("id") || emojiJson.get("id").isNull()) {
emoji = UnicodeEmojiImpl.fromString(emojiJson.get("name").asText());
} else {
emoji = api.getKnownCustomEmojiOrCreateCustomEmoji(emojiJson);
}
message.ifPresent(msg -> ((MessageImpl) msg).removeReaction(emoji, userId == api.getYourself().getId()));
ReactionRemoveEvent event = new ReactionRemoveEventImpl(api, messageId, channel, emoji, userId);
Optional<Server> optionalServer = channel.asServerChannel().map(ServerChannel::getServer);
api.getEventDispatcher().dispatchReactionRemoveEvent(optionalServer.map(DispatchQueueSelector.class::cast).orElse(api), messageId, optionalServer.orElse(null), channel, userId, event);
}
use of org.javacord.api.entity.message.Message in project Javacord by BtoBastian.
the class MessageReactionRemoveAllHandler method handle.
@Override
public void handle(JsonNode packet) {
long messageId = packet.get("message_id").asLong();
Optional<Message> message = api.getCachedMessageById(messageId);
message.ifPresent(msg -> ((MessageImpl) msg).removeAllReactionsFromCache());
long channelId = packet.get("channel_id").asLong();
TextChannel channel = api.getTextChannelById(channelId).orElse(null);
if (channel == null) {
if (packet.hasNonNull("guild_id")) {
// we don't know anything about the channel as it is part of a server and not cached
LoggerUtil.logMissingChannel(logger, channelId);
return;
}
// channel is a private channel:
channel = PrivateChannelImpl.dispatchPrivateChannelCreateEvent(api, new PrivateChannelImpl(api, channelId, null, null));
}
ReactionRemoveAllEvent event = new ReactionRemoveAllEventImpl(api, messageId, channel);
Optional<Server> optionalServer = channel.asServerChannel().map(ServerChannel::getServer);
api.getEventDispatcher().dispatchReactionRemoveAllEvent(optionalServer.map(DispatchQueueSelector.class::cast).orElse(api), messageId, optionalServer.orElse(null), channel, event);
}
use of org.javacord.api.entity.message.Message in project Javacord by BtoBastian.
the class MessageSetImpl method getMessagesAround.
/**
* Gets up to a given amount of messages in the given channel around a given message in any channel.
* The given message will be part of the result in addition to the messages around if it was sent in the given
* channel and does not count towards the limit.
* Half of the messages will be older than the given message and half of the messages will be newer.
* If there aren't enough older or newer messages, the actual amount of messages will be less than the given limit.
* It's also not guaranteed to be perfectly balanced.
*
* @param channel The channel of the messages.
* @param limit The limit of messages to get.
* @param around Get messages around the message with this id.
* @return The messages.
* @see #getMessagesAroundAsStream(TextChannel, long)
*/
public static CompletableFuture<MessageSet> getMessagesAround(TextChannel channel, int limit, long around) {
CompletableFuture<MessageSet> future = new CompletableFuture<>();
channel.getApi().getThreadPool().getExecutorService().submit(() -> {
try {
// calculate the half limit.
int halfLimit = limit / 2;
// get the newer half
MessageSet newerMessages = getMessagesAfter(channel, halfLimit, around).join();
// get the older half + around message
MessageSet olderMessages = getMessagesBefore(channel, halfLimit + 1, around + 1).join();
// for example because the around message was from a different channel
if (olderMessages.getNewestMessage().map(DiscordEntity::getId).map(id -> id != around).orElse(false)) {
olderMessages = olderMessages.tailSet(olderMessages.getOldestMessage().orElseThrow(AssertionError::new), false);
}
// combine the messages into one collection
Collection<Message> messages = Stream.of(olderMessages, newerMessages).flatMap(Collection::stream).collect(toList());
// we are done
future.complete(new MessageSetImpl(messages));
} catch (Throwable t) {
future.completeExceptionally(t);
}
});
return future;
}
Aggregations