feat: improve autotranslate performance

This commit is contained in:
Anna 2022-05-30 14:40:58 -04:00
parent 8a7593327c
commit 8993da08e2

View File

@ -16,6 +16,7 @@ namespace ChatTwo.Util;
internal static class AutoTranslate { internal static class AutoTranslate {
private static readonly Dictionary<ClientLanguage, List<AutoTranslateEntry>> Entries = new(); private static readonly Dictionary<ClientLanguage, List<AutoTranslateEntry>> Entries = new();
private static readonly HashSet<(uint, uint)> ValidEntries = new();
private static Parser<char, (string name, Maybe<IEnumerable<ISelectorPart>> selector)> Parser() { private static Parser<char, (string name, Maybe<IEnumerable<ISelectorPart>> selector)> Parser() {
var sheetName = Any var sheetName = Any
@ -93,6 +94,8 @@ internal static class AutoTranslate {
return entries; return entries;
} }
var shouldAdd = ValidEntries.Count == 0;
var parser = Parser(); var parser = Parser();
var list = new List<AutoTranslateEntry>(); var list = new List<AutoTranslateEntry>();
foreach (var row in data.GetExcelSheet<Completion>()!) { foreach (var row in data.GetExcelSheet<Completion>()!) {
@ -167,6 +170,10 @@ internal static class AutoTranslate {
text, text,
name name
)); ));
if (shouldAdd) {
ValidEntries.Add((row.Group, (uint) i));
}
} }
} }
} }
@ -179,6 +186,10 @@ internal static class AutoTranslate {
text.TextValue, text.TextValue,
text text
)); ));
if (shouldAdd) {
ValidEntries.Add((row.Group, row.RowId));
}
} }
} }
@ -222,16 +233,21 @@ internal static class AutoTranslate {
return; return;
} }
if (ValidEntries.Count == 0) {
// populate the list of valid entries
AllEntries(data);
}
var start = -1; var start = -1;
for (var i = 0; i < bytes.Length; i++) { for (var i = 0; i < bytes.Length; i++) {
if (start != -1) { if (start != -1) {
if (bytes[i] == '>') { if (bytes[i] == '>') {
var tag = Encoding.UTF8.GetString(bytes[start..(i + 1)]); var tag = Encoding.UTF8.GetString(bytes[start..(i + 1)]);
var parts = tag[4..^1].Split(',', 2); var parts = tag[4..^1].Split(',', 2);
if (uint.TryParse(parts[0], out var group) && uint.TryParse(parts[1], out var key)) { if (parts.Length == 2 && uint.TryParse(parts[0], out var group) && uint.TryParse(parts[1], out var key)) {
var payload = AllEntries(data).FirstOrDefault(entry => entry.Group == group && entry.Row == key) == null var payload = ValidEntries.Contains((group, key))
? Array.Empty<byte>() ? new AutoTranslatePayload(group, key).Encode()
: new AutoTranslatePayload(group, key).Encode(); : Array.Empty<byte>();
var oldBytes = bytes.ToArray(); var oldBytes = bytes.ToArray();
var lengthDiff = payload.Length - (i - start); var lengthDiff = payload.Length - (i - start);
bytes = new byte[oldBytes.Length + lengthDiff]; bytes = new byte[oldBytes.Length + lengthDiff];