-
Notifications
You must be signed in to change notification settings - Fork 50
Expand file tree
/
Copy pathDataFileSystem.cs
More file actions
140 lines (122 loc) · 4.27 KB
/
DataFileSystem.cs
File metadata and controls
140 lines (122 loc) · 4.27 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
130
131
132
133
134
135
136
137
138
139
140
extern alias References;
using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using Oxide.Core.Configuration;
using References::Newtonsoft.Json;
namespace Oxide.Core
{
/// <summary>
/// Manages all data files
/// </summary>
public class DataFileSystem
{
/// <summary>
/// Gets the directory that this system works in
/// </summary>
public string Directory { get; private set; }
// All currently loaded datafiles
private readonly Dictionary<string, DynamicConfigFile> _datafiles;
/// <summary>
/// Initializes a new instance of the DataFileSystem class
/// </summary>
/// <param name="directory"></param>
public DataFileSystem(string directory)
{
Directory = directory;
_datafiles = new Dictionary<string, DynamicConfigFile>();
KeyValuesConverter converter = new KeyValuesConverter();
JsonSerializerSettings settings = new JsonSerializerSettings();
settings.Converters.Add(converter);
}
public DynamicConfigFile GetFile(string name)
{
name = DynamicConfigFile.SanitizeName(name);
if (_datafiles.TryGetValue(name, out DynamicConfigFile datafile))
{
return datafile;
}
datafile = new DynamicConfigFile(Path.Combine(Directory, $"{name}.json"));
_datafiles.Add(name, datafile);
return datafile;
}
/// <summary>
/// Check if datafile exists
/// </summary>
/// <param name="name"></param>
/// <returns></returns>
public bool ExistsDatafile(string name) => GetFile(name).Exists();
/// <summary>
/// Gets a datafile
/// </summary>
/// <param name="name"></param>
/// <returns></returns>
public DynamicConfigFile GetDatafile(string name)
{
DynamicConfigFile datafile = GetFile(name);
// Does it exist?
if (datafile.Exists())
{
// Load it
datafile.Load();
}
else
{
// Just make a new one
datafile.Save();
}
return datafile;
}
/// <summary>
/// Gets data files from path, with optional search pattern
/// </summary>
/// <param name="path"></param>
/// <param name="searchPattern"></param>
/// <returns></returns>
public string[] GetFiles(string path = "", string searchPattern = "*")
{
return System.IO.Directory.GetFiles(Path.Combine(Directory, path), searchPattern);
}
/// <summary>
/// Saves the specified datafile
/// </summary>
/// <param name="name"></param>
public void SaveDatafile(string name) => GetFile(name).Save();
public T ReadObject<T>(string name)
{
T instance = default;
if (ExistsDatafile(name))
{
instance = GetFile(name).ReadObject<T>();
}
if (instance == null)
{
instance = Activator.CreateInstance<T>();
WriteObject(name, instance);
}
return instance;
}
public void WriteObject<T>(string name, T Object, bool sync = false) => GetFile(name).WriteObject(Object, sync);
/// <summary>
/// Removes the specified datafile
/// </summary>
/// <param name="name"></param>
public void DeleteDataFile(string name) => GetFile(name).Delete();
/// <summary>
/// Read data files in a batch and send callback
/// </summary>
/// <typeparam name="T"></typeparam>
/// <param name="name"></param>
/// <param name="callback"></param>
public void ForEachObject<T>(string name, Action<T> callback)
{
string folder = DynamicConfigFile.SanitizeName(name);
IEnumerable<DynamicConfigFile> files = _datafiles.Where(d => d.Key.StartsWith(folder)).Select(a => a.Value);
foreach (DynamicConfigFile file in files)
{
callback?.Invoke(file.ReadObject<T>());
}
}
}
}