vistitortracker.lsl
///////////////////////////////////////////////////////////////////////////
//  Copyright (C) Wizardry and Steamworks 2014 - License: GNU GPLv3      //
//  Please see: http://www.gnu.org/licenses/gpl.html for legal details,  //
//  rights of fair usage, the disclaimer and warranty conditions.        //
///////////////////////////////////////////////////////////////////////////
 
///////////////////////////////////////////////////////////////////////////
//    Copyright (C) 2015 Wizardry and Steamworks - License: GNU GPLv3    //
///////////////////////////////////////////////////////////////////////////
string wasKeyValueGet(string k, string data) {
    if(llStringLength(data) == 0) return "";
    if(llStringLength(k) == 0) return "";
    list a = llParseStringKeepNulls(data, ["&", "="], []);
    integer i = llListFindList(llList2ListStrided(a, 0, -1, 2), [ k ]);
    if(i != -1) return llList2String(a, 2*i+1);
    return "";
}
 
///////////////////////////////////////////////////////////////////////////
//    Copyright (C) 2014 Wizardry and Steamworks - License: GNU GPLv3    //
///////////////////////////////////////////////////////////////////////////
integer elapsedDays(string date) {
    list age = llParseString2List(date, ["-"], []);
    list now = llParseString2List(llGetDate(), ["-"], []);
 
    integer ny = llList2Integer(now, 0);
    integer nm = llList2Integer(now, 1);
    integer nd = llList2Integer(now, 2);
 
    integer ay = llList2Integer(age, 0);
    integer am = llList2Integer(age, 1);
    integer ad = llList2Integer(age, 2);
 
    return ((ny / 4 - ny / 100 + ny / 400 + (367 * nm) / 12 + nd) + ny * 365 - 719499) -
        ((ay / 4 - ay / 100 + ay / 400 + (367 * am) / 12 + ad) + ay * 365 - 719499);
}
 
// updates the text on the tracker display
updateText(list v, list t, list a, list m) {
    llMessageLinked(LINK_ROOT, 204000, "V:" + (string)llGetListLength(v), "0");
    integer timeMean = llRound(llListStatistics(LIST_STAT_MEAN, tList));
    string s = "s";
    if(timeMean > 60) {
        timeMean = timeMean/60;
        s = "m";
        jump display;
    }
    if(timeMean > 3600) {
        timeMean = timeMean/3600;
        s = "h";
    }
@display;
    llMessageLinked(LINK_ROOT, 204000, "T:" + (string)timeMean + s, "1");
    llMessageLinked(LINK_ROOT, 204000, "A:" + (string)llRound(llListStatistics(LIST_STAT_MEAN, a)) + "d", "2");
    llMessageLinked(LINK_ROOT, 204000, "M:" + (string)llRound(llListStatistics(LIST_STAT_MEAN, m)) + "MB", "3");
}
 
// purges the lists if the memory is under a treshold
purgeMem(integer mem) {
    if (llGetFreeMemory() > mem) return;
    vList = llDeleteSubList(vList, 0, 0);
    tList = llDeleteSubList(tList, 0, 0);
    aList = llDeleteSubList(aList, 0, 0);
    mList = llDeleteSubList(mList, 0, 0);
}
 
list vList = [];
list tList = [];
list aList = [];
list mList = [];
list ageQuery = [];
 
default {
    state_entry() {
        string mode = wasKeyValueGet("mode", llList2String(llGetLinkPrimitiveParams(6, [PRIM_DESC]), 0));
        if(mode == "region") state region_scanning;
        if(mode == "sensor") state sensor_scanning;
    }
}
 
state sensor_scanning {
    state_entry() {
        integer range = (integer) wasKeyValueGet("range", llList2String(llGetLinkPrimitiveParams(6, [PRIM_DESC]), 0));
        llSensorRepeat("", "", AGENT, range, TWO_PI, 1);
    }
    no_sensor() {
        updateText(vList, tList, aList, mList);
    }
    sensor(integer num) {
        --num;
        do {
            key a = llDetectedKey(num);
            string name = llKey2Name(a);
            integer i = llListFindList(vList, (list)name);
            if(i != -1) {
                tList = llListReplaceList(
                    tList, 
                    [ llList2Integer(tList, i) + 1 ], 
                i, i);
                updateText(vList, tList, aList, mList);
                jump continue;
            }
            // free memory if necessary
            purgeMem(1024);
            ageQuery += [ llRequestAgentData(a, DATA_BORN) ];
            mList += llList2Integer(llGetObjectDetails(a,[OBJECT_SCRIPT_MEMORY]), 0)/1048576;
            vList += [ name ];
            tList += 1;
@continue;
        } while(--num>-1);
    }
    dataserver(key queryid, string data) {
        integer i = llListFindList(ageQuery, [queryid]);
        if(i == -1) return;
        ageQuery = llDeleteSubList(ageQuery, i, i);
        aList = llListReplaceList(aList, [elapsedDays(data)], i, i);
        updateText(vList, tList, aList, mList);
    }
}
 
state region_scanning {
    state_entry() {
        llSetTimerEvent(1);
    }
    timer() {
        // Get agents
        list as = llGetAgentList(AGENT_LIST_REGION, []);
        do {
            key a = llList2Key(as, 0);
            as = llDeleteSubList(as, 0, 0);
            string name = llKey2Name(a);
            integer i = llListFindList(vList, (list)name);
            if(i != -1) {
                tList = llListReplaceList(
                    tList, 
                    [ llList2Integer(tList, i) + 1 ], 
                i, i);
                updateText(vList, tList, aList, mList);
                jump continue;
            }
            // free memory if necessary
            purgeMem(1024);
            ageQuery += [ llRequestAgentData(a, DATA_BORN) ];
            mList += llList2Integer(llGetObjectDetails(a,[OBJECT_SCRIPT_MEMORY]), 0)/1048576;
            vList += [ name ];
            tList += 1;
@continue;
        } while(llGetListLength(as));
    }
    dataserver(key queryid, string data) {
        integer i = llListFindList(ageQuery, [queryid]);
        if(i == -1) return;
        ageQuery = llDeleteSubList(ageQuery, i, i);
        aList = llListReplaceList(aList, [elapsedDays(data)], i, i);
        updateText(vList, tList, aList, mList);
    }
    on_rez(integer num) {
        llResetScript();
    }
}

secondlife/visitors/visitor_tracker/tracker.txt ยท Last modified: 2022/11/24 07:46 by 127.0.0.1

Access website using Tor Access website using i2p Wizardry and Steamworks PGP Key


For the contact, copyright, license, warranty and privacy terms for the usage of this website please see the contact, license, privacy, copyright.