Site search

Google
WWW を検索 backup-beta.blogspot.com を検索

2008年10月13日月曜日

訪問者を記録するスクリプト

今回は訪問者を記録するスクリプトです。
接触を調べて記録するようにしましたので、玄関マットやウェルカムマットなどに入れて使ってくださいね^^

オーナーがタッチすると訪問者リストを表示します。
同じアバターは最終訪問時間だけ残るようにしました。


リストは "時間","アバター名" のように記録してるので×2や÷2して調整してます^^;
50人記録するようにしましたが、あまり増やし過ぎるとリストが長くなったときにメモリエラー出てスクリプト止まります。Monoでコンパイルしたらかなり余裕でますけど、ダーッとたくさん表示されても見るの大変だと思うんですねw
// 訪問者を記録
integer max=50;  // 最大記録件数
list visitor;  // 来訪時刻とビジター記録用リスト

string get_time()
{
    integer t=(integer)llGetWallclock();  // 太平洋時間
    integer h=t/3600;  // 時
    integer m=(t%3600)/60;  // 分
    string hh=(string)h;  // 「時」を文字に変換
    if (h < 10) hh="0"+hh;  // 「時」が1桁だったら0を付ける
    string mm=(string)m;
    if (m < 10) mm="0"+mm;
    return hh+":"+mm;  // hh:mm でリターン
}

save_visitor(string name)
{
    integer i=llListFindList(visitor,[name]);  // リストから名前をサーチ
    if (i > -1) {  // リストに名前があったら
        visitor=llDeleteSubList(visitor,i-1,i);  // 時間と名前を削除
    }
    visitor+=[get_time(),name];  // リストに時間と名前を登録
    integer j=llGetListLength(visitor);  // リストの長さ
    if (j > max*2) {  // リストが最大記録数×2を超えたら
        visitor=llDeleteSubList(visitor,0,j-1-max*2);  // 古いほうから消す
    }
}

default
{
    collision_start(integer num)
    {  // 接触したら
        string name=llDetectedName(0);  // アバター名取得
        save_visitor(name);  // save_visitorへ
    }

    touch_start(integer total_number)
    {  // タッチ
        key agent=llDetectedKey(0);  // アバターのキー
        if (agent == llGetOwner()) {  // オーナーなら
            integer i;
            integer j=llGetListLength(visitor);  // リストの長さ
            llOwnerSay((string)(j/2)+" visitor(s).");  // 訪問者数表示
            for (i=0; i < j; i+=2) {  // リストから2つずつ読み出し(時間と名前)
                llOwnerSay(llList2String(visitor,i)+" "+llList2String(visitor,i+1));
            }
        }
    }
}

2009年3月18日23時25分頃追記: コメント頂きましたリストの長さ調整の部分の間違いを直しました。

2009年7月2日追記: リストの長さ調整ですが、llDeleteSubListよりllList2Listを使ったほうが感覚的にわかりやすそうなので、新しく作る製品にはllList2Listを使うようになりました。
visitor=llList2List(visitor,-max*2,-1);

4 件のコメント:

  1. はじめまして。 save_visitor(string name)のユーザ関数とても参考になりました。
    センサーでアバター名とアバターキーを1リストに保存、CSV変換してリンクメッセージ渡した後、llList2ListStridedで名前とキーを抽出するとか・・ホームセキュリティに応用しています。
    テストしててひとつ気がついた事がありました。
    if (j > max*2) { // リストが最大記録数×2を超えたら
    visitor=llDeleteSubList(visitor,0,j-2-max*2); // 古いほうから消す
    }
    この部分ですが、j-1-max*2 が正しいと思うんですがどうでしょう?

    返信削除
  2. はじめまして。。。ホントですね^^;;
    何かリストの調整って勘違いして、よく間違えてしまいます orz
    記事のほうも早速訂正いたしました。ご指摘ありがとうございました^^

    返信削除
  3. こんにちは、そして、初めまして千尋さん。数年前の記事ですが、こちらのスクリプト今でも使わせていただいています。^^ ところで、訪問者をチェックしているのですが、年月日と時間、一日ごとに、訪問者が記録されて、全部チェックできればいいのになって、思うのですが…。よかったら、検討していただけないでしょうか?宜しくお願いします。^^

    返信削除
    返信
    1. はじめまして。ご覧頂きありがとうございます。
      日付の取得関数はllGetDateがあるんですが、これって
      UTC(世界標準時)にしか対応してないんですよ。
      なので、SL時間(太平洋時間)や日本時間の日付に
      するには、自分で変換部分を書かなくてはいけなくて、
      スクリプトが長くなってややこしくなってくるんですよね。
      でもUTCでよかったら結構簡単な変更でできます。
      string get_time()内にある
      integer t=(integer)llGetWallclock(); // 太平洋時間
      の部分を
      integer t=(integer)llGetGMTclock(); // UTC時間
      に変えて
      return hh+":"+mm; // hh:mm でリターン
      の部分を
      return llGetDate()+" "+hh+":"+mm; // 日付 hh:mm でリターン
      に変えてください。
      これでUTC(世界標準時)になりますが、日付と時間が
      セットで表示されるようになります^^

      削除