ソラマメブログ

2009年04月28日

インワールドからWebサーバへポーリング

さて、今のクリエモンには、配布先を一覧できるページがあったりします。非常にみつけにくいところにありますが・・・。
配布場所一覧

でも、配布場所は今1カ所しかないので、HTMLにベタ書きで書いてあるんですね。これが、次のクリエモンでは、複数のベンダーがWebサイトにポーリングして、常に最新の配布先一覧を表示できるようになります。今日は、そのやり方を書いてみます。

まず、LSL側のコードです。llSetTimerEventで、1時間毎に、llHTTPRequestを実行してます。バージョン情報を渡したくて、GETのクエリで渡そうかとも思いましたが、何となくPOSTにしました・・・。

default
{
state_entry()
{
llSetTimerEvent(60 * 60);
}

timer()
{
llHTTPRequest("http://www.creamon.net/○○○", [HTTP_METHOD, "POST", HTTP_MIMETYPE, "application/x-www-form-urlencoded"], "version=TU");
}
}

余談ですが、今のクリエモンを持っていって頂いた方はクリエモンの名前が「Creamon Ver.ST」になっていたのにお気づきかと思います。このSTは、「先行テスト版」の略なんです、気づきました? さらに前のバージョンでOT→「お試し版」というのを配布してた時期もあります。上記コードでは、バージョンTUとなってますね。正式版のバージョン名が推測できるかもしれませんね^^

次は、サーバ側です。何回か書いてるとおり、サーバ側はC#で書いてます。

// 生のヘッダ文字列を取得
string region = Request.Headers["X-SecondLife-Region"];
string position = Request.Headers["X-SecondLife-Local-Position"];

// versionが古ければ、格納しない
string version = Form["version"].Trim();
if (!version.Equals(VersionConst.CURRENT)) { return; }

// Sim名取得
region=region.Substring(0, region.IndexOf("(")).Trim();

// Position取得
position = position.Replace("(", "").Replace(")", "").Replace(" ", "");
string[] positionMembers = position.Split(',');
positionMembers = Array.ConvertAll<string, string>
(positionMembers, new Converter<string, string>
(delegate(string s)
{
    return Math.Round(double.Parse(s)).ToString();
}
    )
);
position = string.Join("/", positionMembers);


// memcachedに登録する処理
(省略)

先頭で、セカンドライフから送られてきたヘッダから、RegionとPositionの情報を取得しています。ヘッダの詳しい情報は、WikiのllHTTPRequestのページにのってます。

つづいてバージョン情報を取得しますが、ここで定数で定義してある現在のバージョンと等しいかチェックして、異なる場合は処理を終了してます。古いバージョンがいつまでも残らないための対策というわけです。

Sim名は、「Jin Ho (264448, 233984) 」みたいな情報が入ってくるので、SubStringで「(」から後を消してから、Trimで一応スペースを削除してます。Positionは、「(173.009827, 75.551231, 60.950001)」みたいな形式でくるので、かっこやスペースを消して、カンマで分割後、それぞれをMath.Round関数で整数に四捨五入。どうせURLにしか使わないので、最後に「/」を区切り文字にして連結してます。ここは、匿名メソッドを使ってます。あんまりこういう書き方はしないので分かりにくいかもしれません。

無事解析が済んだら、各情報をmemcachedに格納しています。本来はDBやファイルなどに格納した方が消えなくてよいのですが、テーブル定義がめんどくさかったので、memcachedに格納することにしちゃいました( ̄∇ ̄) まあ、消えても1時間後には復活しますしね。

表示時には、これらの情報から、SLURLを生成する必要があります。StringBuilderを使って、こんな感じでやってます。

StringBuilder("http://slurl.com/secondlife/")
.Append(HttpUtility.UrlEncode(Region))
.Append("/")
.Append(Position)
.ToString();
2009/07/21追記:2行目は「.Append(Uri.EscapeDataString(Region))」が正解でした。詳しくは、「クリエモン、URLエンコード周りのバグを修正しました」をご覧ください m(_ _)m

注意点としてはSim名にはスペースが入ることがあるので、URLエンコードが必要なことくらいですね。

SLとWebの連動にはいろんな可能性がありそうですよね。最近は、PHPとLSLが連携する商品が普通に出てくるようになりましたし、これからもあっと驚くようなものが出てくるかもしれませんね(^^)



同じカテゴリー(LSL)の記事画像
オブジェクトのコンテンツに自分自身を入れて再帰Rezしたい
Babbage Linden さんが来ました
LSLCon2008 開幕
LSL-Editorでユーザ定義変数も補完する
ホーミング弾の作り方
パーティクル小ネタ
同じカテゴリー(LSL)の記事
 LSLのC#実装は凍結らしいです (2010-07-02 03:23)
 LSLに導入されるC#ってバージョン1.0の予定なの? (2010-06-27 14:26)
 Eclipse+VrapperでのLSL開発 (2010-02-20 22:55)
 Web連携するときのオブジェクトの識別子 (2009-08-15 17:55)
 オブジェクトのコンテンツに自分自身を入れて再帰Rezしたい (2008-12-17 01:55)
 Babbage Linden さんが来ました (2008-10-25 01:17)

Posted by sabro at 23:50│Comments(0)LSL
上の画像に書かれている文字を入力して下さい
 
<ご注意>
書き込まれた内容は公開され、ブログの持ち主だけが削除できます。