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