-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathScriptsRepository.cs
More file actions
91 lines (80 loc) · 3.98 KB
/
Copy pathScriptsRepository.cs
File metadata and controls
91 lines (80 loc) · 3.98 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
using System;
using System.Collections.Generic;
using System.IO;
using YamlDotNet.Serialization;
using YamlDotNet.Serialization.NamingConventions;
namespace WebToolsDataMonitor
{
public class ScriptsRepository
{
private static readonly Lazy<ScriptsRepository> _instance = new Lazy<ScriptsRepository>(() => new ScriptsRepository());
public static ScriptsRepository Instance => _instance.Value;
private readonly object _lock = new object();
private Dictionary<string, ScrapScript> _scripts = new Dictionary<string, ScrapScript>(StringComparer.OrdinalIgnoreCase);
private ScriptsRepository() { LoadScriptsFromYamlDirectory(_scripts); }
// Re-reads every script file from disk, replacing the in-memory set. See ToolRepository.Reload -
// called alongside it at the start of every single run and every continuous-loop cycle, so a tweak
// to a script's scriptText/DelaySeconds/etc. takes effect on the next run without an app restart.
public void Reload()
{
var freshScripts = new Dictionary<string, ScrapScript>(StringComparer.OrdinalIgnoreCase);
LoadScriptsFromYamlDirectory(freshScripts);
lock (_lock)
{
_scripts = freshScripts;
}
}
private void LoadScriptsFromYamlDirectory(Dictionary<string, ScrapScript> targetScripts)
{
string scriptsDirectory = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "tools", "scripts");
Logger.Instance.Info("SCRIPTS_REPO", $"Scanning workspace path: {scriptsDirectory}");
try
{
if (!Directory.Exists(scriptsDirectory))
{
Directory.CreateDirectory(scriptsDirectory);
Logger.Instance.Warn("SCRIPTS_REPO", "Target folder missing. Generated empty container directory.");
return;
}
var deserializer = new DeserializerBuilder().WithNamingConvention(CamelCaseNamingConvention.Instance).IgnoreUnmatchedProperties().Build();
string[] files = Directory.GetFiles(scriptsDirectory, "*.y*ml");
Logger.Instance.Debug("SCRIPTS_REPO", $"Found ({files.Length}) candidate files target parsing.");
foreach (string filePath in files)
{
try
{
string yamlContent = File.ReadAllText(filePath);
var parsedScripts = deserializer.Deserialize<List<ScrapScript>>(yamlContent);
if (parsedScripts == null) continue;
int fileScriptCount = 0;
foreach (var script in parsedScripts)
{
if (script != null && !string.IsNullOrWhiteSpace(script.Name))
{
targetScripts[script.Name] = script;
fileScriptCount++;
}
}
Logger.Instance.Info("SCRIPTS_REPO", $"Ingested ({fileScriptCount}) standalone script assets out of: '{Path.GetFileName(filePath)}'");
}
catch (Exception fileEx)
{
Logger.Instance.Error("SCRIPTS_REPO", $"Fault parsing scripts inside '{Path.GetFileName(filePath)}': {fileEx.Message}");
}
}
Logger.Instance.Info("SCRIPTS_REPO", $"Cache completed. Inventory size: {targetScripts.Count} active entries.");
}
catch (Exception dirEx)
{
Logger.Instance.Critical("SCRIPTS_REPO", $"Directory discovery collapse: {dirEx.Message}");
}
}
public ScrapScript GetScript(string name)
{
lock (_lock)
{
return _scripts.TryGetValue(name, out var script) ? script : null;
}
}
}
}