Review Board でレビューが届いたら IRC に通知して欲しい

経緯

Review Board には通知の仕組みがメールしか無かったので、IRC でも流して欲しかった。
フィード吐いてればそれを IRC ボットに読ませるのだけれど多分ないと思う???

なのでニセメールサーバ立てて、メール着信のタイミングで IRC に接続、NOTICE 後、即死するような BOT を作った。

別に Review Board に限らずメール発信する系なら何でも出来るね。

ソース

# -*- coding: utf-8 -*-
require 'rubygems'
require 'net/irc'
require 'pp'
require 'smtpserver'
require 'nkf'

class ReviewReportBot < Net::IRC::Client
  def initialize(*args)
    super
    @mes = args[2][:mes]
    @ch = args[2][:ch]
  end

  def on_rpl_welcome(m)
    post JOIN, @ch

    notice @ch, @mes

    sleep(3)
    finish()
  end

  def notice(ch, msg)
    post NOTICE, ch, msg
  end
end

config = {
  :Port => 25,
  :ServerName => 'メールサーバ名',
  :RequestTimeout => 120,
  :LineLengthLimit => 1024
}

config[:DataHook] = lambda do |mail, sender, recipients|
  mes = '';
  url = '';
  mail.split(/\r\n/).each{|line|
    if /^Subject: (.*)$/ =~ line
      subject = NKF::nkf('-wWm', $1)
      if /^(Re: )?Review Request: (.*)$/ =~ subject
        rep = !$1.nil?
        title = $2
        if rep
          mes = "レビュー依頼が更新されました"
        else
          mes = "新しいレビュー依頼が届きました"
        end
        mes += ": #{title}"
      end
    elsif /^X-ReviewRequest-URL: (.*)$/ =~ line
      url = $1
    end
  }
  bot = ReviewReportBot.new("IRC接続先", "ポート", {
                              :nick => '_reviewbot_',
                              :user => '_reviewbot_',
                              :real => '_reviewbot_',
                              :mes => "#{mes} <#{url}>",
                              :ch => "#review"
                            }).start
end

server = SMTPServer.new(config)

[:INT, :TERM].each do |signal|
  Signal.trap(signal) { server.shutdown }
end

server.start