class MijDiscord::Events::EventBase

Constants

FilterMatch

Attributes

event_filters[R]

Public Class Methods

new(*args) click to toggle source
# File lib/mij-discord/events.rb, line 7
def initialize(*args)
  # Nothing
end

Private Class Methods

delegate_method(*names, to:) click to toggle source
# File lib/mij-discord/events.rb, line 84
def delegate_method(*names, to:)
  names.each do |name|
    define_method(name) do |*arg|
      send(to).send(name, *arg)
    end
  end
end
filter_match(key, field: key, on: :any, cmp: nil, &block) click to toggle source
# File lib/mij-discord/events.rb, line 76
def filter_match(key, field: key, on: :any, cmp: nil, &block)
  raise ArgumentError, 'No comparison function provided' unless cmp || block

  # @event_filters ||= superclass&.event_filters&.dup || {}
  filter = (@event_filters[key] ||= [])
  filter << FilterMatch.new(field, on, block || cmp)
end
inherited(sc) click to toggle source
# File lib/mij-discord/events.rb, line 92
def inherited(sc)
  filters = @event_filters&.dup || {}
  sc.instance_variable_set(:@event_filters, filters)
end

Public Instance Methods

inspect() click to toggle source
# File lib/mij-discord/events.rb, line 56
def inspect
  MijDiscord.make_inspect(self)
end
trigger?(params) click to toggle source
# File lib/mij-discord/events.rb, line 11
def trigger?(params)
  filters = self.class.event_filters

  result = params.map do |key, param|
    next true unless filters.has_key?(key)

    check = filters[key].map do |match|
      on, field, cmp = match.on, match.field, match.cmp

      is_match = case on
        when Array
          on.reduce(false) {|a,x| a || trigger_match?(x, param) }
        else
          trigger_match?(on, param)
      end

      next false unless is_match

      value = case field
        when Array
          field.reduce(self) {|a,x| a.respond_to?(x) ? a.send(x) : nil }
        else
          respond_to?(field) ? send(field) : nil
      end

      case cmp
        when :eql?
          value == param
        when :neq?
          value != param
        when :case
          param === value
        when Proc
          cmp.call(value, param)
        else
          false
      end
    end

    check.reduce(false, &:|)
  end

  result.reduce(true, &:&)
end

Private Instance Methods

trigger_match?(match, key) click to toggle source
# File lib/mij-discord/events.rb, line 62
def trigger_match?(match, key)
  case match
    when :any, :all
      true
    when :id_obj
      key.respond_to?(:to_id)
    when Class
      match === key
  end
end