2010年4月8日木曜日

プロフ写真を展示するスクリプト

昨年12月くらいにアバタープロフィールのウェブページが仕様変更されたんですが、そのときの変更に対応したプロフィール写真を表示するスクリプトを書いてみました。

変更当時は古いスクリプトだとプロフによってはデータが取得できない不具合が出てたんですが、その後、古いスクリプトも問題出ないよう修正されたので、一昨年書いたプロフ写真を表示するスクリプトとかでも取得は可能なんですけどね^^;

仕組みは http://world.secondlife.com/resident/アバターキー にアクセスして、ページのヘッダ部分にある <meta name="imageid" content="テクスチャUUID" /> の部分からテクスチャのキーを取得します。

今回は少し長くなりますが、タッチでダイアログを出して許可もらったときだけ表示するようにしてみました。本人に無断で表示しちゃうのは良くないと思うのでw
// プロフ写真展示

integer face=0;  // 表示する面の番号
integer ch;
key http_req;

default
{
    state_entry()
    {
        llSetTexture(TEXTURE_BLANK,face);  // テクスチャをブランク
        ch=llCeil(llFrand(2147483646));  // チャットチャンネル用乱数発生
        llListen(ch,"",NULL_KEY,"");  // リッスン開始
    }

    on_rez(integer start_param)
    {  // 持ち物から出したら
        llResetScript();  // リセット
    }

    touch_start(integer total_number)
    {
        key id=llDetectedKey(0);  // タッチしたアバターのキー
        if (id) {
            llDialog(id,"May I display your photo?",["No problem","No thanks"],ch);  // ダイアログで質問する
        }
    }

    listen(integer channel, string name, key id, string msg)
    {
        if (channel == ch) {
            if (msg == "No problem") {  // いい返事もらったら
                http_req=llHTTPRequest("http://world.secondlife.com/resident/"+(string)id,[],"");  // プロフのウェブページをHTTPリクエスト
            }
        }
    }

    http_response(key request_id, integer status, list metadata, string body)
    {
        if (request_id == http_req)
        {
            if (status == 200) {  // プロフが取得できたら
                string str="<meta name=\"imageid\" content=\"";  // この文字列を探す
                integer i=llStringLength(str);
                integer j=llSubStringIndex(body,str);
                if (~j) {  // 見つけたらUUIDをstrに代入
                    str=llGetSubString(body,j+i,-1);
                    j=llSubStringIndex(str,"\"");
                    str=llGetSubString(str,0,j-1);
                    if ((key)str) {  // UUIDキーがOKだったら
                        llSetTexture(str,face);  // 写真表示
                        string name=llGetSubString(body,llSubStringIndex(body,"<title>")+7,llSubStringIndex(body,"</title>")-1);  // アバター名取得
                        if (name) llWhisper(0,"Displayed "+name+"'s photo.");  // ○○の写真を表示しますた^^
                    }
                    else llWhisper(0,"No image.");  // 写真が見つからない><
                }
                else llWhisper(0,"Error, hidden profile in search?");  // 検索で非表示になってる><
            }
            else {
                llWhisper(0,"Error, status "+(string)status+". Can't get data.");  // ウェブページ取得エラー
            }
        }
    }
}

写真を貼ってないプロフはテクスチャのUUIDキーにヌルキーが入ります。また検索にチェック入れてないプロフは <meta name="imageid" content="テクスチャUUID" /> のタグがありません。

ウェブからデータ取得するのはグループ記章も同じ要領でできますね。グループのURLは http://world.secondlife.com/group/グループキー になります^^

4月22日追記: タッチってあまりしてもらえないと思うので、レーダーみたいにセンサーイベントを組み込んだり、ウェルカムマットとかと通信させて連動するようにしたほうがいいかもですね。

7月9日追記: また仕様変更があって、もう古い方法は使えなくなったみたいです。

0 件のコメント:

コメントを投稿