Skip to content
This repository was archived by the owner on May 11, 2024. It is now read-only.

Commit 90fd2a6

Browse files
committed
- [CLI] bug fixes
1 parent cf2e750 commit 90fd2a6

File tree

2 files changed

+90
-30
lines changed

2 files changed

+90
-30
lines changed

AssetStudio.CLI/Components/CommandLine.cs

+78-21
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@
55
using System.CommandLine.Binding;
66
using System.CommandLine.Parsing;
77
using System.Text.RegularExpressions;
8+
using System.Collections.Generic;
89

910
namespace AssetStudio.CLI
1011
{
@@ -93,8 +94,68 @@ public OptionsBinder()
9394
Silent = new Option<bool>("--silent", "Hide log messages.");
9495
LoggerFlags = new Option<LoggerEvent[]>("--logger_flags", "Flags to control toggle log events.") { AllowMultipleArgumentsPerToken = true, ArgumentHelpName = "Verbose|Debug|Info|etc.." };
9596
TypeFilter = new Option<string[]>("--types", "Specify unity class type(s)") { AllowMultipleArgumentsPerToken = true, ArgumentHelpName = "Texture2D|Shader:Parse|Sprite:Both|etc.." };
96-
NameFilter = new Option<Regex[]>("--names", result => result.Tokens.Select(x => new Regex(x.Value, RegexOptions.IgnoreCase)).ToArray(), false, "Specify name regex filter(s).") { AllowMultipleArgumentsPerToken = true };
97-
ContainerFilter = new Option<Regex[]>("--containers", result => result.Tokens.Select(x => new Regex(x.Value, RegexOptions.IgnoreCase)).ToArray(), false, "Specify container regex filter(s).") { AllowMultipleArgumentsPerToken = true };
97+
NameFilter = new Option<Regex[]>("--names", result =>
98+
{
99+
var items = new List<Regex>();
100+
var value = result.Tokens.Single().Value;
101+
if (File.Exists(value))
102+
{
103+
var lines = File.ReadLines(value);
104+
foreach (var line in lines)
105+
{
106+
if (string.IsNullOrWhiteSpace(line))
107+
{
108+
continue;
109+
}
110+
111+
try
112+
{
113+
items.Add(new Regex(line, RegexOptions.IgnoreCase));
114+
}
115+
catch (ArgumentException e)
116+
{
117+
continue;
118+
}
119+
}
120+
}
121+
else
122+
{
123+
items.AddRange(result.Tokens.Select(x => new Regex(x.Value, RegexOptions.IgnoreCase)).ToArray());
124+
}
125+
126+
return items.ToArray();
127+
}, false, "Specify name regex filter(s).") { AllowMultipleArgumentsPerToken = true };
128+
ContainerFilter = new Option<Regex[]>("--containers", result =>
129+
{
130+
var items = new List<Regex>();
131+
var value = result.Tokens.Single().Value;
132+
if (File.Exists(value))
133+
{
134+
var lines = File.ReadLines(value);
135+
foreach(var line in lines)
136+
{
137+
if (string.IsNullOrWhiteSpace(line))
138+
{
139+
continue;
140+
}
141+
142+
try
143+
{
144+
items.Add(new Regex(line, RegexOptions.IgnoreCase));
145+
}
146+
catch (ArgumentException e)
147+
{
148+
continue;
149+
}
150+
}
151+
}
152+
else
153+
{
154+
items.AddRange(result.Tokens.Select(x => new Regex(x.Value, RegexOptions.IgnoreCase)).ToArray());
155+
}
156+
157+
return items.ToArray();
158+
}, false, "Specify container regex filter(s).") { AllowMultipleArgumentsPerToken = true };
98159
GameName = new Option<string>("--game", $"Specify Game.") { IsRequired = true };
99160
KeyIndex = new Option<int>("--key_index", "Specify key index.") { ArgumentHelpName = UnityCNManager.ToString() };
100161
MapOp = new Option<MapOpType>("--map_op", "Specify which map to build.");
@@ -110,16 +171,7 @@ public OptionsBinder()
110171

111172
Key = new Option<byte>("--key", result =>
112173
{
113-
var value = result.Tokens.Single().Value;
114-
if (value.StartsWith("0x"))
115-
{
116-
value = value[2..];
117-
return Convert.ToByte(value, 0x10);
118-
}
119-
else
120-
{
121-
return byte.Parse(value);
122-
}
174+
return ParseKey(result.Tokens.Single().Value);
123175
}, false, "XOR key to decrypt MiHoYoBinData.");
124176

125177
LoggerFlags.AddValidator(FilterValidator);
@@ -131,15 +183,7 @@ public OptionsBinder()
131183
var value = result.Tokens.Single().Value;
132184
try
133185
{
134-
if (value.StartsWith("0x"))
135-
{
136-
value = value.Substring(2);
137-
Convert.ToByte(value, 0x10);
138-
}
139-
else
140-
{
141-
byte.Parse(value);
142-
}
186+
ParseKey(value);
143187
}
144188
catch (Exception e)
145189
{
@@ -156,6 +200,19 @@ public OptionsBinder()
156200
MapType.SetDefaultValue(ExportListType.XML);
157201
KeyIndex.SetDefaultValue(0);
158202
}
203+
204+
public byte ParseKey(string value)
205+
{
206+
if (value.StartsWith("0x"))
207+
{
208+
value = value[2..];
209+
return Convert.ToByte(value, 0x10);
210+
}
211+
else
212+
{
213+
return byte.Parse(value);
214+
}
215+
}
159216

160217
public void FilterValidator(OptionResult result)
161218
{

AssetStudio/AssetsHelper.cs

+12-9
Original file line numberDiff line numberDiff line change
@@ -488,18 +488,21 @@ private static void BuildAssetMap(string file, List<AssetEntry> assets, ClassIDT
488488
else asset.Name = $"BinFile #{asset.PathID}";
489489
}
490490
}
491-
foreach ((var pptr, var container) in containers)
491+
if (!containerFilters.IsNullOrEmpty())
492492
{
493-
if (pptr.TryGet(out var obj))
493+
foreach ((var pptr, var container) in containers)
494494
{
495-
var item = objectAssetItemDic[obj];
496-
if (containerFilters.IsNullOrEmpty() || containerFilters.Any(x => x.IsMatch(container)))
495+
if (pptr.TryGet(out var obj))
497496
{
498-
item.Container = container;
499-
}
500-
else
501-
{
502-
assets.Remove(item);
497+
var item = objectAssetItemDic[obj];
498+
if (containerFilters.Any(x => x.IsMatch(container)))
499+
{
500+
item.Container = container;
501+
}
502+
else
503+
{
504+
assets.Remove(item);
505+
}
503506
}
504507
}
505508
}

0 commit comments

Comments
 (0)