slack_service.rb 1.6 KB
Newer Older
1 2
# frozen_string_literal: true

3
class SlackService < ChatNotificationService
4
  def title
5
    'Slack notifications'
6 7 8
  end

  def description
9
    'Receive event notifications in Slack'
10 11
  end

12
  def self.to_param
13
    'slack'
14 15
  end

16
  def help
17
    'This service sends notifications about projects events to Slack channels.<br />
18
    To set up this service:
19
    <ol>
20 21
      <li><a href="https://slack.com/apps/A0F7XDUAZ-incoming-webhooks">Add an incoming webhook</a> in your Slack team. The default channel can be overridden for each event.</li>
      <li>Paste the <strong>Webhook URL</strong> into the field below.</li>
22
      <li>Select events below to enable notifications. The <strong>Channel names</strong> and <strong>Username</strong> fields are optional.</li>
23 24
    </ol>
    <strong>Note:</strong> Usernames and private channels are not supported.'
25 26
  end

27
  def default_channel_placeholder
28
    _('Channel names (e.g. general, people-ops)')
29
  end
30 31 32 33

  def webhook_placeholder
    'https://hooks.slack.com/services/…'
  end
34 35 36 37 38 39

  module Notifier
    private

    def notify(message, opts)
      # See https://github.com/stevenosloan/slack-notifier#custom-http-client
40
      notifier = Slack::Messenger.new(webhook, opts.merge(http_client: HTTPClient))
41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57

      notifier.ping(
        message.pretext,
        attachments: message.attachments,
        fallback: message.fallback
      )
    end

    class HTTPClient
      def self.post(uri, params = {})
        params.delete(:http_options) # these are internal to the client and we do not want them
        Gitlab::HTTP.post(uri, body: params)
      end
    end
  end

  include Notifier
58
end