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

org.moskito.control.plugins.slack.SlackMessageBuilder Maven / Gradle / Ivy

The newest version!
package org.moskito.control.plugins.slack;

import com.github.seratch.jslack.api.methods.request.chat.ChatPostMessageRequest;
import com.github.seratch.jslack.api.model.Attachment;
import com.github.seratch.jslack.api.model.Field;
import net.anotheria.util.NumberUtils;
import org.moskito.control.common.HealthColor;
import org.moskito.control.core.status.StatusChangeEvent;
import org.moskito.control.plugins.notifications.NotificationUtils;

import java.util.Collections;
import java.util.LinkedList;

/**
 * Builds request object to post notification message to Slack
 * from configuration data and status change event
 */
public class SlackMessageBuilder {

    /**
     * Channel name to post notification
     */
    private String channel;
    /**
     * Source status change event
     */
    private StatusChangeEvent event;
    /**
     * Template for alert links leads to component where status changes
     */
    private String alertLinkTemplate;
    /**
     * Base to path to images that inserted in message
     */
    private String thumbImageBasePath;
    /**
     * Is required to make asUser request to post message
     * Avatar and name are shown in that case, but posting to not joined in channels is disabled
     */
    private boolean asUser;
    /**
     * Bot auth token
     */
    private String token;

    /**
     * Builds attachment filed for slack message
     * @param title name of filed
     * @param value value of filed
     * @return filed object
     */
    private Field buildField(String title, String value){
        return Field.builder().title(title).value(value).valueShortEnough(true).build();
    }

    /**
     * Transforms HealthColor object to
     * color hex code
     * @param color color to take hex code
     * @return hex code of color suite to color from arguments
     */
    /* test scope */ static String color2color(HealthColor color){
        switch(color){
            case GREEN:
                return "#94cc19";
            case RED:
                return "#fc3e39";
            case ORANGE:
                return "#ff8400";
            case YELLOW:
                return "#f4e300";
            case PURPLE:
                return "#ff53d6";
            case NONE:
                return "#cccccc";
            default:
                throw new IllegalArgumentException("Color "+color+" is not yet mapped");

        }

    }

    /**
     * Builds request object filling it parameters.
     * @return request object ready to make request. (In case all builder parameters fill)
     */
    public ChatPostMessageRequest build(){

        ChatPostMessageRequest.ChatPostMessageRequestBuilder requestBuilder = ChatPostMessageRequest.builder()
                .token(token)
                .asUser(asUser)
                .channel(channel);

        // START COMPOSING MESSAGE HEADER

            // Putting component name to message header
            String messageHeader = event.getComponent().getName();

            if(alertLinkTemplate != null) // inserting link to component name if it set in config
                messageHeader =
                        "<" + NotificationUtils.buildAlertLink(alertLinkTemplate, event) + "|" + messageHeader + ">";

            messageHeader += " status changed to " + event.getStatus(); // Adding status change to message header
            requestBuilder.text(messageHeader); // attaching message header to request

        // END COMPOSING MESSAGE TEXT

        // START COMPOSING ATTACHMENTS

            Attachment.AttachmentBuilder attachmentBuilder = Attachment.builder();

            String fallbackText = event.getComponent().getName()
                        +" status changed from " + event.getOldStatus()
                        + " to " + event.getStatus() + " @ "
                        + NumberUtils.makeISO8601TimestampString(event.getTimestamp());

            attachmentBuilder.color(color2color(event.getStatus().getHealth()));
            attachmentBuilder.fallback(fallbackText);

            // Building fields in message
            LinkedList fields = new LinkedList<>();
            fields.add(buildField("NewStatus", event.getStatus().getHealth().toString()));
            fields.add(buildField("OldStatus", event.getOldStatus().getHealth().toString()));
            fields.add(buildField("Timestamp", NumberUtils.makeISO8601TimestampString(event.getTimestamp())));
            attachmentBuilder.fields(fields);

            attachmentBuilder.thumbUrl(
                    NotificationUtils.getThumbImageUrlByColor(thumbImageBasePath, event.getStatus().getHealth())
            );

            requestBuilder.attachments(
                    Collections.singletonList(attachmentBuilder.build())
            );

        // END COMPOSING ATTACHMENTS

        return requestBuilder.build();

    }

    public SlackMessageBuilder setChannel(String channel) {
        this.channel = channel;
        return this;
    }

    public SlackMessageBuilder setEvent(StatusChangeEvent event) {
        this.event = event;
        return this;
    }

    public SlackMessageBuilder setAlertLinkTemplate(String alertLinkTemplate) {
        this.alertLinkTemplate = alertLinkTemplate;
        return this;
    }

    public SlackMessageBuilder setThumbImageBasePath(String thumbImageBasePath) {
        this.thumbImageBasePath = thumbImageBasePath;
        return this;
    }

    public SlackMessageBuilder setAsUser(boolean asUser) {
        this.asUser = asUser;
        return this;
    }

    public SlackMessageBuilder setToken(String token) {
        this.token = token;
        return this;
    }

}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy