@@ -114,7 +114,8 @@ async fn upload_yaml(
114
114
redirect_to : & RedirectTo ,
115
115
uuid : Uuid ,
116
116
yaml : Form < & [ u8 ] > ,
117
- session : LoggedInSession ,
117
+ mut session : LoggedInSession ,
118
+ cookies : & CookieJar < ' _ > ,
118
119
ctx : & State < Context > ,
119
120
) -> Result < Redirect > {
120
121
redirect_to. set ( & format ! ( "/room/{}" , uuid) ) ;
@@ -138,7 +139,9 @@ async fn upload_yaml(
138
139
anyhow:: bail!( "Invalid yaml file. Syntax error." )
139
140
} ;
140
141
let Ok ( parsed) = serde_yaml:: from_str ( & doc) else {
141
- anyhow:: bail!( "Invalid yaml file. This does not look like an archipelago game YAML." )
142
+ anyhow:: bail!(
143
+ "Invalid yaml file. This does not look like an archipelago game YAML."
144
+ )
142
145
} ;
143
146
Ok ( ( doc, parsed) )
144
147
} )
@@ -156,14 +159,12 @@ async fn upload_yaml(
156
159
157
160
for ( document, parsed) in documents. iter ( ) {
158
161
let mut player_name = parsed. name . clone ( ) ;
159
- player_name. truncate ( 16 ) ;
160
162
161
- if player_name. contains ( "{NUMBER}" ) || player_name. contains ( "{number}" ) {
162
- continue ;
163
- }
164
- if player_name. contains ( "{PLAYER}" ) || player_name. contains ( "{player}" ) {
165
- continue ;
166
- }
163
+ let ignore_dupe = player_name. contains ( "{NUMBER}" )
164
+ || player_name. contains ( "{number}" )
165
+ || player_name. contains ( "{PLAYER}" )
166
+ || player_name. contains ( "{player}" ) ;
167
+ player_name. truncate ( 16 ) ;
167
168
168
169
if player_name == "meta" || player_name == "Archipelago" {
169
170
return Err ( Error ( anyhow:: anyhow!( format!(
@@ -172,14 +173,27 @@ async fn upload_yaml(
172
173
) ) ) ) ;
173
174
}
174
175
175
- if players_in_room. contains ( & player_name) {
176
+ if !ignore_dupe && players_in_room. contains ( & player_name) {
176
177
return Err ( Error ( anyhow:: anyhow!(
177
178
"Adding this yaml would duplicate a player name"
178
179
) ) ) ;
179
180
}
180
181
181
182
if room. yaml_validation {
182
- validate_yaml ( document, ctx) . await ?;
183
+ let unsupported_games = validate_yaml ( document, ctx) . await ?;
184
+ if room. allow_unsupported {
185
+ session. 0 . warning_msg . push ( format ! (
186
+ "Uploaded a YAML with unsupported games: {}. Couldn't verify it." ,
187
+ unsupported_games. iter( ) . join( "; " )
188
+ ) ) ;
189
+ session. 0 . save ( cookies) ?;
190
+ } else {
191
+ return Err ( anyhow:: anyhow!( format!(
192
+ "Your YAML contains the following unsupported games: {}. Can't upload." ,
193
+ unsupported_games. iter( ) . join( "; " )
194
+ ) )
195
+ . into ( ) ) ;
196
+ }
183
197
}
184
198
185
199
players_in_room. insert ( player_name) ;
@@ -192,14 +206,15 @@ async fn upload_yaml(
192
206
Ok ( Redirect :: to ( uri ! ( room( uuid) ) ) )
193
207
}
194
208
195
- async fn validate_yaml ( yaml : & str , ctx : & State < Context > ) -> Result < ( ) > {
209
+ async fn validate_yaml ( yaml : & str , ctx : & State < Context > ) -> Result < Vec < String > > {
196
210
if ctx. yaml_validator_url . is_none ( ) {
197
- return Ok ( ( ) ) ;
211
+ return Ok ( vec ! [ ] ) ;
198
212
}
199
213
200
214
#[ derive( serde:: Deserialize ) ]
201
215
struct ValidationResponse {
202
216
error : Option < String > ,
217
+ unsupported : Vec < String > ,
203
218
}
204
219
205
220
let client = reqwest:: Client :: new ( ) ;
@@ -218,7 +233,7 @@ async fn validate_yaml(yaml: &str, ctx: &State<Context>) -> Result<()> {
218
233
return Err ( anyhow:: anyhow!( error) . into ( ) ) ;
219
234
}
220
235
221
- Ok ( ( ) )
236
+ Ok ( response . unsupported )
222
237
}
223
238
224
239
#[ get( "/room/<room_id>/delete/<yaml_id>" ) ]
0 commit comments