206 lines
		
	
	
		
			5.6 KiB
		
	
	
	
		
			C#
		
	
	
	
			
		
		
	
	
			206 lines
		
	
	
		
			5.6 KiB
		
	
	
	
		
			C#
		
	
	
	
 | 
						|
using System.IO;
 | 
						|
using System.Text;
 | 
						|
using UnityEngine.Networking;
 | 
						|
 | 
						|
#if NETFX_CORE
 | 
						|
using UnityEngine.Windows;
 | 
						|
#endif
 | 
						|
 | 
						|
namespace SRDebugger.Internal
 | 
						|
{
 | 
						|
    using System;
 | 
						|
    using System.Collections;
 | 
						|
    using System.Collections.Generic;
 | 
						|
    using Services;
 | 
						|
    using SRF;
 | 
						|
    using UnityEngine;
 | 
						|
 | 
						|
    public class BugReportApi
 | 
						|
    {
 | 
						|
        private readonly string _apiKey;
 | 
						|
        private readonly BugReport _bugReport;
 | 
						|
        private bool _isBusy;
 | 
						|
 | 
						|
        private UnityWebRequest _webRequest;
 | 
						|
 | 
						|
        public BugReportApi(BugReport report, string apiKey)
 | 
						|
        {
 | 
						|
            _bugReport = report;
 | 
						|
            _apiKey = apiKey;
 | 
						|
        }
 | 
						|
 | 
						|
        public bool IsComplete { get; private set; }
 | 
						|
        public bool WasSuccessful { get; private set; }
 | 
						|
        public string ErrorMessage { get; private set; }
 | 
						|
 | 
						|
        public float Progress
 | 
						|
        {
 | 
						|
            get
 | 
						|
            {
 | 
						|
                if (_webRequest == null)
 | 
						|
                {
 | 
						|
                    return 0;
 | 
						|
                }
 | 
						|
 | 
						|
                return Mathf.Clamp01(_webRequest.uploadProgress);
 | 
						|
            }
 | 
						|
        }
 | 
						|
 | 
						|
        public IEnumerator Submit()
 | 
						|
        {
 | 
						|
            //Debug.Log("[BugReportApi] Submit()");
 | 
						|
 | 
						|
            if (_isBusy)
 | 
						|
            {
 | 
						|
                throw new InvalidOperationException("BugReportApi is already sending a bug report");
 | 
						|
            }
 | 
						|
 | 
						|
            // Reset state
 | 
						|
            _isBusy = true;
 | 
						|
            ErrorMessage = "";
 | 
						|
            IsComplete = false;
 | 
						|
            WasSuccessful = false;
 | 
						|
            _webRequest = null;
 | 
						|
 | 
						|
            string json;
 | 
						|
            byte[] jsonBytes;
 | 
						|
 | 
						|
            try
 | 
						|
            {
 | 
						|
                json = BuildJsonRequest(_bugReport);
 | 
						|
                jsonBytes = Encoding.UTF8.GetBytes(json);
 | 
						|
            }
 | 
						|
            catch (Exception e)
 | 
						|
            {
 | 
						|
                ErrorMessage = "Error building bug report.";
 | 
						|
                Debug.LogError(e);
 | 
						|
                SetCompletionState(false);
 | 
						|
                yield break;
 | 
						|
            }
 | 
						|
 | 
						|
            try
 | 
						|
            {
 | 
						|
                const string jsonContentType = "application/json";
 | 
						|
 | 
						|
                _webRequest = new UnityWebRequest(SRDebugApi.BugReportEndPoint, UnityWebRequest.kHttpVerbPOST,
 | 
						|
                    new DownloadHandlerBuffer(), new UploadHandlerRaw(jsonBytes)
 | 
						|
                    {
 | 
						|
                        contentType = jsonContentType
 | 
						|
                    });
 | 
						|
 | 
						|
                _webRequest.SetRequestHeader("Accept", jsonContentType);
 | 
						|
                _webRequest.SetRequestHeader("X-ApiKey", _apiKey);
 | 
						|
            }
 | 
						|
            catch (Exception e)
 | 
						|
            {
 | 
						|
                ErrorMessage = "Error building bug report request.";
 | 
						|
                Debug.LogError(e);
 | 
						|
 | 
						|
                if (_webRequest != null)
 | 
						|
                {
 | 
						|
                    _webRequest.Dispose();
 | 
						|
                }
 | 
						|
 | 
						|
                SetCompletionState(false);
 | 
						|
            }
 | 
						|
            
 | 
						|
            if (_webRequest == null)
 | 
						|
            {
 | 
						|
                SetCompletionState(false);
 | 
						|
                yield break;
 | 
						|
            }
 | 
						|
 | 
						|
#if !UNITY_2017_2_OR_NEWER
 | 
						|
            yield return _webRequest.Send();
 | 
						|
#else
 | 
						|
            yield return _webRequest.SendWebRequest();
 | 
						|
#endif
 | 
						|
 | 
						|
#if !UNITY_2017_1_OR_NEWER
 | 
						|
            if(_webRequest.isError)
 | 
						|
#else
 | 
						|
                if (_webRequest.isNetworkError)
 | 
						|
#endif
 | 
						|
            {
 | 
						|
                ErrorMessage = "Request Error: " + _webRequest.error;
 | 
						|
                SetCompletionState(false);
 | 
						|
                _webRequest.Dispose();
 | 
						|
                yield break;
 | 
						|
            }
 | 
						|
 | 
						|
            long responseCode = _webRequest.responseCode;
 | 
						|
            var responseJson = _webRequest.downloadHandler.text;
 | 
						|
 | 
						|
            _webRequest.Dispose();
 | 
						|
 | 
						|
            if (responseCode != 200)
 | 
						|
            {
 | 
						|
                ErrorMessage = "Server: " + SRDebugApiUtil.ParseErrorResponse(responseJson, "Unknown response from server");
 | 
						|
                SetCompletionState(false);
 | 
						|
                yield break;
 | 
						|
            }
 | 
						|
 | 
						|
            SetCompletionState(true);
 | 
						|
        }
 | 
						|
 | 
						|
        private void SetCompletionState(bool wasSuccessful)
 | 
						|
        {
 | 
						|
            _bugReport.ScreenshotData = null;
 | 
						|
            WasSuccessful = wasSuccessful;
 | 
						|
            IsComplete = true;
 | 
						|
            _isBusy = false;
 | 
						|
 | 
						|
            if (!wasSuccessful)
 | 
						|
            {
 | 
						|
                Debug.LogError("Bug Reporter Error: " + ErrorMessage);
 | 
						|
            }
 | 
						|
        }
 | 
						|
 | 
						|
        private static string BuildJsonRequest(BugReport report)
 | 
						|
        {
 | 
						|
            var ht = new Hashtable();
 | 
						|
 | 
						|
            ht.Add("userEmail", report.Email);
 | 
						|
            ht.Add("userDescription", report.UserDescription);
 | 
						|
 | 
						|
            ht.Add("console", CreateConsoleDump());
 | 
						|
            ht.Add("systemInformation", report.SystemInformation);
 | 
						|
 | 
						|
            if (report.ScreenshotData != null)
 | 
						|
            {
 | 
						|
                ht.Add("screenshot", Convert.ToBase64String(report.ScreenshotData));
 | 
						|
            }
 | 
						|
 | 
						|
            var json = Json.Serialize(ht);
 | 
						|
 | 
						|
            return json;
 | 
						|
        }
 | 
						|
 | 
						|
        private static IList<IList<string>> CreateConsoleDump()
 | 
						|
        {
 | 
						|
            var list = new List<IList<string>>();
 | 
						|
 | 
						|
            var consoleLog = Service.Console.AllEntries;
 | 
						|
 | 
						|
            foreach (var consoleEntry in consoleLog)
 | 
						|
            {
 | 
						|
                var entry = new List<string>();
 | 
						|
 | 
						|
                entry.Add(consoleEntry.LogType.ToString());
 | 
						|
                entry.Add(consoleEntry.Message);
 | 
						|
                entry.Add(consoleEntry.StackTrace);
 | 
						|
 | 
						|
                if (consoleEntry.Count > 1)
 | 
						|
                {
 | 
						|
                    entry.Add(consoleEntry.Count.ToString());
 | 
						|
                }
 | 
						|
 | 
						|
                list.Add(entry);
 | 
						|
            }
 | 
						|
 | 
						|
            return list;
 | 
						|
        }
 | 
						|
    }
 | 
						|
}
 |