Adds common functions and variables
This commit is contained in:
parent
6d7b0aead1
commit
b32b75967e
2 changed files with 393 additions and 1 deletions
377
functions.lsl
377
functions.lsl
|
@ -0,0 +1,377 @@
|
|||
|
||||
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"]);
|
||||
}
|
||||
|
||||
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 + "/zni/Get_Support.php", [], ""), SetDSMeta(["get_support"]));
|
||||
}
|
||||
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;
|
||||
}
|
|
@ -1 +1,16 @@
|
|||
key NULL = NULL_KEY;
|
||||
key NULL = NULL_KEY;
|
||||
string API_SERVER;
|
||||
|
||||
#define R_ADMIN 1
|
||||
#define R_DEVELOPER 2
|
||||
#define R_SUPPORT 4
|
||||
|
||||
list g_lSupport;
|
||||
integer g_iLastSupportCheck;
|
||||
|
||||
#define RED_QUEEN "27a0ae67-30d9-4fbc-b9fb-fd388c98c202"
|
||||
#define ARIA "5556d037-3990-4204-a949-73e56cd3cb06"
|
||||
integer ONE_DAY = ((60*60)*24);
|
||||
|
||||
list g_lCheckboxes=["□","▣"];
|
||||
list g_lDSRequests;
|
Loading…
Add table
Add a link
Reference in a new issue