常駐している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 )
robot.hearだと、privmsgしか取得できないため、hubotのメソッドではなく、アダプタが利用しているnode-ircのonメソッドを用います。このメソッドでrawイベントをハンドリングすると、すべてのIRCコマンドが取得できるので、 コマンドの種類でswitch-whenし、記録したいコマンドだけファイルに書き出してあげます。
ほんとはログは完全なJSONで吐きたかったけれど、JSONは追記には向かなかったので、各行をJSON.stringifyしたものをカンマ改行区切りでつないでいくというややキモい形式で吐かせています。