You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
CrowdControl/Assets/3rd/StompyRobot/SRDebugger/Scripts/Internal/BugReportApi.cs

206 lines
5.4 KiB
C#

2 months ago

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