using Newtonsoft.Json; using REST_JSON_API; using System.Collections; using System.Collections.Generic; using System.IO; using System.Text.RegularExpressions; using UnityEngine; using UnityEngine.Networking; public class GlobalBehaviour : MonoBehaviour { public static GlobalBehaviour Instance { get => _Instance; set { if (_Instance == null) _Instance = value; else Destroy(value); } } private static GlobalBehaviour _Instance; //Make sure when using RGBA-Colors, the A-value of animationStartColor //and animationEndColor is the same OR try with value = 255 public static Color HintAnimationStartColor => Instance._hintAnimationStartColor; public static Color HintAnimationEndColor => Instance._hintAnimationEndColor; public static float HintAnimationDuration => Instance._hintAnimationDuration; public static float AnimationLerpDuration => Instance._AnimationLerpDuration; public static Color StageAccomplished => Instance._StageAccomplished; public static Color StageNotYetAccomplished => Instance._StageNotYetAccomplished; public static Color StageError => Instance._StageError; public static float GadgetLaserDistance => Instance._GadgetLaserDistance; public static float GadgetPhysicalDistance => Instance._GadgetPhysicalDistance; #region Unity Serialization [SerializeField] private Color _hintAnimationStartColor; [SerializeField] private Color _hintAnimationEndColor; [SerializeField] private float _hintAnimationDuration; [SerializeField] private float _AnimationLerpDuration; [SerializeField] private Color _StageAccomplished; [SerializeField] private Color _StageNotYetAccomplished; [SerializeField] private Color _StageError; [SerializeField] private float _GadgetLaserDistance; [SerializeField] private float _GadgetPhysicalDistance; #endregion //TODO: move? /// <summary> Default Setting for all JSONConvert operations </summary> public static JsonSerializerSettings JsonConvertDefaultSettings = new() { MaxDepth = 256 }; private void Awake() { Instance = this; if (Instance != this) return; JsonConvert.DefaultSettings = () => JsonConvertDefaultSettings; DontDestroyOnLoad(this); GetScrollsfromServer(); GetContextfromServer(); } //TODO: Move where appropiate public int tryScrollListTimes = 2; static public List<REST_JSON_API.Scroll> AvailableScrolls; public static IEnumerator InitiateScrolls = IEnumeratorExtensions.yield_break; public static bool AttemptScrollList = true; //false; private void GetScrollsfromServer() { StartCoroutine(InitiateScrolls = _GetScrollsfromServer()); IEnumerator _GetScrollsfromServer() { //Try /scroll/listall endpoint when scroll/list is not working //UnityWebRequest request = UnityWebRequest.Get(CommunicationEvents.ServerAdress + "/scroll/listall"); //Postman-Echo-Mock //UnityWebRequest request = UnityWebRequest.Get("https://019a8ea5-843a-498b-8d0c-778669aef987.mock.pstmn.io/get"); System.DateTime requestTime = System.DateTime.UtcNow; UnityWebRequest request = null; if (AttemptScrollList) { for (int i = 0; i < this.tryScrollListTimes; i++) { request = UnityWebRequest.Get(CommunicationEvents.ServerAdress + "/scroll/list"); request.method = UnityWebRequest.kHttpVerbGET; yield return request.SendWebRequest(); if (request.result == UnityWebRequest.Result.ConnectionError || request.result == UnityWebRequest.Result.ProtocolError) { Debug.LogWarning(request.error); Debug.Log("GET Scroll/list failed. Attempt: " + (i + 1).ToString()); } else break; } while (request.result == UnityWebRequest.Result.InProgress) yield return null; } System.DateTime answerTime = System.DateTime.UtcNow; string jsonString = null; if (AttemptScrollList) { if (request.result == UnityWebRequest.Result.ConnectionError || request.result == UnityWebRequest.Result.ProtocolError) { Debug.LogWarning(request.error); } else { CommunicationEvents.ServerRunning = true; while (!request.downloadHandler.isDone) yield return null; jsonString = request.downloadHandler.text; } } if (string.IsNullOrEmpty(jsonString) || jsonString.Equals("[]")) { jsonString = File.ReadAllText(Application.streamingAssetsPath + "/scrolls.json"); Debug.Log("Using Fallback Scrolls: \n" + jsonString); } System.DateTime parseTime = System.DateTime.UtcNow; List<Scroll> _AvailableScrolls = JsonConvert.DeserializeObject<List<Scroll>>(jsonString); System.DateTime processTime = System.DateTime.UtcNow; AvailableScrolls = new(); foreach (Scroll scroll in _AvailableScrolls) AvailableScrolls.Add(IJSONsavable<Scroll>.postprocess(scroll)); Debug.Log( $"Scroll Times:\n" + $"Summ\t{(System.DateTime.UtcNow - requestTime).TotalMilliseconds}ms\n" + $"Server\t{(answerTime - requestTime).TotalMilliseconds}ms\n" + $"Download\t{(parseTime - answerTime).TotalMilliseconds}ms\n" + $"JSONParsing\t{(processTime - parseTime).TotalMilliseconds}ms\n" + $"Processing\t{(System.DateTime.UtcNow - processTime).TotalMilliseconds}ms"); yield break; } } public static FactRecorder Context = new(); public static IEnumerator InitiateContext = IEnumeratorExtensions.yield_break; public static bool ContextLoaded = false; public static bool AttemptContextLoad = true; //false; private void GetContextfromServer() { StartCoroutine(InitiateContext = _GetContextfromServer()); IEnumerator _GetContextfromServer() { ContextLoaded = false; System.DateTime requestTime = System.DateTime.UtcNow; UnityWebRequest request = null; if (AttemptContextLoad) { for (int i = 0; i < this.tryScrollListTimes; i++) { request = UnityWebRequest.Get(CommunicationEvents.ServerAdress + "/fact/list"); request.method = UnityWebRequest.kHttpVerbGET; yield return request.SendWebRequest(); if (request.result == UnityWebRequest.Result.ConnectionError || request.result == UnityWebRequest.Result.ProtocolError) { Debug.LogWarning(request.error); Debug.Log("GET /fact/list failed. Attempt: " + (i + 1).ToString()); } else break; } while (request.result == UnityWebRequest.Result.InProgress) yield return null; } System.DateTime answerTime = System.DateTime.UtcNow; string jsonString = null; if (AttemptContextLoad) { if (request.result == UnityWebRequest.Result.ConnectionError || request.result == UnityWebRequest.Result.ProtocolError) { Debug.LogWarning(request.error); } else { CommunicationEvents.ServerRunning = true; while (!request.downloadHandler.isDone) yield return null; jsonString = request.downloadHandler.text; } } if (string.IsNullOrEmpty(jsonString) || jsonString.Equals("[]")) { jsonString = File.ReadAllText(Application.streamingAssetsPath + "/context.json"); Debug.Log("Using Fallback Context: \n" + jsonString); } System.DateTime parseTime = System.DateTime.UtcNow; MMTFact[] context_facts = JsonConvert.DeserializeObject<MMTFact[]>(jsonString); System.DateTime parseEnd = System.DateTime.UtcNow; System.TimeSpan justParseTime = default; System.TimeSpan justAddinTime = default; bool samestep = false; foreach (MMTFact fact in context_facts) { if (Regex.IsMatch(fact.@ref.uri, ".*fact\\d+$") // one of ours || Regex.IsMatch(fact.@ref.uri, ".*SituationTheory\\d+\\?.*") // one of ours || fact.GetDefines() == null) // Scala rule? continue; System.DateTime parse_time = System.DateTime.UtcNow; List<Fact> new_list = Fact.MMTFactory(fact); // old but IEnumerator: yield return ParsingDictionary.parseFactDictionary[fact.getType()](new_list, fact); justParseTime += System.DateTime.UtcNow - parse_time; if (new_list.Count == 0) { Debug.LogWarning("Parsing on context-fact returned empty List -> One of the dependent facts does not exist or parsing failed"); continue; } System.DateTime addin_time = System.DateTime.UtcNow; foreach (Fact new_fact in new_list) { Context.Add(new_fact, out bool exists, samestep, null, null, true, true); if (!exists) samestep = true; //yield return null; } justAddinTime += System.DateTime.UtcNow - addin_time; } Debug.Log( $"Context Times:\n" + $"Summ\t{(System.DateTime.UtcNow - requestTime).TotalMilliseconds}ms\n" + $"Server\t{(answerTime - requestTime).TotalMilliseconds}ms\n" + $"Download\t{(parseTime - answerTime).TotalMilliseconds}ms\n" + $"JSONParsing\t{(parseEnd - parseTime).TotalMilliseconds}ms\n" + $"FactCreation\t{(System.DateTime.UtcNow - parseEnd).TotalMilliseconds}ms\n" + $"FactJustParsing\t{justParseTime.Milliseconds}ms\n" + $"FactJustAdding\t{justAddinTime.Milliseconds}ms\n" + ""); ContextLoaded = true; yield break; } } }