SendGridをゲームプラットフォームとして使ってみました

きっかけ

SendGridには多くのAPIがあって、どれをどういう風に使うのかがピンときていませんでした。で、自分含めそんな人向けに、SendGridのAPIをできるだけ多く使ってそれぞれの使い所をイメージしやすいモノを作ってみようと思いできあがったのがこのアプリケーションです。

できること

メールを介してオセロができます。
ソースコードはこちらで公開しています。

中で何をやっているか

こんな感じで動作します。

  • 0:アプリケーション初回起動時
    • Web API/Template Engine APIを使ってSendGridの設定を自動的に変更します。設定が自動化されると、設定手順をドキュメント化する手間が減って楽ですよね。
      • SendGrid上にTemplateを作成します
      • Event Notificationを設定してEvent Webhookを有効化します
      • Parse Webhookを設定、有効化します
      • Click Trackingを有効化します
  • 1:ゲームの開始
    • Parse Webhook機能に設定したアドレスにメール(件名に相手プレイヤーのアドレスを設定)を送るとSendGridは受信したメールを解析して、Reversi Web AppにPOSTします。POSTを受けたアプリケーションはMongoDB上にゲームデータを生成します。
    • アプリケーションはSendGrid経由で各プレイヤーにメッセージおよびゲームボードのメールを送ります。
  • 2:クリック
    • ゲームボードのメール上で石を置きたい場所をクリックすると、クリックイベントがSendGridからReversi Web AppにPOSTされます。ここではEvent WebhookとClick Tracking機能を使っています。
    • クリックイベントはGETでアプリケーションに直接アクセスしても良いのですが、Click Trackingは元URLを隠ぺいするので、今回のアプリではなりすましを防ぐ意味合いがあります。(本当は単に使いたかっただけで、理由は後付です)

テキストメール

このアプリでは、マルチパートでテキストメールにも対応しています。
対応してみてテキストメール死ねって思いました。


その他

Ruby

プログラミング言語を何にしようかと思いましたが、この人を見つけてRubyにしてみました。というわけで目下勉強中です。

Sinatra

RubyでWebフレームワークと言えばRailsですが、Railsの入門書読んでて眠くなったのでSinatraで作ってみました。

MongoDB

MongoDBをちゃんと使ったことがなかったので使ってみました。代わりにSQLiteでもいいと思います。MongoDBだとSQLが使えないので、ちょっと学習する必要はありますが、オブジェクトをそのまま保存できるので、シンプルでコード量を減らせます。実際、楽でした。

RSpec

テストフレームワークとしてrspecとrack-testを使ってみました。RubyのWebフレームワークでテストと言えばこのあたりが一般的なんですかね?ググったらいっぱいヒットしたので使ってみました。よくわかりませんが。

Travis-CI

「今どきCIツールは普通に使うよね」ってぐらいの空気を感じるのでとりあえず使ってみました。GitHubにpushするとテストして結果を通知するだけです。しかし、JenkinsとかTravis-CIってなんでヒゲのオッサンなんでしょうね。どうせ2次元にするなら女の子にした方がいいと思います。

sendgrid_ruby

一応、お仕事で作ったライブラリを有効活用できました。たまたまです。

sendgrid_template_engine_ruby

Rubyの練習用に作ったライブラリを有効活用してみました。これもたまたまです。使ってみてはじめて「こんな使い方をするんだなぁ」って認識しました。

さいごに

こんなのでAPIの使い所が伝わったのでしょうか?よくわかりませんが。公開してみて嬉しかったのが、GitHubでStarを付けてくれたのがGridderばかりということでした。
今回、色々はじめてのことが多かったので、自分の中で再利用できるようにそれぞれ個別のネタとして記事をまとめていこうと思います。とりあえず、今回はこの辺で。

コメント

このブログの人気の投稿

Execノードを使う

Joinノードを使う(その4)

SendGridのX-SMTPAPIヘッダの使い方(Section Tags、Substitution Tags編)