forked from haroohie-club/SerialLoops
-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathConfigUser.cs
More file actions
129 lines (117 loc) · 5.1 KB
/
ConfigUser.cs
File metadata and controls
129 lines (117 loc) · 5.1 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
using System;
using System.Collections.Generic;
using System.Collections.ObjectModel;
using System.Globalization;
using System.IO;
using System.Linq;
using System.Text.Json;
using System.Text.Json.Serialization;
using DynamicData;
using HaruhiChokuretsuLib.Util;
using SerialLoops.Lib.Hacks;
using SerialLoops.Lib.Script;
namespace SerialLoops.Lib;
public class ConfigUser
{
[JsonIgnore]
public ConfigSystem SysConfig { get; set; }
[JsonIgnore]
public string ConfigPath { get; set; }
public string UserDirectory { get; set; }
[JsonIgnore]
public string ProjectsDirectory => Path.Combine(UserDirectory, "Projects");
[JsonIgnore]
public string LogsDirectory => Path.Combine(UserDirectory, "Logs");
[JsonIgnore]
public string CachesDirectory => Path.Combine(UserDirectory, "Caches");
[JsonIgnore]
public string HacksDirectory => Path.Combine(UserDirectory, "Hacks");
[JsonIgnore]
public string ScriptTemplatesDirectory => Path.Combine(UserDirectory, "ScriptTemplates");
[JsonIgnore]
public ObservableCollection<AsmHack> Hacks { get; set; }
[JsonIgnore]
public ObservableCollection<ScriptTemplate> ScriptTemplates { get; set; }
public string CurrentCultureName { get; set; }
public bool AutoReopenLastProject { get; set; }
public bool RememberProjectWorkspace { get; set; }
public bool RemoveMissingProjects { get; set; }
public bool CheckForUpdates { get; set; }
public bool PreReleaseChannel { get; set; }
public string DisplayFont { get; set; }
public bool FirstTimeFlatpak { get; set; }
public void Save(ILogger log)
{
IO.WriteStringFile(ConfigPath, JsonSerializer.Serialize(this), log);
}
public void ValidateConfig(Func<string, string> localize, ILogger log)
{
if (CurrentCultureName is null)
{
CurrentCultureName = CultureInfo.CurrentCulture.Name;
}
else
{
CultureInfo.CurrentCulture = new(CurrentCultureName);
}
}
public void InitializeHacks(ILogger log)
{
if (!Directory.Exists(HacksDirectory))
{
Directory.CreateDirectory(HacksDirectory);
IO.CopyFiles(Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "Sources", "Hacks"), HacksDirectory, log);
File.Copy(Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "Sources", "hacks.json"), Path.Combine(HacksDirectory, "hacks.json"));
}
Hacks = JsonSerializer.Deserialize<ObservableCollection<AsmHack>>(File.ReadAllText(Path.Combine(HacksDirectory, "hacks.json")));
// Pull in new hacks in case we've updated the program with more
List<AsmHack> builtinHacks = JsonSerializer.Deserialize<List<AsmHack>>(File.ReadAllText(Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "Sources", "hacks.json")));
AsmHack[] missingHacks = builtinHacks.Where(h => !Hacks.Contains(h)).ToArray();
if (missingHacks.Length != 0)
{
IO.CopyFiles(Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "Sources", "Hacks"), HacksDirectory, log);
Hacks.AddRange(missingHacks);
File.WriteAllText(Path.Combine(HacksDirectory, "hacks.json"), JsonSerializer.Serialize(Hacks));
}
AsmHack[] updatedHacks = builtinHacks.Where(h => !Hacks.FirstOrDefault(o => h.Name == o.Name)?.DeepEquals(h) ?? false).ToArray();
if (updatedHacks.Length != 0)
{
IO.CopyFiles(Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "Sources", "Hacks"), HacksDirectory, log);
foreach (AsmHack updatedHack in updatedHacks)
{
Hacks[Hacks.IndexOf(updatedHack)] = updatedHack;
}
File.WriteAllText(Path.Combine(HacksDirectory, "hacks.json"), JsonSerializer.Serialize(Hacks));
}
}
public void UpdateHackAppliedStatus(Project project, ILogger log)
{
foreach (AsmHack hack in Hacks)
{
hack.IsApplied = hack.Applied(project);
}
log.Log("Hydrated all hacks with the applied information for the current project.");
}
internal void InitializeScriptTemplates(Func<string, string> localize, ILogger log)
{
if (!Directory.Exists(ScriptTemplatesDirectory))
{
Directory.CreateDirectory(ScriptTemplatesDirectory);
}
IO.CopyFiles(Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "Sources", "ScriptTemplates"), ScriptTemplatesDirectory, log); // Update script templates each time we launch in case of program update
string[] scriptTemplateFiles = Directory.GetFiles(ScriptTemplatesDirectory, "*.slscr");
List<ScriptTemplate> templates = [];
foreach (string scriptTemplateFile in scriptTemplateFiles)
{
try
{
templates.Add(JsonSerializer.Deserialize<ScriptTemplate>(File.ReadAllText(scriptTemplateFile)));
}
catch (Exception ex)
{
log.LogException(string.Format(localize("ErrorFailedDeserializingScriptTemplate"), scriptTemplateFile), ex);
}
}
ScriptTemplates = new(templates);
}
}