From bc67eb6301ec6a02092bedc08a5b13c4d57fdb83 Mon Sep 17 00:00:00 2001 From: huyfei Date: Fri, 2 Feb 2024 19:06:32 +0800 Subject: [PATCH] =?UTF-8?q?update:=20=E6=96=B0=E5=A2=9E=20guru-services.js?= =?UTF-8?q?on=20=E7=94=9F=E6=88=90=E5=B7=A5=E5=85=B7?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../GuruManager/Config/EditorGuruServiceIO.cs | 21 +- Editor/GuruManager/Helper/GuruEditorHelper.cs | 14 + .../Helper/GuruServiceConverterHelper.cs | 479 ++++++++++++++++++ .../Helper/GuruServiceConverterHelper.cs.meta | 3 + Runtime/Code/Config/GuruServicesConfig.cs | 10 +- Runtime/Code/SDK/GuruSDK.cs | 9 +- 6 files changed, 516 insertions(+), 20 deletions(-) create mode 100644 Editor/GuruManager/Helper/GuruServiceConverterHelper.cs create mode 100644 Editor/GuruManager/Helper/GuruServiceConverterHelper.cs.meta diff --git a/Editor/GuruManager/Config/EditorGuruServiceIO.cs b/Editor/GuruManager/Config/EditorGuruServiceIO.cs index 96fd7d4..601f1fe 100644 --- a/Editor/GuruManager/Config/EditorGuruServiceIO.cs +++ b/Editor/GuruManager/Config/EditorGuruServiceIO.cs @@ -10,12 +10,12 @@ namespace Guru.Editor public class EditorGuruServiceIO { - private static readonly string SourceConfigFileName = "guru-service"; - private const string LocalServicesConfigPath = "Guru/Resources"; - private const string SourceConfigExtension = ".json"; - private const string LocalConfigExtension = ".txt"; + internal static readonly string SourceConfigFileName = "guru-service"; + internal const string LocalServicesConfigPath = "Guru/Resources"; + internal const string SourceConfigExtension = ".json"; + internal const string LocalConfigExtension = ".txt"; - private static string DefaultFilePath = + internal static string DefaultFilePath = Path.GetFullPath(Path.Combine(Application.dataPath, $"{SourceConfigFileName}{SourceConfigExtension}")); internal static string SourceServiceFilePath = ""; @@ -47,7 +47,7 @@ namespace Guru.Editor /// 保存配置 /// /// - internal static void SaveConfig(GuruServicesConfig config = null) + internal static void SaveConfig(GuruServicesConfig config = null, string savePath = "") { if (config == null) { @@ -59,12 +59,13 @@ namespace Guru.Editor PrettyPrint = true, }; JsonMapper.ToJson(config, jw); - var json = jw.ToString(); - if (string.IsNullOrEmpty(SourceServiceFilePath)) SourceServiceFilePath = DefaultFilePath; - File.WriteAllText(SourceServiceFilePath, json); - Debug.Log($"Save config to {SourceServiceFilePath}"); + if (string.IsNullOrEmpty(savePath)) savePath = SourceServiceFilePath; + if (string.IsNullOrEmpty(savePath)) savePath = DefaultFilePath; + + File.WriteAllText(savePath, json); + Debug.Log($"Save config to {savePath}"); } /// diff --git a/Editor/GuruManager/Helper/GuruEditorHelper.cs b/Editor/GuruManager/Helper/GuruEditorHelper.cs index 0a2d9cb..4cf80e0 100644 --- a/Editor/GuruManager/Helper/GuruEditorHelper.cs +++ b/Editor/GuruManager/Helper/GuruEditorHelper.cs @@ -1,6 +1,8 @@ namespace Guru.Editor { using UnityEditor; + using UnityEngine; + public class GuruEditorHelper { public static string GetFilePath(string filter) @@ -13,5 +15,17 @@ namespace Guru.Editor } return ""; } + + public static void OpenPath(string path) + { +#if UNITY_EDITOR_OSX + EditorUtility.RevealInFinder(path); + return; +#endif + Application.OpenURL($"file://{path}"); + } + + + } } \ No newline at end of file diff --git a/Editor/GuruManager/Helper/GuruServiceConverterHelper.cs b/Editor/GuruManager/Helper/GuruServiceConverterHelper.cs new file mode 100644 index 0000000..131d0b3 --- /dev/null +++ b/Editor/GuruManager/Helper/GuruServiceConverterHelper.cs @@ -0,0 +1,479 @@ + +namespace Guru.Editor +{ + using System; + using System.IO; + using UnityEditor; + using UnityEngine; + using System.Collections.Generic; + using System.Linq; + + public class GuruServiceConverterHelper + { + const string k_app_settings = "app_settings"; + const string k_adjust_settings = "adjust_settings"; + const string k_fb_settings = "fb_settings"; + const string k_ad_settings = "ad_settings"; + const string k_iap_settings = "iap_settings"; + + #region Export JSON + + /// + /// 从 TSV 文件进行转化 + /// + /// + /// + public static void ConvertFromTSV(string tsvPath, string savePath = "") + { + if (!File.Exists(tsvPath)) + { + EditorUtility.DisplayDialog("FILE NOT FOUND!", $"File not exist:\n{tsvPath}", "OK"); + return; + } + + var guru_service = EditorGuruServiceIO.CreateEmpty(); + + var lines = File.ReadAllLines(tsvPath); + string line = ""; + for (int index = 0; index < lines.Length; index++) + { + line = lines[index]; + if (!IsInvalidLine(line)) + { + //---------------- app_settings ---------------- + if (line.StartsWith(k_app_settings)) + { + index++; + while (!line.StartsWith(k_adjust_settings)) + { + line = lines[index]; + FillAppSettings(guru_service, line); + index++; + line = lines[index]; + } + } + //---------------- adjust_settings ---------------- + if (line.StartsWith(k_adjust_settings)) + { + index++; + FillAdjustSettings(guru_service, lines, ref index); + } + //---------------- fb_settings ---------------- + if (line.StartsWith(k_fb_settings)) + { + index++; + FillFacebookSettings(guru_service, lines, ref index); + } + //---------------- ad_settings ---------------- + if (line.StartsWith(k_ad_settings)) + { + index++; + FillAdSettings(guru_service, lines, ref index); + } + //---------------- iap_settings ---------------- + if (line.StartsWith(k_iap_settings)) + { + index++; + FillProducts(guru_service, lines, ref index); + } + } + + } + + EditorGuruServiceIO.SourceServiceFilePath = savePath; + EditorGuruServiceIO.SaveConfig(guru_service, savePath); + + if (EditorUtility.DisplayDialog("CONVERT SUCCESS!", $"Export Json to:\n{savePath}", "OK")) + { + GuruEditorHelper.OpenPath(Directory.GetParent(savePath)?.FullName ?? Application.dataPath); + } + } + + /// + /// AppSettings 填充 + /// + /// + /// + private static void FillAppSettings(GuruServicesConfig settings, string line) + { + // 对于空行和空值直接跳过 + if (IsInvalidLine(line)) return; + + string value = ""; + if(settings.app_settings == null) settings.app_settings = new GuruAppSettings(); + + // 拾取值和注入 + if (GetValue(line, "app_id", out value)) + { + settings.app_settings.app_id = value; + } + else if (GetValue(line, "product_name", out value)) + { + settings.app_settings.product_name = value; + } + else if (GetValue(line, "bundle_id", out value)) + { + settings.app_settings.bundle_id = value; + } + else if (GetValue(line, "support_email", out value)) + { + settings.app_settings.support_email = value; + } + else if (GetValue(line, "privacy_url", out value)) + { + settings.app_settings.privacy_url = value; + } + else if (GetValue(line, "terms_url", out value)) + { + settings.app_settings.terms_url = value; + } + else if (GetValue(line, "android_store", out value)) + { + settings.app_settings.android_store = value; + } + else if (GetValue(line, "ios_store", out value)) + { + settings.app_settings.ios_store = value; + } + else if (GetValue(line, "level_end_success_num", out value)) + { + settings.app_settings.level_end_success_num = GetInt(value); + } + else if (GetValue(line, "enable_keywords", out value)) + { + settings.app_settings.enable_keywords = GetBool(value); + } + else if (GetValue(line, "enable_firebase", out value)) + { + settings.app_settings.enable_firebase = GetBool(value); + } + else if (GetValue(line, "enable_facebook", out value)) + { + settings.app_settings.enable_facebook = GetBool(value); + } + else if (GetValue(line, "enable_adjust", out value)) + { + settings.app_settings.enable_adjust = GetBool(value); + } + else if (GetValue(line, "enable_iap", out value)) + { + settings.app_settings.enable_iap = GetBool(value); + } + else if (GetValue(line, "tch_020", out value)) + { + settings.app_settings.tch_020 = GetDouble(value); + } + else if (GetValue(line, "using_uuid", out value)) + { + settings.app_settings.using_uuid = GetBool(value); + } + + } + + /// + /// AdjustSettings 填充 + /// + /// + /// + private static void FillAdjustSettings(GuruServicesConfig settings, string[] lines, ref int index) + { + if(settings.adjust_settings == null) settings.adjust_settings = new GuruAdjustSettings(); + string[] list = null; + string line = lines[index]; + bool pass = false; + List events = new List(20); + + while (!lines[index].StartsWith(k_fb_settings)) + { + line = lines[index]; + if (!IsInvalidLine(line)) + { + if (line.StartsWith("app_token")) + { + list = GetStringArray(line, 1, 2); + settings.adjust_settings.app_token = list; + } + else + { + list = GetStringArray(line, 0, 3); + pass = list != null && !string.IsNullOrEmpty(list[0]) + && (!string.IsNullOrEmpty(list[1]) || !string.IsNullOrEmpty(list[2])); + if( pass) events.Add(string.Join(",", list)); + } + } + index++; + } + + settings.adjust_settings.events = events.ToArray(); + index--; + } + + private static void FillFacebookSettings(GuruServicesConfig settings, string[] lines, ref int index) + { + string value = ""; + if(settings.fb_settings == null) settings.fb_settings = new GuruFbSettings(); + var line = ""; + + while (!lines[index].StartsWith(k_ad_settings)) + { + line = lines[index]; + if (!IsInvalidLine(line)) + { + // 拾取值和注入 + if (GetValue(line, "fb_app_id", out value)) + { + settings.fb_settings.fb_app_id = value; + } + else if (GetValue(line, "fb_client_token", out value)) + { + settings.fb_settings.fb_client_token = value; + } + } + index++; + } + + index--; + } + + private static void FillAdSettings(GuruServicesConfig settings, string[] lines, ref int index) + { + string value = ""; + if(settings.ad_settings == null) settings.ad_settings = new GuruAdSettings(); + + + var line = lines[index]; + // SDK Key + + + string[] max_ids_android = new string[3]; + string[] max_ids_ios = new string[3]; + string[] amazon_ids_android = new string[4]; + string[] amazon_ids_ios = new string[4]; + string[] pubmatic_ids_android = new string[3]; + string[] pubmatic_ids_ios = new string[3]; + string[] moloco_ids_android = new string[3]; + string[] moloco_ids_ios = new string[3]; + + + + //------- 开始记录广告配置; + string[] arr; + while (!lines[index].StartsWith(k_iap_settings)) + { + line = lines[index]; + + if (GetValue(line, "sdk_key", out value)) + { + settings.ad_settings.sdk_key = value; + } + else if (line.StartsWith("admob_app_id")) + { + settings.ad_settings.admob_app_id = GetStringArray(line, 1, 2); + } + else if (line.StartsWith("max_bads")) + { + arr = GetStringArray(line, 1, 2); + max_ids_android[0] = arr[0]; + max_ids_ios[0] = arr[1]; + } + else if (line.StartsWith("max_iads")) + { + arr = GetStringArray(line, 1, 2); + max_ids_android[1] = arr[0]; + max_ids_ios[1] = arr[1]; + } + else if (line.StartsWith("max_rads")) + { + arr = GetStringArray(line, 1, 2); + max_ids_android[2] = arr[0]; + max_ids_ios[2] = arr[1]; + } + else if (line.StartsWith("amazon_app_id")) + { + arr = GetStringArray(line, 1, 2); + amazon_ids_android[0] = arr[0]; + amazon_ids_ios[0] = arr[1]; + } + else if (line.StartsWith("amazon_bads")) + { + arr = GetStringArray(line, 1, 2); + amazon_ids_android[1] = arr[0]; + amazon_ids_ios[1] = arr[1]; + } + else if (line.StartsWith("amazon_iads")) + { + arr = GetStringArray(line, 1, 2); + amazon_ids_android[2] = arr[0]; + amazon_ids_ios[2] = arr[1]; + } + else if (line.StartsWith("amazon_rads")) + { + arr = GetStringArray(line, 1, 2); + amazon_ids_android[3] = arr[0]; + amazon_ids_ios[3] = arr[1]; + } + else if (line.StartsWith("pubmatic_bads")) + { + arr = GetStringArray(line, 1, 2); + pubmatic_ids_android[0] = arr[0]; + pubmatic_ids_ios[0] = arr[1]; + } + else if (line.StartsWith("pubmatic_iads")) + { + arr = GetStringArray(line, 1, 2); + pubmatic_ids_android[1] = arr[0]; + pubmatic_ids_ios[1] = arr[1]; + } + else if (line.StartsWith("pubmatic_rads")) + { + arr = GetStringArray(line, 1, 2); + pubmatic_ids_android[2] = arr[0]; + pubmatic_ids_ios[2] = arr[1]; + } + else if (line.StartsWith("moloco_bads")) + { + arr = GetStringArray(line, 1, 2); + moloco_ids_android[0] = arr[0]; + moloco_ids_ios[0] = arr[1]; + } + else if (line.StartsWith("moloco_iads")) + { + arr = GetStringArray(line, 1, 2); + moloco_ids_android[1] = arr[0]; + moloco_ids_ios[1] = arr[1]; + } + else if (line.StartsWith("moloco_rads")) + { + arr = GetStringArray(line, 1, 2); + moloco_ids_android[2] = arr[0]; + moloco_ids_ios[2] = arr[1]; + } + index++; + } + + //-------- Fill all data ----------- + settings.ad_settings.max_ids_android = max_ids_android; + settings.ad_settings.max_ids_ios = max_ids_ios; + settings.ad_settings.amazon_ids_android = amazon_ids_android; + settings.ad_settings.amazon_ids_ios = amazon_ids_ios; + settings.ad_settings.pubmatic_ids_android = pubmatic_ids_android; + settings.ad_settings.pubmatic_ids_ios = pubmatic_ids_ios; + settings.ad_settings.moloco_ids_android = moloco_ids_android; + settings.ad_settings.moloco_ids_ios = moloco_ids_ios; + + index--; + } + + private static void FillProducts(GuruServicesConfig settings, string[] lines, ref int index) + { + string line = ""; + List iaps = new List(30); + + string[] arr; + while (index < lines.Length) + { + line = lines[index]; + if(IsInvalidLine(line)) continue; + arr = GetStringArray(line, 0, 7); + if(string.IsNullOrEmpty(arr[5])) arr[5] = "Store"; + if(string.IsNullOrEmpty(arr[6])) arr[6] = "0"; + iaps.Add(string.Join("," , arr)); + index++; + } + settings.products = iaps.ToArray(); + index--; + } + + + + + + #endregion + + #region Utils + + private static bool GetBool(string value) + { + return value.ToLower() == "true" || value == "1"; + } + + private static int GetInt(string value) + { + int val = 0; + int.TryParse(value, out val); + return val; + } + + private static double GetDouble(string value) + { + double val = 0; + double.TryParse(value, out val); + return val; + } + + + private static bool IsInvalidLine(string line) + { + return (string.IsNullOrEmpty(line) || line.StartsWith("\t")); + } + + + private static bool GetValue(string line, string key, out string value) + { + value = ""; // default + if (line.StartsWith(key)) + { + value = line.Split('\t')[1]; + if (string.IsNullOrEmpty(value)) value = "empty"; + return true; + } + return false; + } + + private static string[] GetStringArray(string line, int startIndex = 0, int length = 0, string spliter = "\t") + { + if (IsInvalidLine(line)) return null; + + var raw = line.Split(spliter); + if (length == 0) length = raw.Length; + + var a = new List(length); + for (int i = startIndex; i < length + startIndex; i++) + { + if (i < raw.Length) + { + a.Add(raw[i]); + } + else + { + a.Add(""); + } + } + return a.ToArray(); + } + #endregion + + #region Menu Items + +#if GURU_SDK_DEV + [MenuItem("Tools/Export Guru Service", false, 0 )] +#endif + private static void ExportJsonFile() + { + string saveDir = Path.GetFullPath($"{Application.dataPath}/../output"); + string saveFile = Path.Combine(saveDir,$"guru-service____{DateTime.Now:yyyy-M-d-HH-mm}.json"); + + if(!Directory.Exists(saveDir)) Directory.CreateDirectory(saveDir); + + string searchPath = "~/Downloads/"; + string tsv = EditorUtility.OpenFilePanel("Load Guru Service TSV", searchPath, ".tsv"); + if (!string.IsNullOrEmpty(tsv)) + { + GuruServiceConverterHelper.ConvertFromTSV(tsv, saveFile); + } + } + + #endregion + + } +} \ No newline at end of file diff --git a/Editor/GuruManager/Helper/GuruServiceConverterHelper.cs.meta b/Editor/GuruManager/Helper/GuruServiceConverterHelper.cs.meta new file mode 100644 index 0000000..8b2d117 --- /dev/null +++ b/Editor/GuruManager/Helper/GuruServiceConverterHelper.cs.meta @@ -0,0 +1,3 @@ +fileFormatVersion: 2 +guid: 8c7dc826ea0848f0a3bf05009fab6377 +timeCreated: 1706856053 \ No newline at end of file diff --git a/Runtime/Code/Config/GuruServicesConfig.cs b/Runtime/Code/Config/GuruServicesConfig.cs index f79c368..5b0db5e 100644 --- a/Runtime/Code/Config/GuruServicesConfig.cs +++ b/Runtime/Code/Config/GuruServicesConfig.cs @@ -1,6 +1,5 @@ using System; using System.Collections.Generic; -using UnityEngine.Serialization; namespace Guru { @@ -38,6 +37,7 @@ namespace Guru && products != null && products.Length > 0; public bool IsKeywordsEnabled() => app_settings != null && app_settings.enable_keywords; //-------------------------------- 配置检测 ------------------------------- + } [Serializable] @@ -58,7 +58,7 @@ namespace Guru public bool enable_facebook = true; public bool enable_adjust = true; public bool enable_iap = false; - public double tch020_val = 0; + public double tch_020 = 0; public bool using_uuid = false; } @@ -68,8 +68,8 @@ namespace Guru public string[] app_token; public string[] events; - public string AndroidToken => app_token != null && app_token.Length > 0 ? app_token[0] : ""; - public string iOSToken => app_token != null && app_token.Length > 1 ? app_token[1] : ""; + public string AndroidToken() => app_token != null && app_token.Length > 0 ? app_token[0] : ""; + public string iOSToken() => app_token != null && app_token.Length > 1 ? app_token[1] : ""; } [Serializable] @@ -93,7 +93,5 @@ namespace Guru public string[] moloco_ids_android; public string[] moloco_ids_ios; } - - } \ No newline at end of file diff --git a/Runtime/Code/SDK/GuruSDK.cs b/Runtime/Code/SDK/GuruSDK.cs index c418821..85580b5 100644 --- a/Runtime/Code/SDK/GuruSDK.cs +++ b/Runtime/Code/SDK/GuruSDK.cs @@ -209,18 +209,19 @@ namespace Guru if (null != _appServicesConfig.adjust_settings && null != GuruSettings) { // 更新 Adjust Tokens - GuruSettings.UpdateAdjustTokens(_appServicesConfig.adjust_settings.AndroidToken - , _appServicesConfig.adjust_settings.iOSToken); + GuruSettings.UpdateAdjustTokens( + _appServicesConfig.adjust_settings.AndroidToken(), + _appServicesConfig.adjust_settings.iOSToken()); // 更新 Adjust Events GuruSettings.UpdateAdjustEvents(_appServicesConfig.adjust_settings.events); } if (null != _appServicesConfig.app_settings) { - if (_appServicesConfig.app_settings.tch020_val > 0) + if (_appServicesConfig.app_settings.tch_020 > 0) { Analytics.EnableTch02Event = true; - Analytics.SetTch02TargetValue(_appServicesConfig.app_settings.tch020_val); + Analytics.SetTch02TargetValue(_appServicesConfig.app_settings.tch_020); } // 设置获取设备 UUID 的方法