読者です 読者をやめる 読者になる 読者になる

MANA-DOT

PIXEL ART, PROGRAMING, ETC.

HubotでIRCのログをとる

hubot-irc-log

常駐しているbotにログの残らないIRCのログをとってもらいます。

fs = require 'fs'
mkdirp = require 'mkdirp'
LOG_ROOT = '/var/log/mana_bot'

module.exports = (robot) ->
  robot.adapter.bot.on 'raw', (message)->
    switch message.rawCommand
      when 'NOTICE', 'PRIVMSG', 'PART', 'JOIN', 'TOPIC'
        channel = message.args[0].replace /^#/, ''
        time = new Date
        year = time.getFullYear()
        month = time.getMonth()+1
        date = time.getDate()
        
        logContent = (JSON.stringify {
          command: message.rawCommand,
          args: message.args,
          time: time,
          nick: message.nick
        }) + ",\n"
        dir = "#{LOG_ROOT}/#{channel}/#{year}/#{month}"
        
        log = ()->
          fs.appendFile "#{dir}/#{date}", logContent, console.log.bind console
        fs.exists(dir, (exists)->
          if exists
            log()
          else
            mkdirp dir, log
        )

github

robot.hearだと、privmsgしか取得できないため、hubotのメソッドではなく、アダプタが利用しているnode-ircのonメソッドを用います。このメソッドでrawイベントをハンドリングすると、すべてのIRCコマンドが取得できるので、 コマンドの種類でswitch-whenし、記録したいコマンドだけファイルに書き出してあげます。

ほんとはログは完全なJSONで吐きたかったけれど、JSONは追記には向かなかったので、各行をJSON.stringifyしたものをカンマ改行区切りでつないでいくというややキモい形式で吐かせています。