mirror of
https://github.com/MaaAssistantArknights/MaaAssistantArknights.git
synced 2026-07-17 10:00:44 +08:00
perf: null check
[skip changelog]
This commit is contained in:
@@ -10,6 +10,7 @@
|
||||
// This program is distributed in the hope that it will be useful,
|
||||
// but WITHOUT ANY WARRANTY
|
||||
// </copyright>
|
||||
#nullable enable
|
||||
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
@@ -23,12 +24,10 @@ namespace MaaWpfGui.Helper
|
||||
public static class DataHelper
|
||||
{
|
||||
// 储存角色信息的字典
|
||||
public static Dictionary<string, CharacterInfo> Characters { get; }
|
||||
public static Dictionary<string, CharacterInfo> Characters { get; } = new();
|
||||
|
||||
static DataHelper()
|
||||
{
|
||||
Characters = new Dictionary<string, CharacterInfo>();
|
||||
|
||||
const string FilePath = "resource/battle_data.json";
|
||||
if (!File.Exists(FilePath))
|
||||
{
|
||||
@@ -36,7 +35,7 @@ namespace MaaWpfGui.Helper
|
||||
}
|
||||
|
||||
string jsonText = File.ReadAllText(FilePath);
|
||||
var characterData = JsonConvert.DeserializeObject<Dictionary<string, CharacterInfo>>(JObject.Parse(jsonText)["chars"]?.ToString() ?? string.Empty);
|
||||
var characterData = JsonConvert.DeserializeObject<Dictionary<string, CharacterInfo>>(JObject.Parse(jsonText)["chars"]?.ToString() ?? string.Empty) ?? new();
|
||||
|
||||
foreach (var pair in characterData)
|
||||
{
|
||||
@@ -44,21 +43,20 @@ namespace MaaWpfGui.Helper
|
||||
}
|
||||
}
|
||||
|
||||
public static CharacterInfo GetCharacterByNameOrAlias(string characterName)
|
||||
public static CharacterInfo? GetCharacterByNameOrAlias(string characterName)
|
||||
{
|
||||
return Characters.Values.FirstOrDefault(
|
||||
character =>
|
||||
new[]
|
||||
character => new[]
|
||||
{
|
||||
character?.Name,
|
||||
character?.NameEn,
|
||||
character?.NameJp,
|
||||
character?.NameKr,
|
||||
character?.NameTw,
|
||||
}.Any(name => name.Equals(characterName, StringComparison.OrdinalIgnoreCase)));
|
||||
character.Name,
|
||||
character.NameEn,
|
||||
character.NameJp,
|
||||
character.NameKr,
|
||||
character.NameTw,
|
||||
}.Any(name => name?.Equals(characterName, StringComparison.OrdinalIgnoreCase) ?? false));
|
||||
}
|
||||
|
||||
public static string GetLocalizedCharacterName(string characterName, string language)
|
||||
public static string? GetLocalizedCharacterName(string characterName, string language)
|
||||
{
|
||||
var characterInfo = GetCharacterByNameOrAlias(characterName);
|
||||
if (characterInfo?.Name == null)
|
||||
@@ -80,28 +78,28 @@ namespace MaaWpfGui.Helper
|
||||
public class CharacterInfo
|
||||
{
|
||||
[JsonProperty("name")]
|
||||
public string Name { get; set; }
|
||||
public string? Name { get; set; }
|
||||
|
||||
[JsonProperty("name_en")]
|
||||
public string NameEn { get; set; }
|
||||
public string? NameEn { get; set; }
|
||||
|
||||
[JsonProperty("name_jp")]
|
||||
public string NameJp { get; set; }
|
||||
public string? NameJp { get; set; }
|
||||
|
||||
[JsonProperty("name_kr")]
|
||||
public string NameKr { get; set; }
|
||||
public string? NameKr { get; set; }
|
||||
|
||||
[JsonProperty("name_tw")]
|
||||
public string NameTw { get; set; }
|
||||
public string? NameTw { get; set; }
|
||||
|
||||
[JsonProperty("position")]
|
||||
public string Position { get; set; }
|
||||
public string? Position { get; set; }
|
||||
|
||||
[JsonProperty("profession")]
|
||||
public string Profession { get; set; }
|
||||
public string? Profession { get; set; }
|
||||
|
||||
[JsonProperty("rangeId")]
|
||||
public List<string> RangeId { get; set; }
|
||||
public List<string>? RangeId { get; set; }
|
||||
|
||||
[JsonProperty("rarity")]
|
||||
public int Rarity { get; set; }
|
||||
|
||||
@@ -324,7 +324,7 @@ namespace MaaWpfGui.Main
|
||||
string jsonStr = PtrToStringCustom(jsonBuffer, Encoding.UTF8);
|
||||
|
||||
// Console.WriteLine(json_str);
|
||||
JObject json = (JObject)JsonConvert.DeserializeObject(jsonStr);
|
||||
var json = (JObject)JsonConvert.DeserializeObject(jsonStr);
|
||||
MaaService.ProcCallbackMsg dlg = ProcMsg;
|
||||
Execute.OnUIThread(() =>
|
||||
{
|
||||
@@ -385,7 +385,7 @@ namespace MaaWpfGui.Main
|
||||
|
||||
private void ProcConnectInfo(JObject details)
|
||||
{
|
||||
var what = details["what"].ToString();
|
||||
var what = details["what"]?.ToString() ?? string.Empty;
|
||||
switch (what)
|
||||
{
|
||||
case "Connected":
|
||||
@@ -519,8 +519,7 @@ namespace MaaWpfGui.Main
|
||||
|
||||
private void ProcTaskChainMsg(AsstMsg msg, JObject details)
|
||||
{
|
||||
string taskChain = details["taskchain"].ToString();
|
||||
|
||||
string taskChain = details["taskchain"]?.ToString() ?? string.Empty;
|
||||
switch (taskChain)
|
||||
{
|
||||
case "CloseDown":
|
||||
@@ -813,8 +812,7 @@ namespace MaaWpfGui.Main
|
||||
|
||||
private static void ProcSubTaskError(JObject details)
|
||||
{
|
||||
string subTask = details["subtask"].ToString();
|
||||
|
||||
string subTask = details["subtask"]?.ToString() ?? string.Empty;
|
||||
switch (subTask)
|
||||
{
|
||||
case "StartGameTask":
|
||||
@@ -860,8 +858,7 @@ namespace MaaWpfGui.Main
|
||||
|
||||
private void ProcSubTaskStart(JObject details)
|
||||
{
|
||||
string subTask = details["subtask"].ToString();
|
||||
|
||||
string subTask = details["subtask"]?.ToString() ?? string.Empty;
|
||||
switch (subTask)
|
||||
{
|
||||
case "ProcessTask":
|
||||
@@ -1018,8 +1015,7 @@ namespace MaaWpfGui.Main
|
||||
|
||||
private static void ProcSubTaskExtraInfo(JObject details)
|
||||
{
|
||||
string taskChain = details["taskchain"].ToString();
|
||||
|
||||
string taskChain = details["taskchain"]?.ToString() ?? string.Empty;
|
||||
switch (taskChain)
|
||||
{
|
||||
case "Recruit":
|
||||
@@ -1043,14 +1039,13 @@ namespace MaaWpfGui.Main
|
||||
break;
|
||||
}
|
||||
|
||||
string what = details["what"].ToString();
|
||||
|
||||
string what = details["what"]?.ToString() ?? string.Empty;
|
||||
switch (what)
|
||||
{
|
||||
case "StageDrops":
|
||||
{
|
||||
string allDrops = string.Empty;
|
||||
var statistics = (JArray)subTaskDetails["stats"] ?? new();
|
||||
var statistics = subTaskDetails["stats"] ?? new JArray();
|
||||
int curTimes = (int)(subTaskDetails["cur_times"] ?? -1);
|
||||
|
||||
foreach (var item in statistics)
|
||||
@@ -1097,7 +1092,7 @@ namespace MaaWpfGui.Main
|
||||
|
||||
case "RecruitTagsDetected":
|
||||
{
|
||||
var tags = (JArray)subTaskDetails["tags"] ?? new();
|
||||
var tags = subTaskDetails["tags"] ?? new JArray();
|
||||
string logContent = tags.Select(tagName => tagName.ToString())
|
||||
.Aggregate(string.Empty, (current, tagStr) => current + (tagStr + "\n"));
|
||||
|
||||
@@ -1165,7 +1160,7 @@ namespace MaaWpfGui.Main
|
||||
|
||||
case "RecruitTagsSelected":
|
||||
{
|
||||
var selected = (JArray)subTaskDetails["tags"] ?? new();
|
||||
var selected = subTaskDetails["tags"] ?? new JArray();
|
||||
string selectedLog = selected.Aggregate(string.Empty, (current, tag) => current + (tag + "\n"));
|
||||
|
||||
selectedLog = selectedLog.EndsWith('\n') ? selectedLog.TrimEnd('\n') : LocalizationHelper.GetString("NoDrop");
|
||||
@@ -1363,8 +1358,8 @@ namespace MaaWpfGui.Main
|
||||
|
||||
int sanityCur = sanityReport.TryGetValue("current_sanity", out var sanityCurToken) ? (int)sanityCurToken : -1;
|
||||
int sanityMax = sanityReport.TryGetValue("max_sanity", out var sanityMaxToken) ? (int)sanityMaxToken : -1;
|
||||
var reportTime = sanityReport.TryGetValue("report_time", out var reportTimeToken) ? (string)reportTimeToken : string.Empty;
|
||||
if (sanityCur < 0 || sanityMax < 1 || reportTime?.Length < 12)
|
||||
var reportTime = sanityReport.TryGetValue("report_time", out var reportTimeToken) ? (string)reportTimeToken! : string.Empty;
|
||||
if (sanityCur < 0 || sanityMax < 1 || reportTime.Length < 12)
|
||||
{
|
||||
break;
|
||||
}
|
||||
@@ -1436,8 +1431,7 @@ namespace MaaWpfGui.Main
|
||||
|
||||
private static void ProcVideoRecMsg(JObject details)
|
||||
{
|
||||
string what = details["what"].ToString();
|
||||
|
||||
string what = details["what"]?.ToString() ?? string.Empty;
|
||||
switch (what)
|
||||
{
|
||||
case "Finished":
|
||||
|
||||
@@ -75,22 +75,27 @@ namespace MaaWpfGui.ViewModels.UI
|
||||
JArray jArray = JArray.Parse(copilotTaskList);
|
||||
foreach (var it in jArray)
|
||||
{
|
||||
if (it is JObject item && item.TryGetValue("file_path", out var token) && File.Exists(token.ToString()))
|
||||
if (it is JObject item && item.TryGetValue("file_path", out var pathToken) && File.Exists(pathToken.ToString()))
|
||||
{
|
||||
int copilotIdInFile = item.TryGetValue("copilot_id", out var copilotIdToken) ? (int)copilotIdToken : -1;
|
||||
string name = (string)item["name"];
|
||||
bool isRaid = false;
|
||||
if (string.IsNullOrEmpty(name))
|
||||
{
|
||||
continue;
|
||||
}
|
||||
|
||||
bool? isRaid = false;
|
||||
if (item.ContainsKey("is_raid"))
|
||||
{
|
||||
isRaid = (bool)item["is_raid"];
|
||||
isRaid = (bool?)item["is_raid"];
|
||||
}
|
||||
else if (name.EndsWith("-Adverse"))
|
||||
{
|
||||
name = name.Replace("-Adverse", string.Empty);
|
||||
name = name[..^8];
|
||||
isRaid = true; // 用于迁移配置 (since 5.1.0, 后期移除)
|
||||
}
|
||||
|
||||
CopilotItemViewModels.Add(new CopilotItemViewModel(name, (string)item["file_path"], isRaid, copilotIdInFile, (bool)item["is_checked"]));
|
||||
CopilotItemViewModels.Add(new CopilotItemViewModel(name, (string)pathToken!, isRaid == true, copilotIdInFile, (bool?)item?["is_checked"] ?? true));
|
||||
}
|
||||
}
|
||||
|
||||
@@ -234,7 +239,7 @@ namespace MaaWpfGui.ViewModels.UI
|
||||
return;
|
||||
}
|
||||
|
||||
if (jsonStr != string.Empty)
|
||||
if (!string.IsNullOrEmpty(jsonStr))
|
||||
{
|
||||
ParseJsonAndShowInfo(jsonStr);
|
||||
}
|
||||
@@ -566,7 +571,7 @@ namespace MaaWpfGui.ViewModels.UI
|
||||
return;
|
||||
}
|
||||
|
||||
var filename = ((Array)e.Data.GetData(DataFormats.FileDrop))?.GetValue(0).ToString();
|
||||
var filename = ((Array)e.Data.GetData(DataFormats.FileDrop))?.GetValue(0)?.ToString();
|
||||
DropFile(filename);
|
||||
}
|
||||
|
||||
|
||||
@@ -74,7 +74,7 @@ namespace MaaWpfGui.ViewModels.UI
|
||||
/// <summary>
|
||||
/// Gets the core version.
|
||||
/// </summary>
|
||||
public static string CoreVersion { get; } = Marshal.PtrToStringAnsi(MaaService.AsstGetVersion());
|
||||
public static string CoreVersion { get; } = Marshal.PtrToStringAnsi(MaaService.AsstGetVersion()) ?? "0.0.1";
|
||||
|
||||
private static readonly string _uiVersion = Assembly.GetExecutingAssembly().GetCustomAttribute<AssemblyInformationalVersionAttribute>()?.InformationalVersion.Split('+')[0] ?? "0.0.1";
|
||||
|
||||
@@ -112,8 +112,8 @@ namespace MaaWpfGui.ViewModels.UI
|
||||
|
||||
JObject versionJson = (JObject)JsonConvert.DeserializeObject(File.ReadAllText(jsonPath));
|
||||
var currentTime = (ulong)DateTimeOffset.UtcNow.ToUnixTimeSeconds();
|
||||
var poolTime = (ulong)versionJson?["gacha"]?["time"];
|
||||
var activityTime = (ulong)versionJson?["activity"]?["time"];
|
||||
var poolTime = (ulong?)versionJson?["gacha"]?["time"]; // 卡池的开始时间
|
||||
var activityTime = (ulong?)versionJson?["activity"]?["time"]; // 活动的开始时间
|
||||
|
||||
if ((currentTime < poolTime) && (currentTime < activityTime))
|
||||
{
|
||||
@@ -1705,7 +1705,7 @@ namespace MaaWpfGui.ViewModels.UI
|
||||
/// <summary>
|
||||
/// Gets or sets the list of divider vertical offset.
|
||||
/// </summary>
|
||||
public List<double> DividerVerticalOffsetList { get; set; }
|
||||
public List<double> DividerVerticalOffsetList { get; set; } = new();
|
||||
|
||||
private int _selectedIndex;
|
||||
|
||||
@@ -1723,11 +1723,7 @@ namespace MaaWpfGui.ViewModels.UI
|
||||
_notifySource = NotifyType.SelectedIndex;
|
||||
SetAndNotify(ref _selectedIndex, value);
|
||||
|
||||
var isInRange = DividerVerticalOffsetList != null
|
||||
&& DividerVerticalOffsetList.Count > 0
|
||||
&& value < DividerVerticalOffsetList.Count;
|
||||
|
||||
if (isInRange)
|
||||
if (DividerVerticalOffsetList?.Count > 0 && value < DividerVerticalOffsetList.Count)
|
||||
{
|
||||
ScrollOffset = DividerVerticalOffsetList[value];
|
||||
}
|
||||
@@ -1759,9 +1755,7 @@ namespace MaaWpfGui.ViewModels.UI
|
||||
SetAndNotify(ref _scrollOffset, value);
|
||||
|
||||
// 设置 ListBox SelectedIndex 为当前 ScrollOffset 索引
|
||||
var isInRange = DividerVerticalOffsetList != null && DividerVerticalOffsetList.Count > 0;
|
||||
|
||||
if (isInRange)
|
||||
if (DividerVerticalOffsetList?.Count > 0)
|
||||
{
|
||||
// 滚动条滚动到底部,返回最后一个 Divider 索引
|
||||
if (value + ScrollViewportHeight >= ScrollExtentHeight)
|
||||
|
||||
@@ -93,9 +93,30 @@ namespace MaaWpfGui.ViewModels.UI
|
||||
private string _actionAfterCompleted = ConfigurationHelper.GetValue(ConfigurationKeys.ActionAfterCompleted, ActionType.DoNothing.ToString());
|
||||
|
||||
/// <summary>
|
||||
/// Gets or private sets the list of the actions after completion.
|
||||
/// Gets the list of the actions after completion.
|
||||
/// </summary>
|
||||
public List<GenericCombinedData<ActionType>> ActionAfterCompletedList { get; private set; }
|
||||
public List<GenericCombinedData<ActionType>> ActionAfterCompletedList { get; } =
|
||||
[
|
||||
new() { Display = LocalizationHelper.GetString("DoNothing"), Value = ActionType.DoNothing },
|
||||
new() { Display = LocalizationHelper.GetString("ExitArknights"), Value = ActionType.StopGame },
|
||||
new() { Display = LocalizationHelper.GetString("BackToAndroidHome"), Value = ActionType.BackToAndroidHome },
|
||||
|
||||
new() { Display = LocalizationHelper.GetString("ExitEmulator"), Value = ActionType.ExitEmulator },
|
||||
new() { Display = LocalizationHelper.GetString("ExitSelf"), Value = ActionType.ExitSelf },
|
||||
new() { Display = LocalizationHelper.GetString("ExitEmulatorAndSelf"), Value = ActionType.ExitEmulatorAndSelf },
|
||||
|
||||
// new() { Display="待机",Value=ActionTypeAfterCompleted.Suspend },
|
||||
new() { Display = LocalizationHelper.GetString("ExitEmulatorAndSelfAndHibernate"), Value = ActionType.ExitEmulatorAndSelfAndHibernate },
|
||||
new() { Display = LocalizationHelper.GetString("Hibernate"), Value = ActionType.Hibernate },
|
||||
new() { Display = LocalizationHelper.GetString("Shutdown"), Value = ActionType.Shutdown },
|
||||
|
||||
// new() { Display = Localization.GetString("ExitEmulatorAndSelfAndHibernate") + "*", Value = ActionType.ExitEmulatorAndSelfAndHibernateWithoutPersist },
|
||||
new() { Display = LocalizationHelper.GetString("HibernateWithoutPersist"), Value = ActionType.HibernateWithoutPersist },
|
||||
new() { Display = LocalizationHelper.GetString("ShutdownWithoutPersist"), Value = ActionType.ShutdownWithoutPersist },
|
||||
|
||||
new() { Display = LocalizationHelper.GetString("ExitEmulatorAndSelfIfOtherMaaElseExitEmulatorAndSelfAndHibernate"), Value = ActionType.ExitEmulatorAndSelfIfOtherMaaElseExitEmulatorAndSelfAndHibernate },
|
||||
new() { Display = LocalizationHelper.GetString("ExitSelfIfOtherMaaElseShutdown"), Value = ActionType.ExitSelfIfOtherMaaElseShutdown },
|
||||
];
|
||||
|
||||
/// <summary>
|
||||
/// Gets or sets the action after completion.
|
||||
@@ -397,28 +418,6 @@ namespace MaaWpfGui.ViewModels.UI
|
||||
taskList.Add("ReclamationAlgorithm2");
|
||||
}
|
||||
|
||||
ActionAfterCompletedList =
|
||||
[
|
||||
new() { Display = LocalizationHelper.GetString("DoNothing"), Value = ActionType.DoNothing },
|
||||
new() { Display = LocalizationHelper.GetString("ExitArknights"), Value = ActionType.StopGame },
|
||||
new() { Display = LocalizationHelper.GetString("BackToAndroidHome"), Value = ActionType.BackToAndroidHome },
|
||||
|
||||
new() { Display = LocalizationHelper.GetString("ExitEmulator"), Value = ActionType.ExitEmulator },
|
||||
new() { Display = LocalizationHelper.GetString("ExitSelf"), Value = ActionType.ExitSelf },
|
||||
new() { Display = LocalizationHelper.GetString("ExitEmulatorAndSelf"), Value = ActionType.ExitEmulatorAndSelf },
|
||||
|
||||
// new() { Display="待机",Value=ActionTypeAfterCompleted.Suspend },
|
||||
new() { Display = LocalizationHelper.GetString("ExitEmulatorAndSelfAndHibernate"), Value = ActionType.ExitEmulatorAndSelfAndHibernate },
|
||||
new() { Display = LocalizationHelper.GetString("Hibernate"), Value = ActionType.Hibernate },
|
||||
new() { Display = LocalizationHelper.GetString("Shutdown"), Value = ActionType.Shutdown },
|
||||
|
||||
// new() { Display = Localization.GetString("ExitEmulatorAndSelfAndHibernate") + "*", Value = ActionType.ExitEmulatorAndSelfAndHibernateWithoutPersist },
|
||||
new() { Display = LocalizationHelper.GetString("HibernateWithoutPersist"), Value = ActionType.HibernateWithoutPersist },
|
||||
new() { Display = LocalizationHelper.GetString("ShutdownWithoutPersist"), Value = ActionType.ShutdownWithoutPersist },
|
||||
|
||||
new() { Display = LocalizationHelper.GetString("ExitEmulatorAndSelfIfOtherMaaElseExitEmulatorAndSelfAndHibernate"), Value = ActionType.ExitEmulatorAndSelfIfOtherMaaElseExitEmulatorAndSelfAndHibernate },
|
||||
new() { Display = LocalizationHelper.GetString("ExitSelfIfOtherMaaElseShutdown"), Value = ActionType.ExitSelfIfOtherMaaElseShutdown },
|
||||
];
|
||||
var tempOrderList = new List<DragItemViewModel>(new DragItemViewModel[taskList.Count]);
|
||||
var nonOrderList = new List<DragItemViewModel>();
|
||||
for (int i = 0; i != taskList.Count; ++i)
|
||||
|
||||
@@ -50,10 +50,10 @@ namespace MaaWpfGui.Views.UI
|
||||
while (true)
|
||||
{
|
||||
errorStr.Append(exc.Message);
|
||||
exc = exc.InnerException;
|
||||
if (exc != null)
|
||||
if (exc.InnerException != null)
|
||||
{
|
||||
errorStr.AppendLine();
|
||||
exc = exc.InnerException;
|
||||
}
|
||||
else
|
||||
{
|
||||
|
||||
Reference in New Issue
Block a user