2014年11月4日火曜日

Hubotでコマンドの引数を省略可とする場合の注意

module.exports = (robot) ->

  # コマンド受け付け
    # 引数1: サブコマンド
    # 引数2: 非負整数
    # 引数3: 非負整数または非負小数
  robot.respond /([a-zA-Z]+) ([a-zA-Z_]+) ([0-9]+) ([0-9\.]+)/i, (msg) ->
    cmd = msg.match[1]
    type = msg.match[2]
    qty = msg.match[3]
    avept = msg.match[4]
    switch cmd.toLowerCase()
      # 作業種別指定・点数指定・平均pt指定の引き合い
      when 'inq'
        # 引き合い(今発注、今入稿)に対する最早予想納品時刻を算出
        typeRedmine = typeHubot2Redmine type
        etd = calcEtd typeRedmine, qty * avept, new Date()
        typeJa = typeHubot2Ja type
        msg.send "#{String.fromCharCode(0x16)}#{typeJa}#{qty}点(平均#{avept}pt)を今発注、今入稿していただくと最早予想納品時刻は#{etd}です。" # 反転表示

のようなコマンドをHubotで実装した。

たとえば
cdr inq cut 100 1.5
とIRCで打つと、この.coffee内のサブルーチンで実装された生産スケジューラが計算を行い、最早予想納品時刻を回答するというしくみだ。なお、cdrはこれまでにも出ている我らがHubotの名前である。またcutは「切り抜き」という当社のひとつの作業種別を指す。

このとき、最後の引数の+を*に変えても、その引数は省略可能とはならないことに注意が必要だとおもった。すなわちmsg.matchに対する*はあまり意味がない。引数を省略可としたければ、もうひとつrobot.respondを書く必要がある。

※なお、上のスクリプト中、typeHubot2RedmineはIRCで打たれた作業種別文字列をRedmine用に正規化するサブルーチン、typeHubot2Jaは同じく日本語への変換ルーチンである。calcEtdは生産スケジューラが最早予想納品時刻を回答するサブルーチンであり、その最終引数に予約入稿日時を指定することができるようになっている。スクリプトは今入稿の場合である。