Lingr APIで何か作る日記

Lingr APIを使って何か面白いものが作れないかと試行錯誤する日記です。
 | 

2007-02-12

WebブラウザからJSONPで部屋を覗く (observe)  WebブラウザからJSONPで部屋を覗く (observe) - Lingr APIで何か作る日記 を含むブックマーク はてなブックマーク -  WebブラウザからJSONPで部屋を覗く (observe) - Lingr APIで何か作る日記  WebブラウザからJSONPで部屋を覗く (observe) - Lingr APIで何か作る日記 のブックマークコメント

Railsからもらったsession, ticket, counterを使って、Webブラウザからroom.observeを呼び出します。ソースは下に載せておきます。要点だけ箇条書きで書いておきます。

  • timeoutSecondsを必ず指定すること。値はroom.enter戻り値の一つ、max_observe_timeよりも大きくする。(さっき試したら80秒だったので、余裕を持って120秒にしている)
  • onFailureはサーバとの接続に失敗したか、timeoutSecondsで設定した時間が経っても応答が無かった場合。
  • onSuccessはサーバから応答が返ってきた場合。応答の種類によって処理が異なる。
    • statusがokの場合: 誰かが発言したか、max_observe_timeの時間が過ぎたかのどちらか。後者の場合はjson.messagesが空になる。counterも進まない。
    • statusがfailの場合: sessionやticketの有効期限切れなど。たぶんそのままリクエストを再送しても無駄
  • console.logはFireBug用のデバッグログ。
  • このままだとJSONPでroom.observeを呼ぶたびに、headのscriptタグがどんどん増えていく。本当は呼び終わったらscriptタグを消すべし(やり方分からない。req.abort()を呼べばいい?)。

と言うわけで、onSuccessかつstatusが'ok'の場合のみに、リクエストを再送 (再びobserveLingr関数を実行) しています。さらに、messages配列存在する場合は、showMessage関数を呼び出してWebブラウザの画面にチャットの発言を表示します。

一応、これでJSONPを使ってLingr API経由でチャットを見られるようになりました。

var lingr_base = 'http://www.lingr.com/api';

function observeLingr() {
  var url = lingr_base + '/room/observe/';
  url += '?session=' + $F('session');
  url += '&ticket=' + $F('ticket');
  url += '&counter=' + $F('counter');
  url += '&format=json';
  new Ajax.Request(url, {
    method: 'get',
    transport: EspnScriptSrcTransport,
    jsonParamName: 'callback',
    timeoutSeconds: 120,
    onFailure: function(req, json) {
      console.log(req);
      console.log('connection error');
    },
    onSuccess: function(req, json) {
      if (json && json.status == 'ok') {
        if (json.messages) {
          showMessage(json.messages);
          $('counter').value = json.counter;
        }
        observeLingr();
      } else {
        // Error was returned by Lingr API
        console.log('response error');
      }
    }
  });
}

function showMessage(messages) {
  messages.each(function(message, index) {
    nickname = message.nickname.escapeHTML();
    text = message.text.escapeHTML();
    new Insertion.Bottom('messages', '<li>' + nickname + ':' + text + '</li>');
  });
}
 |