//*********************
//****from notecard****
//*********************
integer intchannel;
integer paramchannel;
integer scanrate;
integer scanrange;
integer salt;
integer certificate;
float logrange;
float lograngewarning;
string url;
string sitetitle;
vector textcolor;
//*********************
//*********************
//*****avatar vars*****
//*********************
key av_key;
string username;
string av_name;
string av_surname;
string av_created;
string av_payinfo;
//*********************
//*********************
//******menu vars******
//*********************
list menuAdmin = ["Settings", "My Account", "Website","Logoff"];
list menuRegistered = ["My Account", "Website", "Logoff"];
list menuInactive = ["Website", "About", "Logoff"];
list menuNewUser = ["Register", "Website", "About","Logoff"];
//*********************
//*********************
//*****http id's*******
//*********************
string item_request_id;
string authenticate_request_id;
string register_request_id;
string logoff_request_id;
string x_request_id;
string account_request_id;
//*********************
//*********************
//*****dataserver******
//*********************
key settingsDS;
key payinfoDS;
key bornDS;
//*********************
//*********************
//******handlers*******
//*********************
string settingsFileName="jSLplus Settings";
integer settingsEntry;
integer defaultSalt=666;
integer online=-2;
string settingsNotify;
string sid;
string menu;
list objectSpecs;
string secretWord;
string status;
string itemName;
//*********************
//Settings Notecard stuff
init() {
if (llGetInventoryType(settingsFileName) == INVENTORY_NOTECARD) {
online=-1;
readSettings();
}
else {
llOwnerSay("===ERROR===\nNo settings-notecard found!");
}
}
//Settings Notecard stuff
readSettings() {
llOwnerSay("Initializing settings. Please wait...");
settingsEntry = 0;
settingsNotify="===SETUP SETTINGS===";
settingsDS = llGetNotecardLine(settingsFileName, settingsEntry) ;
}
checkSettings(string entry) {
if((entry != "") && (llGetSubString(entry, 0, 1) != "//")) {
list Details = llParseString2List(entry, ["="], []);
string keyname = llList2String(Details, 0);
string contents = llList2String(Details, 1);
if ((keyname != "") && (contents != "")) {
if(keyname=="url") {url=contents;settingsNotify+="\nURL: "+contents;}
if(keyname=="ssl") {if((integer)contents==1) {url="https://"+url;settingsNotify+="\nSSL: enabled";}
else if((integer)contents==0){url="http://"+url;settingsNotify+="\nSSL: disabled (NOT recommended)";}
}
else if(keyname=="certificate") {
certificate=(integer)contents;
if(certificate==0) {settingsNotify+="\nCertificate: not required";}
else if(certificate==1) {settingsNotify+="\nCertificate: required";}
}
else if(keyname=="sitetitle") {sitetitle=contents;settingsNotify+="\nSite-title: "+contents;}
else if(keyname=="intchannel") {intchannel=(integer)contents;settingsNotify+="\nInternal channel: "+contents;}
else if(keyname=="paramchannel") {paramchannel=(integer)contents;settingsNotify+="\nParameter channel: "+contents;}
else if(keyname=="salt") {salt=(integer)contents;settingsNotify+="\nHash-Salt: "+contents;}
else if(keyname=="scanrate") {scanrate=(integer)contents;settingsNotify+="\nIdle Scan: "+contents+" seconds per scan";}
else if(keyname=="scanrange") {scanrange=(integer)contents;settingsNotify+="\nIdle Scanrange: "+contents+" meters";}
else if(keyname=="logrange") {logrange=(float)contents;settingsNotify+="\nLogs off: "+contents+" meters from console";}
else if(keyname=="lograngewarning") {lograngewarning=(float)contents;settingsNotify+="\nLogoff warning: "+contents+" meters from console";}
else if(keyname=="textcolor") {textcolor=string2vector(contents);settingsNotify+="\nTextcolor: "+contents;}
}
}
settingsEntry+=1;
settingsDS = llGetNotecardLine(settingsFileName, settingsEntry) ;
}
vector string2vector(string s) {
list foo = llCSV2List(s);
vector v;
v.x = llList2Float(foo,0);
v.y = llList2Float(foo,1);
v.z = llList2Float(foo,2);
return v;
}
//Generates secretWord, and a MD5-hash from secretWord and Salt
string generatePW(float uniqueness) {
list primewords = ["alpha","beta","gamma","zulu","bravo","cappa","tango"];
string randomWord = llList2String(primewords,(integer)llFrand(llGetListLength(primewords)));
string randomNumber = (string)llRound(llFrand(uniqueness));
secretWord = randomWord+randomNumber;
return llMD5String(secretWord,salt);
}
returnDialog(string returnMenu) {
if(returnMenu == "MENU_UNREGISTERED") {
llDialog( av_key, "Select an option...", menuNewUser, intchannel);
}
else if(returnMenu == "MENU_PROFILE_ACTIVE") {
llDialog( av_key, "Select an option...", menuRegistered, intchannel);
}
else if(returnMenu == "MENU_PROFILE_INACTIVE") {
llDialog( av_key, "Select an option...", menuInactive, intchannel);
}
else if(returnMenu == "MENU_ADMIN") {
llDialog( av_key, "Select an option...", menuAdmin, intchannel);
}
}
httpRequest(string function,list params) {
if(function=="login") {
authenticate_request_id = llHTTPRequest(url+"index.php?option=com_jslplus&view=interface&controller=interface&task=login",
[HTTP_METHOD,"POST",HTTP_VERIFY_CERT,certificate,HTTP_MIMETYPE,"application/x-www-form-urlencoded"],
"&k="+llList2String(params,0)+"&n="+llList2String(params,1)+"&s="+llList2String(params,2)+"&p="+llList2String(params,3)+"&c="
+llList2String(params,4)+"&h="+generatePW(1000)+"&o="+llList2String(params,5)+"&format=raw");
}
if(function =="logoff") {
logoff_request_id = llHTTPRequest(url+"index.php?option=com_jslplus&view=interface&controller=interface&task=logoff",
[HTTP_METHOD, "POST",HTTP_VERIFY_CERT,certificate,HTTP_MIMETYPE,"application/x-www-form-urlencoded"],
"&sid="+llList2String(params,0)+"&format=raw");
}
if(function=="register") {
register_request_id = llHTTPRequest(url+"index.php?option=com_jslplus&view=interface&controller=interface&task=register",
[HTTP_METHOD, "POST",HTTP_VERIFY_CERT,certificate,HTTP_MIMETYPE,"application/x-www-form-urlencoded"],
"&h="+llList2String(params,0)+"&e="+llList2String(params,1)+"&sid="+sid+"&format=raw");
}
if(function=="additem") {
item_request_id = llHTTPRequest(url + "index.php?option=com_jslplus&view=interface&controller=interface&task=additem",
[HTTP_METHOD, "POST",HTTP_VERIFY_CERT,certificate,HTTP_MIMETYPE,"application/x-www-form-urlencoded"],
"&k="+llList2String(params,0)+"&n="+llList2String(params,1)+"&t="+llList2String(params,2)+"&p="+llList2String(params,3)+llList2String(params,4)+
llList2String(params,5)+"&sid="+sid+"&format=raw");
}
}
login(key id) {
av_key = id;
username = llKey2Name(av_key);
av_surname = llGetSubString(username, llSubStringIndex(username, " ") + 1, -1);
av_name = llGetSubString(username, 0, llSubStringIndex(username, " "));
llSetText("Controller: "+username, textcolor, 1);
llInstantMessage(av_key, "Contacting server. Please wait...");
bornDS = llRequestAgentData(av_key, DATA_BORN);
payinfoDS = llRequestAgentData(av_key, DATA_PAYINFO);
}
default {
on_rez(integer startparam){
llResetScript();
}
state_entry() {
if(online==-2) {
init();
}
llAllowInventoryDrop(FALSE);
if(online==TRUE || online==FALSE){
llSetText("Terminal online...",textcolor,1);
}
else {
llSetText("Terminal offline...",<0,0,0>,1);
}
}
touch_start( integer num ) {
if(llDetectedKey(0)!=av_key) {
return;
}
else {
if(online==-1) {
init();
}
else {
login(llDetectedKey(0));
}
}
}
dataserver(key query_id, string data) {
if(query_id == bornDS) {
av_created=data;
}
else if (query_id == payinfoDS) {
av_payinfo=data;
httpRequest("login",[av_key,av_name,av_surname,av_payinfo,av_created,(string)llGetLinkKey(2)]);
}
else if (query_id == settingsDS) {
if (data != EOF) {
checkSettings(data) ;
return;
}
else {
llOwnerSay("Settings are loaded. Checking content...");
if(salt==defaultSalt) {
llOwnerSay("You didn't setup a unique hash-salt. Please correct the problem...");
state restart_default;
}
else {
llOwnerSay(settingsNotify+"\nSettings ok...\n");
settingsNotify="";
login(llGetOwner());
}
}
}
}
//RESPONSE FROM INITIAL HTTP-REQUEST
http_response(key request_id, integer httpStatus, list metadata, string body) {
if (authenticate_request_id == request_id) {
body = llStringTrim(body, STRING_TRIM);
list parameters;
parameters = llCSV2List(body);
status = llList2String(parameters,0);
sid = llList2String(parameters,1);
string visited = llList2String(parameters,2);
//Send link-message to feedback-module(3)
llMessageLinked(3,0,status+","+username+","+visited+","+secretWord,av_key);
}
}
//Receives link-messages from feedback-module(3)
link_message(integer sender_num, integer lineResponse, string str, key id) {
if (sender_num==3) {
list input = llCSV2List(str);
menu = llList2String(input,0);
//Positive message, proceed to logged-in state
if(lineResponse==TRUE) {
state inuse;
}
//Reboot when an error-message comes back...
else {
//Critical error(lineResponse=-1) or non-critical error(lineResponse=0/FALSE)
online=lineResponse;
state restart_default;
}
}
}
changed( integer change ) {
if ( change == CHANGED_INVENTORY ) {
integer itemCount = llGetInventoryNumber(INVENTORY_ALL);
integer i=0;
if(itemCount>3) {
for(i=0;i<itemCount;i++) {
string itemName = llGetInventoryName(INVENTORY_ALL, i);
if (itemName != "About" && itemName!="jSLplus Interface" && itemName!="jSLplus Visitor-Tracker" && itemName!="jSLplus Settings") {
llSay(0,"You must be logged in, before you may upload items to the ODS!");
llRemoveInventory(itemName);
}
}
}
else {
llOwnerSay("Settings have been changed. Please wait while the terminal reboots...");
online=-2;
state restart_default;
}
}
}
}
state restart_default {
state_entry() {
state default;
}
}
state inuse {
state_entry() {
llSensorRepeat( "", "", AGENT, scanrange, TWO_PI, scanrate);
llListen(intchannel, "", av_key, "" );
llListen(paramchannel,"",av_key,"");
if(menu=="MENU_PROFILE_ACTIVE" || status=="MENU_ADMIN") {
llAllowInventoryDrop(TRUE);
string folder = llGetObjectName();
}
returnDialog(menu);
}
touch_start( integer number_detected ) {
integer i;
for( i = 0; i < number_detected; i++ ) {
if (llDetectedKey(i) == av_key) {
returnDialog(menu);
}
else {
llSay(0,username+" is currently logged into this terminal. Please wait until this user logged off...");
}
}
}
sensor( integer number_detected ) {
integer i;
for( i = 0; i < number_detected; i++ ) {
key detected_key = llDetectedKey(i);
if(av_key==detected_key) {
vector agentPos = llDetectedPos(i);
vector terminalPos = llGetPos();
float distance = llVecDist(agentPos, terminalPos);
if (distance > logrange) {
llInstantMessage(av_key, "===NOTICE===\nYou are out of range. logging off now...");
httpRequest("logoff",[]);
llSensorRemove();
}
else if(distance > lograngewarning){
llInstantMessage(av_key, "===NOTICE===\nYou are "+(string)(logrange-distance)+" meters from being logged out.");
}
}
}
}
listen( integer chan, string name, key id, string msg ) {
if(id == av_key) {
msg = llStringTrim(msg, STRING_TRIM);
list paramList;
string command;
if(msg!="") {
paramList = llCSV2List(msg);
command = llList2String(paramList,0);
}
if (command == "Website") {
llLoadURL(av_key, sitetitle, url);
returnDialog(menu);
}
else if (command == "About") {
llGiveInventory(av_key,"About");
returnDialog(menu);
}
else if (command == "Request") {
x_request_id = llHTTPRequest(url + "index.php?option=com_jslplus&view=interface&controller=interface&task=request&sid="+sid+
"&format=raw", [HTTP_METHOD, "GET"],"");
}
else if (command == "Logoff") {
llSetText(username+" logs out...",textcolor,1);
httpRequest("logoff",[sid]);
llInstantMessage(av_key,"Preparing to log off...");
}
if(menu=="MENU_UNREGISTERED") {
if (command == "Register") {
llInstantMessage(av_key,"===NOTICE===\nYou must provide a valid emailaddress.\nType: /"+(string)paramchannel+
" registermail,myemail@address.org' in order to finish the registration process.");
}
if (command == "registermail") {
httpRequest("register",[generatePW(1000),llStringTrim(llList2String(paramList,1), STRING_TRIM)]);
}
}
else if(menu=="MENU_PROFILE_ACTIVE") {
if (command == "My Account") {
string myAccount = "===MY ACCOUNT===\n";
myAccount += "Avatar-key: "+(string)av_key;
llInstantMessage(av_key,myAccount);
returnDialog(menu);
}
}
else if(menu=="MENU_ADMIN") {
if (command == "Settings") {
string terminalSettings = "===SETTINGS===\n";
terminalSettings += "terminal-key: "+(string)llGetKey()+"\n";
terminalSettings += "heap: "+(string)llGetFreeMemory() + " bytes\n";
llInstantMessage(av_key, terminalSettings);
llMessageLinked(2, 0, "settings",av_key);
returnDialog(menu);
}
else if (command == "My Account") {
string myAccount = "===MY ACCOUNT===\n";
account_request_id = llHTTPRequest(url + "index.php?option=com_jslplus&view=interface&controller=interface&task=getaccount&sid="+sid+
"&format=raw", [HTTP_METHOD, "GET"],"");
myAccount += "Avatar-key: "+(string)av_key;
llInstantMessage(av_key,myAccount);
returnDialog(menu);
}
}
}
}
http_response(key request_id, integer httpStatus, list metadata, string body) {
list parameters;
body = llStringTrim(body, STRING_TRIM);
parameters = llCSV2List(body);
status = llList2String(parameters,0);
if (request_id == register_request_id) {
llMessageLinked(3,0,status+","+username+","+secretWord,av_key);
}
if (request_id == item_request_id) {
llMessageLinked(3,0,status+","+username,av_key);
}
if (request_id == logoff_request_id) {
llMessageLinked(3,0,status+","+username,av_key);
}
if (request_id == x_request_id) {
llMessageLinked(3,0,status+","+username,av_key);
}
if (request_id == account_request_id) {
llMessageLinked(3,0,status+","+username,av_key);
}
}
link_message(integer sender_num, integer lineResponse, string str, key id) {
online = lineResponse;
if(lineResponse==TRUE) {
list input = llCSV2List(str);
menu = llList2String(input,0);
returnDialog(menu);
}
else {
state default;
}
}
changed( integer change ) {
if (change & CHANGED_ALLOWED_DROP) {
llOwnerSay("The inventory has changed as a result of a user without mod permissions dropping an item on the prim"+
"and it being allowed by the script.");
}
if ( change == CHANGED_INVENTORY ) {
integer itemCount = llGetInventoryNumber(INVENTORY_ALL);
if(itemCount>3) {
llSay(0,"A new item was submitted!");
integer i=0;
string newItem;
for(i=0;i<itemCount;i++) {
string itemName = llGetInventoryName(INVENTORY_ALL, i);
if (itemName != "About" && itemName!="jSLplus Interface" && itemName!="jSLplus Visitor-Tracker" && itemName!="jSLplus Settings") {
newItem = itemName;
}
}
key itemKey = llGetInventoryKey(newItem);
key itemCreatorKey = llGetInventoryCreator(newItem);
if(av_key != itemCreatorKey) {
llSay(0,"Item denied! You must be the creator of the submitted item!");
llRemoveInventory(newItem);
return;
}
else {
if (llStringLength(newItem) <=30) {
llSay(0,"Item accepted. You have been recognised as the creator of this item...");
}
else {
llSay(0,"Item denied! Please shorten the objectname to a maximum of 30 characters...");
llRemoveInventory(newItem);
return;
}
}
integer itemType = llGetInventoryType(newItem);
integer permCopy; integer permMod; integer permTransfer;
string itemSpecs = "\n===Item specifications===\n";
itemSpecs+="item-Key: "+(string)itemKey+"\n";
itemSpecs+="item-Name: "+newItem+"\n";
itemSpecs+="=Permissions=\n";
if(llGetInventoryPermMask(newItem, MASK_NEXT) & PERM_COPY) {permCopy=1;itemSpecs+="Copy:Yes\n";}
else {permCopy=0;itemSpecs+="Copy:No\n";}
if(llGetInventoryPermMask(newItem, MASK_NEXT) & PERM_MODIFY) {permMod=1;itemSpecs+="Modify:Yes\n";}
else {permMod=0;itemSpecs+="Modify:No\n";}
if(llGetInventoryPermMask(newItem, MASK_NEXT) & PERM_TRANSFER) {permTransfer=1;itemSpecs+="Transfer:Yes\n";}
else {permTransfer=0;itemSpecs+="Transfer:No\n";}
llSay(0,itemSpecs);
llGiveInventory(llGetLinkKey(2), newItem);
llRemoveInventory(newItem);
llSay(0,"Sending request to ODS-Site...");
newItem = llEscapeURL(newItem);
httpRequest("additem",[itemKey,newItem,itemType,permCopy,permMod,permTransfer]);
}
}
}
}