package fr.jcgay.notification.notifier.snarl; import com.google.common.base.MoreObjects; import com.google.common.base.Objects; import com.google.common.io.Closeables; import fr.jcgay.notification.Application; import fr.jcgay.notification.DiscoverableNotifier; import fr.jcgay.notification.Notification; import fr.jcgay.notification.Notifier; import fr.jcgay.snp4j.Icon; import fr.jcgay.snp4j.Server; import fr.jcgay.snp4j.SnpException; import fr.jcgay.snp4j.impl.SnpNotifier; import fr.jcgay.snp4j.request.Priority; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import java.io.IOException; public class SnarlNotifier implements DiscoverableNotifier { private static final Logger LOGGER = LoggerFactory.getLogger(SnarlNotifier.class); private final Application application; private final SnarlConfiguration configuration; private final fr.jcgay.snp4j.Application snarlApplication; private fr.jcgay.snp4j.Notifier snarl; public SnarlNotifier(Application application, SnarlConfiguration configuration) { LOGGER.debug("Configuring Snarl for application {}: {}.", application, configuration); this.application = application; this.configuration = configuration; this.snarlApplication = fr.jcgay.snp4j.Application.withPassword(application.id(), application.name(), configuration.applicationPassword()); } @Override public Notifier init() { Server server = Server.builder() .withHost(configuration.host()) .withPort(configuration.port()) .build(); try { snarl = SnpNotifier.of(snarlApplication, server); } catch (SnpException e) { throw new SnarlNotificationException("Cannot register application with Snarl.", e); } return this; } @Override public void send(Notification notification) { if (snarl == null) { LOGGER.warn("Snarl notifier is not initialized, cannot send notification."); return; } fr.jcgay.snp4j.request.Notification snarNotification = new fr.jcgay.snp4j.request.Notification(); snarNotification.setIcon(Icon.base64(notification.icon().toByteArray())); snarNotification.setText(notification.message()); snarNotification.setTitle(notification.title()); snarNotification.setPriority(toPriority(notification.level())); init(); try { snarl.send(snarNotification); } catch (SnpException e) { throw new SnarlNotificationException("Cannot send notification to Snarl.", e); } } @Override public void close() { if (snarl != null) { try { Closeables.close(snarl, true); } catch (IOException ignored) {} } } @Override public boolean isPersistent() { return false; } @Override public boolean tryInit() { try { init(); return true; } catch (RuntimeException e) { close(); return false; } } private static Priority toPriority(Notification.Level level) { switch (level) { case WARNING: case ERROR: return Priority.HIGH; default: return Priority.NORMAL; } } @Override public int hashCode() { return Objects.hashCode(application, configuration); } @Override public boolean equals(Object obj) { if (this == obj) { return true; } if (obj == null || getClass() != obj.getClass()) { return false; } final SnarlNotifier other = (SnarlNotifier) obj; return Objects.equal(this.application, other.application) && Objects.equal(this.configuration, other.configuration); } @Override public String toString() { return MoreObjects.toStringHelper(this) .add("application", application) .add("configuration", configuration) .toString(); } }