189 lines
		
	
	
		
			6.9 KiB
		
	
	
	
		
			C#
		
	
	
	
			
		
		
	
	
			189 lines
		
	
	
		
			6.9 KiB
		
	
	
	
		
			C#
		
	
	
	
| using System;
 | |
| using System.Collections.Generic;
 | |
| using UnityEngine;
 | |
| using ThinkingSDK.PC.Utils;
 | |
| 
 | |
| namespace ThinkingSDK.PC.Storage
 | |
| {
 | |
|     public class ThinkingSDKFileJson
 | |
|     {
 | |
|         // Save the event, return the number of cached events
 | |
|         internal static int EnqueueTrackingData(Dictionary<string, object> data, string prefix)
 | |
|         {
 | |
|             int eventId = EventAutoIncrementingID(prefix);
 | |
|             string trackingKey = GetEventKeysPrefix(prefix, eventId);
 | |
| 
 | |
|             var dataJson = ThinkingSDKJSON.Serialize(data);
 | |
|             PlayerPrefs.SetString(trackingKey, dataJson);
 | |
|             IncreaseTrackingDataID(prefix);
 | |
|             int eventCount = EventAutoIncrementingID(prefix) - EventIndexID(prefix);
 | |
|             return eventCount;
 | |
|         }
 | |
| 
 | |
|         // Get event end ID
 | |
|         internal static int EventAutoIncrementingID(string prefix)
 | |
|         {
 | |
|             string mEventAutoIncrementingID = GetEventAutoIncrementingIDKey(prefix);
 | |
|             return PlayerPrefs.HasKey(mEventAutoIncrementingID) ? PlayerPrefs.GetInt(mEventAutoIncrementingID) : 0;
 | |
|         }
 | |
| 
 | |
|         // Auto increment event end ID
 | |
|         private static void IncreaseTrackingDataID(string prefix)
 | |
|         {
 | |
|             int id = EventAutoIncrementingID(prefix);
 | |
|             id += 1;
 | |
|             PlayerPrefs.SetInt(GetEventAutoIncrementingIDKey(prefix), id);
 | |
|         }
 | |
| 
 | |
|         // Reset event end ID
 | |
|         private static void ResetTrackingDataID(string prefix)
 | |
|         {
 | |
|             int id = 0;
 | |
|             PlayerPrefs.SetInt(GetEventAutoIncrementingIDKey(prefix), id);
 | |
|         }
 | |
| 
 | |
|         // Get event start ID
 | |
|         internal static int EventIndexID(string prefix)
 | |
|         {
 | |
|             string eventIndexID = GetEventIndexIDKey(prefix);
 | |
|             return PlayerPrefs.HasKey(eventIndexID) ? PlayerPrefs.GetInt(eventIndexID) : 0;
 | |
|         }
 | |
| 
 | |
|         // Save time start ID
 | |
|         private static void SaveEventIndexID(int indexID, string prefix)
 | |
|         {
 | |
|             string eventIndexID = GetEventIndexIDKey(prefix);
 | |
|             PlayerPrefs.SetInt(eventIndexID, indexID);
 | |
|         }
 | |
| 
 | |
|         // Fetch a specified number of events in batches
 | |
|         internal static string DequeueBatchTrackingData(int batchSize, string prefix, out int eventCount)
 | |
|         {
 | |
|             string batchData = eventBatchPrefix;
 | |
|             List<Dictionary<string, object>> tempDataList = new List<Dictionary<string, object>>();
 | |
|             int dataIndex = EventIndexID(prefix);
 | |
|             int maxIndex = EventAutoIncrementingID(prefix) - 1;
 | |
|             eventCount = 0;
 | |
|             while (eventCount < batchSize && dataIndex <= maxIndex) {
 | |
|                 string trackingKey = GetEventKeysPrefix(prefix, dataIndex);
 | |
|                 if (PlayerPrefs.HasKey(trackingKey)) {
 | |
|                     string dataJson = PlayerPrefs.GetString(trackingKey);
 | |
|                     if (eventCount < batchSize - 1 && dataIndex < maxIndex)
 | |
|                     {
 | |
|                         batchData = batchData + dataJson + eventBatchInfix;
 | |
|                     }
 | |
|                     else
 | |
|                     {
 | |
|                         batchData = batchData + dataJson;
 | |
|                     }
 | |
|                     eventCount++;
 | |
|                 }
 | |
|                 dataIndex++;
 | |
|             }
 | |
| 
 | |
|             if (eventCount > 0)
 | |
|             {
 | |
|                 batchData = batchData + eventBatchSuffix;
 | |
|                 return batchData;
 | |
|             }
 | |
|             else
 | |
|             {
 | |
|                 return null;
 | |
|             }
 | |
|         }
 | |
| 
 | |
|         // Batch delete the specified number of events and return the remaining number of events
 | |
|         internal static int DeleteBatchTrackingData(int batchSize, string prefix)
 | |
|         {
 | |
|             int deletedCount = 0;
 | |
|             int dataIndex = EventIndexID(prefix);
 | |
|             int maxIndex = EventAutoIncrementingID(prefix) - 1;
 | |
|             while (deletedCount < batchSize && dataIndex <= maxIndex) {
 | |
|                 string trackingKey = GetEventKeysPrefix(prefix, dataIndex);
 | |
|                 if (PlayerPrefs.HasKey(trackingKey)) {
 | |
|                     PlayerPrefs.DeleteKey(trackingKey);
 | |
|                     deletedCount++;
 | |
|                 }
 | |
|                 dataIndex++;
 | |
|             }
 | |
|             SaveEventIndexID(dataIndex, prefix);
 | |
| 
 | |
|             int eventCount = EventAutoIncrementingID(prefix) - EventIndexID(prefix);
 | |
|             return eventCount;
 | |
|         }
 | |
| 
 | |
|         // Batch delete specified events
 | |
|         // internal static void DeleteBatchTrackingData(List<Dictionary<string, object>> batch, string prefix) {
 | |
|         //     foreach(Dictionary<string, object> data in batch) {
 | |
|         //         String id = data["id"].ToString();
 | |
|         //         if (id != null && PlayerPrefs.HasKey(id)) {
 | |
|         //             PlayerPrefs.DeleteKey(id);
 | |
|         //         }
 | |
|         //     }
 | |
|         // }
 | |
| 
 | |
|         // Batch delete all events
 | |
|         internal static int DeleteAllTrackingData(string prefix)
 | |
|         {
 | |
|             DeleteBatchTrackingData(int.MaxValue, prefix);
 | |
|             SaveEventIndexID(0, prefix);
 | |
|             ResetTrackingDataID(prefix);
 | |
|             return 0;
 | |
|         }
 | |
| 
 | |
|         private static string eventKeyInfix = "Event";
 | |
|         private static string eventIndexIDSuffix = "EventIndexID";
 | |
|         private static string eventAutoIncrementingIDSuffix = "EventAutoIncrementingID";
 | |
| 
 | |
|         private static string eventBatchPrefix = "[";
 | |
|         private static string eventBatchInfix = ",";
 | |
|         private static string eventBatchSuffix = "]";
 | |
| 
 | |
|         private static Dictionary<string, string> eventKeysPrefix = new Dictionary<string, string>() { };
 | |
|         private static Dictionary<string, string> eventIndexIDKeys = new Dictionary<string, string>() { };
 | |
|         private static Dictionary<string, string> eventAutoIncrementingIDKeys = new Dictionary<string, string>() { };
 | |
| 
 | |
|         private static string GetEventKeysPrefix(string prefix, int index)
 | |
|         {
 | |
|             if (eventKeysPrefix.ContainsKey(prefix))
 | |
|             {
 | |
|                 return eventKeysPrefix[prefix] + index;
 | |
|             }
 | |
|             else
 | |
|             {
 | |
|                 string eventKey = prefix + eventKeyInfix;
 | |
|                 eventKeysPrefix[prefix] = eventKey;
 | |
|                 return eventKey + index;
 | |
|             }
 | |
|         }
 | |
| 
 | |
|         private static string GetEventIndexIDKey(string prefix)
 | |
|         {
 | |
|             if (eventIndexIDKeys.ContainsKey(prefix))
 | |
|             {
 | |
|                 return eventIndexIDKeys[prefix];
 | |
|             }
 | |
|             else
 | |
|             {
 | |
|                 string eventKey = prefix + eventIndexIDSuffix;
 | |
|                 eventIndexIDKeys[prefix] = eventKey;
 | |
|                 return eventKey;
 | |
|             }
 | |
|         }
 | |
| 
 | |
|         private static string GetEventAutoIncrementingIDKey(string prefix)
 | |
|         {
 | |
|             if (eventAutoIncrementingIDKeys.ContainsKey(prefix))
 | |
|             {
 | |
|                 return eventAutoIncrementingIDKeys[prefix];
 | |
|             }
 | |
|             else
 | |
|             {
 | |
|                 string eventKey = prefix + eventAutoIncrementingIDSuffix;
 | |
|                 eventAutoIncrementingIDKeys[prefix] = eventKey;
 | |
|                 return eventKey;
 | |
|             }
 | |
|         }
 | |
|     }
 | |
| }
 |