271 lines
7.5 KiB
C#
271 lines
7.5 KiB
C#
using System.Text;
|
|
using Bansonic;
|
|
using UnityEngine;
|
|
using UnityEngine.UI;
|
|
|
|
public class TeamShareApplyPanel : MonoBehaviour
|
|
{
|
|
[Header("Inputs")]
|
|
[SerializeField] private InputField schemeNameInputField;
|
|
[SerializeField] private InputField shareCodeInputField;
|
|
|
|
[Header("Buttons")]
|
|
[SerializeField] private Button copyButton;
|
|
[SerializeField] private Button applyButton;
|
|
|
|
[Header("Config")]
|
|
[SerializeField] private bool autoRefreshShareCode = true;
|
|
|
|
private string lockedVisibleSchemeName;
|
|
|
|
private void Awake()
|
|
{
|
|
BindUiEvents();
|
|
}
|
|
|
|
private void OnEnable()
|
|
{
|
|
RefreshShareCodeDisplay();
|
|
}
|
|
|
|
private void OnDestroy()
|
|
{
|
|
UnbindUiEvents();
|
|
}
|
|
|
|
public void RefreshShareCodeDisplay()
|
|
{
|
|
if (!autoRefreshShareCode || shareCodeInputField == null)
|
|
{
|
|
return;
|
|
}
|
|
|
|
string shareCode;
|
|
string errorMessage;
|
|
if (!TeamShareCodec.TryExportCurrentTeam(GetSchemeNameOrDefault(), out shareCode, out errorMessage))
|
|
{
|
|
if (!string.IsNullOrWhiteSpace(errorMessage))
|
|
{
|
|
gNotice.error.display(errorMessage);
|
|
}
|
|
|
|
return;
|
|
}
|
|
|
|
EnsureLockedVisibleSchemeName();
|
|
shareCodeInputField.text = ReplaceVisibleSchemeName(shareCode, lockedVisibleSchemeName);
|
|
}
|
|
|
|
public void HandleCopyClicked()
|
|
{
|
|
if (shareCodeInputField == null)
|
|
{
|
|
gNotice.error.display("\u672a\u914d\u7f6e\u7f16\u961f\u7801\u8f93\u5165\u6846");
|
|
return;
|
|
}
|
|
|
|
string content = string.IsNullOrWhiteSpace(shareCodeInputField.text) ? string.Empty : shareCodeInputField.text.Trim();
|
|
if (string.IsNullOrEmpty(content))
|
|
{
|
|
RefreshShareCodeDisplay();
|
|
content = string.IsNullOrWhiteSpace(shareCodeInputField.text) ? string.Empty : shareCodeInputField.text.Trim();
|
|
}
|
|
|
|
if (string.IsNullOrEmpty(content))
|
|
{
|
|
gNotice.error.display("\u5f53\u524d\u6ca1\u6709\u53ef\u590d\u5236\u7684\u7f16\u961f\u7801");
|
|
return;
|
|
}
|
|
|
|
GUIUtility.systemCopyBuffer = content;
|
|
gNotice.recommendation.display("\u5df2\u590d\u5236\u7f16\u961f\u5206\u4eab\u7801");
|
|
}
|
|
|
|
public void HandleApplyClicked()
|
|
{
|
|
if (shareCodeInputField == null)
|
|
{
|
|
gNotice.error.display("\u672a\u914d\u7f6e\u7f16\u961f\u7801\u8f93\u5165\u6846");
|
|
return;
|
|
}
|
|
|
|
string content = string.IsNullOrWhiteSpace(shareCodeInputField.text) ? string.Empty : shareCodeInputField.text.Trim();
|
|
if (string.IsNullOrEmpty(content))
|
|
{
|
|
gNotice.error.display("\u8bf7\u8f93\u5165\u7f16\u961f\u5206\u4eab\u7801");
|
|
return;
|
|
}
|
|
|
|
TeamShareApplyReport report;
|
|
string errorMessage;
|
|
if (!TeamShareCodec.TryApplyToCurrentTeam(content, out report, out errorMessage))
|
|
{
|
|
gNotice.error.display(string.IsNullOrWhiteSpace(errorMessage) ? "\u7f16\u961f\u7801\u5e94\u7528\u5931\u8d25" : errorMessage);
|
|
return;
|
|
}
|
|
|
|
lockedVisibleSchemeName = ExtractVisibleSchemeName(content);
|
|
if (schemeNameInputField != null && !string.IsNullOrWhiteSpace(report.schemeName))
|
|
{
|
|
schemeNameInputField.text = report.schemeName;
|
|
}
|
|
|
|
RefreshShareCodeDisplay();
|
|
|
|
if (report != null && report.messages != null && report.messages.Count > 0)
|
|
{
|
|
gNotice.error.display(BuildSkipReasonText(report));
|
|
return;
|
|
}
|
|
|
|
gNotice.recommendation.display("\u5df2\u5e94\u7528\u7f16\u961f\u5206\u4eab\u7801");
|
|
}
|
|
|
|
private void HandleSchemeNameChanged(string _)
|
|
{
|
|
RefreshShareCodeDisplay();
|
|
}
|
|
|
|
private void BindUiEvents()
|
|
{
|
|
UnbindUiEvents();
|
|
|
|
if (copyButton != null)
|
|
{
|
|
copyButton.onClick.AddListener(HandleCopyClicked);
|
|
}
|
|
|
|
if (applyButton != null)
|
|
{
|
|
applyButton.onClick.AddListener(HandleApplyClicked);
|
|
}
|
|
|
|
if (schemeNameInputField != null)
|
|
{
|
|
schemeNameInputField.onValueChanged.AddListener(HandleSchemeNameChanged);
|
|
}
|
|
}
|
|
|
|
private void UnbindUiEvents()
|
|
{
|
|
if (copyButton != null)
|
|
{
|
|
copyButton.onClick.RemoveListener(HandleCopyClicked);
|
|
}
|
|
|
|
if (applyButton != null)
|
|
{
|
|
applyButton.onClick.RemoveListener(HandleApplyClicked);
|
|
}
|
|
|
|
if (schemeNameInputField != null)
|
|
{
|
|
schemeNameInputField.onValueChanged.RemoveListener(HandleSchemeNameChanged);
|
|
}
|
|
}
|
|
|
|
private string GetSchemeNameOrDefault()
|
|
{
|
|
if (schemeNameInputField == null || string.IsNullOrWhiteSpace(schemeNameInputField.text))
|
|
{
|
|
return TeamShareSnapshot.DefaultSchemeName;
|
|
}
|
|
|
|
return schemeNameInputField.text;
|
|
}
|
|
|
|
private void EnsureLockedVisibleSchemeName()
|
|
{
|
|
if (!string.IsNullOrWhiteSpace(lockedVisibleSchemeName))
|
|
{
|
|
return;
|
|
}
|
|
|
|
if (shareCodeInputField != null && !string.IsNullOrWhiteSpace(shareCodeInputField.text))
|
|
{
|
|
lockedVisibleSchemeName = ExtractVisibleSchemeName(shareCodeInputField.text);
|
|
}
|
|
|
|
if (string.IsNullOrWhiteSpace(lockedVisibleSchemeName))
|
|
{
|
|
lockedVisibleSchemeName = GetSchemeNameOrDefault();
|
|
}
|
|
}
|
|
|
|
private static string ReplaceVisibleSchemeName(string shareCode, string visibleSchemeName)
|
|
{
|
|
if (string.IsNullOrWhiteSpace(shareCode))
|
|
{
|
|
return string.Empty;
|
|
}
|
|
|
|
int splitIndex = FindPrefixSplitIndex(shareCode);
|
|
if (splitIndex < 0)
|
|
{
|
|
return shareCode;
|
|
}
|
|
|
|
string safeVisibleName = string.IsNullOrWhiteSpace(visibleSchemeName) ? TeamShareSnapshot.DefaultSchemeName : visibleSchemeName.Trim();
|
|
return safeVisibleName + shareCode.Substring(splitIndex);
|
|
}
|
|
|
|
private static string ExtractVisibleSchemeName(string shareCode)
|
|
{
|
|
if (string.IsNullOrWhiteSpace(shareCode))
|
|
{
|
|
return TeamShareSnapshot.DefaultSchemeName;
|
|
}
|
|
|
|
int splitIndex = FindPrefixSplitIndex(shareCode);
|
|
if (splitIndex <= 0)
|
|
{
|
|
return TeamShareSnapshot.DefaultSchemeName;
|
|
}
|
|
|
|
return shareCode.Substring(0, splitIndex);
|
|
}
|
|
|
|
private static int FindPrefixSplitIndex(string shareCode)
|
|
{
|
|
if (string.IsNullOrWhiteSpace(shareCode))
|
|
{
|
|
return -1;
|
|
}
|
|
|
|
int index = shareCode.IndexOf("-T3", System.StringComparison.Ordinal);
|
|
if (index >= 0)
|
|
{
|
|
return index;
|
|
}
|
|
|
|
index = shareCode.IndexOf("-TS3", System.StringComparison.Ordinal);
|
|
if (index >= 0)
|
|
{
|
|
return index;
|
|
}
|
|
|
|
index = shareCode.IndexOf("-BT2", System.StringComparison.Ordinal);
|
|
if (index >= 0)
|
|
{
|
|
return index;
|
|
}
|
|
|
|
index = shareCode.IndexOf("-BT1", System.StringComparison.Ordinal);
|
|
return index;
|
|
}
|
|
|
|
private static string BuildSkipReasonText(TeamShareApplyReport report)
|
|
{
|
|
StringBuilder builder = new StringBuilder();
|
|
builder.Append("\u7f16\u961f\u7801\u5df2\u90e8\u5206\u5e94\u7528\uff0c\u4ee5\u4e0b\u5185\u5bb9\u88ab\u8df3\u8fc7\uff1a");
|
|
|
|
for (int i = 0; i < report.messages.Count; i++)
|
|
{
|
|
builder.Append('\n');
|
|
builder.Append(report.messages[i]);
|
|
}
|
|
|
|
return builder.ToString();
|
|
}
|
|
}
|