nadoka/nadoka

View on GitHub
plugins/backlogbot.nb

Summary

Maintainability
Test Coverage
# -*-ruby-*-
#
# Copyright (c) 2004-2005 SASADA Koichi <ko1 at atdot.net>
#
# This program is free software with ABSOLUTELY NO WARRANTY.
# You can re-distribute and/or modify this program under
# the same terms of the Ruby's license.
#
#
# $Id$
#

=begin

== Abstract

BackLogBot support rich backlog management scheme.


== Configuration

#
# Maybe you don't have to write config(default setting is very useful)
#
BotConfig = [
{
  :name   => :BackLogBot,
  
  :clear       => false,        # if true, clear backlogs when output once
  :talker      => false,        # if true, talker will be pseudo talker 
  :prefix      => 'BL',
  :sender      => 'backlogbot',
  :time_format => '%m/%d-%H:%M',
}
]

=end


class BackLogBot < Nadoka::NDK_Bot
  def bot_initialize
    @stores = @logger.message_stores
    @talker = @bot_config.fetch(:talker, false)
    @clear  = @bot_config.fetch(:clear, false)
    @prefix = @bot_config.fetch(:prefix, 'BL')
    @sender = @bot_config.fetch(:sender, 'backlogbot')
    @sepr   = @bot_config.fetch(:separate, true)
    @tmfmt  = @bot_config.fetch(:time_format, '%m/%d-%H:%M')
    @msgfmts= @bot_config.fetch(:message_format, @config.default_log[:message_format])
    @pattern= @bot_config.fetch(:pattern, nil)
  end

  def channel_message? ch
    /\A[\&\#\+\!]/ =~ ch
  end

  def on_client_login client_count, client
    @stores.each_channel_pool{|ch, msgobjs|
      if @state.current_channels[ch]
        msgobjs.each{|msgobj|
          msg  = @config.log_format_message(@msgfmts, msgobj)
          rch  = msgobj[:ch]
          time = msgobj[:time]

          cmd = Cmd.notice(rch, "#{@prefix}(#{time.strftime(@tmfmt)}) #{msg}")
          client.add_prefix(cmd, @talker ? nick : @sender)
          client.send_msg cmd
        }
      else
        msgobjs.each{|msgobj|
          if ch == :__talk__
            msg  = @config.log_format_message(@config.talk_log[:message_format], msgobj)
          else
            msg  = @config.log_format_message(@config.system_log[:message_format], msgobj)
          end
          next unless @pattern.nil? || @pattern =~ msg
          
          rch  = msgobj[:ch]
          time = msgobj[:time]
          
          cmd = Cmd.notice(@state.nick, "#{@prefix}(#{time.strftime(@tmfmt)}) #{msg}")
          client.send_msg cmd
        }
      end
    }
    @stores.clear if @clear
  end
end