Courier

Давным давно, в одной далекой-предалекой галактике, был такой модем USR Courier, он хорошо держал карриер и был мечтой каждого фидошника. А сейчас чтобы получать много не нужных писем достаточно зарегистрироваться на еще одной социальной сети.

Чтобы помочь социальной сети справиться с большим количеством видов подписок и оповещений, а пользователю настроить способы их доставки мы разработали плагин Courier. Courier On Rails.

Courier - Система управления пользовательскими оповещениями и подписоками.

Установка

Gemfile:

gem 'courier'

Создание миграции и конфигцарции ./config/initializers/courier.rb

rails g courier

rake db:migrate

В config/initializers/courier.rb регистрируем используемые сервисы, шаблоны и их значения по умолчанию:

Courier.init do |d|
  d.services                       :active_mailer, :gritter_notice, :facebook
  d.template :import_complete,     :off,           :on,              :off
  d.template :avatar_loaded,       :on,            :off,             :disabled
  d.template :weekly_subscription, :on,            :on,              :disabled
end

Где :on и :off это значения по умолчанию, а :disabled - полный запрет на установку этого параметра пользователем (:off по умолчанию)

В модели пользователя:

class User << ActiveRecord::Base
  has_courier
  ...

Использование

Посылаем пользователю сообщение по шаблону <tt>:import_complete<tt> во все разрешенные сервисы

user.message :import_complete, {:some=>'arguments in hash'}

Если сервис отправляет сообщение в реальном времени, то он его уже отправил, а если сообщения собираются для дальнейшей отправки, то осуществляется эта доставка так:

Courier.deliver_all! # Запускает доставку по всем сервисам

Для каждого сервиса можно запускать доставку отдельно:

Courier.service(:facebook).deliver_all!

Персональные настройки

У каждого пользователя есть персональные настройки для матрицы шаблон-сервис. По умолчанию они такие, какие указаны в Courier.init Установить собственное значение можно так:

user.courier.set(:import_complete, :facebook, :on)  # или :off

Где :import_complete - название шаблона, а :facebook название сервиса.

Узнать значение:

user.courier.get(:import_complete, :facebook)  # Вернет :on или :off
user.courier.enabled?(:import_complete, :facebook) # Вернет true или false

Сервисы

На данный момент реализованы сервисы:

  • Courier::Service::GritterNotice - отправка сообщений через gritter_notices

  • Courier::Service::ActionMailer - TODO

  • Courier::Service::MailChimp - TODO

  • Courier::Service::Facebook - Использует Koala

Свой сервис

Все сервисы наследуютсяо от Courier::Service::Base. Последнее имя класс автоматически становится именем этого сервиса через demodulize.underscore. Всего нужно имплементировать 2 метода:

  • message(owner, template, args)

  • deliver!

Сервис отложенной отправки

Достаточно реализовать метод deliver_all! или deliver_message, так как message удачно складывает все сообщения в базу. Например:

def deliver_all!
  messages.fresh.each do |message|
    send_message_my_way(message.owner, message.text) and message.mark_as_delivered!
  end
end

или

def deliver_message(message)
  send_message_my_way(message.owner, message.text)
  # returns true to mark message as delivered
end

Сервис отправки в реальном времени

Достаточно реализоват метод message. Например:

def message(owner, template, args)
  send_message_my_way owner, template.get_text(args)
end

Contributing to courier

  • Yes, please.

Copyright © 2011 Danil Pismenny.