From c092d8bfcc150d8d053b4075149d8049660b1d4b Mon Sep 17 00:00:00 2001 From: Thanos Kyritsis Date: Tue, 8 Nov 2016 14:40:18 +0200 Subject: [PATCH] Send to multiple rooms at a time (sync with sciyoshi/redmine-slack commit 7575feca8716acf52c669af7725db6054e897ed3) --- lib/redmine_mattermost/listener.rb | 54 ++++++++++++++++-------------- 1 file changed, 29 insertions(+), 25 deletions(-) diff --git a/lib/redmine_mattermost/listener.rb b/lib/redmine_mattermost/listener.rb index cda8d39..e6659e7 100644 --- a/lib/redmine_mattermost/listener.rb +++ b/lib/redmine_mattermost/listener.rb @@ -4,10 +4,10 @@ class MattermostListener < Redmine::Hook::Listener def redmine_mattermost_issues_new_after_save(context={}) issue = context[:issue] - channel = channel_for_project issue.project + channels = channels_for_project issue.project url = url_for_project issue.project - return unless channel and url + return unless channels.any? and url return if issue.is_private? msg = "[#{escape issue.project}] #{escape issue.author} created <#{object_url issue}|#{escape issue}>#{mentions issue.description}" @@ -34,17 +34,17 @@ class MattermostListener < Redmine::Hook::Listener :short => true } if Setting.plugin_redmine_mattermost[:display_watchers] == 'yes' - speak msg, channel, attachment, url + speak msg, channels, attachment, url end def redmine_mattermost_issues_edit_after_save(context={}) issue = context[:issue] journal = context[:journal] - channel = channel_for_project issue.project + channels = channels_for_project issue.project url = url_for_project issue.project - return unless channel and url and Setting.plugin_redmine_mattermost[:post_updates] == '1' + return unless channels.any? and url and Setting.plugin_redmine_mattermost[:post_updates] == '1' return if issue.is_private? return if journal.private_notes? @@ -54,7 +54,7 @@ class MattermostListener < Redmine::Hook::Listener attachment[:text] = escape journal.notes if journal.notes attachment[:fields] = journal.details.map { |d| detail_to_field d } - speak msg, channel, attachment, url + speak msg, channels, attachment, url end def model_changeset_scan_commit_for_issue_ids_pre_issue_update(context={}) @@ -62,10 +62,10 @@ class MattermostListener < Redmine::Hook::Listener journal = issue.current_journal changeset = context[:changeset] - channel = channel_for_project issue.project + channels = channels_for_project issue.project url = url_for_project issue.project - return unless channel and url and issue.save + return unless channels.any? and url and issue.save return if issue.is_private? msg = "[#{escape issue.project}] #{escape journal.user.to_s} updated <#{object_url issue}|#{escape issue}>" @@ -101,7 +101,7 @@ class MattermostListener < Redmine::Hook::Listener attachment[:text] = ll(Setting.default_language, :text_status_changed_by_changeset, "<#{revision_url}|#{escape changeset.comments}>") attachment[:fields] = journal.details.map { |d| detail_to_field d } - speak msg, channel, attachment, url + speak msg, channels, attachment, url end def controller_wiki_edit_after_save(context = { }) @@ -115,7 +115,7 @@ class MattermostListener < Redmine::Hook::Listener page_url = "<#{object_url page}|#{page.title}>" comment = "[#{project_url}] #{page_url} updated by *#{user}*" - channel = channel_for_project project + channels = channels_for_project project url = url_for_project project attachment = nil @@ -124,10 +124,10 @@ class MattermostListener < Redmine::Hook::Listener attachment[:text] = "#{escape page.content.comments}" end - speak comment, channel, attachment, url + speak comment, channels, attachment, url end - def speak(msg, channel, attachment=nil, url=nil) + def speak(msg, channels, attachment=nil, url=nil) url = Setting.plugin_redmine_mattermost[:mattermost_url] if not url username = Setting.plugin_redmine_mattermost[:username] icon = Setting.plugin_redmine_mattermost[:icon] @@ -138,7 +138,7 @@ class MattermostListener < Redmine::Hook::Listener } params[:username] = username if username - params[:channel] = channel if channel + params[:attachments] = [attachment] if attachment @@ -150,14 +150,18 @@ class MattermostListener < Redmine::Hook::Listener end end - begin - client = HTTPClient.new - client.ssl_config.cert_store.set_default_paths - client.ssl_config.ssl_version = :auto - client.post_async url, {:payload => params.to_json} - rescue Exception => e - logger.warn("cannot connect to #{url}") - logger.warn(e) + channels.each do |channel| + params[:channel] = channel + + begin + client = HTTPClient.new + client.ssl_config.cert_store.set_default_paths + client.ssl_config.ssl_version = :auto + client.post_async url, {:payload => params.to_json} + rescue Exception => e + logger.warn("cannot connect to #{url}") + logger.warn(e) + end end end @@ -187,20 +191,20 @@ private ].find{|v| v.present?} end - def channel_for_project(proj) + def channels_for_project(proj) return nil if proj.blank? cf = ProjectCustomField.find_by_name("Mattermost Channel") val = [ (proj.custom_value_for(cf).value rescue nil), - (channel_for_project proj.parent), + (channels_for_project proj.parent), Setting.plugin_redmine_mattermost[:channel], ].find{|v| v.present?} # Channel name '-' is reserved for NOT notifying - return nil if val.to_s == '-' - val + return [] if val.to_s == '-' + val.split(",") end def detail_to_field(detail)