// SPDX-License-Identifier: MIT // Copyright (c) 2026 Incoprea // Record before and after edit notes // Not compiled or tested in-world // Setup: Place in your own object and touch. Enter field|before|after, or list. Maximum 12 changes. // Stop / restore: Remove or reset to erase session data. Input listeners close after one reply or after 45 seconds. // Notes: Data lives only in script memory and is lost on reset. No visitors are logged and no external requests are sent. Records what you type and does not inspect or apply actual edits. Intended for rollback notes you export before reset. // License: see LICENSE in this distribution. // Original Incoprea example. MIT. list changes; integer handle; integer channel; closeInput() { if(handle)llListenRemove(handle); handle=0; llSetTimerEvent(0); } respond(string input) { input=llStringTrim(input,STRING_TRIM); if(llStringLength(input)>200) { llOwnerSay("Use at most 200 characters."); return; } if(input=="list") { integer i; for(i=0;i ["+llList2String(changes,i+2)+"]"); return; } list p=llParseStringKeepNulls(input,["|"],[]); if(llGetListLength(p)!=3 || llList2String(p,0)=="" || llGetListLength(changes)>=36) { llOwnerSay("Use field|before|after; maximum 12 records."); return; } changes += p; llOwnerSay("Change note recorded."); } default { touch_start(integer touches) { if(llDetectedKey(0)!=llGetOwner())return; closeInput(); channel=-10000-(integer)llFrand(1000000000); handle=llListen(channel,"",llGetOwner(),""); llSetTimerEvent(45); llTextBox(llGetOwner(),"Enter field|before|after, or list. Maximum 12 changes.",channel); } listen(integer c,string name,key speaker,string input) { if(c!=channel || speaker!=llGetOwner())return; closeInput(); respond(input); } timer() { closeInput(); llOwnerSay("Input closed."); } changed(integer flags) { if(flags & CHANGED_OWNER)llResetScript(); } }