All Downloads are FREE. Search and download functionalities are using the official Maven repository.

io.dangernoodle.slack.client.rtm.SlackWebSocketAssistant Maven / Gradle / Ivy

The newest version!
package io.dangernoodle.slack.client.rtm;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import io.dangernoodle.slack.client.SlackClient;
import io.dangernoodle.slack.client.SlackClientSettings;
import io.dangernoodle.slack.client.SlackJsonTransformer;
import io.dangernoodle.slack.client.SlackJsonTransformer.SlackJsonObject;
import io.dangernoodle.slack.events.SlackEvent;
import io.dangernoodle.slack.events.SlackEventType;
import io.dangernoodle.slack.events.SlackHelloEvent;
import io.dangernoodle.slack.events.SlackMessageEvent;
import io.dangernoodle.slack.events.SlackMessageEventType;
import io.dangernoodle.slack.events.SlackPongEvent;
import io.dangernoodle.slack.events.SlackReplyToEvent;
import io.dangernoodle.slack.events.SlackUnknownEvent;
import io.dangernoodle.slack.events.channel.SlackChannelCreatedEvent;
import io.dangernoodle.slack.events.channel.SlackChannelDeletedEvent;
import io.dangernoodle.slack.events.channel.SlackChannelJoinedEvent;
import io.dangernoodle.slack.events.channel.SlackChannelLeftEvent;
import io.dangernoodle.slack.events.channel.SlackChannelRenameEvent;
import io.dangernoodle.slack.events.user.SlackPresenceChangeEvent;
import io.dangernoodle.slack.events.user.SlackUserChangeEvent;
import io.dangernoodle.slack.events.user.SlackUserTypingEvent;


public class SlackWebSocketAssistant
{
    private static final Logger logger = LoggerFactory.getLogger(SlackWebSocketAssistant.class);

    private final SlackClient client;

    private final SlackClientSettings settings;

    private final SlackJsonTransformer transformer;

    public SlackWebSocketAssistant(SlackClient client, SlackJsonTransformer transformer, SlackClientSettings settings)
    {
        this.client = client;
        this.transformer = transformer;
        this.settings = settings;
    }

    public void handleEvent(String message)
    {
        if (logger.isTraceEnabled())
        {
            logger.trace("incoming event:\n{}", transformer.prettyPrint(message));
        }

        SlackJsonObject object = transformer.deserialize(message);
        String type = object.getType();

        if (type != null)
        {
            // treat this as a string until we determine if it's a 'message' event
            String subType = object.getSubType();
            SlackEventType eventType = SlackEventType.toEventType(object.getType());

            dispatchEvent(eventType, subType, object);
        }
        else if (object.isReplyTo())
        {
            dispatch(SlackEventType.REPLY_TO, object, SlackReplyToEvent.class);
        }
        else
        {
            // not sure this could ever happen, but just in case...
            logger.warn("unknown incoming slack message:\n{}", transformer.prettyPrint(message));
        }
    }

    public String serialize(Object object)
    {
        return transformer.serialize(object);
    }

    private  void dispatch(E eventType, SlackJsonObject object, Class clazz)
    {
        T event = transformer.deserialize(object, clazz);
        logger.debug("dispatching event type [{}] - event: {}", event.getType().toType(), event);

        client.getObserverRegistry()
              .findObservers(eventType)
              .forEach(observer -> observer.onEvent(event, client));
    }

    private void dispatch(SlackEventType eventType, String subType, SlackJsonObject object)
    {
        if (filterSelfUserMessages(object))
        {
            if (logger.isTraceEnabled())
            {
                logger.trace("filtered 'self' message {}", transformer.prettyPrint(object.getRawJson()));
            }
        }
        else if (dispatchAsMessageSubtype(eventType, subType))
        {
            SlackMessageEventType messageEventType = SlackMessageEventType.toEventType(subType);
            if (messageEventType == SlackMessageEventType.UNKNOWN)
            {
                logUnknownEvent(object, true);
                dispatch(SlackMessageEventType.UNKNOWN, object, SlackUnknownEvent.class);
            }
            else
            {
                dispatch(SlackMessageEventType.toEventType(subType), object, SlackMessageEvent.class);
            }
        }
        else
        {
            dispatch(eventType, object, SlackMessageEvent.class);
        }
    }

    private boolean dispatchAsMessageSubtype(SlackEventType eventType, String subType)
    {
        return (eventType == SlackEventType.MESSAGE && subType != null && settings.dispatchMessageSubtypes());
    }

