Search in sources :

Example 11 with Server

use of org.javacord.api.entity.server.Server in project Javacord by BtoBastian.

the class InviteDeleteHandler method handle.

@Override
protected void handle(JsonNode packet) {
    String code = packet.get("code").asText();
    Channel channel = api.getChannelById(packet.get("channel_id").asLong()).orElseThrow(AssertionError::new);
    channel.asServerChannel().ifPresent(serverChannel -> {
        Server server = serverChannel.getServer();
        ServerChannelInviteDeleteEvent event = new ServerChannelInviteDeleteEventImpl(code, serverChannel);
        api.getEventDispatcher().dispatchServerChannelInviteDeleteEvent((DispatchQueueSelector) server, server, event);
    });
}
Also used : Server(org.javacord.api.entity.server.Server) ServerChannelInviteDeleteEventImpl(org.javacord.core.event.channel.server.invite.ServerChannelInviteDeleteEventImpl) Channel(org.javacord.api.entity.channel.Channel) ServerChannelInviteDeleteEvent(org.javacord.api.event.channel.server.invite.ServerChannelInviteDeleteEvent)

Example 12 with Server

use of org.javacord.api.entity.server.Server in project Javacord by BtoBastian.

the class MessageUpdateHandler method handle.

@Override
public void handle(JsonNode packet) {
    long messageId = packet.get("id").asLong();
    long channelId = packet.get("channel_id").asLong();
    Optional<TextChannel> optionalChannel = api.getTextChannelById(channelId);
    if (!optionalChannel.isPresent()) {
        LoggerUtil.logMissingChannel(logger, channelId);
        return;
    }
    TextChannel channel = optionalChannel.get();
    Optional<MessageImpl> message = api.getCachedMessageById(messageId).map(msg -> (MessageImpl) msg);
    message.ifPresent(msg -> {
        boolean newPinnedFlag = packet.hasNonNull("pinned") ? packet.get("pinned").asBoolean() : msg.isPinned();
        boolean oldPinnedFlag = msg.isPinned();
        if (newPinnedFlag != oldPinnedFlag) {
            msg.setPinned(newPinnedFlag);
            if (newPinnedFlag) {
                CachedMessagePinEvent event = new CachedMessagePinEventImpl(msg);
                Optional<Server> optionalServer = msg.getChannel().asServerChannel().map(ServerChannel::getServer);
                api.getEventDispatcher().dispatchCachedMessagePinEvent(optionalServer.map(DispatchQueueSelector.class::cast).orElse(api), msg, optionalServer.orElse(null), msg.getChannel(), event);
            } else {
                CachedMessageUnpinEvent event = new CachedMessageUnpinEventImpl(msg);
                Optional<Server> optionalServer = msg.getChannel().asServerChannel().map(ServerChannel::getServer);
                api.getEventDispatcher().dispatchCachedMessageUnpinEvent(optionalServer.map(DispatchQueueSelector.class::cast).orElse(api), msg, optionalServer.orElse(null), msg.getChannel(), event);
            }
        }
    });
    MessageEditEvent editEvent = null;
    if (packet.has("edited_timestamp") && !packet.get("edited_timestamp").isNull()) {
        message.ifPresent(msg -> {
            msg.setLastEditTime(OffsetDateTime.parse(packet.get("edited_timestamp").asText()).toInstant());
            msg.setMentionsEveryone(packet.get("mention_everyone").asBoolean());
        });
        long editTimestamp = OffsetDateTime.parse(packet.get("edited_timestamp").asText()).toInstant().toEpochMilli();
        long lastKnownEditTimestamp = lastKnownEditTimestamps.getOrDefault(messageId, 0L);
        lastKnownEditTimestamps.put(messageId, editTimestamp);
        boolean isMostLikelyAnEdit = true;
        long offset = api.getTimeOffset() == null ? 0 : api.getTimeOffset();
        if (editTimestamp == lastKnownEditTimestamp) {
            isMostLikelyAnEdit = false;
        } else if (System.currentTimeMillis() + offset - editTimestamp > 5000) {
            isMostLikelyAnEdit = false;
        }
        String oldContent = message.map(Message::getContent).orElse(null);
        List<Embed> oldEmbeds = message.map(Message::getEmbeds).orElse(null);
        String newContent = null;
        if (packet.has("content")) {
            newContent = packet.get("content").asText();
            String finalNewContent = newContent;
            message.ifPresent(msg -> msg.setContent(finalNewContent));
        }
        List<Embed> newEmbeds = null;
        if (packet.has("embeds")) {
            newEmbeds = new ArrayList<>();
            for (JsonNode embedJson : packet.get("embeds")) {
                Embed embed = new EmbedImpl(embedJson);
                newEmbeds.add(embed);
            }
            List<Embed> finalNewEmbeds = newEmbeds;
            message.ifPresent(msg -> msg.setEmbeds(finalNewEmbeds));
        }
        if (oldContent != null && newContent != null && !oldContent.equals(newContent)) {
            // If the old content doesn't match the new content it's for sure an edit
            isMostLikelyAnEdit = true;
        }
        if (oldEmbeds != null && newEmbeds != null) {
            if (newEmbeds.size() != oldEmbeds.size()) {
                isMostLikelyAnEdit = true;
            } else {
                for (int i = 0; i < newEmbeds.size(); i++) {
                    if (!((EmbedBuilderDelegateImpl) newEmbeds.get(i).toBuilder().getDelegate()).toJsonNode().toString().equals(((EmbedBuilderDelegateImpl) oldEmbeds.get(i).toBuilder().getDelegate()).toJsonNode().toString())) {
                        isMostLikelyAnEdit = true;
                    }
                }
            }
        }
        if (isMostLikelyAnEdit) {
            editEvent = new MessageEditEventImpl(api, messageId, channel, newContent, newEmbeds, oldContent, oldEmbeds);
        }
    }
    if (editEvent != null) {
        dispatchEditEvent(editEvent);
    }
}
Also used : CachedMessagePinEventImpl(org.javacord.core.event.message.CachedMessagePinEventImpl) Server(org.javacord.api.entity.server.Server) CachedMessageUnpinEvent(org.javacord.api.event.message.CachedMessageUnpinEvent) Embed(org.javacord.api.entity.message.embed.Embed) CachedMessageUnpinEventImpl(org.javacord.core.event.message.CachedMessageUnpinEventImpl) MessageEditEventImpl(org.javacord.core.event.message.MessageEditEventImpl) CachedMessagePinEvent(org.javacord.api.event.message.CachedMessagePinEvent) JsonNode(com.fasterxml.jackson.databind.JsonNode) EmbedImpl(org.javacord.core.entity.message.embed.EmbedImpl) ServerChannel(org.javacord.api.entity.channel.ServerChannel) DispatchQueueSelector(org.javacord.core.util.event.DispatchQueueSelector) MessageEditEvent(org.javacord.api.event.message.MessageEditEvent) TextChannel(org.javacord.api.entity.channel.TextChannel) MessageImpl(org.javacord.core.entity.message.MessageImpl)

