@@ -14,29 +14,173 @@ public LoadJson(ILogger<CustomCommands> Logger)
14
14
this . Logger = Logger ;
15
15
}
16
16
17
- /// <summary>
18
- /// Load the commands from the JSON file
19
- /// </summary>
20
- /// <returns>Returns the Commands as a List</returns>
21
- public List < Commands > ? LoadCommandsFromJson ( string path )
17
+ public List < Commands > GetCommandsFromJsonFiles ( string path )
22
18
{
23
- string jsonPath = Path . Combine ( path , "Commands.json" ) ;
24
- if ( File . Exists ( jsonPath ) )
19
+ var comms = new List < Commands > ( ) ;
20
+
21
+ CheckForExampleFile ( path ) ;
22
+
23
+ var pathofcommands = Path . Combine ( path , "Commands" ) ;
24
+ var defaultconfigpath = Path . Combine ( path , "Commands.json" ) ;
25
+
26
+ var files = new List < string > ( ) ;
27
+
28
+ if ( Directory . Exists ( pathofcommands ) )
29
+ files . AddRange ( Directory . GetFiles ( pathofcommands , "*.json" , SearchOption . AllDirectories ) ) ;
30
+
31
+ // Check if the default config file exists in plugins/CustomCommands
32
+ if ( File . Exists ( defaultconfigpath ) )
33
+ {
34
+ files . Add ( defaultconfigpath ) ;
35
+ Logger . LogInformation ( "Found default config file." ) ;
36
+ }
37
+ //
38
+ else if ( ! File . Exists ( defaultconfigpath ) && files . Count == 0 )
39
+ {
40
+ Logger . LogWarning ( "No Config file found. Please create plugins/CustomCommands/Commands.json or in plugins/CustomCommands/Commands/<name>.json" ) ;
41
+ return comms ;
42
+ }
43
+
44
+ foreach ( var file in files )
45
+ {
46
+ var json = File . ReadAllText ( file ) ;
47
+
48
+ // Validate the JSON file
49
+ if ( ! IsValidJsonSyntax ( file ) )
50
+ continue ;
51
+
52
+ var commands = JsonSerializer . Deserialize < List < Commands > > ( json ) ;
53
+ if ( ValidateObject ( commands , file ) )
54
+ comms . AddRange ( commands ! ) ;
55
+ }
56
+ return comms ;
57
+ }
58
+ // Check if the Command.json file exists. If not replace it with the example file
59
+ public void CheckForExampleFile ( string path )
60
+ {
61
+ var defaultconfigpath = Path . Combine ( path , "Commands.json" ) ;
62
+ var exampleconfigpath = Path . Combine ( path , "Commands.example.json" ) ;
63
+ if ( ! File . Exists ( defaultconfigpath ) )
64
+ {
65
+ File . Copy ( exampleconfigpath , defaultconfigpath ) ;
66
+ Logger . LogInformation ( "Created default config file." ) ;
67
+ }
68
+
69
+ }
70
+ public bool IsValidJsonSyntax ( string path )
71
+ {
72
+ try
73
+ {
74
+ var json = File . ReadAllText ( path ) ;
75
+ var document = JsonDocument . Parse ( json ) ;
76
+ return true ;
77
+ }
78
+ catch ( JsonException ex )
25
79
{
26
- var json = File . ReadAllText ( jsonPath ) ;
27
- return JsonSerializer . Deserialize < List < Commands > > ( json ) ;
80
+ Logger . LogError ( $ "Invalid JSON syntax in { path } . Please check the docs on how to create a valid JSON file") ;
81
+ Logger . LogError ( ex . Message ) ;
82
+ return false ;
28
83
}
29
- else if ( File . Exists ( Path . Combine ( path , "Commands.example.json" ) ) )
84
+ }
85
+ public bool ValidateObject ( List < Commands > ? comms , string path )
86
+ {
87
+ if ( comms == null )
88
+ {
89
+ Logger . LogError ( $ "Invalid JSON format in { path } . Please check the docs on how to create a valid JSON file") ;
90
+ return false ;
91
+ }
92
+ bool commandstatus = true ;
93
+ for ( int i = 0 ; i < comms . Count ; i ++ )
94
+ {
95
+ commandstatus = true ;
96
+ // Title
97
+ if ( string . IsNullOrEmpty ( comms [ i ] . Title ) )
98
+ {
99
+ Logger . LogWarning ( $ "Title not set in { path } . Title is not required but recommended") ;
100
+ commandstatus = false ;
101
+ }
102
+ // Description
103
+ if ( string . IsNullOrEmpty ( comms [ i ] . Description ) )
104
+ {
105
+ Logger . LogWarning ( $ "Description not set in { path } . Description is not required but recommended. This will be shown in the help command") ;
106
+ commandstatus = false ;
107
+ }
108
+ // Command
109
+ if ( string . IsNullOrEmpty ( comms [ i ] . Command ) )
110
+ {
111
+ Logger . LogError ( $ "Command not set in { path } ") ;
112
+ commandstatus = false ;
113
+ }
114
+ if ( ! PrintToCheck ( comms [ i ] ) )
115
+ commandstatus = false ;
116
+
117
+ if ( ! commandstatus )
118
+ {
119
+ Logger . LogError ( $ "Command { comms [ i ] . Command } will not be loaded. Index: { i } ") ;
120
+ LogCommandDetails ( comms [ i ] ) ;
121
+ }
122
+ }
123
+ if ( ! commandstatus )
124
+ return false ;
125
+ return true ;
126
+ }
127
+
128
+ public void LogCommandDetails ( Commands comms )
129
+ {
130
+ Logger . LogInformation ( $ "-- Title: { comms . Title } ") ;
131
+ Logger . LogInformation ( $ "-- Description: { comms . Description } ") ;
132
+ Logger . LogInformation ( $ "-- Command: { comms . Command } ") ;
133
+ Logger . LogInformation ( $ "-- Message: { comms . Message } ") ;
134
+ Logger . LogInformation ( $ "-- CenterMessage: { comms . CenterMessage . Message } ") ;
135
+ Logger . LogInformation ( $ "-- CenterMessageTime: { comms . CenterMessage . Time } ") ;
136
+ Logger . LogInformation ( $ "-- PrintTo: { comms . PrintTo } ") ;
137
+ Logger . LogInformation ( $ "-- ServerCommands: { JsonSerializer . Serialize ( comms . ServerCommands ) } ") ;
138
+ Logger . LogInformation ( $ "-- PermissionList: { JsonSerializer . Serialize ( comms . Permission ) } ") ;
139
+ Logger . LogInformation ( "--------------------------------------------------" ) ;
140
+ }
141
+
142
+ public bool PrintToCheck ( Commands comms )
143
+ {
144
+ if ( comms . PrintTo == Sender . ClientChat || comms . PrintTo == Sender . AllChat )
30
145
{
31
- Logger . LogWarning ( "No Config file found. Please rename Commands.example.json to Commands.json" ) ;
32
- return null ;
146
+
147
+ if ( ! ValidateMessage ( comms . Message ) )
148
+ {
149
+ Logger . LogError ( $ "Message not set but needs to be set because PrintTo is set to { comms . PrintTo } ") ;
150
+ return false ;
151
+ }
33
152
}
153
+ else if ( comms . PrintTo == Sender . ClientCenter || comms . PrintTo == Sender . AllCenter )
154
+ {
155
+ if ( string . IsNullOrEmpty ( comms . CenterMessage . Message ) )
156
+ {
157
+ Logger . LogError ( $ "CenterMessage is not set but needs to be set because PrintTo is set to { comms . PrintTo } ") ;
158
+ return false ;
159
+ }
160
+ }
34
161
else
35
162
{
36
- Logger . LogWarning ( "No Config file found. Please create one" ) ;
37
- return null ;
163
+ if ( ! ValidateMessage ( comms . Message ) && string . IsNullOrEmpty ( comms . CenterMessage . Message ) )
164
+ {
165
+ Logger . LogError ( $ "Message and CenterMessage are not set but needs to be set because PrintTo is set to { comms . PrintTo } ") ;
166
+ return false ;
167
+ }
38
168
}
169
+ return true ;
39
170
}
40
171
41
-
172
+ public bool ValidateMessage ( dynamic message )
173
+ {
174
+ if ( message is JsonElement jsonElement )
175
+ {
176
+ if ( jsonElement . ValueKind == JsonValueKind . String )
177
+ return true ;
178
+
179
+ if ( jsonElement . ValueKind == JsonValueKind . Array )
180
+ return true ;
181
+
182
+ return false ;
183
+ }
184
+ return false ;
185
+ }
42
186
}
0 commit comments