class Scorecard::Subscriber

Public Class Methods

attach_to(suffix) click to toggle source
# File lib/scorecard/subscriber.rb, line 2
def self.attach_to(suffix)
  subscriber = new
  subscriber.public_methods(false).each do |event|
    next if event.to_s == 'call'

    ActiveSupport::Notifications.subscribe "#{event}.#{suffix}", subscriber
  end
end

Public Instance Methods

badge(event) click to toggle source
# File lib/scorecard/subscriber.rb, line 16
def badge(event)
  Scorecard::Badger.update event.payload[:user]
end
call(message, *args) click to toggle source
# File lib/scorecard/subscriber.rb, line 11
def call(message, *args)
  method = message.split('.').first
  send method, ActiveSupport::Notifications::Event.new(message, *args)
end
points(event) click to toggle source
# File lib/scorecard/subscriber.rb, line 20
def points(event)
  rule = Scorecard.rules.find event.payload[:context]
  return if rule.nil?

  event.payload[:amount]     ||= rule.amount
  event.payload[:identifier] ||= event.payload[:gameable].id
  event.payload[:user]       ||= event.payload[:gameable].user

  return unless rule && rule.allowed?(event.payload)

  point = Scorecard::Point.create(
    event.payload.slice(:context, :amount, :identifier, :user, :gameable)
  )
  ActiveSupport::Notifications.instrument(
    'scorecard', user: event.payload[:user]
  ) if point.persisted?
end
progress(event) click to toggle source
# File lib/scorecard/subscriber.rb, line 38
def progress(event)
  Scorecard.progressions.each do |progression|
    if progression.check.call event.payload[:user]
      progress = Scorecard::Progress.create(
        user: event.payload[:user], identifier: progression.identifier
      )

      ActiveSupport::Notifications.instrument(
        'progress.scorecard', user: event.payload[:user]
      ) if progress.persisted?
    else
      progresses = Scorecard::Progress.for_user(event.payload[:user]).
        for_identifier(progression.identifier)
      progresses.each &:destroy

      ActiveSupport::Notifications.instrument(
        'progress.scorecard', user: event.payload[:user]
      ) if progresses.any?
    end
  end
end