using UnityEngine; using Amazon.S3.Model; using UltraCombos.Upload; using OscJack; using System.Collections; using TMPro; using System; using UnityEngine.UI; [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_postcard; public RenderTexture renderTexture_share; 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; public GameObject BackgroundText; public GameObject BackgroundDefault; public GameObject ImageDiscard; public GameObject ImageGenerate; public GameObject ImageDiscardPostcard; public GameObject ImageGeneratePostcard; // 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 uploadDest=parmas[0].Trim(); string id = parmas[1].Trim(); string summary = parmas[2].Trim(); string filename = parmas.Length > 3 ? parmas[3].Trim() : System.DateTime.Now.ToString("yyyyMMdd_hhmmss"); bool discard = parmas.Length > 4 && (parmas[4].Trim().ToLower() == "discard"); bool default_image= parmas.Length > 5 && (parmas[5].Trim().ToLower() == "default"); if (discard) { if (ImageDiscard != null) ImageDiscard.SetActive(true); } else { if (ImageDiscard != null) ImageDiscard.SetActive(false); } Debug.Log("choice: " + discard +" default"+ default_image+" summary:"+summary); if (summary.Length > 0) { BackgroundDefault.SetActive(false); BackgroundText.SetActive(true); } else { BackgroundDefault.SetActive(true); BackgroundText.SetActive(false); } if (default_image) { ImageGenerate.SetActive(false); if(!discard) ImageDiscard.SetActive(false); ImageGeneratePostcard.SetActive(false); if(!discard) ImageDiscardPostcard.SetActive(false); } else { ImageGenerate.SetActive(true); ImageGeneratePostcard.SetActive(true); } TextNumber.SetText(id); TextSummary.SetText(summary); TextNumber.ForceMeshUpdate(); TextSummary.ForceMeshUpdate(); if (string.IsNullOrEmpty(filename)) { Debug.LogError("Filename cannot be null or empty."); return; } Debug.Log("Saving image to: " + uploadDest + " filename=" + filename+ " id=" + id); string timestamp = System.DateTime.Now.ToString("yyyyMMdd"); if (!System.IO.Directory.Exists(OutputFolder+"/" + uploadDest)) { System.IO.Directory.CreateDirectory(OutputFolder+"/" + uploadDest); } SaveRenderTextureToPNG(renderTexture_postcard, System.IO.Path.Combine(OutputFolder+"/" + uploadDest, filename + "_print.png")); Debug.Log("Image saved to " + filename); SaveRenderTextureToPNG(renderTexture_share, System.IO.Path.Combine(OutputFolder+"/" + uploadDest, filename + ".png")); Debug.Log("Image saved to " + filename); // Optionally, you can also log the full path string print_fullPath = System.IO.Path.Combine(OutputFolder+"/" + uploadDest + "/", filename + "_print.png"); Debug.Log("print_path: " + print_fullPath); upload(print_fullPath, id, "print"); string share_fullPath = System.IO.Path.Combine(OutputFolder+"/" + uploadDest + "/", filename + ".png"); Debug.Log("share_path: " + share_fullPath); upload(share_fullPath, id, "share"); } 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, string id, string type) { if (uploader != null) { uploader.Upload(filename, (response) => { if (response.success) { Debug.Log("Upload successful: " + response.message); if(type=="print") writeToFirebase("prints", System.DateTime.Now.ToString("yyyyMMdd_hhmmss"), response.message, type); writeToFirebase("records","user/"+id+"/file/"+type, response.message, type); } else { Debug.LogError("Upload failed: " + response); } }); } else { Debug.LogError("Uploader is not assigned."); } } public void writeToFirebase(string collection, string id, string url, string type) { Debug.Log("Writing to Firebase: " + collection + "/" + id); StartCoroutine(WriteToFirebaseCoroutine(id, url)); IEnumerator WriteToFirebaseCoroutine(string id, string url) { // string[] tags=filename.Split('/'); // string id=tags[tags.Length - 1].Split('.')[0]; Debug.Log("Extracted ID: " + id); string firebaseUrl = FirebaseUrl + collection + "/" + id; string jsonData = "{ \"fields\": { " + "\""+type+"_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); } } } } }