@@ -235,26 +235,78 @@ impl IcyBoardState {
235
235
} ;
236
236
self . session . op_text = format ! ( "{}-{}" , base_number, active_messages) ;
237
237
238
- let text = self
239
- . input_field (
240
- prompt,
241
- 40 ,
242
- MASK_COMMAND ,
243
- & CommandType :: ReadMessages . get_help ( ) ,
244
- None ,
245
- display_flags:: UPCASE | display_flags:: NEWLINE | display_flags:: NEWLINE ,
246
- )
247
- . await ?;
248
- if text. is_empty ( ) {
249
- break ;
238
+ if self . session . tokens . is_empty ( ) {
239
+ let text = self
240
+ . input_field (
241
+ prompt,
242
+ 40 ,
243
+ MASK_COMMAND ,
244
+ & CommandType :: ReadMessages . get_help ( ) ,
245
+ None ,
246
+ display_flags:: UPCASE | display_flags:: NEWLINE | display_flags:: NEWLINE ,
247
+ )
248
+ . await ?;
249
+ if text. is_empty ( ) {
250
+ break ;
251
+ }
252
+ self . session . push_tokens ( & text) ;
250
253
}
251
254
252
- if let Ok ( number) = text. parse :: < u32 > ( ) {
253
- if only_personal && !messages. contains ( & number) {
254
- self . display_text ( IceText :: NoMailFound , display_flags:: NEWLINE ) . await ?;
255
- continue ;
255
+ if let Some ( text) = self . session . tokens . pop_front ( ) {
256
+ match text. as_str ( ) {
257
+ "RM" => {
258
+ let Some ( ( area, number) ) = self . session . memorized_msg else {
259
+ self . display_text ( IceText :: NotMemorized , display_flags:: NEWLINE | display_flags:: LFBEFORE )
260
+ . await ?;
261
+ return Ok ( ( ) ) ;
262
+ } ;
263
+ if area != self . session . current_message_area {
264
+ self . display_text ( IceText :: NotMemorized , display_flags:: NEWLINE | display_flags:: LFBEFORE )
265
+ . await ?;
266
+ return Ok ( ( ) ) ;
267
+ }
268
+ self . read_message_number ( & mut message_base, & viewer, number, number, false , Box :: new ( |_, _| true ) )
269
+ . await ?;
270
+ }
271
+ "RM+" => {
272
+ let Some ( ( area, number) ) = self . session . memorized_msg else {
273
+ self . display_text ( IceText :: NotMemorized , display_flags:: NEWLINE | display_flags:: LFBEFORE )
274
+ . await ?;
275
+ return Ok ( ( ) ) ;
276
+ } ;
277
+ if area != self . session . current_message_area {
278
+ self . display_text ( IceText :: NotMemorized , display_flags:: NEWLINE | display_flags:: LFBEFORE )
279
+ . await ?;
280
+ return Ok ( ( ) ) ;
281
+ }
282
+ self . read_message_number ( & mut message_base, & viewer, number, u32:: MAX , true , Box :: new ( |_, _| true ) )
283
+ . await ?;
284
+ }
285
+ "RM-" => {
286
+ let Some ( ( area, number) ) = self . session . memorized_msg else {
287
+ self . display_text ( IceText :: NotMemorized , display_flags:: NEWLINE | display_flags:: LFBEFORE )
288
+ . await ?;
289
+ return Ok ( ( ) ) ;
290
+ } ;
291
+ if area != self . session . current_message_area {
292
+ self . display_text ( IceText :: NotMemorized , display_flags:: NEWLINE | display_flags:: LFBEFORE )
293
+ . await ?;
294
+ return Ok ( ( ) ) ;
295
+ }
296
+ self . read_message_number ( & mut message_base, & viewer, number, 1 , true , Box :: new ( |_, _| true ) )
297
+ . await ?;
298
+ }
299
+ text => {
300
+ if let Ok ( number) = text. parse :: < u32 > ( ) {
301
+ if only_personal && !messages. contains ( & number) {
302
+ self . display_text ( IceText :: NoMailFound , display_flags:: NEWLINE ) . await ?;
303
+ continue ;
304
+ }
305
+ self . read_message_number ( & mut message_base, & viewer, number, number, false , Box :: new ( |_, _| true ) )
306
+ . await ?;
307
+ }
308
+ }
256
309
}
257
- self . read_message_number ( & mut message_base, & viewer, number, Box :: new ( |_, _| true ) ) . await ?;
258
310
}
259
311
}
260
312
Ok ( ( ) )
@@ -264,14 +316,17 @@ impl IcyBoardState {
264
316
& mut self ,
265
317
message_base : & mut JamMessageBase ,
266
318
viewer : & MessageViewer ,
267
- mut number : u32 ,
319
+ mut first : u32 ,
320
+ mut last : u32 ,
321
+ mut keep_going : bool ,
268
322
_filter : Box < dyn Fn ( & JamMessageHeader , & str ) -> bool > ,
269
323
) -> Res < ( ) > {
324
+ let mut number = first;
270
325
if number == 0 {
271
326
return Ok ( ( ) ) ;
272
327
}
273
328
self . session . current_messagenumber = number;
274
- self . session . high_msg_num = message_base. base_messagenumber ( ) ;
329
+ self . session . low_msg_num = message_base. base_messagenumber ( ) ;
275
330
self . session . high_msg_num = message_base. base_messagenumber ( ) + message_base. active_messages ( ) ;
276
331
277
332
unsafe {
@@ -287,33 +342,34 @@ impl IcyBoardState {
287
342
message_base. write_last_read ( opt) ?;
288
343
}
289
344
let mut flag = ReadLoopType :: InsideReadLoop ;
290
- let mut first = number;
291
- let mut last = number;
292
345
let mut since = false ;
293
- let mut keep_going = false ;
294
-
346
+ let mut display_msg = true ;
295
347
loop {
296
- match message_base. read_header ( number) {
297
- Ok ( header) => {
298
- let text = message_base. read_msg_text ( & header) ?. to_string ( ) ;
299
- viewer. display_header ( self , message_base, & header) . await ?;
300
- if header. needs_password ( ) {
301
- if self
302
- . check_password ( IceText :: PasswordToReadMessage , 0 , |pwd| header. is_password_valid ( pwd) )
303
- . await ?
304
- {
348
+ if display_msg {
349
+ display_msg = false ;
350
+ match message_base. read_header ( number) {
351
+ Ok ( header) => {
352
+ let text = message_base. read_msg_text ( & header) ?. to_string ( ) ;
353
+ viewer. display_header ( self , message_base, & header) . await ?;
354
+ if header. needs_password ( ) {
355
+ if self
356
+ . check_password ( IceText :: PasswordToReadMessage , 0 , |pwd| header. is_password_valid ( pwd) )
357
+ . await ?
358
+ {
359
+ viewer. display_body ( self , & text) . await ?;
360
+ }
361
+ } else {
305
362
viewer. display_body ( self , & text) . await ?;
306
363
}
307
- } else {
308
- viewer. display_body ( self , & text) . await ?;
364
+ self . new_line ( ) . await ?;
365
+ }
366
+ Err ( err) => {
367
+ log:: error!( "Error reading message header: {}" , err) ;
368
+ self . display_text ( IceText :: NoMailFound , display_flags:: NEWLINE | display_flags:: LFAFTER ) . await ?;
309
369
}
310
- self . new_line ( ) . await ?;
311
- }
312
- Err ( err) => {
313
- log:: error!( "Error reading message header: {}" , err) ;
314
- self . display_text ( IceText :: NoMailFound , display_flags:: NEWLINE | display_flags:: LFAFTER ) . await ?;
315
370
}
316
371
}
372
+
317
373
let prompt = if self . session . expert_mode ( ) {
318
374
IceText :: EndOfMessageExpertmode
319
375
} else {
@@ -412,6 +468,7 @@ impl IcyBoardState {
412
468
}
413
469
"/" => {
414
470
// Redisplay
471
+ display_msg = true ;
415
472
continue ;
416
473
}
417
474
text => {
@@ -425,8 +482,16 @@ impl IcyBoardState {
425
482
if keep_going {
426
483
if last < number {
427
484
number -= 1 ;
485
+
486
+ if number < self . session . low_msg_num {
487
+ break ;
488
+ }
428
489
} else if number > first {
429
490
number += 1 ;
491
+
492
+ if number > self . session . high_msg_num {
493
+ break ;
494
+ }
430
495
}
431
496
}
432
497
}
0 commit comments