2018年7月24日火曜日

L$ Exchange Rate Board V1.1.0

L$ Exchange Rate Boardなんですが、2週間前ぐらいから動作してないことに気が付きました。そのときは、サーバーが調子悪いんじゃないかな?って思って、きっと数日後にはケロッと直ってるはず!って期待してたんですよ。でも1週間過ぎても直らないので、もう流石に知らないふりはできないなって思い始めて、色々と調べてみると原因はllHTTPRequestに関わるバグで、もう1ヶ月か2ヶ月くらいバグ修正されてないみたいでした。#BUG-216320

簡単に書くと、現時点で下記みたいにllHTTPRequestからSLのライブデータフィードを取得しようとすると499エラーが出ます。
// 取得するライブデータフィードURL
string url="http://secondlife.com/httprequest/homepage.php";

default
{
    touch_start(integer total_number)
    {
        key id=llDetectedKey(0);  // タッチしたアバターのキー
        if (id == llGetOwner()) {  // それがオーナーなら
            llHTTPRequest(url, [], "");  // HTTPリクエスト実行
        }
    }

    http_response(key request_id, integer status, list metadata, string body)
    {  // HTTPレスポンス
        if (status == 200) {  // 正常(ステータスコードが200)なら
            llOwnerSay(body);  // データ内容を表示
        }
        else {  // エラーのときはエラー番号を表示
            llOwnerSay("エラー HTTP status "+(string)status);
        }
    }
}

SL公式のデータフィードがインワールド内からゲットできなくなるなんて想定外だったので、現バージョン(当装置にはバージョン表記ないですけど一応V1.0.0かな?)のL$ Exchange Rate Boardはエラーも出さなくて、全くうんともすんとも言わない有様です^^; ちなみにライブデータフィードは普通にウエブブラウザで開くとエラーもなく開けるんですよ。なので外部サーバーを経由させてデータを取得するように改造しました。。。わざわざ外部サーバー使うって、何かバカみたいなんですけどねw まあエラー出たときだけ外部サーバーに頼るって感じの改良です。

今までにL$ Exchange Rate Boardをお買い上げ頂いたお客様には既にV1.1.0をお送りました。もし受け取れなかったお客様は再送しますのでご連絡くださいね。

2018年7月1日日曜日

名前からアバターキーを取得するスクリプト

ずっと存在しなかったアバター名からアバターキーを得る関数が最近できてたので、今回はそれを使ったスクリプトを書いてみました。昔は名前からアバターキーを調べるために、外部サーバーを併用するなどしてSLの検索などからHTMLデータを取得してキーを切り出すっていう面倒な方法しかなかったので便利ですよね。んー、ただ私はこの関数、プライバシーとかの関係で実装されてないのかなって勝手に思ってたんですけど、今頃になって実装されたってことはそうでもなかったんでしょうかね?w

新しく実装された関数はllName2KeyllRequestUserKeyです。llName2KeyはllKey2Nameと同様データサーバーを通さないので、同一SIM内かその周囲数m以内に対象アバターがいないと値が得られないんだと思います。。。ってことは名前からキーを割り出すっていう場面では、この関数ってあまり使い道なくないですかね?www

そういうことでllRequestUserKeyの方を使って、早速アバターキーを取得するスクリプトを書いてみました。

// アバター名からアバターキーを取得

integer ch=5;  // チャット入力に使うチャンネル番号
integer listen_handle;  // リッスン関数を扱うための変数
key query;  // データ問い合わせ用変数

listen_end()
{  // チャット受信またはタイムアウト時の処理
    llListenRemove(listen_handle);  // リッスンを破棄
    llSetTimerEvent(0);  // タイマー停止
}

default
{
    touch_start(integer total_number)
    {
        key id=llDetectedKey(0);  // タッチしたアバターが
        if (id == llGetOwner()) {  // オーナーなら
            llOwnerSay("「/"+(string)ch+" アバター名」でキーを検索します。");
            llListenRemove(listen_handle);  // 一応リッスンを破棄して
            listen_handle=llListen(ch, "", NULL_KEY, "");  // リッスン開始
            llSetTimerEvent(60);  // タイマー60秒
        }
    }

    timer()
    {  // 指定時間が経過したら
        listen_end();  // listen_endへ
        llOwnerSay("時間切れです><");
    }

    listen(integer channel, string name, key id, string msg)
    {  // チャットを受信
        if (channel == ch) {  // 設定したチャンネル番号なら
            listen_end();  // listen_endを処理して
            query = llRequestUserKey(msg);  // アバターキー問い合わせ
        }
    }

    dataserver(key queryid, string data)
    {
        if (queryid == query) {  // 問い合わせたデータを取得したら
            llOwnerSay("アバターキー "+data);  // アバターキーを表示
        }
    }
}

オーナーがタッチして「/5 アバター名」をチャットで入力するとアバターキーを表示します。入力するアバター名はユーザーネームでもレガシーネームでもオッケーみたいです。

7月3日追記: リッスン開始の直前に念のためリッスン破棄するよう修正しました。