use of org.javacord.api.entity.channel.ServerThreadChannel in project Javacord by BtoBastian.
the class ThreadListSyncHandler method handle.
@Override
public void handle(final JsonNode packet) {
final long serverId = packet.get("guild_id").asLong();
final ServerImpl server = api.getServerById(serverId).map(ServerImpl.class::cast).orElse(null);
if (server == null) {
logger.warn("Unable to find server with id {}", serverId);
return;
}
final List<Long> channelIds = new ArrayList<>();
if (packet.has("channel_ids")) {
for (final JsonNode channelId : packet.get("channel_ids")) {
channelIds.add(channelId.asLong());
}
}
final List<ServerThreadChannel> threads = new ArrayList<>();
for (final JsonNode thread : packet.get("threads")) {
threads.add(server.getOrCreateServerThreadChannel(thread));
}
final List<Long> threadIds = new ArrayList<>();
for (final ServerThreadChannel thread : threads) {
threadIds.add(thread.getId());
}
final List<ThreadMember> members = new ArrayList<>();
for (final JsonNode member : packet.get("members")) {
members.add(new ThreadMemberImpl(api, server, member));
}
// Removes lost threads from cache
for (final Channel channel : api.getChannels()) {
if (channel.getType() == ChannelType.SERVER_PRIVATE_THREAD || channel.getType() == ChannelType.SERVER_PUBLIC_THREAD && !threadIds.contains(channel.getId())) {
api.removeChannelFromCache(channel.getId());
}
}
final ThreadListSyncEvent event = new ThreadListSyncEventImpl(server, channelIds, threads, members);
api.getEventDispatcher().dispatchThreadListSyncEvent(server, server, event);
}
use of org.javacord.api.entity.channel.ServerThreadChannel in project Javacord by BtoBastian.
the class ThreadCreateHandler method handleThread.
/**
* Handles the creation of a thread.
*
* @param channel The channel data from which to build the thread.
*/
private void handleThread(final JsonNode channel) {
final long serverId = channel.get("guild_id").asLong();
api.getPossiblyUnreadyServerById(serverId).ifPresent(server -> {
final ServerThreadChannel serverThreadChannel = ((ServerImpl) server).getOrCreateServerThreadChannel(channel);
final ThreadCreateEvent event = new ThreadCreateEventImpl(serverThreadChannel);
api.getEventDispatcher().dispatchThreadCreateEvent((DispatchQueueSelector) server, serverThreadChannel, event);
});
}
use of org.javacord.api.entity.channel.ServerThreadChannel in project Javacord by BtoBastian.
the class MessageCreateHandler method handle.
@Override
public void handle(JsonNode packet) {
long channelId = packet.get("channel_id").asLong();
// See https://github.com/discord/discord-api-docs/issues/2248
if (!packet.hasNonNull("guild_id")) {
// Check for EPHEMERAL messages as they do NOT include a guild_id when the EPHEMERAL flag is set.
if (packet.hasNonNull("flags") && (packet.get("flags").asInt() & MessageFlag.EPHEMERAL.getId()) > 0) {
Optional<ServerTextChannel> serverTextChannel = api.getServerTextChannelById(channelId);
if (serverTextChannel.isPresent()) {
handle(serverTextChannel.get(), packet);
return;
}
Optional<ServerThreadChannel> serverThreadChannel = api.getServerThreadChannelById(channelId);
if (serverThreadChannel.isPresent()) {
handle(serverThreadChannel.get(), packet);
return;
}
}
UserImpl author = new UserImpl(api, packet.get("author"), (MemberImpl) null, null);
PrivateChannelImpl privateChannel = PrivateChannelImpl.getOrCreatePrivateChannel(api, channelId, author.getId(), author);
handle(privateChannel, packet);
return;
}
Optional<TextChannel> optionalChannel = api.getTextChannelById(channelId);
if (optionalChannel.isPresent()) {
handle(optionalChannel.get(), packet);
} else {
LoggerUtil.logMissingChannel(logger, channelId);
}
}
use of org.javacord.api.entity.channel.ServerThreadChannel in project Javacord by BtoBastian.
the class ServerImpl method getChannels.
@Override
public List<ServerChannel> getChannels() {
final List<ServerChannel> channels = getUnorderedChannels().stream().filter(channel -> channel.asCategorizable().map(categorizable -> !categorizable.getCategory().isPresent()).orElse(false)).map(Channel::asRegularServerChannel).filter(Optional::isPresent).map(Optional::get).sorted(Comparator.<RegularServerChannel>comparingInt(channel -> channel.getType().getId()).thenComparing(RegularServerChannelImpl.COMPARE_BY_RAW_POSITION)).collect(Collectors.toList());
getChannelCategories().forEach(category -> {
channels.add(category);
channels.addAll(category.getChannels());
});
final Map<ServerTextChannel, List<ServerThreadChannel>> serverTextChannelThreads = new HashMap<>();
getThreadChannels().forEach(serverThreadChannel -> {
final ServerTextChannel serverTextChannel = serverThreadChannel.getParent();
serverTextChannelThreads.merge(serverTextChannel, new ArrayList<>(Collections.singletonList(serverThreadChannel)), (serverThreadChannels, serverThreadChannels2) -> {
serverThreadChannels.addAll(serverThreadChannels2);
return new ArrayList<>(serverThreadChannels);
});
});
serverTextChannelThreads.forEach((serverTextChannel, serverThreadChannels) -> channels.addAll(channels.indexOf(serverTextChannel) + 1, serverThreadChannels));
return Collections.unmodifiableList(channels);
}
use of org.javacord.api.entity.channel.ServerThreadChannel in project Javacord by BtoBastian.
the class ServerThreadChannelBuilderDelegateImpl method create.
@Override
public CompletableFuture<ServerThreadChannel> create() {
final ObjectNode body = JsonNodeFactory.instance.objectNode();
prepareBody(body);
if (message != null) {
return new RestRequest<ServerThreadChannel>(message.getApi(), RestMethod.POST, RestEndpoint.START_THREAD_WITH_MESSAGE).setUrlParameters(message.getChannel().getIdAsString(), message.getIdAsString()).setBody(body).execute(result -> ((ServerImpl) message.getServer().get()).getOrCreateServerThreadChannel(result.getJsonBody()));
} else {
return new RestRequest<ServerThreadChannel>(serverTextChannel.getApi(), RestMethod.POST, RestEndpoint.START_THREAD_WITHOUT_MESSAGE).setUrlParameters(serverTextChannel.getIdAsString()).setBody(body).execute(result -> ((ServerImpl) serverTextChannel.getServer()).getOrCreateServerThreadChannel(result.getJsonBody()));
}
}
Aggregations