9
9
using System . Collections . Generic ;
10
10
using System . Linq ;
11
11
using System . Reflection ;
12
- using System . Security . Principal ;
13
12
using System . Text ;
14
13
using System . Threading . Tasks ;
15
14
@@ -39,6 +38,17 @@ internal sealed class SettingsDataFeedInjector : ResoniteAsyncEventHandlerMonkey
39
38
40
39
protected override Task Handle ( FallbackLocaleGenerationEvent eventData )
41
40
{
41
+ foreach ( var configSection in Mod . Loader . Config . Sections )
42
+ {
43
+ eventData . AddMessage ( $ "{ configSection . FullId } .Name", configSection . Name ) ;
44
+
45
+ foreach ( var configKey in configSection . Keys )
46
+ {
47
+ eventData . AddMessage ( $ "{ configKey . FullId } .Name", configKey . Id ) ;
48
+ eventData . AddMessage ( $ "{ configKey . FullId } .Description", configKey . Description ?? "No Description" ) ;
49
+ }
50
+ }
51
+
42
52
foreach ( var mod in Mod . Loader . Mods )
43
53
{
44
54
var modNameKey = $ "{ mod . Id } .Name";
@@ -83,6 +93,19 @@ protected override bool OnEngineReady()
83
93
return base . OnEngineReady ( ) ;
84
94
}
85
95
96
+ private static async IAsyncEnumerable < DataFeedItem > EnumerateConfigAsync ( IReadOnlyList < string > path , Config config )
97
+ {
98
+ foreach ( var configSection in config . Sections . Where ( section => ! section . InternalAccessOnly ) )
99
+ {
100
+ var sectionGroup = new DataFeedGroup ( ) ;
101
+ sectionGroup . InitBase ( configSection . Id , path , null , $ "{ configSection . FullId } .Name". AsLocaleKey ( ) ) ;
102
+ yield return sectionGroup ;
103
+
104
+ await foreach ( var sectionItem in EnumerateConfigSectionAsync ( path , configSection ) )
105
+ yield return sectionItem ;
106
+ }
107
+ }
108
+
86
109
private static async IAsyncEnumerable < DataFeedItem > EnumerateConfigSectionAsync ( IReadOnlyList < string > path , ConfigSection configSection )
87
110
{
88
111
foreach ( var configKey in configSection . Keys . Where ( key => ! key . InternalAccessOnly ) )
@@ -123,8 +146,21 @@ private static async IAsyncEnumerable<DataFeedItem> EnumerateConfigSectionAsync(
123
146
}
124
147
}
125
148
149
+ private static async IAsyncEnumerable < DataFeedItem > EnumerateModMonkeysAsync ( IReadOnlyList < string > path , Mod mod )
150
+ {
151
+ await foreach ( var feedItem in EnumerateMonkeysAsync ( path , mod , Monkeys ) )
152
+ yield return feedItem ;
153
+
154
+ await foreach ( var feedItem in EnumerateMonkeysAsync ( path , mod , EarlyMonkeys ) )
155
+ yield return feedItem ;
156
+ }
157
+
126
158
private static async IAsyncEnumerable < DataFeedItem > EnumerateModsAsync ( IReadOnlyList < string > path )
127
159
{
160
+ var monkeyLoaderCategory = new DataFeedCategory ( ) ;
161
+ monkeyLoaderCategory . InitBase ( "MonkeyLoader" , path , null , $ "{ Mod . Id } .OpenMonkeyLoader.Name". AsLocaleKey ( ) , $ "{ Mod . Id } .OpenMonkeyLoader.Description". AsLocaleKey ( ) ) ;
162
+ yield return monkeyLoaderCategory ;
163
+
128
164
foreach ( var mod in Mod . Loader . Mods )
129
165
{
130
166
var modGroup = new DataFeedGroup ( ) ;
@@ -133,123 +169,51 @@ private static async IAsyncEnumerable<DataFeedItem> EnumerateModsAsync(IReadOnly
133
169
134
170
var grouping = new [ ] { mod . Id } ;
135
171
136
- var monkeysCategory = new DataFeedCategory ( ) ;
137
- monkeysCategory . InitBase ( $ "{ mod . Id } .{ MonkeyToggles } ", path , grouping , $ "{ Mod . Id } .Mod.Open{ MonkeyToggles } ". AsLocaleKey ( ) ) ;
138
- monkeysCategory . SetOverrideSubpath ( mod . Id , MonkeyToggles ) ;
139
- yield return monkeysCategory ;
140
-
141
172
var configSectionsCategory = new DataFeedCategory ( ) ;
142
173
configSectionsCategory . InitBase ( $ "{ mod . Id } .{ ConfigSections } ", path , grouping , $ "{ Mod . Id } .Mod.Open{ ConfigSections } ". AsLocaleKey ( ) ) ;
143
174
configSectionsCategory . SetOverrideSubpath ( mod . Id , ConfigSections ) ;
144
175
yield return configSectionsCategory ;
176
+
177
+ var monkeysCategory = new DataFeedCategory ( ) ;
178
+ monkeysCategory . InitBase ( $ "{ mod . Id } .{ MonkeyToggles } ", path , grouping , $ "{ Mod . Id } .Mod.Open{ MonkeyToggles } ". AsLocaleKey ( ) ) ;
179
+ monkeysCategory . SetOverrideSubpath ( mod . Id , MonkeyToggles ) ;
180
+ yield return monkeysCategory ;
145
181
}
146
182
}
147
183
148
184
private static async IAsyncEnumerable < DataFeedItem > EnumerateModSettingsAsync ( IReadOnlyList < string > path )
149
185
{
150
- // path.Count >= 3 because otherwise other methods are called
151
- // Format: MonkeyLoader / modId / { page}
186
+ // path.Count >= 2 because otherwise other methods are called
187
+ // Format: MonkeyLoader / modId / [ page]
152
188
if ( Mod . Loader . Mods . FirstOrDefault ( mod => mod . Id == path [ 1 ] ) is not Mod mod )
153
189
{
154
190
Logger . Error ( ( ) => $ "Tried to access non-existant mod's settings: { path [ 1 ] } ") ;
155
191
yield break ;
156
192
}
157
193
158
- switch ( path [ 2 ] )
194
+ if ( path . Count == 2 )
159
195
{
160
- case MonkeyToggles :
161
- var monkeysGroup = new DataFeedGroup ( ) ;
162
- monkeysGroup . InitBase ( Monkeys , path , null , $ "{ Mod . Id } .{ Monkeys } .Name". AsLocaleKey ( ) , $ "{ Mod . Id } .{ Monkeys } .Description". AsLocaleKey ( ) ) ;
163
- yield return monkeysGroup ;
164
-
165
- var monkeysGrouping = new [ ] { Monkeys } ;
166
-
167
- var monkeyCount = new DataFeedIndicator < string > ( ) ;
168
- monkeyCount . InitBase ( $ "{ Monkeys } .Count", path , monkeysGrouping , $ "{ Mod . Id } .{ Monkeys } .Count.Name". AsLocaleKey ( ) , $ "{ Mod . Id } .{ Monkeys } .Count.Description". AsLocaleKey ( ) ) ;
169
- monkeyCount . InitSetupValue ( field => field . Value = mod . Monkeys . Count ( ) . ToString ( ) ) ;
170
- yield return monkeyCount ;
171
-
172
- foreach ( var monkey in mod . Monkeys )
173
- {
174
- var monkeyGroup = new DataFeedGroup ( ) ;
175
- monkeyGroup . InitBase ( $ "{ monkey . Id } ", path , monkeysGrouping , $ "{ mod . Id } .{ monkey . Id } .Name". AsLocaleKey ( ) , $ "{ mod . Id } .{ monkey . Id } .Description". AsLocaleKey ( ) ) ;
176
- yield return monkeyGroup ;
177
-
178
- var monkeyGrouping = new [ ] { Monkeys , monkey . Id } ;
179
-
180
- if ( monkey . CanBeDisabled )
181
- {
182
- var toggle = new DataFeedToggle ( ) ;
183
- toggle . InitBase ( $ "{ monkey . Id } .Enabled", path , monkeyGrouping , $ "{ Mod . Id } .{ Monkeys } .Enabled.Name". AsLocaleKey ( ) , $ "{ Mod . Id } .{ Monkeys } .Enabled.Description". AsLocaleKey ( ) ) ;
184
- toggle . InitSetupValue ( field => field . SyncWithConfigKey ( mod . MonkeyToggles . GetToggle ( monkey ) ) ) ;
185
- yield return toggle ;
186
- }
187
- else
188
- {
189
- var enabledIndicator = new DataFeedIndicator < string > ( ) ;
190
- enabledIndicator . InitBase ( $ "{ monkey . Id } .Enabled", path , monkeyGrouping , $ "{ Mod . Id } .{ Monkeys } .Enabled.Name". AsLocaleKey ( ) , $ "{ Mod . Id } .{ Monkeys } .Enabled.Description". AsLocaleKey ( ) ) ;
191
- enabledIndicator . InitSetupValue ( field => field . Value = "Always Enabled" ) ;
192
- yield return enabledIndicator ;
193
- }
194
-
195
- var typeIndicator = new DataFeedIndicator < string > ( ) ;
196
- typeIndicator . InitBase ( $ "{ monkey . Id } .Type", path , monkeyGrouping , $ "{ Mod . Id } .{ Monkeys } .Type.Name". AsLocaleKey ( ) , $ "{ Mod . Id } .{ Monkeys } .Type.Description". AsLocaleKey ( ) ) ;
197
- typeIndicator . InitSetupValue ( field => field . Value = monkey . Type . BaseType . Name ) ;
198
- yield return typeIndicator ;
199
- }
200
-
201
- var earlyMonkeysGroup = new DataFeedGroup ( ) ;
202
- earlyMonkeysGroup . InitBase ( EarlyMonkeys , path , null , $ "{ Mod . Id } .{ EarlyMonkeys } .Name". AsLocaleKey ( ) , $ "{ Mod . Id } .{ EarlyMonkeys } .Description". AsLocaleKey ( ) ) ;
203
- yield return earlyMonkeysGroup ;
196
+ await foreach ( var feedItem in EnumerateConfigAsync ( path , mod . Config ) )
197
+ yield return feedItem ;
204
198
205
- var earlyMonkeysGrouping = new [ ] { EarlyMonkeys } ;
199
+ await foreach ( var feedItem in EnumerateModMonkeysAsync ( path , Mod ) )
200
+ yield return feedItem ;
206
201
207
- var earlyMonkeyCount = new DataFeedIndicator < string > ( ) ;
208
- earlyMonkeyCount . InitBase ( $ "{ EarlyMonkeys } .Count", path , earlyMonkeysGrouping , $ "{ Mod . Id } .{ EarlyMonkeys } .Count.Name". AsLocaleKey ( ) , $ "{ Mod . Id } .{ EarlyMonkeys } .Count.Description". AsLocaleKey ( ) ) ;
209
- earlyMonkeyCount . InitSetupValue ( field => field . Value = mod . EarlyMonkeys . Count ( ) . ToString ( ) ) ;
210
- yield return earlyMonkeyCount ;
202
+ yield break ;
203
+ }
211
204
212
- foreach ( var earlyMonkey in mod . EarlyMonkeys )
213
- {
214
- var earlyMonkeyGroup = new DataFeedGroup ( ) ;
215
- earlyMonkeyGroup . InitBase ( earlyMonkey . Id , path , earlyMonkeysGrouping , $ "{ mod . Id } .{ earlyMonkey . Id } .Name". AsLocaleKey ( ) , $ "{ mod . Id } .{ earlyMonkey . Id } .Description". AsLocaleKey ( ) ) ;
216
- yield return earlyMonkeyGroup ;
217
-
218
- var earlyMonkeyGrouping = new [ ] { EarlyMonkeys , earlyMonkey . Id } ;
219
-
220
- if ( earlyMonkey . CanBeDisabled )
221
- {
222
- var toggle = new DataFeedToggle ( ) ;
223
- toggle . InitBase ( $ "{ earlyMonkey . Id } .Enabled", path , earlyMonkeyGrouping , $ "{ Mod . Id } .{ EarlyMonkeys } .Enabled.Name". AsLocaleKey ( ) , $ "{ Mod . Id } .{ EarlyMonkeys } .Enabled.Description". AsLocaleKey ( ) ) ;
224
- toggle . InitSetupValue ( field => field . SyncWithConfigKey ( mod . MonkeyToggles . GetToggle ( earlyMonkey ) ) ) ;
225
- yield return toggle ;
226
- }
227
- else
228
- {
229
- var enabledIndicator = new DataFeedIndicator < string > ( ) ;
230
- enabledIndicator . InitBase ( $ "{ earlyMonkey . Id } .Enabled", path , earlyMonkeyGrouping , $ "{ Mod . Id } .{ Monkeys } .Enabled.Name". AsLocaleKey ( ) , $ "{ Mod . Id } .{ Monkeys } .Enabled.Description". AsLocaleKey ( ) ) ;
231
- enabledIndicator . InitSetupValue ( field => field . Value = "Always Enabled" ) ;
232
- yield return enabledIndicator ;
233
- }
234
-
235
- var typeIndicator = new DataFeedIndicator < string > ( ) ;
236
- typeIndicator . InitBase ( $ "{ earlyMonkey . Id } .Type", path , earlyMonkeyGrouping , $ "{ Mod . Id } .{ Monkeys } .Type.Name". AsLocaleKey ( ) , $ "{ Mod . Id } .{ Monkeys } .Type.Description". AsLocaleKey ( ) ) ;
237
- typeIndicator . InitSetupValue ( field => field . Value = earlyMonkey . Type . BaseType . Name ) ;
238
- yield return typeIndicator ;
239
- }
205
+ switch ( path [ 2 ] )
206
+ {
207
+ case ConfigSections :
208
+ await foreach ( var feedItem in EnumerateConfigAsync ( path , mod . Config ) )
209
+ yield return feedItem ;
240
210
241
211
break ;
242
212
243
- case ConfigSections :
244
- foreach ( var configSection in mod . Config . Sections . Where ( section => ! section . InternalAccessOnly ) )
245
- {
246
- var sectionGroup = new DataFeedGroup ( ) ;
247
- sectionGroup . InitBase ( configSection . Id , path , null , $ "{ configSection . FullId } .Name". AsLocaleKey ( ) ) ;
248
- yield return sectionGroup ;
213
+ case MonkeyToggles :
214
+ await foreach ( var feedItem in EnumerateModMonkeysAsync ( path , Mod ) )
215
+ yield return feedItem ;
249
216
250
- await foreach ( var sectionItem in EnumerateConfigSectionAsync ( path , configSection ) )
251
- yield return sectionItem ;
252
- }
253
217
break ;
254
218
255
219
default :
@@ -260,7 +224,58 @@ private static async IAsyncEnumerable<DataFeedItem> EnumerateModSettingsAsync(IR
260
224
261
225
private static async IAsyncEnumerable < DataFeedItem > EnumerateMonkeyLoaderSettingsAsync ( IReadOnlyList < string > path )
262
226
{
263
- yield break ;
227
+ await foreach ( var feedItem in EnumerateConfigAsync ( path , Mod . Loader . Config ) )
228
+ yield return feedItem ;
229
+ }
230
+
231
+ private static async IAsyncEnumerable < DataFeedItem > EnumerateMonkeysAsync ( IReadOnlyList < string > path , Mod mod , string monkeyType )
232
+ {
233
+ var monkeys = monkeyType switch
234
+ {
235
+ Monkeys => mod . Monkeys . ToArray ( ) ,
236
+ EarlyMonkeys => mod . EarlyMonkeys . ToArray ( ) ,
237
+ _ => Array . Empty < IMonkey > ( )
238
+ } ;
239
+
240
+ var group = new DataFeedGroup ( ) ;
241
+ group . InitBase ( monkeyType , path , null , $ "{ Mod . Id } .{ monkeyType } .Name". AsLocaleKey ( ) , $ "{ Mod . Id } .{ monkeyType } .Description". AsLocaleKey ( ) ) ;
242
+ yield return group ;
243
+
244
+ var monkeysGrouping = new [ ] { monkeyType } ;
245
+
246
+ var monkeyCount = new DataFeedIndicator < string > ( ) ;
247
+ monkeyCount . InitBase ( $ "{ monkeyType } .Count", path , monkeysGrouping , $ "{ Mod . Id } .{ monkeyType } .Count.Name". AsLocaleKey ( ) , $ "{ Mod . Id } .{ monkeyType } .Count.Description". AsLocaleKey ( ) ) ;
248
+ monkeyCount . InitSetupValue ( field => field . Value = monkeys . Length . ToString ( ) ) ;
249
+ yield return monkeyCount ;
250
+
251
+ foreach ( var monkey in monkeys )
252
+ {
253
+ var monkeyGroup = new DataFeedGroup ( ) ;
254
+ monkeyGroup . InitBase ( $ "{ monkey . Id } ", path , monkeysGrouping , $ "{ monkey . FullId } .Name". AsLocaleKey ( ) , $ "{ monkey . FullId } .Description". AsLocaleKey ( ) ) ;
255
+ yield return monkeyGroup ;
256
+
257
+ var monkeyGrouping = new [ ] { monkeyType , monkey . Id } ;
258
+
259
+ if ( monkey . CanBeDisabled )
260
+ {
261
+ var toggle = new DataFeedToggle ( ) ;
262
+ toggle . InitBase ( $ "{ monkey . Id } .Enabled", path , monkeyGrouping , $ "{ Mod . Id } .{ monkeyType } .Enabled.Name". AsLocaleKey ( ) , $ "{ Mod . Id } .{ monkeyType } .Enabled.Description". AsLocaleKey ( ) ) ;
263
+ toggle . InitSetupValue ( field => field . SyncWithConfigKey ( mod . MonkeyToggles . GetToggle ( monkey ) ) ) ;
264
+ yield return toggle ;
265
+ }
266
+ else
267
+ {
268
+ var enabledIndicator = new DataFeedIndicator < string > ( ) ;
269
+ enabledIndicator . InitBase ( $ "{ monkey . Id } .Enabled", path , monkeyGrouping , $ "{ Mod . Id } .{ monkeyType } .Enabled.Name". AsLocaleKey ( ) , $ "{ Mod . Id } .{ monkeyType } .Enabled.Description". AsLocaleKey ( ) ) ;
270
+ enabledIndicator . InitSetupValue ( field => field . Value = "Always Enabled" ) ;
271
+ yield return enabledIndicator ;
272
+ }
273
+
274
+ var typeIndicator = new DataFeedIndicator < string > ( ) ;
275
+ typeIndicator . InitBase ( $ "{ monkey . Id } .Type", path , monkeyGrouping , $ "{ Mod . Id } .{ monkeyType } .Type.Name". AsLocaleKey ( ) , $ "{ Mod . Id } .{ monkeyType } .Type.Description". AsLocaleKey ( ) ) ;
276
+ typeIndicator . InitSetupValue ( field => field . Value = monkey . Type . BaseType . Name ) ;
277
+ yield return typeIndicator ;
278
+ }
264
279
}
265
280
266
281
[ HarmonyPrefix ]
@@ -270,12 +285,12 @@ private static bool EnumeratePrefix(IReadOnlyList<string> path, ref IAsyncEnumer
270
285
if ( path . Count == 0 || path [ 0 ] != "MonkeyLoader" )
271
286
return true ;
272
287
273
- if ( path . Count == 1 )
274
- __result = EnumerateModsAsync ( path ) ;
275
- else if ( path . Count == 2 )
276
- __result = EnumerateMonkeyLoaderSettingsAsync ( path ) ;
277
- else if ( path . Count >= 3 )
278
- __result = EnumerateModSettingsAsync ( path ) ;
288
+ __result = path . Count switch
289
+ {
290
+ 1 => EnumerateModsAsync ( path ) ,
291
+ 2 => path [ 1 ] == "MonkeyLoader" ? EnumerateMonkeyLoaderSettingsAsync ( path ) : EnumerateModSettingsAsync ( path ) ,
292
+ _ => EnumerateModSettingsAsync ( path ) ,
293
+ } ;
279
294
280
295
return false ;
281
296
}
0 commit comments