IndieGame/client/Assets/Plugins/Easy Save 3/Scripts/Web/ES3WebClass.cs
DOBEST\zhaoyingjie f242607587 初始化工程
2024-10-11 10:12:15 +08:00

149 lines
3.7 KiB
C#

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.Networking;
namespace ES3Internal
{
public class ES3WebClass
{
protected string url;
protected string apiKey;
protected List<KeyValuePair<string,string>> formData = new List<KeyValuePair<string, string>>();
protected UnityWebRequest _webRequest = null;
public bool isDone = false;
public float uploadProgress
{
get
{
if(_webRequest == null)
return 0;
else
return _webRequest.uploadProgress;
}
}
public float downloadProgress
{
get
{
if(_webRequest == null)
return 0;
else
return _webRequest.downloadProgress;
}
}
#region Error Handling
/// <summary>An error message, if an error occurred.</summary>
public string error = null;
/// <summary>This is set to true if an error occurred while performing an operation.</summary>
public bool isError{ get{ return !string.IsNullOrEmpty(error) || errorCode > 0; } }
/// <summary>The error code relating to the error, if one occurred. If it's a server error, this will return the HTTP error code.</summary>
public long errorCode = 0;
public static bool IsNetworkError(UnityWebRequest www)
{
#if UNITY_2020_1_OR_NEWER
return www.result == UnityWebRequest.Result.ConnectionError;
#else
return www.isNetworkError;
#endif
}
#endregion
protected ES3WebClass(string url, string apiKey)
{
this.url = url;
this.apiKey = apiKey;
}
#region Other Methods
/// <summary>Adds POST data to any requests sent by this ES3Cloud object. Use this if you are sending data to a custom script on your server.</summary>
/// <param name="fieldName">The name of the POST field we want to add.</param>
/// <param name="value">The string value of the POST field we want to add.</param>
public void AddPOSTField(string fieldName, string value)
{
formData.Add(new KeyValuePair<string, string>(fieldName, value));
}
#endregion
#region Internal Methods
protected string GetUser(string user, string password)
{
if(string.IsNullOrEmpty(user))
return "";
// Final user string is a combination of the username and password, and hashed if encryption is enabled.
if(!string.IsNullOrEmpty(password))
user += password;
#if !DISABLE_ENCRYPTION && !DISABLE_HASHING
user = ES3Internal.ES3Hash.SHA1Hash(user);
#endif
return user;
}
protected WWWForm CreateWWWForm()
{
var form = new WWWForm();
foreach(var kvp in formData)
form.AddField(kvp.Key, kvp.Value);
return form;
}
/* Checks if an error occurred and sets relevant details, and returns true if an error did occur */
protected bool HandleError(UnityWebRequest webRequest, bool errorIfDataIsDownloaded)
{
if(IsNetworkError(webRequest))
{
errorCode = 1;
error = "Error: " + webRequest.error;
}
else if(webRequest.responseCode >= 400)
{
errorCode = webRequest.responseCode;
if(string.IsNullOrEmpty(webRequest.downloadHandler.text))
error = string.Format("Server returned {0} error with no message", webRequest.responseCode);
else
error = webRequest.downloadHandler.text;
}
else if(errorIfDataIsDownloaded && webRequest.downloadedBytes > 0)
{
errorCode = 2;
error = "Server error: '" + webRequest.downloadHandler.text + "'";
}
else
return false;
return true;
}
protected IEnumerator SendWebRequest(UnityWebRequest webRequest)
{
_webRequest = webRequest;
#if !UNITY_2017_2_OR_NEWER
yield return webRequest.Send();
#else
yield return webRequest.SendWebRequest();
#endif
}
protected virtual void Reset()
{
error = null;
errorCode = 0;
isDone = false;
}
#endregion
}
}