2025-04-11 15:22:47 +08:00
using Newtonsoft.Json ;
using System ;
using System.Collections ;
using System.Collections.Generic ;
using System.IO ;
using System.Runtime.InteropServices ;
using System.Security.Cryptography ;
using System.Text ;
using UnityEngine ;
using UnityEngine.Events ;
using UnityEngine.Networking ;
public class LYTWebGLHelper : MonoBehaviour
{
public class LabData
{
public string GUID ;
public string ExpID ;
public string HOST = string . Empty ;
public string PARA1 ;
public string PARA ;
public string PARA2 ;
}
#if UNITY_WEBGL
[DllImport("__Internal")]
private static extern IntPtr GetURLParameter ( string name ) ;
#endif
string token = string . Empty ;
LabData labData = new LabData ( ) ;
[SerializeField]
private TextAsset RSA ;
private const int RsaKeySize = 2048 ;
public string uploadUrl ;
public static LYTWebGLHelper Instance ;
private void Awake ( )
{
#if UNITY_WEBGL
Instance = this ;
DontDestroyOnLoad ( this ) ;
#endif
}
public void Init ( )
{
#if UNITY_WEBGL & & ! UNITY_EDITOR
var paramPtr = GetURLParameter ( "token" ) ;
if ( paramPtr ! = IntPtr . Zero )
{
string value = Marshal . PtrToStringUTF8 ( paramPtr ) ;
//token = value.Replace("%2B", "+");
token = value . Replace ( " " , "+" ) ;
Marshal . FreeHGlobal ( paramPtr ) ; // <20> ͷŷ<CDB7> <C5B7> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> ڴ<EFBFBD>
}
Debug . LogError ( "<22> <> ȡ<EFBFBD> ģ<EFBFBD> " + token ) ;
#endif
RSA = Resources . Load < TextAsset > ( "LYTWebGL/RSA" ) ;
if ( string . IsNullOrEmpty ( token ) = = false )
{
string urlData = Decrypt ( token ) ;
var datas = urlData . Split ( "&" ) ;
labData . GUID = datas [ 0 ] ;
labData . ExpID = datas [ 1 ] ;
labData . HOST = datas [ 2 ] ;
labData . PARA1 = datas [ 3 ] ;
labData . PARA = datas [ 4 ] ;
labData . PARA2 = datas [ 5 ] ;
}
uploadUrl = Path . Combine ( labData . HOST , "host/public/Exp/AddScore/" ) ;
}
/// <summary>
/// Decrypts encrypted text given a RSA private key file path.<2E> <> <EFBFBD> <EFBFBD> ·<EFBFBD> <C2B7> <EFBFBD> <EFBFBD> RSA ˽Կ<CBBD> ļ<EFBFBD> <C4BC> <EFBFBD>
/// </summary>
/// <param name="encryptedText"><3E> <> <EFBFBD> ܵ<EFBFBD> <DCB5> <EFBFBD> <EFBFBD> <EFBFBD> </param>
/// <param name="pathToPrivateKey"><3E> <> <EFBFBD> ڼ<EFBFBD> <DABC> ܵ<EFBFBD> ˽Կ·<D4BF> <C2B7> .</param>
/// <returns>δ<> <CEB4> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> ݵ<EFBFBD> <DDB5> ַ<EFBFBD> <D6B7> <EFBFBD> </returns>
public string Decrypt ( string encryptedText )
{
using ( var rsa = new RSACryptoServiceProvider ( RsaKeySize ) )
{
try
{
string privateXmlKey = RSA . text ;
rsa . FromXmlString ( privateXmlKey ) ;
Debug . Log ( "encryptedText " + encryptedText ) ;
var bytesEncrypted = Convert . FromBase64String ( encryptedText ) ;
string b = Encoding . UTF8 . GetString ( bytesEncrypted ) ;
Debug . Log ( "byte " + b ) ;
//var bytesPlainText = rsa.Decrypt(bytesEncrypted, false);
var bytesPlainText = rsa . Decrypt ( bytesEncrypted , false ) ;
Debug . Log ( "bytesPlainText " + bytesPlainText ) ;
return System . Text . Encoding . UTF8 . GetString ( bytesPlainText ) ;
}
finally
{
rsa . PersistKeyInCsp = false ;
}
}
}
2025-04-24 16:01:48 +08:00
public void UpLoadData ( int totalScore , List < Expstepvtwolist > datas )
2025-04-11 15:22:47 +08:00
{
if ( string . IsNullOrEmpty ( token ) )
{
Init ( ) ;
}
2025-04-24 16:01:48 +08:00
//if (string.IsNullOrEmpty(labData.GUID))
//{
// return;
//}
2025-04-11 15:22:47 +08:00
var data = new UploadData ( ) ;
data . GUID = labData . GUID ;
int expId = 0 ;
int . TryParse ( labData . ExpID , out expId ) ;
data . ExpID = expId ;
data . score = totalScore ;
data . flag = true ;
2025-04-24 16:01:48 +08:00
//var list = new List<Expstepvtwolist>();
//for (int i = 0; i < stepNames.Count; i++)
//{
// var step = new Expstepvtwolist();
// step.ExpStepName = stepNames[i];
// step.maxScore = maxScore[i];
// step.score = score[i];
// list.Add(step);
//}
data . ExpStepVTwoList = datas . ToArray ( ) ;
2025-04-11 15:22:47 +08:00
StartCoroutine ( SendScore ( JsonConvert . SerializeObject ( data ) ) ) ;
}
IEnumerator SendScore ( string json , UnityAction < string > action = null )
{
if ( string . IsNullOrEmpty ( uploadUrl ) )
{
Debug . LogError ( "<22> ϴ<EFBFBD> <CFB4> ӿڵ<D3BF> ַ<EFBFBD> <D6B7> <EFBFBD> <EFBFBD> :" + uploadUrl ) ;
yield break ;
}
2025-04-24 16:01:48 +08:00
Debug . LogError ( "<22> <> <EFBFBD> <EFBFBD> json:" + json ) ;
2025-04-11 15:22:47 +08:00
using ( UnityWebRequest request = new UnityWebRequest ( uploadUrl , "POST" ) )
{
request . SetRequestHeader ( "Content-Type" , "application/json" ) ;
request . uploadHandler = new UploadHandlerRaw ( System . Text . Encoding . UTF8 . GetBytes ( json ) ) ;
request . downloadHandler = new DownloadHandlerBuffer ( ) ;
yield return request . SendWebRequest ( ) ;
// <20> <> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> Ӧ
if ( request . result = = UnityWebRequest . Result . ConnectionError | |
request . result = = UnityWebRequest . Result . ProtocolError )
{
Debug . LogError ( $"Upload failed: {request.uri}" ) ;
Debug . LogError ( $"Upload failed: {request.error}" ) ;
Debug . LogError ( $"Response Code: {request.responseCode}" ) ;
}
else
{
Debug . Log ( "Upload complete!" ) ;
Debug . Log ( $"Response Code: {request.responseCode}" ) ;
Debug . Log ( $"Server Response: {request.downloadHandler.text}" ) ;
Response response = JsonConvert . DeserializeObject < Response > ( request . downloadHandler . text ) ;
Debug . LogError ( response . msg ) ;
action ? . Invoke ( response . msg ) ;
}
}
}
public class UploadData
{
public string GUID { get ; set ; }
// ʵ<> <CAB5> ID
public int ExpID { get ; set ; }
// <20> ɼ<EFBFBD>
public int score { get ; set ; }
// <20> <> ־λ<D6BE> <CEBB> Ĭ<EFBFBD> <C4AC> ֵ true
public bool flag { get ; set ; }
// ʵ<> 鲽<EFBFBD> <E9B2BD> <EFBFBD> б <EFBFBD>
public Expstepvtwolist [ ] ExpStepVTwoList { get ; set ; }
}
public class Expstepvtwolist
{
// ʵ<> 鲽<EFBFBD> <E9B2BD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD>
public int seq { get ; set ; }
// ʵ<> 鲽<EFBFBD> <E9B2BD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD>
public string ExpStepName = "" ;
// ʵ<> 鲽<EFBFBD> <E9B2BD> ״̬
public string StepState = "" ;
// ʵ<> 鲽<EFBFBD> 迪ʼ ʱ<CABC> <CAB1>
2025-04-24 16:01:48 +08:00
public string startTime = default ;
2025-04-11 15:22:47 +08:00
// ʵ<> 鲽<EFBFBD> <E9B2BD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> ʱ<EFBFBD> <CAB1>
2025-04-24 16:01:48 +08:00
public string endTime = default ;
2025-04-11 15:22:47 +08:00
// ʵ<> 鲽<EFBFBD> <E9B2BD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> ʱ<EFBFBD> <CAB1> <EFBFBD> <EFBFBD> λ<EFBFBD> <CEBB>
public int expectTime = 0 ;
// ʵ<> 鲽<EFBFBD> <E9B2BD> <EFBFBD> <EFBFBD> <EFBFBD> ֣<EFBFBD> 0 ~100<30> <30> <EFBFBD> ٷ<EFBFBD> <D9B7> <EFBFBD>
public int maxScore = 100 ;
// ʵ<> 鲽<EFBFBD> <E9B2BD> <EFBFBD> ÷֣<C3B7> 0 ~100<30> <30> <EFBFBD> ٷ<EFBFBD> <D9B7> <EFBFBD>
public int score = 0 ;
// ʵ<> 鲽<EFBFBD> <E9B2BD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD>
public int repeatCount = 1 ;
// <20> <> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> ۣ<EFBFBD> 200 <20> <> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD>
public string evaluation = "" ;
// <20> <> <EFBFBD> <EFBFBD> ģ<EFBFBD> ͣ<EFBFBD> 200 <20> <> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD>
public string scoringModel = "" ;
// <20> <> ע
public string remarks { get ; set ; }
}
public class Response
{
public string msg ;
public bool success ;
}
}