AsakusaSatellite はプラグインを作成することにより、 機能を拡張することができます。 以下の三種類の拡張方法があります。
ジェネレータが用意されています。
$ rails g as_filter フィルタ名
とすることで plugins/as_フィルタ名_filter に以下に以下のように生成されます。
フィルタの登録は config/filter_infra.yml で行います。 登録されたフィルタは、上から順番に適用されます。
- name: フィルタ名_filter
任意の名前で引数を与えることもできます。
- name: フィルタ名_filter
url: xxx
フィルタプログラムは AsakusaSatellite::Filter::Base を継承したクラスを作成し、 process メソッドを実装します。 (ジェネレータで生成した場合は lib/フィルタ名_filter.rb に生成されています。) フィルタ設定で与えた引数はAsakusaSatellite::Filter::Base を継承したクラスでは config 変数で保持しています。
class XxxFilter < AsakusaSatellite::Filter::Base
# メッセージを処理します
# text: メッセージの本文
# return: フィルタしたメッセージ
def process(text)
%[<a target="_blank" href="#{config.url}">#{text}</a>]
end
end
ビューフックは AsakusaSatellite のビュープログラムに あらかじめ設定されたフックポイントにプラグインからHTMLを 埋め込んで画面を拡張する仕組みです。
ビューフックを使用して画面を拡張するには AsakusaSatellite::Hook::Listener を継承したクラスを実装します。
AsakusaSatellite::Hook::Listener を継承したクラスはRailsの起動時に読み込まれ、 自動的に登録されます。
ジェネレータが用意されています。
$ rails g as_viewhook プラグイン名
とすることで plugins/as_プラグイン名 に以下に以下のように生成されます。
作成コマンドを発行し、プラグインのテンプレートを生成します。
ここでは test_listener とします
$ rails g as_viewhook test_listener
plugins/as_test_listener/lib/test_listener.rb を以下のように編集します。
class TestListener < AsakusaSatellite::Hook::Listener
def message_buttons(context)
if context[:message].body
context[:message].body.size.to_s + "文字"
else
"0文字"
end
end
end
リスナクラスでAsakusaSatelliteに設置されているフックポイント名と同名の メソッドを実装します(上記の例ではmessage_buttons) 。引数(context)はビューフックから 渡されてくるオブジェクトを保持するハッシュが渡されます。
フックポイントを調べるには、view の中で call_hook を呼んでいる 箇所を検索することができます。 具体的には、以下のコマンドが利用できます。
$ git grep call_hook app/views
現在のバージョンでは、以下のフックポイントが有効です。
plugins/<plugin>/app/assets/<type>/<filename> にファイルを配置すると、 /plugin/<plugin>/<type>/<filename> でアクセスできるようになります。
例えば plugins/as_hoge/app/assets/stylesheets/style.css にファイルを配置すると /plugin/as_hoge/stylesheets/sytle.css でアクセスできます。
AsaksuaSatellite へのログイン時の認証は OmniAuth を使用しています。 デフォルトではプロバイダとして Twitter の OAuth を利用していますが、プラグインを追加することで切り替えが可能となっています。
公開されている OmniAuth Strategy を利用することで、認証プラグインを作成することができます。
以下、プラグインの作成手順について説明します。
<AS_ROOT>/plugins ディレクトリの直下に任意のディレクトリを作成し、その直下に Gemfile を以下のとおり作成します。
gem 'omniauth-XXXX' # 利用する OmniAuth Strategy の gem
例えば、 Github の OAuth による認証 を利用する場合は以下のようになります。
gem 'omniauth-github'
<AS_ROOT> ディレクトリに移動し、以下のコマンドを入力して、依存 gem をインストールしなおします.
$ bundle install --path .bundle --without development test
<AS_ROOT>/config/settings.yml の “omniauth” の設定項目を修正して AsakusaSatellite で利用する認証を変更します。
omniauth:
provider: "プロバイダ"
provider_args:
- "引数1"
- "引数2"
- "..."
設定内容は以下の通りです。
例えば Github の OAuth による認証を利用する場合は以下のとおりとなります
omniauth:
provider: "github"
provider_args:
- "<Client ID>"
- "<Client Secret>"
provider と provider_args に渡す値については各 OmniAuth Strategy を参照してください。
AsakusaSatellite を再起動することで認証が切り替わります。
既存の OmniAuth Strategy を使用しているプラグインは以下の通りです。
OmniAuth Strategy を自作することが可能です。
独自 OmniAuth Strategy 作成の詳細については Strategy Contribution Guide を参照してください。
以下、プラグインの作成手順について説明します。
OmniAuth の規約にしたがって OmniAuth::Strategies モジュール以下にクラスを作成します。 <AS_ROOT>/plugins ディレクトリの直下に任意のディレクトリを作成し、lib/omniauth/strategies/mystrategy.rb を以下のように作成します。
module OmniAuth
module Strategies
class Mystrategy
include OmniAuth::Strategy
args [:arg1, :arg2] # provider_args で渡される引数
def request_phase
...
end
def callback_phase
...
end
info {
{:name => '....', :nickname => '....', :image => 'http://....'}
}
end
end
end
OmniAuth Strategy に従い、info で取得できる値を作成します。
AsakusaSatellite で使用する値は :name, :nickname および :image です。 それぞれの意味は以下の通りです。
AsakusaSatellite プラグインは、 app ディレクトリ以下に Rails の controller, view を独自に作成できるため、 request_phase メソッドの実装で独自に作成したページにリダイレクトすることにより、独自の認証フォームを作成することも可能です。
プラグインディレクトリの直下に init.rb ファイルを以下のように作成します。
require 'omniauth/strategies/mystrategy'
<AS_ROOT>/config/settings.yml の “omniauth” の設定項目を修正して AsakusaSatellite で利用する認証を変更します。
omniauth:
provider: "mystrategy" # Strategy 名
provider_args: # Strategy に渡す値
- "引数1"
- "引数2"
AsakusaSatellite を再起動することで認証が切り替わります。
独自 OmniAuth Strategy を使用しているプラグインは以下の通りです。
AsakusaSatellite は、UserScript が安全にクロスドメイン制約を回避できるようにするため、 window.postMessage を用いて各種イベントを通知します。
通知されるイベントは type, current, data の3つの情報を持っています。 current には現在の部屋の ID とユーザの ID が含まれます。 data の内容は type に応じて変化します。
type の種類と、data に含まれる情報は以下です。
以下のように message イベントに対してイベントハンドラを登録し、 イベント内の type の値で処理を切り替えてください。
window.addEventListener('message', function(e){
switch(e.data.type) {
case "create":
...
case "update":
...
}
});