summaryrefslogtreecommitdiff
path: root/lib/oxidized/hook/xmppdiff.rb
blob: 396d1b312d3cdccb15d5536de798129ddfcf47ae (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
require 'xmpp4r'
require 'xmpp4r/muc/helper/simplemucclient'

class XMPPDiff < Oxidized::Hook
  def validate_cfg!
    raise KeyError, 'hook.jid is required' unless cfg.has_key?('jid')
    raise KeyError, 'hook.password is required' unless cfg.has_key?('password')
    raise KeyError, 'hook.channel is required' unless cfg.has_key?('channel')
    raise KeyError, 'hook.nick is required' unless cfg.has_key?('nick')
 end

  def run_hook(ctx)
    if ctx.node
      if ctx.event.to_s == "post_store"
        begin
          Timeout::timeout(15) do
            gitoutput = ctx.node.output.new
            diff = gitoutput.get_diff ctx.node, ctx.node.group, ctx.commitref, nil

            interesting = diff[:patch].lines.to_a[4..-1].any? { |line|
              ["+", "-"].include?(line[0]) and not ["#", "!"].include?(line[1])
            }
            interesting &&= diff[:patch].lines.to_a[5..-1].any? { |line| line[0] == '-' }
            interesting &&= diff[:patch].lines.to_a[5..-1].any? { |line| line[0] == '+' }

            if interesting
              log "Connecting to XMPP"
              client = Jabber::Client.new(Jabber::JID.new(cfg.jid))
              client.connect
              sleep 1
              client.auth(cfg.password)
              sleep 1

              log "Connected"

              m = Jabber::MUC::SimpleMUCClient.new(client)
              m.join(cfg.channel + "/" + cfg.nick)

              log "Joined"

              title = "#{ctx.node.name.to_s} #{ctx.node.group.to_s} #{ctx.node.model.class.name.to_s.downcase}"
              log "Posting diff as snippet to #{cfg.channel}"

              m.say(title + "\n\n" + diff[:patch].lines.to_a[4..-1].join)

              sleep 1

              client.close

              log "Finished"

            end
          end
        rescue Timeout::Error
          log "timed out"
        end
      end
    end
  end
end