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日追記: リッスン開始の直前に念のためリッスン破棄するよう修正しました。

0 件のコメント:

コメントを投稿