using UnityEngine; using Amazon.S3.Model; using UltraCombos.Upload; using OscJack; using System.Collections; using TMPro; [System.Serializable] public class S3Tag { public string key; public string value; public static implicit operator Tag(S3Tag t) => new Tag { Key = t.key, Value = t.value }; } public class SaveImage : MonoBehaviour { public Uploader uploader; public RenderTexture renderTexture; public string OutputFolder = "output"; public string FirebaseUrl = "https://firestore.googleapis.com/v1/projects/uc-24070-thegreattipsy/databases/(default)/documents/"; public TextMeshProUGUI TextNumber; public TextMeshProUGUI TextSummary; // Start is called before the first frame update void Start() { uploader = GetComponent(); } // Update is called once per frame void Update() { } public void Save(string input_text) { var parmas = input_text.Split('#'); if (parmas.Length < 2) { Debug.LogError("Input text must contain at least two parts separated by '#'."); return; } string id = parmas[0].Trim(); string summary = parmas[1].Trim(); TextNumber.text = id; TextSummary.text = summary; string filename = $"{id}.png"; // Use the ID as the filename if (string.IsNullOrEmpty(filename)) { Debug.LogError("Filename cannot be null or empty."); return; } Debug.Log("Saving image to: " + filename); string timestamp = System.DateTime.Now.ToString("yyyyMMdd"); if (!System.IO.Directory.Exists(OutputFolder + "/" + timestamp)) { System.IO.Directory.CreateDirectory(OutputFolder + "/" + timestamp); } SaveRenderTextureToPNG(renderTexture, System.IO.Path.Combine(OutputFolder + "/" + timestamp, filename)); Debug.Log("Image saved to " + filename); // Optionally, you can also log the full path string fullPath = System.IO.Path.Combine(OutputFolder + "/" + timestamp + "/", filename); Debug.Log("path: " + fullPath); upload(fullPath); } void SaveRenderTextureToPNG(RenderTexture rt, string filePath) { RenderTexture currentRT = RenderTexture.active; RenderTexture.active = rt; Texture2D tex = new Texture2D(rt.width, rt.height, TextureFormat.RGBA32, false); tex.ReadPixels(new Rect(0, 0, rt.width, rt.height), 0, 0); tex.Apply(); byte[] bytes = tex.EncodeToPNG(); System.IO.File.WriteAllBytes(filePath, bytes); Debug.Log("Saved RenderTexture to PNG at " + filePath + " with size: " + bytes.Length + " bytes"); RenderTexture.active = currentRT; Destroy(tex); } void upload(string filename) { if (uploader != null) { uploader.Upload(filename, (response) => { if (response.success) { Debug.Log("Upload successful: " + response.message); writeToFirebase("prints", filename, response.message); writeToFirebase("records", filename, response.message); } else { Debug.LogError("Upload failed: " + response); } }); } else { Debug.LogError("Uploader is not assigned."); } } public void writeToFirebase(string collection, string filename, string url) { Debug.Log("Writing to Firebase: " + filename); StartCoroutine(WriteToFirebaseCoroutine(filename, url)); IEnumerator WriteToFirebaseCoroutine(string filename, string url) { string id=filename.Split('/')[2].Split('.')[0]; Debug.Log("Extracted ID: " + id); string firebaseUrl = FirebaseUrl + collection + "/" + id; string jsonData = "{ \"fields\": { " + "\"url\": { \"stringValue\": \"" + url + "\" }, " + "\"timestamp\": { \"timestampValue\": \"" + System.DateTime.UtcNow.ToString("o") + "\" } " + "} }"; using (var www = new UnityEngine.Networking.UnityWebRequest(firebaseUrl, "PATCH")) { byte[] bodyRaw = System.Text.Encoding.UTF8.GetBytes(jsonData); www.uploadHandler = new UnityEngine.Networking.UploadHandlerRaw(bodyRaw); www.downloadHandler = new UnityEngine.Networking.DownloadHandlerBuffer(); www.SetRequestHeader("Content-Type", "application/json"); yield return www.SendWebRequest(); #if UNITY_2020_1_OR_NEWER if (www.result != UnityEngine.Networking.UnityWebRequest.Result.Success) #else if (www.isNetworkError || www.isHttpError) #endif { Debug.LogError("Error writing to Firebase: " + www.error); Debug.LogError("Response: " + www.downloadHandler.text); } else { Debug.Log("Successfully wrote to Firebase: " + www.downloadHandler.text); } } } } }