module Legitbot
def self.bot(user_agent, ip)
:yields: a found bot
otherwise.
Returns +nil+ if no bot found and a bot match instance
If a block given, passes the found bot to the block.
Lookup a bot based on its signature from +User-Agent+ header.
#
def self.bot(user_agent, ip) bots = @rules .select { |rule| rule[:fragments].any? { |f| user_agent.index f } } .map { |rule| rule[:class].new(ip) } selected = bots.select(&:valid?).first if bots.size > 1 selected = bots.last if selected.nil? if selected && block_given? yield selected else selected end end
def self.rule(clazz, fragments)
def self.rule(clazz, fragments) @rules << { class: clazz, fragments: fragments } end