using System; using System.Collections; using System.Collections.Generic; using System.Diagnostics; using System.Net.Http; using System.Threading; using Cysharp.Threading.Tasks; using UnityEditor.Rendering; using UnityEngine; using UnityEngine.Events; using Timer = System.Timers.Timer; namespace BITKit.Http { public class HttpService : MonoBehaviour { [Header(Constant.Header.Settings)] [SerializeReference,SubclassSelector] private IReference url; [SerializeField] private double interval; [SerializeField] private CollisionDetectionMode detectionMode; [Header(Constant.Header.Output)] [SerializeField] private UnityEvent output; [SerializeField] private UnityEvent onException; [Header(Constant.Header.Debug)] [SerializeField, ReadOnly] private double time; private readonly Timer timer = new() { AutoReset = true }; private readonly HttpClient _httpClient = new(); private CancellationToken _cancellationToken; private void Awake() { _cancellationToken = gameObject.GetCancellationTokenOnDestroy(); } private void Start() { timer.Interval = interval*1000; timer.Elapsed += (x, y) => OnUpdate(); timer.AutoReset = detectionMode switch { CollisionDetectionMode.ContinuousDynamic => true, CollisionDetectionMode.ContinuousSpeculative => true, CollisionDetectionMode.Continuous => true, CollisionDetectionMode.Discrete => false, _ => throw new ArgumentOutOfRangeException() }; timer.Start(); } private void OnDestroy() { timer.Stop(); timer.Dispose(); } private async void OnUpdate() { Stopwatch stopwatch = new(); stopwatch.Start(); //var result = await _httpClient.GetStringAsync(url.Value); var response = await _httpClient.GetAsync(url.Value, _cancellationToken); var result =await response.Content.ReadAsStringAsync(); _cancellationToken.ThrowIfCancellationRequested(); stopwatch.Stop(); time =System.TimeSpan.FromMilliseconds(stopwatch.ElapsedMilliseconds).TotalSeconds; await UniTask.SwitchToMainThread(_cancellationToken); if (response.StatusCode is not System.Net.HttpStatusCode.OK) { onException.Invoke(result); } else { output.Invoke(result); } if(timer.AutoReset==false) timer.Start(); } } }