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