433 lines
No EOL
11 KiB
Text
433 lines
No EOL
11 KiB
Text
|
|
string DecipherService(string payload, string ident)
|
|
{
|
|
if(llJsonValueType(payload,[ident]) == JSON_INVALID)
|
|
{
|
|
return "";
|
|
}
|
|
|
|
return llJsonGetValue(payload, [ident,"protocol"]) + "://" + llJsonGetValue(payload,[ident,"host"]) + ":" + llJsonGetValue(payload,[ident,"port"]);
|
|
}
|
|
|
|
ReadAPIServer(string payload) {
|
|
API_SERVER = DecipherService(payload, "api" ) + "/zni";
|
|
}
|
|
|
|
initBasicSupport()
|
|
{
|
|
g_lSupport = [RED_QUEEN, R_ADMIN|R_DEVELOPER|R_SUPPORT,
|
|
ARIA, R_ADMIN|R_DEVELOPER|R_SUPPORT
|
|
];
|
|
}
|
|
|
|
integer checkSupportUser(key kID, integer minAccessRights)
|
|
{
|
|
integer iIndex=llListFindList(g_lSupport, [(string)kID]);
|
|
if(iIndex!=-1)
|
|
{
|
|
integer iMask = (integer)llList2String(g_lSupport, iIndex+1);
|
|
if(iMask & minAccessRights)
|
|
{
|
|
return TRUE;
|
|
}else return FALSE;
|
|
}
|
|
return FALSE;
|
|
}
|
|
|
|
checkSupport()
|
|
{
|
|
UpdateDSRequest(NULL, llHTTPRequest(API_SERVER + "/Get_Support.php", [], ""), SetDSMeta(["get_support"]));
|
|
}
|
|
|
|
parseSupport(string sValue) {
|
|
list lParse = llParseString2List(sValue, [";;", ";"], []);
|
|
g_lSupport = llParseString2List(llList2String(lParse,1), ["~"], []);
|
|
}
|
|
|
|
string MakeTimeNotation(integer iSec)
|
|
{
|
|
integer iDifference = iSec;
|
|
|
|
integer Days = iDifference/ONE_DAY;
|
|
iDifference -= (ONE_DAY*Days);
|
|
integer Hours = iDifference/60/60;
|
|
iDifference -= (Hours*60*60);
|
|
integer Minutes = iDifference/60;
|
|
iDifference -= (Minutes*60);
|
|
|
|
list lItem = [Days,"d", Hours, "h", Minutes, "m", iDifference, "s"];
|
|
return llDumpList2String(lItem, "");
|
|
}
|
|
string MakeTimeNotationFloated(float iSec)
|
|
{
|
|
float iDifference = iSec;
|
|
|
|
integer Days = llRound(iDifference/ONE_DAY);
|
|
iDifference -= (ONE_DAY*Days);
|
|
integer Hours = llRound(iDifference/60/60);
|
|
iDifference -= (Hours*60*60);
|
|
integer Minutes = llRound(iDifference/60);
|
|
iDifference -= (Minutes*60);
|
|
|
|
list lItem = [Days,"d", Hours, "h", Minutes, "m", llRound(iDifference), "s", llRound((iDifference - llRound(iDifference))*1000), "ms"];
|
|
return llDumpList2String(lItem, "");
|
|
}
|
|
|
|
// Returns in the same format as Make: Days, Hours, Minutes, Seconds, TotalSeconds
|
|
list ParseTimeNotation(string sNotation)
|
|
{
|
|
integer Days;
|
|
integer Hours;
|
|
integer Minutes;
|
|
integer Seconds;
|
|
integer TotalSec;
|
|
|
|
list lTmp = llParseString2List(llToLower(sNotation), [], ["d", "h", "m", "s"]);
|
|
integer i = 0;
|
|
integer end = llGetListLength(lTmp);
|
|
for(i=0;i<end;i+=2)
|
|
{
|
|
string sNote = llList2String(lTmp,i+1);
|
|
integer iSeg = (integer)llList2String(lTmp,i);
|
|
switch(sNote)
|
|
{
|
|
case "d":
|
|
{
|
|
Days = iSeg;
|
|
break;
|
|
}
|
|
case "h":
|
|
{
|
|
Hours = iSeg;
|
|
break;
|
|
}
|
|
case "m":
|
|
{
|
|
Minutes=iSeg;
|
|
break;
|
|
}
|
|
case "s":
|
|
{
|
|
Seconds = iSeg;
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
|
|
|
|
TotalSec += Seconds;
|
|
TotalSec += (Minutes*60);
|
|
TotalSec += (Hours*(60*60));
|
|
TotalSec += (Days*((60*60)*24));
|
|
return [Days, Hours, Minutes, Seconds, TotalSec];
|
|
}
|
|
|
|
key decodeAvatarInput(string sInput, string sExtra)
|
|
{
|
|
if(IsLikelyAvatarID(sInput))
|
|
{
|
|
return (key)sInput;
|
|
}else {
|
|
list lParts = llParseString2List(sInput, ["/"],[]);
|
|
if(llList2String(lParts,0) == "secondlife:")
|
|
{
|
|
return (key)llList2String(lParts,3);
|
|
}else {
|
|
UpdateDSRequest(NULL_KEY, llRequestUserKey(sInput), SetDSMeta(["decodeAvatar", sInput, sExtra]));
|
|
return NULL_KEY;
|
|
}
|
|
}
|
|
}
|
|
|
|
string ToBinary(integer num)
|
|
{
|
|
integer i = 0;
|
|
integer end = 16;
|
|
|
|
string sStr = "";
|
|
|
|
for(i=0;i<end;i++)
|
|
{
|
|
if(num & 1)sStr = "1" + sStr;
|
|
else sStr = "0" + sStr;
|
|
|
|
num = num >> 1;
|
|
}
|
|
|
|
return sStr;
|
|
}
|
|
|
|
integer IsLikelyUUID(string sID)
|
|
{
|
|
if(sID == (string)NULL_KEY)return TRUE;
|
|
if(llStringLength(sID)==32)return TRUE;
|
|
key kID = (key)sID;
|
|
if(kID)return TRUE;
|
|
if(llStringLength(sID) >25){
|
|
if(llGetSubString(sID,8,8)=="-" && llGetSubString(sID, 13,13) == "-" && llGetSubString(sID,18,18) == "-" && llGetSubString(sID,23,23)=="-") return TRUE;
|
|
|
|
}
|
|
return FALSE;
|
|
}
|
|
|
|
integer IsLikelyAvatarID(key kID)
|
|
{
|
|
if(!IsLikelyUUID(kID))return FALSE;
|
|
// Avatar UUIDs always have the 15th digit set to a 4
|
|
if(llGetSubString(kID,8,8) == "-" && llGetSubString(kID,14,14)=="4")return TRUE;
|
|
|
|
return FALSE;
|
|
}
|
|
|
|
integer IsListOfIDs(list lIDs)
|
|
{
|
|
integer i=0;
|
|
integer end = llGetListLength(lIDs);
|
|
for(i=0;i<end;i++){
|
|
if(IsLikelyUUID(llList2String(lIDs,i)))return TRUE;
|
|
}
|
|
return FALSE;
|
|
}
|
|
|
|
integer bool(integer a){
|
|
if(a)return TRUE;
|
|
else return FALSE;
|
|
}
|
|
|
|
string Checkbox(integer iValue, string sLabel) {
|
|
return llList2String(g_lCheckboxes, bool(iValue))+" "+sLabel;
|
|
}
|
|
|
|
string sSetor(integer a, string b, string c)
|
|
{
|
|
if(a)return b;
|
|
else return c;
|
|
}
|
|
key kSetor(integer a, key b, key c)
|
|
{
|
|
if(a)return b;
|
|
else return c;
|
|
}
|
|
integer iSetor(integer a, integer b, integer c)
|
|
{
|
|
if(a)return b;
|
|
else return c;
|
|
}
|
|
vector vSetor(integer a, vector b, vector c)
|
|
{
|
|
if(a)return b;
|
|
else return c;
|
|
}
|
|
list lSetor(integer a,list b, list c)
|
|
{
|
|
if(a)return b;
|
|
else return c;
|
|
}
|
|
|
|
|
|
string List2TypeList(list input) { // converts a list to a CSV string with type information prepended to each item
|
|
integer i;
|
|
list output;
|
|
integer len;
|
|
|
|
len=llGetListLength(input); //this can shave seconds off long lists
|
|
for (i = 0; i < len; i++) {
|
|
output += [llGetListEntryType(input, i)] + [llStringToBase64(llList2String(input, i))];
|
|
}
|
|
|
|
return llDumpList2String(output,"^^^");
|
|
}
|
|
list TypeList2List(string inputstring) { // converts a CSV string created with List2TypeCSV back to a list with the correct type information
|
|
integer i;
|
|
list input;
|
|
list output;
|
|
integer len;
|
|
|
|
input = llParseString2List(inputstring, ["^^^"],[]);
|
|
|
|
len=llGetListLength(input);
|
|
for (i = 0; i < len; i += 2) {
|
|
if (llList2Integer(input, i) == TYPE_INTEGER) output += (integer)llBase64ToString(llList2String(input, i + 1));
|
|
else if (llList2Integer(input, i) == TYPE_FLOAT) output += (float)llList2String(input, i + 1);
|
|
else if (llList2Integer(input, i) == TYPE_STRING) output += llBase64ToString(llList2String(input, i + 1));
|
|
else if (llList2Integer(input, i) == TYPE_KEY) output += (key)llBase64ToString(llList2String(input, i + 1));
|
|
else if (llList2Integer(input, i) == TYPE_VECTOR) output += (vector)llBase64ToString(llList2String(input, i + 1));
|
|
else if (llList2Integer(input, i) == TYPE_ROTATION) output += (rotation)llBase64ToString(llList2String(input, i + 1));
|
|
}
|
|
|
|
return output;
|
|
}
|
|
|
|
string Uncheckbox(string sLabel)
|
|
{
|
|
integer iBoxLen = 1+llStringLength(llList2String(g_lCheckboxes,0));
|
|
return llGetSubString(sLabel,iBoxLen,-1);
|
|
}
|
|
|
|
|
|
string SLURL(key kID){
|
|
return "secondlife:///app/agent/"+(string)kID+"/about";
|
|
}
|
|
|
|
string OSLURL(key kID)
|
|
{
|
|
return llKey2Name(kID); // TODO: Replace with a SLURL of some kind pointing to the object inspect.
|
|
}
|
|
|
|
list StrideOfList(list src, integer stride, integer start, integer end)
|
|
{
|
|
list l = [];
|
|
integer ll = llGetListLength(src);
|
|
if(start < 0)start += ll;
|
|
if(end < 0)end += ll;
|
|
if(end < start) return llList2List(src, start, start);
|
|
while(start <= end)
|
|
{
|
|
l += llList2List(src, start, start);
|
|
start += stride;
|
|
}
|
|
return l;
|
|
}
|
|
|
|
string tf(integer a){
|
|
if(a)return "true";
|
|
return "false";
|
|
}
|
|
|
|
UpdateDSRequest(key orig, key new, string meta){
|
|
if(orig == NULL){
|
|
g_lDSRequests += [new,meta];
|
|
}else {
|
|
integer index = HasDSRequest(orig);
|
|
if(index==-1)return;
|
|
else{
|
|
g_lDSRequests = llListReplaceList(g_lDSRequests, [new,meta], index,index+1);
|
|
}
|
|
}
|
|
}
|
|
|
|
string GetDSMeta(key id){
|
|
integer index=llListFindList(g_lDSRequests,[id]);
|
|
if(index==-1){
|
|
return "N/A";
|
|
}else{
|
|
return llList2String(g_lDSRequests,index+1);
|
|
}
|
|
}
|
|
|
|
integer HasDSRequest(key ID){
|
|
return llListFindList(g_lDSRequests, [ID]);
|
|
}
|
|
|
|
DeleteDSReq(key ID){
|
|
if(HasDSRequest(ID)!=-1)
|
|
g_lDSRequests = llDeleteSubList(g_lDSRequests, HasDSRequest(ID), HasDSRequest(ID)+1);
|
|
else return;
|
|
}
|
|
|
|
string MkMeta(list lTmp){
|
|
return llDumpList2String(lTmp, ":");
|
|
}
|
|
|
|
string SetMetaList(list lTmp){
|
|
return llDumpList2String(lTmp, ":");
|
|
}
|
|
|
|
string SetDSMeta(list lTmp){
|
|
return llDumpList2String(lTmp, ":");
|
|
}
|
|
|
|
list GetMetaList(key kID){
|
|
return llParseStringKeepNulls(GetDSMeta(kID), [":"],[]);
|
|
}
|
|
|
|
string int2Perms(integer perm)
|
|
{
|
|
integer fullPerms = PERM_COPY | PERM_MODIFY | PERM_TRANSFER;
|
|
integer copyModPerms = PERM_COPY | PERM_MODIFY;
|
|
integer copyTransPerms = PERM_COPY | PERM_TRANSFER;
|
|
integer modTransPerms = PERM_MODIFY | PERM_TRANSFER;
|
|
string output = "";
|
|
if ((perm & fullPerms) == fullPerms)
|
|
output += "full";
|
|
else if ((perm & copyModPerms) == copyModPerms)
|
|
output += "copy & modify";
|
|
else if ((perm & copyTransPerms) == copyTransPerms)
|
|
output += "copy & transfer";
|
|
else if ((perm & modTransPerms) == modTransPerms)
|
|
output += "modify & transfer";
|
|
else if ((perm & PERM_COPY) == PERM_COPY)
|
|
output += "copy";
|
|
else if ((perm & PERM_TRANSFER) == PERM_TRANSFER)
|
|
output += "transfer";
|
|
else
|
|
output += "none";
|
|
return output;
|
|
}
|
|
|
|
string inv2Perms(string inventory, integer iMask)
|
|
{
|
|
integer perm = llGetInventoryPermMask(inventory,iMask);
|
|
integer fullPerms = PERM_COPY | PERM_MODIFY | PERM_TRANSFER;
|
|
integer copyModPerms = PERM_COPY | PERM_MODIFY;
|
|
integer copyTransPerms = PERM_COPY | PERM_TRANSFER;
|
|
integer modTransPerms = PERM_MODIFY | PERM_TRANSFER;
|
|
string output = "";
|
|
if ((perm & fullPerms) == fullPerms)
|
|
output += "full";
|
|
else if ((perm & copyModPerms) == copyModPerms)
|
|
output += "copy & modify";
|
|
else if ((perm & copyTransPerms) == copyTransPerms)
|
|
output += "copy & transfer";
|
|
else if ((perm & modTransPerms) == modTransPerms)
|
|
output += "modify & transfer";
|
|
else if ((perm & PERM_COPY) == PERM_COPY)
|
|
output += "copy";
|
|
else if ((perm & PERM_TRANSFER) == PERM_TRANSFER)
|
|
output += "transfer";
|
|
else
|
|
output += "none";
|
|
return output;
|
|
}
|
|
|
|
|
|
/*
|
|
Usage: i = mask (SET, i, BITMASK)
|
|
i = mask (FALSE, i, BITMASK)
|
|
*/
|
|
integer mask(integer states, integer source, integer mask)
|
|
{
|
|
if(states==TOGGLE)
|
|
{
|
|
return source ^ mask;
|
|
}
|
|
if(states)
|
|
{
|
|
source = source | mask;
|
|
return source;
|
|
}else {
|
|
source = source &~ mask;
|
|
return source;
|
|
}
|
|
}
|
|
|
|
|
|
string stripMetatags(string sInput)
|
|
{
|
|
list lTmp = llParseString2List(sInput,[], ["<",">"]);
|
|
integer iIndex = llListFindList(lTmp,[">"]);
|
|
while(iIndex!=-1){
|
|
lTmp = llDeleteSubList(lTmp, iIndex-2, iIndex);
|
|
iIndex=llListFindList(lTmp,[">"]);
|
|
}
|
|
return llDumpList2String(lTmp, "");
|
|
}
|
|
integer timeAsSeconds(string sInput)
|
|
{
|
|
// Converts a string like 02:00 into its seconds equivalent (ie. 120)
|
|
|
|
list lTmp = llParseString2List(stripMetatags(sInput), [":"],[]);
|
|
integer iMin = (integer)llList2String(lTmp,0);
|
|
integer iSec = (integer)llList2String(lTmp,1);
|
|
return (iSec+(iMin*60));
|
|
} |