Example 13 with Server

use of org.javacord.api.entity.server.Server in project Javacord by BtoBastian.

the class MessageDeleteHandler method handle.

@Override
public void handle(JsonNode packet) {
    long messageId = packet.get("id").asLong();
    long channelId = packet.get("channel_id").asLong();
    Optional<TextChannel> optionalChannel = api.getTextChannelById(channelId);
    if (optionalChannel.isPresent()) {
        TextChannel channel = optionalChannel.get();
        MessageDeleteEvent event = new MessageDeleteEventImpl(api, messageId, channel);
        api.getCachedMessageById(messageId).ifPresent(((MessageCacheImpl) channel.getMessageCache())::removeMessage);
        api.removeMessageFromCache(messageId);
        Optional<Server> optionalServer = channel.asServerChannel().map(ServerChannel::getServer);
        api.getEventDispatcher().dispatchMessageDeleteEvent(optionalServer.map(DispatchQueueSelector.class::cast).orElse(api), messageId, optionalServer.orElse(null), channel, event);
        api.removeObjectListeners(Message.class, messageId);
    } else {
        LoggerUtil.logMissingChannel(logger, channelId);
    }
}
Also used : TextChannel(org.javacord.api.entity.channel.TextChannel) Server(org.javacord.api.entity.server.Server) MessageDeleteEvent(org.javacord.api.event.message.MessageDeleteEvent) ServerChannel(org.javacord.api.entity.channel.ServerChannel) MessageDeleteEventImpl(org.javacord.core.event.message.MessageDeleteEventImpl) DispatchQueueSelector(org.javacord.core.util.event.DispatchQueueSelector)

Aggregations

Server (org.javacord.api.entity.server.Server)13 ServerChannel (org.javacord.api.entity.channel.ServerChannel)8 DispatchQueueSelector (org.javacord.core.util.event.DispatchQueueSelector)8 TextChannel (org.javacord.api.entity.channel.TextChannel)7 JsonNode (com.fasterxml.jackson.databind.JsonNode)5 Message (org.javacord.api.entity.message.Message)4 ArrayList (java.util.ArrayList)3 JsonNodeFactory (com.fasterxml.jackson.databind.node.JsonNodeFactory)2 ObjectNode (com.fasterxml.jackson.databind.node.ObjectNode)2 URL (java.net.URL)2 HashMap (java.util.HashMap)2 List (java.util.List)2 Map (java.util.Map)2 CompletableFuture (java.util.concurrent.CompletableFuture)2 Emoji (org.javacord.api.entity.emoji.Emoji)2 Role (org.javacord.api.entity.permission.Role)2 ObjectMapper (com.fasterxml.jackson.databind.ObjectMapper)1 ArrayNode (com.fasterxml.jackson.databind.node.ArrayNode)1 ProxySettings (com.neovisionaries.ws.client.ProxySettings)1 WebSocket (com.neovisionaries.ws.client.WebSocket)1