summaryrefslogtreecommitdiff
path: root/app/models/integrations/pushover.rb
blob: 6bb6b6d60f65700ea18d5d333a7498d14582b5b5 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
# frozen_string_literal: true

module Integrations
  class Pushover < Integration
    BASE_URI = 'https://api.pushover.net/1'

    validates :api_key, :user_key, :priority, presence: true, if: :activated?

    field :api_key,
      type: 'password',
      title: -> { _('API key') },
      help: -> { s_('PushoverService|Enter your application key.') },
      non_empty_password_title: -> { s_('ProjectService|Enter new API key') },
      non_empty_password_help: -> { s_('ProjectService|Leave blank to use your current API key.') },
      placeholder: '',
      required: true

    field :user_key,
      type: 'password',
      title: -> { _('User key') },
      help: -> { s_('PushoverService|Enter your user key.') },
      non_empty_password_title: -> { s_('PushoverService|Enter new user key') },
      non_empty_password_help: -> { s_('PushoverService|Leave blank to use your current user key.') },
      placeholder: '',
      required: true

    field :device,
      title: -> { _('Devices (optional)') },
      help: -> { s_('PushoverService|Leave blank for all active devices.') },
      placeholder: ''

    field :priority,
      type: 'select',
      required: true,
      choices: -> do
        [
          [s_('PushoverService|Lowest priority'), -2],
          [s_('PushoverService|Low priority'), -1],
          [s_('PushoverService|Normal priority'), 0],
          [s_('PushoverService|High priority'), 1]
        ]
      end

    field :sound,
      type: 'select',
      choices: -> do
        [
          ['Device default sound', nil],
          ['Pushover (default)', 'pushover'],
          %w(Bike bike),
          %w(Bugle bugle),
          ['Cash Register', 'cashregister'],
          %w(Classical classical),
          %w(Cosmic cosmic),
          %w(Falling falling),
          %w(Gamelan gamelan),
          %w(Incoming incoming),
          %w(Intermission intermission),
          %w(Magic magic),
          %w(Mechanical mechanical),
          ['Piano Bar', 'pianobar'],
          %w(Siren siren),
          ['Space Alarm', 'spacealarm'],
          ['Tug Boat', 'tugboat'],
          ['Alien Alarm (long)', 'alien'],
          ['Climb (long)', 'climb'],
          ['Persistent (long)', 'persistent'],
          ['Pushover Echo (long)', 'echo'],
          ['Up Down (long)', 'updown'],
          ['None (silent)', 'none']
        ]
      end

    def title
      'Pushover'
    end

    def description
      s_('PushoverService|Get real-time notifications on your device.')
    end

    def self.to_param
      'pushover'
    end

    def self.supported_events
      %w(push)
    end

    def execute(data)
      return unless supported_events.include?(data[:object_kind])

      ref = Gitlab::Git.ref_name(data[:ref])
      before = data[:before]
      after = data[:after]

      message =
        if Gitlab::Git.blank_ref?(before)
          s_("PushoverService|%{user_name} pushed new branch \"%{ref}\".") % { user_name: data[:user_name], ref: ref }
        elsif Gitlab::Git.blank_ref?(after)
          s_("PushoverService|%{user_name} deleted branch \"%{ref}\".") % { user_name: data[:user_name], ref: ref }
        else
          s_("PushoverService|%{user_name} push to branch \"%{ref}\".") % { user_name: data[:user_name], ref: ref }
        end

      if data[:total_commits_count] > 0
        message = [message, s_("PushoverService|Total commits count: %{total_commits_count}") % { total_commits_count: data[:total_commits_count] }].join("\n")
      end

      pushover_data = {
        token: api_key,
        user: user_key,
        device: device,
        priority: priority,
        title: project.full_name.to_s,
        message: message,
        url: data[:project][:web_url],
        url_title: s_("PushoverService|See project %{project_full_name}") % { project_full_name: project.full_name }
      }

      # Sound parameter MUST NOT be sent to API if not selected
      if sound
        pushover_data[:sound] = sound
      end

      Gitlab::HTTP.post('/messages.json', base_uri: BASE_URI, body: pushover_data)
    end
  end
end