11using System ;
2- using System . IO ;
3- using System . Text ;
4- using Dalamud . Game ;
52using OtterGui . Classes ;
63using OtterGui . Log ;
74using Penumbra . Mods ;
@@ -11,103 +8,14 @@ namespace Penumbra.Services;
118/// <summary>
129/// Any file type that we want to save via SaveService.
1310/// </summary>
14- public interface ISavable
15- {
16- /// <summary> The full file name of a given object. </summary>
17- public string ToFilename ( FilenameService fileNames ) ;
18-
19- /// <summary> Write the objects data to the given stream writer. </summary>
20- public void Save ( StreamWriter writer ) ;
21-
22- /// <summary> An arbitrary message printed to Debug before saving. </summary>
23- public string LogName ( string fileName )
24- => fileName ;
25-
26- public string TypeName
27- => GetType ( ) . Name ;
28- }
11+ public interface ISavable : ISavable < FilenameService >
12+ { }
2913
30- public class SaveService
14+ public sealed class SaveService : SaveServiceBase < FilenameService >
3115{
32- #if DEBUG
33- private static readonly TimeSpan StandardDelay = TimeSpan . FromSeconds ( 2 ) ;
34- #else
35- private static readonly TimeSpan StandardDelay = TimeSpan . FromSeconds ( 10 ) ;
36- #endif
37-
38- private readonly Logger _log ;
39- private readonly FrameworkManager _framework ;
40-
41- public readonly FilenameService FileNames ;
42- public readonly Framework DalamudFramework ;
43-
44- public SaveService ( Logger log , FrameworkManager framework , FilenameService fileNames , Framework dalamudFramework )
45- {
46- _log = log ;
47- _framework = framework ;
48- FileNames = fileNames ;
49- DalamudFramework = dalamudFramework ;
50- }
51-
52- /// <summary> Queue a save for the next framework tick. </summary>
53- public void QueueSave ( ISavable value )
54- {
55- var file = value . ToFilename ( FileNames ) ;
56- _framework . RegisterOnTick ( $ "{ value . GetType ( ) . Name } ## { file } ", ( ) => { ImmediateSave ( value ) ; } ) ;
57- }
58-
59- /// <summary> Queue a delayed save with the standard delay for after the delay is over. </summary>
60- public void DelaySave ( ISavable value )
61- => DelaySave ( value , StandardDelay ) ;
62-
63- /// <summary> Queue a delayed save for after the delay is over. </summary>
64- public void DelaySave ( ISavable value , TimeSpan delay )
65- {
66- var file = value . ToFilename ( FileNames ) ;
67- _framework . RegisterDelayed ( $ "{ value . GetType ( ) . Name } ## { file } ", ( ) => { ImmediateSave ( value ) ; } , delay ) ;
68- }
69-
70- /// <summary> Immediately trigger a save. </summary>
71- public void ImmediateSave ( ISavable value )
72- {
73- var name = value . ToFilename ( FileNames ) ;
74- try
75- {
76- if ( name . Length == 0 )
77- throw new Exception ( "Invalid object returned empty filename." ) ;
78-
79- _log . Debug ( $ "Saving { value . TypeName } { value . LogName ( name ) } ...") ;
80- var file = new FileInfo ( name ) ;
81- file . Directory ? . Create ( ) ;
82- using var s = file . Exists ? file . Open ( FileMode . Truncate ) : file . Open ( FileMode . CreateNew ) ;
83- using var w = new StreamWriter ( s , Encoding . UTF8 ) ;
84- value . Save ( w ) ;
85- }
86- catch ( Exception ex )
87- {
88- _log . Error ( $ "Could not save { value . GetType ( ) . Name } { value . LogName ( name ) } :\n { ex } ") ;
89- }
90- }
91-
92- public void ImmediateDelete ( ISavable value )
93- {
94- var name = value . ToFilename ( FileNames ) ;
95- try
96- {
97- if ( name . Length == 0 )
98- throw new Exception ( "Invalid object returned empty filename." ) ;
99-
100- if ( ! File . Exists ( name ) )
101- return ;
102-
103- _log . Information ( $ "Deleting { value . GetType ( ) . Name } { value . LogName ( name ) } ...") ;
104- File . Delete ( name ) ;
105- }
106- catch ( Exception ex )
107- {
108- _log . Error ( $ "Could not delete { value . GetType ( ) . Name } { value . LogName ( name ) } :\n { ex } ") ;
109- }
110- }
16+ public SaveService ( Logger log , FrameworkManager framework , FilenameService fileNames )
17+ : base ( log , framework , fileNames )
18+ { }
11119
11220 /// <summary> Immediately delete all existing option group files for a mod and save them anew. </summary>
11321 public void SaveAllOptionGroups ( Mod mod )
@@ -121,7 +29,7 @@ public void SaveAllOptionGroups(Mod mod)
12129 }
12230 catch ( Exception e )
12331 {
124- Penumbra . Log . Error ( $ "Could not delete outdated group file { file } :\n { e } ") ;
32+ Log . Error ( $ "Could not delete outdated group file { file } :\n { e } ") ;
12533 }
12634 }
12735
0 commit comments