class WeChat::Bot::HandlerList

Handler 列表

Public Class Methods

new() click to toggle source
# File lib/wechat/bot/handler_list.rb, line 6
def initialize
  @handlers = Hash.new {|h,k| h[k] = []}
  @mutex = Mutex.new
end

Public Instance Methods

dispatch(event, message = nil, *args) click to toggle source

分派执行 Handler

@param [Symbol] event @param [String] message @param [Array<Object>] args @return [Array<Thread>]

# File lib/wechat/bot/handler_list.rb, line 40
def dispatch(event, message = nil, *args)
  threads = []

  if handlers = find(event, message)
    already_run = Set.new
    handlers.each do |handler|
      next if already_run.include?(handler.block)
      already_run.add(handler.block)

      if message
        captures = message.match(handler.pattern.to_r(message), event).captures
      else
        captures = []
      end

      threads.push(handler.call(message, captures, args))
    end
  end

  threads
end
each(&block) click to toggle source
# File lib/wechat/bot/handler_list.rb, line 81
def each(&block)
  @handlers.values.flatten.each(&block)
end
find(type, message = nil) click to toggle source

查找匹配 Handler

@param [Symbol] type @param [String] message @return [Hander]

# File lib/wechat/bot/handler_list.rb, line 67
def find(type, message = nil)
  if handlers = @handlers[type]
    if message.nil?
      return handlers
    end

    handlers = handlers.select { |handler|
      message.match(handler.pattern.to_r(message), type)
    }.group_by {|handler| handler.group}

    handlers.values_at(*(handlers.keys - [nil])).map(&:first) + (handlers[nil] || [])
  end
end
register(handler) click to toggle source

注册 Handler

@param [Handler] handler @return [void]

# File lib/wechat/bot/handler_list.rb, line 15
def register(handler)
  @mutex.synchronize do
    handler.bot.logger.debug "[on handler] Registering handler with pattern `#{handler.pattern}`, reacting on `#{handler.event}`"
    @handlers[handler.event].push(handler)
  end
end
stop_all() click to toggle source

停止运行所有 Handler

@return [void]

# File lib/wechat/bot/handler_list.rb, line 88
def stop_all
  each { |h| h.stop }
end
unregister(*handlers) click to toggle source

取消注册 Handler

@param [Array<Handler>] handlers @return [void]

# File lib/wechat/bot/handler_list.rb, line 26
def unregister(*handlers)
  @mutex.synchronize do
    handlers.each do |handler|
      @handlers[handler.event].delete(handler)
    end
  end
end