Explorar o código

fix #2449 add hangouts chat notification

Shinsuke Sugaya %!s(int64=5) %!d(string=hai) anos
pai
achega
f7e0a081dd

+ 2 - 0
src/main/java/org/codelibs/fess/Constants.java

@@ -138,6 +138,8 @@ public class Constants extends CoreLibConstants {
 
     public static final String SLACK_WEBHOOK_URLS_PROPERTY = "slack.webhook.urls";
 
+    public static final String GOOGLE_CHAT_WEBHOOK_URLS_PROPERTY = "google.chat.webhook.urls";
+
     public static final String USE_BROWSER_LOCALE_FOR_SEARCH_PROPERTY = "search.use.browser.locale";
 
     public static final String SUGGEST_SEARCH_LOG_PROPERTY = "suggest.searchlog";

+ 47 - 10
src/main/java/org/codelibs/fess/helper/NotificationHelper.java

@@ -32,10 +32,11 @@ import org.dbflute.mail.send.supplement.SMailPostingDiscloser;
 public class NotificationHelper {
     private static final Logger logger = LogManager.getLogger(NotificationHelper.class);
 
-    protected static final String LF = "\n";
+    protected static final char LF = '\n';
 
     public void send(final CardView cardView, final SMailPostingDiscloser discloser) {
         sendToSlack(cardView, discloser);
+        sendToGoogleChat(cardView, discloser);
     }
 
     protected void sendToSlack(CardView cardView, SMailPostingDiscloser discloser) {
@@ -45,9 +46,7 @@ public class NotificationHelper {
         if (StringUtil.isBlank(slackWebhookUrls)) {
             return;
         }
-        final StringBuilder buf = new StringBuilder();
-        final String body =
-                buf.append("{\"text\":\"").append(StringEscapeUtils.escapeJson(toSlackMessage(discloser))).append("\"}").toString();
+        final String body = toSlackMessage(discloser);
         StreamUtil.split(slackWebhookUrls, "[,\\s]").of(
                 stream -> stream.filter(StringUtil::isNotBlank).forEach(
                         url -> {
@@ -67,12 +66,50 @@ public class NotificationHelper {
     }
 
     protected String toSlackMessage(final SMailPostingDiscloser discloser) {
-        final StringBuilder sb = new StringBuilder();
-        sb.append(LF).append(discloser.getSavedSubject().orElse(StringUtil.EMPTY).trim());
-        sb.append(LF).append("```");
-        sb.append(LF).append(discloser.getSavedPlainText().orElse(StringUtil.EMPTY).trim());
-        sb.append(LF).append("```");
-        return sb.toString();
+        final StringBuilder buf = new StringBuilder(100);
+        buf.append("{\"text\":\"");
+        buf.append(LF);
+        buf.append(StringEscapeUtils.escapeJson(discloser.getSavedSubject().orElse(StringUtil.EMPTY).trim()));
+        buf.append(LF).append("```");
+        buf.append(LF).append(StringEscapeUtils.escapeJson(discloser.getSavedPlainText().orElse(StringUtil.EMPTY).trim()));
+        buf.append(LF).append("```\"}");
+        return buf.toString();
+    }
+
+    protected void sendToGoogleChat(CardView cardView, SMailPostingDiscloser discloser) {
+        // https://developers.google.com/hangouts/chat/how-tos/webhooks
+        final FessConfig fessConfig = ComponentUtil.getFessConfig();
+        final String googleChatWebhookUrls = fessConfig.getGoogleChatWebhookUrls();
+        if (StringUtil.isBlank(googleChatWebhookUrls)) {
+            return;
+        }
+        final String body = toGoogleChatMessage(discloser);
+        StreamUtil.split(googleChatWebhookUrls, "[,\\s]").of(
+                stream -> stream.filter(StringUtil::isNotBlank).forEach(
+                        url -> {
+                            try (CurlResponse response = Curl.post(url).header("Content-Type", "application/json").body(body).execute()) {
+                                if (response.getHttpStatusCode() == 200) {
+                                    if (logger.isDebugEnabled()) {
+                                        logger.debug("Sent {} to {}.", body, url);
+                                    }
+                                } else {
+                                    logger.warn("Failed to send {} to {}. HTTP Status is {}. {}", body, url, response.getHttpStatusCode(),
+                                            response.getContentAsString());
+                                }
+                            } catch (final IOException e) {
+                                logger.warn("Failed to send {} to {}.", body, url, e);
+                            }
+                        }));
+    }
 
+    protected String toGoogleChatMessage(final SMailPostingDiscloser discloser) {
+        final StringBuilder buf = new StringBuilder(100);
+        buf.append("{\"text\":\"");
+        buf.append(LF);
+        buf.append(StringEscapeUtils.escapeJson(discloser.getSavedSubject().orElse(StringUtil.EMPTY).trim()));
+        buf.append(LF).append("```");
+        buf.append(LF).append(StringEscapeUtils.escapeJson(discloser.getSavedPlainText().orElse(StringUtil.EMPTY).trim()));
+        buf.append(LF).append("```\"}");
+        return buf.toString();
     }
 }

+ 9 - 1
src/main/java/org/codelibs/fess/mylasta/direction/FessProp.java

@@ -505,7 +505,7 @@ public interface FessProp {
         return StringUtil.isNotBlank(getNotificationTo()) || StringUtil.isNotBlank(getSlackWebhookUrls());
     }
 
-    default void getSlackWebhookUrls(final String value) {
+    default void setSlackWebhookUrls(final String value) {
         setSystemProperty(Constants.SLACK_WEBHOOK_URLS_PROPERTY, value);
     }
 
@@ -513,6 +513,14 @@ public interface FessProp {
         return getSystemProperty(Constants.SLACK_WEBHOOK_URLS_PROPERTY, StringUtil.EMPTY);
     }
 
+    default void setGoogleChatWebhookUrls(final String value) {
+        setSystemProperty(Constants.GOOGLE_CHAT_WEBHOOK_URLS_PROPERTY, value);
+    }
+
+    default String getGoogleChatWebhookUrls() {
+        return getSystemProperty(Constants.GOOGLE_CHAT_WEBHOOK_URLS_PROPERTY, StringUtil.EMPTY);
+    }
+
     default void setNotificationTo(final String value) {
         setSystemProperty(Constants.NOTIFICATION_TO_PROPERTY, value);
     }