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;
							 | 
						|||
| 
								 | 
							
								        }
							 | 
						|||
| 
								 | 
							
								    }
							 | 
						|||
| 
								 | 
							
								}
							 |