package gov.nysenate.openleg.model.slack; import java.util.ArrayList; import java.util.List; import java.util.stream.Collectors; import com.google.gson.JsonArray; import com.google.gson.JsonObject; public class SlackAttachment { private String fallback; private String text; private String pretext; private String color; private String title; private String titleLink; private List<SlackField> fields; public SlackAttachment() {} public SlackAttachment(SlackAttachment other) { this.fallback = other.fallback; this.text = other.text; this.pretext = other.pretext; this.color = other.color; this.title = other.title; this.titleLink = other.titleLink; this.fields = other.fields != null ? other.fields.stream() .map(SlackField::new) .collect(Collectors.toList()) : null; } public SlackAttachment addFields(SlackField field) { if(this.fields == null) { this.fields = new ArrayList<SlackField>(); } this.fields.add(field); return this; } private boolean isHex(String pair) { return pair.matches("^([A-Fa-f0-9]{6}|[A-Fa-f0-9]{3})$"); } private JsonArray prepareFields() { JsonArray data = new JsonArray(); for(SlackField field: fields) { data.add(field.toJson()); } return data; } public SlackAttachment removeFields(Integer index) { if(this.fields != null) { this.fields.remove(index); } return this; } public SlackAttachment setColor(String color) { if(color != null) { if(color.charAt(0) == '#') { if(!isHex(color.substring(1))) { throw new IllegalArgumentException("Invalid Hex Color @ SlackAttachment"); } } else if(!color.matches("^(good|warning|danger)$")) { throw new IllegalArgumentException("Invalid PreDefined Color @ SlackAttachment"); } } this.color = color; return this; } public SlackAttachment setFallback(String fallback) { this.fallback = fallback; return this; } public SlackAttachment setFields(ArrayList<SlackField> fields) { this.fields = fields; return this; } public SlackAttachment setPretext(String pretext) { this.pretext = pretext; return this; } public SlackAttachment setText(String text) { this.text = text; return this; } public SlackAttachment setTitle(String title) { this.title = title; return this; } public SlackAttachment setTitleLink(String titleLink) { this.titleLink = titleLink; return this; } public JsonObject toJson() { JsonObject data = new JsonObject(); if(fallback == null) { throw new IllegalArgumentException("Missing Fallback @ SlackAttachment"); } else { data.addProperty("fallback", fallback); } if(text != null) { data.addProperty("text", text); } if(pretext != null) { data.addProperty("pretext", pretext); } if(color != null) { data.addProperty("color", color); } if (title != null) { data.addProperty("title", title); } if (titleLink != null) { data.addProperty("title_link", titleLink); } if(fields != null && fields.size() > 0) { data.add("fields", prepareFields()); } return data; } }