From e96fb38f3ee6bc68c5e5386b0ee1c60e850b8e3d Mon Sep 17 00:00:00 2001 From: RebeccaNod1 Date: Thu, 2 Oct 2025 11:35:53 -0500 Subject: [PATCH] fix: Implement manual JSON parsing for LSL 2048-char limit LSL truncates HTTP responses at 2048 characters, breaking JSON parser. Implemented manual string parsing to extract: - tag_name (version) - html_url (release page) - published_at (release date) This works around LSL's HTTP response limitation and provides reliable GitHub release detection. --- Update_Checker.lsl | 73 +++++++++++++++++++++++++++------------------- 1 file changed, 43 insertions(+), 30 deletions(-) diff --git a/Update_Checker.lsl b/Update_Checker.lsl index 72a952d..f35f001 100644 --- a/Update_Checker.lsl +++ b/Update_Checker.lsl @@ -287,42 +287,55 @@ default { updateCheckInProgress = FALSE; if (status == 200) { - // Debug: Show response info first - llOwnerSay("📊 Response received: " + (string)llStringLength(body) + " characters"); - - // Try to find tag_name manually first as a test - integer tagPos = llSubStringIndex(body, "\"tag_name\":"); - if (tagPos == -1) { - llOwnerSay("❌ GitHub response doesn't contain tag_name field"); - llOwnerSay("🔍 First 200 chars: " + llGetSubString(body, 0, 199)); - return; + if (VERBOSE_LOGGING) { + llOwnerSay("📊 GitHub response: " + (string)llStringLength(body) + " chars (LSL limit: 2048)"); } - // Try simple JSON parsing - string latestVersion = llJsonGetValue(body, ["tag_name"]); + // LSL truncates HTTP responses at 2048 chars, breaking JSON parser + // Use manual parsing instead + string latestVersion = ""; + string htmlUrl = ""; + string publishedAt = ""; - if (latestVersion == JSON_INVALID) { - llOwnerSay("❌ LSL JSON parser failed on GitHub response"); - llOwnerSay("🔍 Manual search found tag_name at position: " + (string)tagPos); - // Try to extract version manually - string searchStr = llGetSubString(body, tagPos + 12, tagPos + 50); - llOwnerSay("🔍 Around tag_name: " + searchStr); - return; - } - - // If we get here, JSON parsing worked - string htmlUrl = llJsonGetValue(body, ["html_url"]); - string publishedAt = llJsonGetValue(body, ["published_at"]); - - // Parse release notes with error handling - string releaseNotes = llJsonGetValue(body, ["body"]); - if (releaseNotes == JSON_INVALID) { - releaseNotes = "Release notes unavailable"; - if (VERBOSE_LOGGING) { - llOwnerSay("⚠️ Could not parse release notes - may contain special characters"); + // Extract tag_name manually + integer tagStart = llSubStringIndex(body, "\"tag_name\":\""); + if (tagStart != -1) { + integer versionStart = tagStart + 12; // Skip '"tag_name":"' + integer versionEnd = llSubStringIndex(llGetSubString(body, versionStart, -1), "\""); + if (versionEnd != -1) { + latestVersion = llGetSubString(body, versionStart, versionStart + versionEnd - 1); } } + // Extract html_url manually + integer urlStart = llSubStringIndex(body, "\"html_url\":\""); + if (urlStart != -1) { + integer urlValueStart = urlStart + 12; // Skip '"html_url":"' + integer urlEnd = llSubStringIndex(llGetSubString(body, urlValueStart, -1), "\""); + if (urlEnd != -1) { + htmlUrl = llGetSubString(body, urlValueStart, urlValueStart + urlEnd - 1); + } + } + + // Extract published_at manually + integer pubStart = llSubStringIndex(body, "\"published_at\":\""); + if (pubStart != -1) { + integer pubValueStart = pubStart + 15; // Skip '"published_at":"' + integer pubEnd = llSubStringIndex(llGetSubString(body, pubValueStart, -1), "\""); + if (pubEnd != -1) { + publishedAt = llGetSubString(body, pubValueStart, pubValueStart + pubEnd - 1); + } + } + + if (latestVersion == "") { + llOwnerSay("❌ Could not extract version from truncated GitHub response"); + llOwnerSay("🔍 Response was cut off at 2048 characters"); + return; + } + + // Skip release notes parsing - response is truncated at 2048 chars + string releaseNotes = "Release notes available on GitHub (response truncated)"; + llOwnerSay("=== 🔍 UPDATE CHECK RESULTS ==="); llOwnerSay("📊 Current Version: v" + CURRENT_VERSION); llOwnerSay("✨ Latest GitHub Release: " + latestVersion);