Jump to content

Innula Zenovka

Advisor
  • Posts

    10,754
  • Joined

  • Last visited

Everything posted by Innula Zenovka

  1. Have you tried following the procedure outlined at https://www.dmca.com/FAQ/How-can-I-file-a-DMCA-Takedown-Notice to see what happens? I don't know if it will do any good, but if you don't try it, then it certainly won't.
  2. It says so, in terms, here: https://wiki.secondlife.com/wiki/Linden_Lab_Official:Residents'_privacy_rights
  3. https://www.dmca.com/FAQ/How-can-I-file-a-DMCA-Takedown-Notice
  4. The same thing that stops anyone else grabbing your email and password -- they don't have access to that data, either via the viewer or via script.
  5. If you object, why do you not exercise that right? It's easy enough to submit a complaint to the relevant data protection authority https://edpb.europa.eu/about-edpb/about-edpb/members_en
  6. In this case, I think you need to search just for Quistess, without the last name.
  7. What do you mean by "data mining" in this context? Strictly speaking, it refers to examining large datasets in the hope of discovering patterns of behaviour, though I think it's frequently also used to refer to collecting the data, too, often by using using cookies and by granting click-though permissions when we install apps on our smartphones. There's no suggestion these bots are doing anything of the sort, as least as far as I know, and neither is it possible to do it with LSL. So I think maybe you mean something different by the phrase.
  8. However, since the set of things we don't know with 100% certainty is infinite in its scope that's not really a very useful observation. Personally, I find not worrying about things unless I have reasonable grounds to suspect they may be the case is a far better way of proceeding.
  9. It's by no means clear, or at least not to me, that data about avatars (as opposed to IP addresses) is covered by EU or UK data protection legislation. The test is whether you can identify an individual based on the information you hold about them, whether on its own or by putting it together with other information either you hold or data you could obtain from another source (which is interpreted pretty broadly -- I know that in the UK it covers car registration numbers, even though the public don't have access to a register of them). Who, though, other than particular employees of LL or Tilia who have access to our confidential data like credit card details, is in a position to put together data about Innula Zenovka or Count Burks and connect it to a particular individual in First Life? The payment info LL have on file for me is certainly covered by data protection law, but I'm not so sure about data specific to Innula or any of her alts. https://ico.org.uk/for-organisations/guide-to-data-protection/guide-to-the-general-data-protection-regulation-gdpr/key-definitions/what-is-personal-data/#2
  10. Thanks, both. Sorry. I have staring at this too long!
  11. Sorry, but I'm still not getting it. I think you're telling me to use string test = "{ \"playlists\": [{ \"id\": \"some key\", \"title\": \"Playlist 1\", \"description\": null, \"trackCount\": 20 }, { \"id\": \"another key\", \"title\": \"Playlist 2\", \"description\": null, \"trackCount\": 30 } ] }"; default { state_entry() { llOwnerSay(llJsonGetValue("test",["playlists",0,"id"])); } } but that can't be it, because it returns "[]". Clearly I'm misunderstanding something somewhere.
  12. Thanks, everyone. I'm still not getting it, I'm afraid. In my example, string test = "{ \"playlists\": [{ \"id\": \"some key\", \"title\": \"Playlist 1\", \"description\": null, \"trackCount\": 20 }, { \"id\": \"another key\", \"title\": \"Playlist 2\", \"description\": null, \"trackCount\": 30 } ] }"; how do I find the value for first "id" key? I think it ought to be llJsonGetValue("test",["id",0]); but that doesn't work, and neither does anything else I try.
  13. According to https://jsonlint.com, this (which is an edited version of something I'm receiving from a remote server) is valid json { "playlists": [{ "id": "some key", "title": "Playlist 1", "description": null, "trackCount": 20 }, { "id": "another key", "title": "Playlist 2", "description": null, "trackCount": 30 }] } However, this returns JSON_INVALID, as does a similar test of the unescaped body I receive in the http_response event. string test = "{ \"playlists\": [{ \"id\": \"some key\", \"title\": \"Playlist 1\", \"description\": null, \"trackCount\": 20 }, { \"id\": \"another key\", \"title\": \"Playlist 2\", \"description\": null, \"trackCount\": 30 } ] }"; string json_type2string(string s) { if(s==JSON_OBJECT) { return "JSON_OBJECT"; }else if(s==JSON_ARRAY) { return "JSON_ARRAY"; }else if(s==JSON_NUMBER) { return "JSON_NUMBER"; }else if(s==JSON_STRING) { return "JSON_STRING"; }else if(s==JSON_NULL) { return "JSON_NULL"; }else if(s==JSON_TRUE) { return "JSON_TRUE"; }else if(s==JSON_FALSE) { return "JSON_FALSE"; }else if(s==JSON_DELETE) { return "JSON_DELETE"; } return "JSON_INVALID"; } default { state_entry() { llOwnerSay(json_type2string(test)); } } I must be missing something obvious, but what is it, please?
  14. Specifically, if I want to display an image that exists as a texture in-world using shared media do I have to upload a copy to a hosting service like gyazo and reference that in the <img> tag, or can I use the inworld uuid? I think I have to upload it but I'm just wondering if there's another way to do it.
  15. As I understand it, ChatGPT works by statistical prediction. That is, if you ask it "Who was the first man to walk on the moon?" it replies "Neil Armstrong" not because it has looked it up in a table of people who have walked on the moon but because it "knows", on the basis of the web pages it's read, that there's a strong association between the strings "Neil Armstrong" and "first man to walk on the moon," so that's likely to be a good answer.
  16. Thanks! llJsonGetValue(body, ["items",0,"image","preview"]); does the trick.
  17. Thanks, everyone! This is a huge help, and I'm beginning to understand what I'm doing with JSON, at least in this case. Another question, though. In the example I'm using, what I've got for "image" is "image":{ "preview":"some url", "origin":"another url" }, That is, it's a JSON object inside the "item" object, containing two values, and that's how Quistess' example recognises it. How do I reference the values inside this embedded object for "preview" and "origin" respectively?
  18. Sure. This has only one item, but there could be several. { {"itemsCount":1, "pagesCount":1, "items":[ {"id":"a uuid", "name":"name of track", "artist":"name of artist", "album":"name of album", "duration":"playing time", "genres":[ {"id":12, "name":"Soul/R&B"}], "image":{"preview":"url of album cover"}, "price":n, "currency": {"id":4,"name":"name of currency", "imageUrl":"url for currency symbol"}, "status":"PURCHASED", "isNew":true, "isPreviewAvailable":true} ]} } So I want, for example, to reference each name in items and, along with that, each name in genres for that item.
  19. Thanks! Presumably if I add the names to a "names" list and then do the same thing with the "powers" field, and, at least in theory, I should end up with two synchronised LSL lists, "names" and "powers"? Another question: the JSON I'm working with has several embedded arrays (I think that's the correct term). For example, it contains a number of entries for a field called simply "items", each of which contains fields like "id", "name"", "artist", "album" and so on, but also an array inside the items field for "genres", which also contains multiple items for "id" and "name". How do I reference these for llJsonGetValues? Presumably I use llJsonGetValue("items",iItem,""album") for the names of the albums. How do I reference the "name" field in genres, bearing in mind a single album may belong to more than one genre? I'm wanting to use something like "items.genres" or "genres.name" but I'm not all sure of what I'm doing here.
  20. I've never really looked at json before, but now I find I have to as part of my adventures with shared media -- essentially, I'm receiving data from a remote server in the form of json objects and I need, in the http_response event, to extract the contents of particular fields and then format them as entries in an HTML table I display on the prim. How, using this example from https://developer.mozilla.org/en-US/docs/Learn/JavaScript/Objects/JSON, would I pull out the contents of the "name" and "powers" fields for each superhero in the list? { "squadName": "Super hero squad", "homeTown": "Metro City", "formed": 2016, "secretBase": "Super tower", "active": true, "members": [ { "name": "Molecule Man", "age": 29, "secretIdentity": "Dan Jukes", "powers": ["Radiation resistance", "Turning tiny", "Radiation blast"] }, { "name": "Madame Uppercut", "age": 39, "secretIdentity": "Jane Wilson", "powers": [ "Million tonne punch", "Damage resistance", "Superhuman reflexes" ] }, { "name": "Eternal Flame", "age": 1000000, "secretIdentity": "Unknown", "powers": [ "Immortality", "Heat Immunity", "Inferno", "Teleportation", "Interdimensional travel" ] } ] }
  21. I've been working with ChatGPT quite a lot recently. I've found it very useful with things like javascript, which I don't know much about. Most of the time, so long as I break down the process into a series of discrete steps, it gives me usable answers and examples, and even with the snippets of code it provides are wrong, at least "what's wrong with this line of code?" is generally easier for me to work out than "how on earth do I do this?" Asking it about LSL is a different story, though. For example, This script will set the hovertext to "Hello, World!" in red when the object is first rezzed or when the script is reset. The text will be displayed above the object at a distance of 1 meter. You can adjust the color of the hovertext by changing the values in the vector. For example, to display green hovertext, you could use a vector like <0.0, 1.0, 0.0>. You can also adjust the distance at which the hovertext is displayed by changing the fourth argument to llSetText. For example, to display the hovertext at a distance of 2 meters, you could use llSetText("Hello, World!", <1.0, 0.0, 0.0>, 2.0).
  22. Now I'm starting to get there, after climbing rather a steep learning curve with javascript. Surprisingly, asking ChatGPT "How do I do this?" proved surprisingly effective -- it's not quite as given to wild flights of fancy with CSS and javascript as it is with LSL (and if you get bored, you can frame your questions thus: "describe, in the style of P G Wodehouse, how to make an HTTP request in Javascript" for entertaining and informative results). The problem was I didn't understand how to reference things properly, but this seems to work <script> //<![CDATA[ window.onload = function () { var myMusic = document.getElementById(\"myMusic\"); var playButton = document.getElementById(\"play\"); var pauseButton = document.getElementById(\"pause\"); var skipButton = document.getElementById(\"skip\"); var off = true; var on; // Get the icon button element const playlistButton = document.getElementById('playlist-button'); // Add a click event listener to the button playlistButton.addEventListener('click', function() { let text = \"Playist\"; var xhttp = new XMLHttpRequest(); xhttp.open(\"POST\",\""+strURL+"\",true); xhttp.send(text); }); skipButton.onclick =function(){ let text = \"Skip\"; var xhttp = new XMLHttpRequest(); xhttp.open(\"POST\",\""+strURL+"\",true); xhttp.send(text); } myMusic.addEventListener(\"canplaythrough\", function() { duration = myMusic.duration; }, false); myMusic.addEventListener(\"ended\", function() { let text = \"Ended\"; var xhttp = new XMLHttpRequest(); xhttp.open(\"POST\",\""+strURL+"\",true); xhttp.send(text); }); const button = document.getElementById('playPauseButton'); button.addEventListener('click', function() { const icon = this.firstElementChild; if (icon.textContent === 'play_circle') { icon.textContent = 'pause_circle'; myMusic.play(); } else { myMusic.pause(); icon.textContent = 'play_circle'; } }); }; //]]> </script> when combined with buttons like this <div class=\"icon-button-container\"> <link rel=\"stylesheet\" href=\"https://fonts.googleapis.com/css2?family=Material+Symbols+Outlined:opsz,wght,FILL,GRAD@48,400,0,0\" /> <button id=\"playPauseButton\"> <i class=\"material-symbols-outlined\" style=\"font-size:128px;color:SlateGrey;text-shadow:2px 2px 4px #000000 margin-right:100px;\">play_circle</i> </button> <button id = \"skip\"> <i class=\"material-symbols-outlined\" style=\"font-size:128px;color:SlateGrey;text-shadow:2px 2px 4px #000000;\">skip_next</i> </button> <button id=\"playlist-button\"> <i class=\"material-symbols-outlined\" style=\"font-size:128px;color:SlateGrey;text-shadow:2px 2px 4px #000000 margin-left:100px;\">featured_play_list</i> </button> </div> The buttons need to be big because it's on smallish HUD. All the quote marks are escaped because it's LSL, obviously. However, for design reasons, I may end up needing to control it using buttons on the HUD rather than as part of the shared media screen. It's still under consideration, but if we do, is there any way to control the play/pause by touching a button that makes LSL do something? Since play/pause is supposed to restart the track where it left off, I don't think doing anything that refreshes the screen is going to work. If it's not possible, we'll have to rethink some design decisions but it would good to know it it is.
  23. I realised what I was doing wrong! It needs to know where to send the message, of course. This works: integer face = 4; string myURL; integer seq = 0; // sequence number for unique URLs string gsMainBody; generateMainBody(){ gsMainBody = " <!DOCTYPE html> <html xmlns=\"http://www.w3.org/1999/xhtml\"> <body> <h1>HTML DOM Events</h1> <h2>The onclick Event</h2> <p>The onclick event triggers a function when an element is clicked on.</p> <p>Click to trigger a function that will output \"Hello World\":</p> <button onclick=\"myFunction()\">Click me</button> <p id=\"demo\"></p> <script> function myFunction() { document.getElementById(\"demo\").innerHTML = \"Hello World\"; let text = \"Hello Avatar!\"; var xhttp = new XMLHttpRequest(); xhttp.open(\"POST\",\""+myURL+"\"); xhttp.send(text); } </script> </body> </html>"; } default { state_entry() { llReleaseURL(myURL); llRequestURL(); } on_rez(integer sp){ llResetScript(); } http_request(key id, string method, string body) { llOwnerSay("method is "+method); if (method == URL_REQUEST_GRANTED) { myURL = body; llSetPrimMediaParams(face, [PRIM_MEDIA_AUTO_PLAY, TRUE, PRIM_MEDIA_CURRENT_URL, myURL]); //llSetTimerEvent(5.0); } else if (method == "GET") { generateMainBody(); llSetContentType(id, CONTENT_TYPE_XHTML); llHTTPResponse(id, 200, gsMainBody); } else if (method =="POST"){ llOwnerSay(body); } } }
  24. Clearly, yet again, I'm not understanding something fundamental: integer iFace = 4; string gsMainBody; string strMyURL; generateMainBody(){ gsMainBody = "<!DOCTYPE html> <html> <body onload=\"SendDataToLSL()\"> <h1>Page loaded</h1> </body> <script> function SendDataToLSL() { let text = \"Hello Avatar!\"; var xhttp = new XMLHttpRequest(); xhttp.open(\"POST\",\"GetSomeData\"); xhttp.send(text); } </script> </html>"; } default { state_entry() { llClearPrimMedia(iFace); llRequestURL(); } http_request(key id, string method, string body) { llOwnerSay("method is "+method); if (method == URL_REQUEST_GRANTED) { strMyURL = body; llSetPrimMediaParams(iFace, [PRIM_MEDIA_AUTO_PLAY, TRUE, PRIM_MEDIA_CURRENT_URL, strMyURL]); //llSetTimerEvent(5.0); } else if (method == "GET") { generateMainBody(); llSetContentType(id, CONTENT_TYPE_HTML); llHTTPResponse(id, 200, gsMainBody); }else if (method == "POST"){ llOwnerSay(body); } } } That loads the page (I see "Page loaded" on the face of the prim, which chats out "method is GET") but SendDataToLSL() never happens, or at least I don't hear "method is POST" or anything further from the script. What am I doing wrong, please? ETA: It seems to be to do with how I'm sending the message with AJAX. I've adapted my earlier example, with the button, which you fixed, to use integer face = 4; string myURL; integer seq = 0; // sequence number for unique URLs string gsMainBody; generateMainBody(){ gsMainBody = " <!DOCTYPE html> <html xmlns=\"http://www.w3.org/1999/xhtml\"> <body> <h1>HTML DOM Events</h1> <h2>The onclick Event</h2> <p>The onclick event triggers a function when an element is clicked on.</p> <p>Click to trigger a function that will output \"Hello World\":</p> <button onclick=\"myFunction()\">Click me</button> <p id=\"demo\"></p> <script> function myFunction() { document.getElementById(\"demo\").innerHTML = \"Hello World\"; let text = \"Hello Avatar!\"; var xhttp = new XMLHttpRequest(); xhttp.open(\"POST\",\"GetSomeData\"); xhttp.send(text); } </script> </body> </html>"; } default { state_entry() { llReleaseURL(myURL); llRequestURL(); } on_rez(integer sp){ llResetScript(); } http_request(key id, string method, string body) { llOwnerSay("method is "+method); if (method == URL_REQUEST_GRANTED) { myURL = body; llSetPrimMediaParams(face, [PRIM_MEDIA_AUTO_PLAY, TRUE, PRIM_MEDIA_CURRENT_URL, myURL]); //llSetTimerEvent(5.0); } else if (method == "GET") { generateMainBody(); llSetContentType(id, CONTENT_TYPE_XHTML); llHTTPResponse(id, 200, gsMainBody); } else if (method =="POST"){ llOwnerSay(body); } } } and, when I click the button, "Hello World" appears but the http_request event doesn't fire.
  25. "Why it terminated" is a lot simpler than it sounds -- it just means if the previous track played through to the end, or if the user skipped it or turned it off. I need to send the data about last track played, etc, each time I request a new track, so the requirements are very specific.
×
×
  • Create New...