update: 修复编译 bug

# Conflicts:
#	Editor/GuruManager/Helper/GuruServiceConverterHelper.cs
dev
胡宇飞 2024-07-01 18:45:07 +08:00
parent 9d168cdd46
commit f33fc2c764
1 changed files with 374 additions and 25 deletions

View File

@ -1,3 +1,4 @@
#if GURU_SDK_DEV
namespace Guru.Editor namespace Guru.Editor
{ {
@ -5,37 +6,69 @@ namespace Guru.Editor
using System.IO; using System.IO;
using UnityEditor; using UnityEditor;
using UnityEngine; using UnityEngine;
using UnityEngine.Networking;
using System.Collections.Generic; using System.Collections.Generic;
using System.Linq; using System.Linq;
public class GuruServiceConverterHelper public class GuruServiceJsonBuilder: EditorWindow
{ {
const string K_APP_SETTINGS = "app_settings"; const string GuruProjectSettingsName = "guru-project-settings.cfg";
const string K_ADJUST_SETTINGS = "adjust_settings";
const string K_FB_SETTINGS = "fb_settings";
const string K_AD_SETTINGS = "ad_settings"; // Tool Version
const string K_IAP_SETTINGS = "iap_settings"; public const string Version = "0.2.0";
const char K_SPLITTER_TAB = '\t';
const char K_SPLITTER_COMMA = ','; private const string K_APP_SETTINGS = "app_settings";
private const string K_ADJUST_SETTINGS = "adjust_settings";
private const string K_FB_SETTINGS = "fb_settings";
private const string K_AD_SETTINGS = "ad_settings";
private const string K_IAP_SETTINGS = "iap_settings";
private const char K_SPLITTER_TAB = '\t';
private const char K_SPLITTER_COMMA = ',';
private const string NoSelectionName = "------";
private const string STATE_IDLE = "s_idle";
private const string STATE_LOADING = "s_loading";
private const string STATE_SUCCESS = "s_success";
private static GuruServiceJsonBuilder _instance;
private List<string> _projectNames;
private int _selectedProjectIndex = 0;
private static Dictionary<string, string> _publishLinks;
public static Dictionary<string, string> PublishLinks
{
get
{
if (_publishLinks == null) _publishLinks = LoadProjectSettingsCfg();
return _publishLinks;
}
}
#region Link & Keys
private const string TSVLink = "https://docs.google.com/spreadsheets/d/e/{0}/pub?gid=0&single=true&output=tsv";
#endregion
#region Export JSON #region Export JSON
/// <summary> /// <summary>
/// 从 TSV 文件进行转化 /// 从 TSV 文件进行转化
/// </summary> /// </summary>
/// <param name="tsvPath"></param> /// <param name="tsv"></param>
/// <param name="savePath"></param> /// <param name="savePath"></param>
public static void ConvertFromTSV(string tsvPath, string savePath = "") public static void ConvertFromTSV(string tsv, string savePath = "")
{ {
if (!File.Exists(tsvPath)) if (string.IsNullOrEmpty(tsv))
{ {
EditorUtility.DisplayDialog("FILE NOT FOUND!", $"File not exist:\n{tsvPath}", "OK"); EditorUtility.DisplayDialog("空文件!", $"文件格式错误!\n{tsv}", "OK");
return; return;
} }
var guru_service = EditorGuruServiceIO.CreateEmpty(); var guru_service = EditorGuruServiceIO.CreateEmpty();
var lines = File.ReadAllLines(tsvPath); var lines = tsv.Split('\n');
string line = ""; string line = "";
for (int index = 0; index < lines.Length; index++) for (int index = 0; index < lines.Length; index++)
{ {
@ -81,16 +114,45 @@ namespace Guru.Editor
} }
} }
guru_service.version = GetFileVersionByDate();
if (string.IsNullOrEmpty(savePath))
{
var dir = Path.GetFullPath($"{Application.dataPath}/../output");
if (!Directory.Exists(dir)) Directory.CreateDirectory(dir);
savePath = $"{dir}/guru-services-{guru_service.app_settings.app_id.ToLower()}.json";
}
var arr = savePath.Split('/');
var fileName = arr[arr.Length - 1];
EditorGuruServiceIO.SourceServiceFilePath = savePath; EditorGuruServiceIO.SourceServiceFilePath = savePath;
EditorGuruServiceIO.SaveConfig(guru_service, savePath); EditorGuruServiceIO.SaveConfig(guru_service, savePath);
if (EditorUtility.DisplayDialog("CONVERT SUCCESS!", $"Export Json to:\n{savePath}", "OK")) if (EditorUtility.DisplayDialog("CONVERT SUCCESS!", $"Export Json File\n{fileName}\nto:\n{savePath}", "OK"))
{ {
GuruEditorHelper.OpenPath(Directory.GetParent(savePath)?.FullName ?? Application.dataPath); GuruEditorHelper.OpenPath(Directory.GetParent(savePath)?.FullName ?? Application.dataPath);
} }
} }
public static void ConvertFromTsvFile(string tsvPath, string savePath = "")
{
if (!File.Exists(tsvPath))
{
EditorUtility.DisplayDialog("FILE NOT FOUND!", $"File not exist:\n{tsvPath}", "OK");
return;
}
var tsvString = File.ReadAllText(tsvPath);
if (!string.IsNullOrEmpty(tsvString))
{
ConvertFromTSV(tsvString, savePath);
}
}
/// <summary> /// <summary>
/// AppSettings 填充 /// AppSettings 填充
/// </summary> /// </summary>
@ -219,7 +281,14 @@ namespace Guru.Editor
settings.adjust_settings.events = events.ToArray(); settings.adjust_settings.events = events.ToArray();
index--; index--;
} }
private static long GetFileVersionByDate()
{
var startDt = new DateTime(1970,1,1,0,0,0);
return (long) (DateTime.UtcNow.Ticks - startDt.Ticks) / 10000;
}
private static void FillFacebookSettings(GuruServicesConfig settings, string[] lines, ref int index) private static void FillFacebookSettings(GuruServicesConfig settings, string[] lines, ref int index)
{ {
string value = ""; string value = "";
@ -416,9 +485,6 @@ namespace Guru.Editor
settings.products = iaps.ToArray(); settings.products = iaps.ToArray();
index--; index--;
} }
#endregion #endregion
@ -499,16 +565,299 @@ namespace Guru.Editor
if(!Directory.Exists(saveDir)) Directory.CreateDirectory(saveDir); if(!Directory.Exists(saveDir)) Directory.CreateDirectory(saveDir);
string searchPath = "~/Downloads/"; string searchPath = "~/Downloads/";
string tsv = EditorUtility.OpenFilePanel("Load Guru Service TSV", searchPath, ".tsv"); string tsvPath = EditorUtility.OpenFilePanel("Load Guru Service TSV", searchPath, ".tsv");
if (!string.IsNullOrEmpty(tsv)) if (!string.IsNullOrEmpty(tsvPath))
{ {
GuruServiceConverterHelper.ConvertFromTSV(tsv, saveFile); ConvertFromTsvFile(tsvPath, saveFile);
} }
}
[MenuItem("Guru/Guru-Service Json Builder...", false, 0)]
private static void OpenWindow()
{
if(_instance != null ) _instance.Close();
_instance = GetWindow<GuruServiceJsonBuilder>();
_instance.Show();
}
#endregion
#region Settings
private static string GetRelativeDir()
{
var guids = AssetDatabase.FindAssets(nameof(GuruServiceJsonBuilder));
if (guids.Length > 0)
{
var path = AssetDatabase.GUIDToAssetPath(guids[0]);
var rpath = Directory.GetParent(path).FullName;
return rpath;
}
return Path.GetFullPath($"Assets/../Packages/Editor/GuruJsonBuilder");
}
private static Dictionary<string, string> LoadProjectSettingsCfg()
{
var cfgPath = $"{GetRelativeDir()}/{GuruProjectSettingsName}";
if (File.Exists(cfgPath))
{
var lines = File.ReadAllLines(cfgPath);
int len = lines?.Length ?? -1;
if (len > 0)
{
Dictionary<string, string> dict = new Dictionary<string, string>(lines.Length);
int i = 0;
string[] raw;
string line, key, value;
while (i < len)
{
line = lines[i];
if(string.IsNullOrEmpty(line)) continue;
raw = lines[i].Split(',');
value = "";
key = raw[0];
if(string.IsNullOrEmpty(key)) continue;
if(raw.Length > 1) value = raw[1];
dict[key] = value;
i++;
}
return dict;
}
}
return null;
} }
#endregion #endregion
#region Window
private void Awake()
{
Debug.Log($"------- Awake -------");
this.titleContent = new GUIContent("Json Builder");
_projectNames = new List<string>(20);
string[] names = PublishLinks.Keys.ToArray();
string name = "";
for(int i = 0; i < names.Length; i++)
{
name = names[i];
if (name == "Default")
{
_projectNames.Insert(0, NoSelectionName);
}
else
{
_projectNames.Add(name);
}
}
_selectedProjectIndex = 0;
_state = STATE_IDLE;
var json = LoadProjectSettingsCfg();
Debug.Log(json);
}
private void OnEnable()
{
// Debug.Log($"------- OnEnable -------");
}
private void OnGUI()
{
GUI_Title();
switch (_state)
{
case STATE_IDLE:
GUI_Projects();
break;
case STATE_LOADING:
GUI_Loading();
break;
}
}
#endregion
#region GUI
private string _state = "";
private void GUI_Title()
{
var s = new GUIStyle("box")
{
fontSize = 20,
fontStyle = FontStyle.Bold,
stretchWidth = true,
alignment = TextAnchor.MiddleCenter,
padding = new RectOffset(4, 4, 4, 4),
};
GUILayout.Label("Guru-Service Json Builder", s, GUILayout.Height(60));
s.fontSize = 14;
GUILayout.Label($"Version: {Version}", s);
GUILayout.Space(10);
}
private void GUI_Loading()
{
var s = new GUIStyle("box")
{
fontSize = 16,
alignment = TextAnchor.MiddleCenter,
stretchWidth = true,
padding = new RectOffset(4, 4, 4, 4),
};
GUILayout.Label("Loading...", s);
GUILayout.Space(10);
}
private void GUI_Projects()
{
_selectedProjectIndex = EditorGUILayout.Popup("选择生成项目", _selectedProjectIndex, _projectNames.ToArray());
GUILayout.Space(5);
if (GUILayout.Button("生成 guru-services.json", GUILayout.Height(40)))
{
var id = _projectNames[_selectedProjectIndex];
if (id == NoSelectionName)
{
ShowDialog("选择错误", "请选择一个存在的项目");
}
else
{
DownloadTsvAndBuild(_selectedProjectIndex, (success, txt) =>
{
if (success)
{
ConvertFromTSV(txt);
}
else
{
ShowDialog("网络错误", txt);
}
_state = STATE_IDLE;
});
_state = STATE_LOADING;
}
}
}
private void ShowDialog(string title, string content, string okName = "OK", Action onOKCallback = null,
string cancelName = "", Action onCancelCallback = null)
{
if (EditorUtility.DisplayDialog(title, content, okName, cancelName))
{
onOKCallback?.Invoke();
}
else
{
onCancelCallback?.Invoke();
}
}
#endregion
#region Networking
private static string GetProjectTSVUrl(string pid)
{
if (PublishLinks.TryGetValue(pid, out var id))
{
string url = string.Format(TSVLink, id);
return url;
}
return "";
}
private void DownloadTsvAndBuild(int projIndex, Action<bool, string> loadCompleted = null)
{
var pid = _projectNames[projIndex];
var id = GetProjectTSVUrl(pid);
string title, msg;
if(string.IsNullOrEmpty(id))
{
title = "参数错误";
msg = $"项目 {pid} 不正确, 请重新选择...";
ShowDialog(title, msg);
Debug.LogError($"{title}\n{msg}");
return;
}
var www = UnityEngine.Networking.UnityWebRequest.Get(id);
www.SendWebRequest().completed += ap =>
{
if (www.result == UnityWebRequest.Result.Success)
{
Debug.Log($"<color=#088ff00>--- Load Success ---</color>");
// Debug.Log(www.downloadHandler.text);
loadCompleted?.Invoke(true, www.downloadHandler.text);
}
else
{
msg = $"Result {www.result}: {www.responseCode}\n\r{www.error}";
Debug.LogError(msg);
loadCompleted?.Invoke(false, msg);
}
};
}
#endregion
#region TEST
#if GURU_SDK_DEV
// [MenuItem("Tools/Test/Fetch Config File", false, 1)]
#endif
private static void Test_FetchConfigFile()
{
var pid = "FindOut";
var url = GetProjectTSVUrl(pid);
if(string.IsNullOrEmpty(url))
{
Debug.LogError($"Wrong ProjectId: {pid}");
return;
}
var www = UnityEngine.Networking.UnityWebRequest.Get(url);
www.SendWebRequest().completed += ap =>
{
if (www.result == UnityWebRequest.Result.Success)
{
Debug.Log($"<color=#088ff00>--- Load Success ---</color>");
Debug.Log(www.downloadHandler.text);
}
else
{
Debug.LogError($"Loading Failed: {www.error} : {www.result} : {www.responseCode}");
}
};
}
#endregion
} }
} }
#endif