update: 修复编译 bug
# Conflicts: # Editor/GuruManager/Helper/GuruServiceConverterHelper.csdev
parent
9d168cdd46
commit
f33fc2c764
|
|
@ -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++)
|
||||||
{
|
{
|
||||||
|
|
@ -82,15 +115,44 @@ 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>
|
||||||
|
|
@ -220,6 +282,13 @@ namespace Guru.Editor
|
||||||
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 = "";
|
||||||
|
|
@ -418,9 +487,6 @@ namespace Guru.Editor
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
#endregion
|
#endregion
|
||||||
|
|
||||||
#region Utils
|
#region Utils
|
||||||
|
|
@ -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
|
#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
|
||||||
|
|
||||||
|
#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
|
||||||
Loading…
Reference in New Issue