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