Redmine 2.3.0にXMPP Notifications Pluginを入れた話

Redmine 2.3.0にXMPP Notifications Pluginを入れました。いくつかハマリポイントがあったのでメモしておきます。

なお、私はRubyは全く詳しくありません。

まず、xmpp4r-simpleを入れるのですが、普通にgem install xmpp4r-simpleするとRuby 1.9以上に対応できなかったので、gem install xmpp4r-simple-19としました。

続いて、エンコード云々によって正規表現云々で落ちていたので plugins/redmine_xmpp_notifications/init.rb に書き足しています。
具体的には、require_dependencyの塊に上からに"project" "principal" "user"の3つを追加してやります。
更に、

  # Encoding patch
  require 'socket'
  class TCPSocket
      def external_encoding
          Encoding::BINARY
      end
  end

  require 'rexml/source'
  class REXML::IOSource
      alias_method :encoding_assign, :encoding=
      def encoding=(value)
          encoding_assign(value) if value
      end
  end

  begin
      # OpenSSL is optional and can be missing
      require 'openssl'
      class OpenSSL::SSL::SSLSocket
          def external_encoding
              Encoding::BINARY
          end
      end
  rescue
  end

Redmine::Plugin.register :redmine_xmpp_notifications doブロックの末尾に追加します。

標準手順に加えて上記をすることでとりあえずXMPPのメッセージは飛ぶようになりました。
が、「ウォッチまたは関係している事柄のみ」メール通知をする設定になっている人にはこれでは飛ばなかったので、app/models/user.rb にパッチを当てます。

notify_about?(object)メソッドの when 'selected', 'only_my_events' の下をこんな感じに書き換えます(私は1行で書きましたが複数行に分割して大丈夫?)。

object.author == self || is_or_belongs_to?(object.assigned_to) || is_or_belongs_to?(object.assigned_to_was) || 
object.watcher_recipients.include?(self.mail)


やっていることは、Issueのwacher_recipients(メールアドレスが入っていた)にUserのmailが含まれるか調べているだけです。

とりあえずは以上でなんとなく使えると思います。
なにか問題がありましたら教えてください。