2009年12月29日火曜日

オートアップデートのスクリプト

うちの製品のアップデートはラッキーレターだけ実験的にタッチでアップデート品が届くシステムを店舗に置いてるんですね。このシステムはお客様データベース(バージョンアップの度に私がお名前を手動で入力してるんですがw)にアクセスしてアバター名が登録されてたらサーバーから商品配送するようになってるんですよ。でも、まあ入力が面倒で、時々ミスで抜けてたりすることもあるし、お客様には来店してもらう必要があるので、自動アップデートに切り替えようかなって思ってます^^;

普通に利用されてるアップデートシステムはRezのときメールでチェックするようなのが多いと思います。llEmailのページに出てるサンプルみたいなスクリプトですね。
ただ、サーバーをテイクしたり手違いとかで持ち物に返却になってしまうと、サーバーのUUIDキーが無効になって既にお客様の手に渡った製品からは二度と利用できなくなるので、私は採用しようって気になりませんでしたが^^;

でも今回は同じようにメールを使ったシステムで、製品バージョンが1.5.4みたいなフォーマットに対応したものを何となく書いてテストしたので載せますね。

アップデートサーバーです。設置して運用開始したら絶対にテイクしないでくださいw
// アップデートサーバー
list product=[ // "製品名","version",
"Drink vendor","1.10",
"Skybox","1.0.2",
"Open car","1.0.15",
NULL_KEY];

default
{
    state_entry()
    {  // 10秒毎のタイマー
        llSetTimerEvent(10);
    }

    timer()
    {  // メールチェック
        llGetNextEmail("","");
    }

    touch_start(integer total_number)
    {
        if (llDetectedKey(0) == llGetOwner()) {  // オーナーがタッチしたら
            integer i;
            integer j=llGetListLength(product)-1;
            string item;
            // コンテンツ内チェック
            for (i=0; i < j; i+=2) {
                item=llList2String(product,i);
                if (llGetInventoryType(item) == INVENTORY_NONE) llOwnerSay(item+" - not found.");
            }
            // サーバーのキー
            llOwnerSay("Server key: "+(string)llGetKey());
        }
    }

    email(string time, string address, string subject, string message, integer num_left)
    {
        list l=llParseString2List(subject,[",","."],[]);  // subjectを分割してリストに格納
        key id=llList2Key(l,0);  // お客様のキー
        string item=llList2String(l,1);  // 製品名
        integer i=llListFindList(product,[item]);  // 製品リストチェック
        if (~i) {  // リストにあったらバージョンチェック
            list ver=llParseString2List(llList2String(product,i+1),["."],[]);
            integer j=llGetListLength(ver);
            for (i=0; i < j; i++) if (llList2Integer(ver,i) > llList2Integer(l,i+2)) i=j+1;
            if (i > j) {  // 新バージョンが出てたら
                if (llGetInventoryType(item) != INVENTORY_NONE) {
                    llInstantMessage(id,"New version "+item+" available.");  // おニューがあるです!
                    llGiveInventory(id,item);  // 送付
                }
            }
        }
        if (num_left) llGetNextEmail("","");  // 次のメールチェック
    }
}

タッチするとコンテンツ内のチェック(リストの製品が入ってないとき表示)とサーバーのキーを表示します。サーバーキーはクライアントスクリプトに記入して製品に組み込んでください。
そして、製品がバージョンアップしたときは、コンテンツの製品を新しいものに入れ替えて、リストの製品のバージョンを変更してからタッチで一応チェックします。

レンタルやプライベートアイランドだと地主の都合でいつ無くなるかも知れないので、メインランドの自分名義の土地に置くのが一番いいでしょうね。

クライアントです。
// アップデートクライアント
key server="サーバーUUIDキー";  // アップデートサーバーのキーを記入
string name="Drink vendor";  // 製品名
string ver="1.10";  // バージョン

default
{
    on_rez(integer start_param)
    {  // 持ち物から出したら
        string addr=(string)server+"@lsl.secondlife.com";  // サーバーのメールアドレス
        llEmail(addr,(string)llGetOwner()+","+name+","+ver,"");  // メール送信
    }
}

クライアントスクリプトはアップデート対象製品(もちろんコピー可、譲渡不可)に組み込みますが、llEmailは20秒もスクリプトが止まるので、他のスクリプトがある場合はマージせずに別のスクリプトにして入れたほうががいいですね。スクリプトのパーミッションは修正不可、コピー可、譲渡不可にしてください。

0 件のコメント:

コメントを投稿