    private void dispatchEvent(SlackEventType eventType, String subType, SlackJsonObject object)
    {
        switch (eventType)
        {
//            case ACCOUNTS_CHANGED:
//                break;
//            case BOT_ADDED:
//                break;
//            case BOT_CHANGED:
//                break;
//            case CHANNEL_ARCHIVE:
//                break;
            case CHANNEL_CREATED:
                dispatch(eventType, object, SlackChannelCreatedEvent.class);
                break;
            case CHANNEL_DELETED:
                dispatch(eventType, object, SlackChannelDeletedEvent.class);
                break;
//            case CHANNEL_HISTORY_CHANGED:
//                break;
            case CHANNEL_JOINED:
                dispatch(eventType, object, SlackChannelJoinedEvent.class);
                break;
            case CHANNEL_LEFT:
                dispatch(eventType, object, SlackChannelLeftEvent.class);
                break;
//            case CHANNEL_MARKED:
//                break;
            case CHANNEL_RENAME:
                dispatch(eventType, object, SlackChannelRenameEvent.class);
                break;
//            case CHANNEL_UNARCHIVE:
//                break;
//            case COMMANDS_CHANGED:
//                break;
//            case DND_UPDATED:
//                break;
//            case DND_UPDATED_USER:
//                break;
//            case EMAIL_DOMAIN_CHANGED:
//                break;
//            case EMOJI_CHANGED:
//                break;
//            case FILE_CHANGE:
//                break;
//            case FILE_COMMENT_ADDED:
//                break;
//            case FILE_COMMENT_DELETED:
//                break;
//            case FILE_COMMENT_EDITED:
//                break;
//            case FILE_CREATED:
//                break;
//            case FILE_DELETED:
//                break;
//            case FILE_PUBLIC:
//                break;
//            case FILE_SHARED:
//                break;
//            case FILE_UNSHARED:
//                break;
//            case GROUP_ARCHIVE:
//                break;
//            case GROUP_CLOSE:
//                break;
//            case GROUP_HISTORY_CHANGED:
//                break;
            case GROUP_JOINED:
                dispatch(eventType, object, SlackChannelJoinedEvent.class);
                break;
            case GROUP_LEFT:
                dispatch(eventType, object, SlackChannelLeftEvent.class);
                break;
//            case GROUP_MARKED:
//                break;
//            case GROUP_OPEN:
//                break;
            case GROUP_RENAME:
                dispatch(eventType, object, SlackChannelRenameEvent.class);
                break;
//            case GROUP_UNARCHIVE:
//                break;
            case HELLO:
                dispatch(eventType, object, SlackHelloEvent.class);
                break;
//            case IM_CLOSE:
//                break;
//            case IM_CREATED:
//                break;
//            case IM_HISTORY_CHANGED:
//                break;
//            case IM_MARKED:
//                break;
//            case IM_OPEN:
//                break;
//            case MANUAL_PRESENCE_CHANGE:
//                break;
            case MESSAGE:
                dispatch(eventType, subType, object);
                break;
//            case PIN_ADDED:
//                break;
//            case PIN_REMOVED:
//                break;
//            case PREF_CHANGE:
//                break;
            case PRESENCE_CHANGE:
                dispatch(eventType, object, SlackPresenceChangeEvent.class);
                break;
            case PONG:
                dispatch(eventType, object, SlackPongEvent.class);
                break;
//            case REACTION_ADDED:
//                break;
//            case REACTION_REMOVED:
//                break;
            case RECONNECT_URL:
                // unsupported, so just ignore outright for now
                break;
//            case STAR_ADDED:
//                break;
//            case STAR_REMOVED:
//                break;
//            case SUBTEAM_CREATED:
//                break;
//            case SUBTEAM_SELF_ADDED:
//                break;
//            case SUBTEAM_SELF_REMOVED:
//                break;
//            case SUBTEAM_UPDATED:
//                break;
//            case TEAM_DOMAIN_CHANGE:
//                break;
//            case TEAM_JOIN:
//                break;
//            case TEAM_MIGRATION_STARTED:
//                break;
//            case TEAM_PLAN_CHANGE:
//                break;
//            case TEAM_PREF_CHANGE:
//                break;
//            case TEAM_PROFILE_CHANGE:
//                break;
//            case TEAM_PROFILE_DELETE:
//                break;
//            case TEAM_PROFILE_REORDER:
//                break;
//            case TEAM_RENAME:
//                break;
            case USER_CHANGE:
                dispatch(eventType, object, SlackUserChangeEvent.class);
                break;
            case USER_TYPING:
                dispatch(eventType, object, SlackUserTypingEvent.class);
                break;
            case UNKNOWN:
            default:
                logUnknownEvent(object, false);
                dispatch(eventType, object, SlackUnknownEvent.class);
                break;
        }
    }

    private boolean filterSelfUserMessages(SlackJsonObject object)
    {
        return settings.filterSelfMessages() && client.getSession().getSelfUser().getId().value().equals(object.getUser());
    }

    private void logUnknownEvent(SlackJsonObject object, boolean message)
    {
        if (logger.isDebugEnabled())
        {
            logger.debug("unhandled {}event occurred: {}", message ? "message " : "", transformer.prettyPrint(object.getRawJson()));
        }
    }
}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy