Site search

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

2009年3月19日木曜日

メッセージを数件記録するスクリプト

タッチした後、チャットで打ったメッセージを記録するスクリプトを考えてみました。記録したメッセージの読み出しは誰でもできます。最初はオーナーのみ読み出し可能にしようかなって思ったんですが、それだったら普通にIMでOKなんじゃないかなって感じになってきたので変更したんですよw

タッチしてチャットすると、チャット内容をリストに記録します。内容を表示するときはチャットのときmsgって入力すると表示するようにしました。(制限時間120秒)

リストには [ 時間+アバター名, チャット内容 ] のように2つずつ記録するようにしました。1つにまとめた方がスマートなんですけど、そうするとチャットできる文字数(バイト数?)いっぱいまで表示できなくなるので分割したんですね。


キー型の変数userは、タッチしたアバターのキーを入れて、使用中かどうかを判断するのに使ってます。スクリプトできてから、これブーリアン型で良かったのにって思ったんですけどね^^;
// メッセージを記録
list msglist;  // 記録用リスト
key user=NULL_KEY;  // 使用チェック用
integer time=120;  // 制限時間
integer listen_handle;
integer max=10;  // 最大記録数
string cmd="msg";

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 でリターン
}

default
{
    touch_start(integer total_number)
    {
        key id=llDetectedKey(0);  // タッチしたアバターのキー
        if (user == NULL_KEY) {  // 使用中でないとき
            user=id;  // userにキーを設定
            llSay(0,"Say '"+cmd+"' to read messages, or say message to save your message. (timeout "+(string)time+" seconds)");
            listen_handle=llListen(0,"",id,"");  // リッスン開始
            llSetTimerEvent(time);  // タイマー始動
        }
    }

    timer()
    {  // 時間切れになったときの処理
        llSetTimerEvent(0);  // タイマー停止
        llListenRemove(listen_handle);  // リッスン中止
        user=NULL_KEY;  // userにヌルキーを設定
        llSay(0,"Timeup! Touch and say again.");  // 時間切れです
    }

    listen(integer channel, string name, key id, string msg)
    {
        llSetTimerEvent(0);  // タイマー停止
        llListenRemove(listen_handle);  // リッスン中止
        user=NULL_KEY;  // userにヌルキー
        if (msg == cmd) {  // 読み出し
            integer i;
            integer j=llGetListLength(msglist);  // リストの長さ
            llSay(0,"--- Max "+(string)max+" saved message(s). ---");
            for (i=0; i < j; i+=2) {
                llSay(0,llList2String(msglist,i));  // 時間、名前
                llSay(0,llList2String(msglist,i+1));  // メッセージ
            }
            llSay(0,"----------------------------------------");
        }
        else {  // 記録
            msglist+=["["+get_time()+"] "+name+": ",msg];  // リストに時間と名前、メッセージを登録
            integer i=llGetListLength(msglist);  // リストの長さ
            if (i > max*2) {  // リストが最大記録数×2を超えたら
                msglist=llDeleteSubList(msglist,0,i-1-max*2);  // 古いほうから消す
            }
            llSay(0,"Saved your message.");
        }
    }
}

リストや時間の部分の処理は訪問者を記録するスクリプト http://backup-beta.blogspot.com/2008/10/blog-post_4583.htmlと同じです^^;

0 件のコメント:

コメントを投稿