Skip to content
Snippets Groups Projects
GlobalBehaviour.cs 9.63 KiB
Newer Older
  • Learn to ignore specific revisions
  • MaZiFAU's avatar
    MaZiFAU committed
    using Newtonsoft.Json;
    
    MaZiFAU's avatar
    MaZiFAU committed
    using System.Collections;
    using System.Collections.Generic;
    using System.IO;
    
    using System.Text.RegularExpressions;
    
    using UnityEditor.PackageManager.Requests;
    
    MaZiFAU's avatar
    MaZiFAU committed
    using UnityEngine;
    using UnityEngine.Networking;
    
    public class GlobalBehaviour : MonoBehaviour
    
    MaZiFAU's avatar
    MaZiFAU committed
        public static GlobalBehaviour Instance
        {
            get => _Instance;
            set
            {
    
    MaZiFAU's avatar
    MaZiFAU committed
                if (_Instance == null)
    
    MaZiFAU's avatar
    MaZiFAU committed
                    _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;
    
    MaZiFAU's avatar
    MaZiFAU committed
    
        private void Awake()
        {
            Instance = this;
    
            if (Instance != this)
                return;
    
            DontDestroyOnLoad(this);
    
            GetScrollsfromServer();
            GetContextfromServer();
    
    MaZiFAU's avatar
    MaZiFAU committed
        }
    
        //TODO: Move where appropiate
    
        public int tryScrollListTimes = 2;
    
        static public List<REST_JSON_API.Scroll> AvailableScrolls;
    
        public static IEnumerator InitiateScrolls = IEnumeratorExtensions.yield_break;
    
        private void GetScrollsfromServer()
    
    MaZiFAU's avatar
    MaZiFAU committed
        {
    
            StartCoroutine(InitiateScrolls = _GetScrollsfromServer());
    
            IEnumerator _GetScrollsfromServer()
    
    MaZiFAU's avatar
    MaZiFAU committed
            {
    
                //Try /scroll/listall endpoint when scroll/list is not working
    
    MaZiFAU's avatar
    MaZiFAU committed
                //UnityWebRequest request = UnityWebRequest.Get(CommunicationEvents.ServerAdress + "/scroll/listall");
    
    MaZiFAU's avatar
    MaZiFAU committed
                //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;
                //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;
    
    MaZiFAU's avatar
    MaZiFAU committed
    
                string jsonString = null;
    
    
                //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;
                //}
    
    MaZiFAU's avatar
    MaZiFAU committed
    
                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;
    
                AvailableScrolls = JsonConvert.DeserializeObject<List<REST_JSON_API.Scroll>>(jsonString);
    
                Debug.Log(
                    $"Scroll Times:\n" +
    
    MaZiFAU's avatar
    MaZiFAU committed
                    $"Summ\t{(System.DateTime.UtcNow - requestTime).TotalMilliseconds}ms\n" +
    
                    $"Server\t{(answerTime - requestTime).TotalMilliseconds}ms\n" +
                    $"Download\t{(parseTime - answerTime).TotalMilliseconds}ms\n" +
                    $"Parsing\t{(System.DateTime.UtcNow - parseTime).TotalMilliseconds}ms");
    
    MaZiFAU's avatar
    MaZiFAU committed
            }
    
    MaZiFAU's avatar
    MaZiFAU committed
        }
    
    
        public static FactRecorder Context = new();
    
        public static IEnumerator InitiateContext = IEnumeratorExtensions.yield_break;
    
    MaZiFAU's avatar
    MaZiFAU committed
        public static bool ContextLoaded = false;
    
            StartCoroutine(InitiateContext = _GetContextfromServer());
    
    MaZiFAU's avatar
    MaZiFAU committed
                ContextLoaded = false;
    
    
                System.DateTime requestTime = System.DateTime.UtcNow;
                UnityWebRequest request = null;
                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 (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.DateTime justParseTime = default;
                System.DateTime 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;
    
                    List<Fact> new_list = new();
    
                    System.DateTime parse_time = System.DateTime.Now;
                    yield return ParsingDictionary.parseFactDictionary[fact.getType()](new_list, fact);
                    justParseTime += System.DateTime.Now - 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.Now;
                    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.Now - 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" +
                    $"Parsing\t{(parseEnd - parseTime).TotalMilliseconds}ms\n" +
                    $"FactParsing\t{justParseTime.Millisecond}ms\n" +
                    $"FactAdding\t{justAddinTime.Millisecond}ms\n" +
                    "");
    
    
    MaZiFAU's avatar
    MaZiFAU committed
                ContextLoaded = true;