class WeChat::Bot::Core

机器人的核心类

Attributes

callback[R]

@return [Callback] @api private

client[R]

微信 API 客户端

@return [Client]

config[R]

@return [Configuration]

contact_list[R]

联系人列表

@return [ContactList]

handlers[R]

@return [HandlerList]

logger[RW]

@return [Logger]

profile[R]

当前登录用户信息

@return [Contact]

Public Class Methods

new(&block) click to toggle source
# File lib/wechat/bot/core.rb, line 50
def initialize(&block)
  # defaults_logger
  @logger = Logger.new(STDOUT, self)
  @config = Configuration.new
  @handlers = HandlerList.new
  @callback = Callback.new(self)

  @client = Client.new(self)
  @profile = Contact.new(self)
  @contact_list = ContactList.new(self)

  instance_eval(&block) if block_given?
end

Public Instance Methods

configure() { |config| ... } click to toggle source

用于设置 WeChat::Bot 的配置 默认无需配置,需要定制化 yield {Core#config} 进行配置

@yieldparam [Struct] config @return [void] 没有返回值

# File lib/wechat/bot/core.rb, line 98
def configure
  yield @config
end
on(event, regexp = //, *args, &block) click to toggle source

消息触发器

@param [String, Symbol, Integer] event @param [Regexp, Pattern, String] regexp @param [Array<Object>] args @yieldparam [Array<String>] @return [Handler]

# File lib/wechat/bot/core.rb, line 71
def on(event, regexp = //, *args, &block)
  event = event.to_s.to_sym

  pattern = case regexp
            when Pattern
              regexp
            when Regexp
              Pattern.new(nil, regexp, nil)
            else
              if event == :ctcp
                Pattern.generate(:ctcp, regexp)
              else
                Pattern.new(/^/, /#{Regexp.escape(regexp.to_s)}/, /$/)
              end
            end

  handler = Handler.new(self, event, pattern, {args: args, execute_in_callback: true}, &block)
  @handlers.register(handler)

  handler
end
start() click to toggle source

运行机器人

@return [void]

# File lib/wechat/bot/core.rb, line 105
def start
  @client.login
  @client.contacts

  @contact_list.each do |c|
    @logger.debug "Contact: #{c}"
  end

  while true
    break unless @client.logged? || @client.alive?
    sleep 1
  end
rescue Interrupt => e
  message = "你使用 Ctrl + C 终止了运行"
  @logger.warn(message)
  @client.send_text(@config.fireman, "[告警] 意外下线\n#{message}\n#{e.backtrace.join("\n")}") if @client.logged? && @client.alive?
rescue Exception => e
  message = e.message
  @logger.fatal(e)
  @client.send_text(@config.fireman, "[告警] 意外下线\n#{message}\n#{e.backtrace.join("\n")}") if @client.logged? && @client.alive?
ensure
  @client.logout if @client.logged? && @client.alive?
end