package gov.nysenate.openleg.service.notification.dispatch;
import gov.nysenate.openleg.model.notification.NotificationDigest;
import gov.nysenate.openleg.model.notification.RegisteredNotification;
import gov.nysenate.openleg.model.slack.SlackAddress;
import gov.nysenate.openleg.service.slack.SlackChatService;
import org.apache.commons.lang3.StringUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
public abstract class BaseSlackNotificationSender extends BaseNotificationSender {
private static final Logger logger = LoggerFactory.getLogger(BaseSlackNotificationSender.class);
private static final Pattern slackAddressPattern =
Pattern.compile("^(?:#([a-z-]+))?(?:@([a-z]*))?$");
@Autowired
protected SlackChatService slackChatService;
/**
* Truncates the notification message for slack consumption
* @param notification RegisteredNotification
* @return String
*/
protected String truncateNotification(RegisteredNotification notification) {
return trimLines(notification.getMessage(), environment.getSlackLineLimit()) +
"\nSee full notification at: " + getDisplayUrl(notification);
}
protected String truncateDigest(NotificationDigest digest, String digestText) {
return trimLines(digestText, environment.getSlackLineLimit()) +
"\nSee full digest at: " + getDigestUrl(digest);
}
protected String trimLines(String str, int maxLength) {
String[] lines = StringUtils.split(str, "\n");
if (lines.length <= maxLength) {
return str;
}
StringBuilder builder = new StringBuilder();
builder.append(lines[0]);
for (int i = 1; i < maxLength; i++) {
builder.append("\n").append(lines[i]);
}
builder.append("...");
return builder.toString();
}
protected SlackAddress parseAddress(String addressString) {
Matcher addressMatcher = slackAddressPattern.matcher(addressString);
if (!addressMatcher.matches()) {
logger.error("addressString: '{}' doesn't conform to pattern: {}",
addressString, slackAddressPattern.pattern());
return new SlackAddress();
}
String channel = addressMatcher.group(1) != null
? addressMatcher.group(1)
: SlackAddress.DEFAULT_CHANNEL_ID;
String username = addressMatcher.group(2);
return new SlackAddress(channel, username);
}
}