@@ -31,8 +31,8 @@ use super::u_upload_file::create_protocol;
31
31
const MASK_CONFNUMBERS : & str = "0123456789-SDL?" ;
32
32
33
33
impl IcyBoardState {
34
- async fn set_last_read ( & mut self , table : & Vec < ( usize , usize ) > ) -> Res < ( ) > {
35
- self . session . op_text = format ! ( "(1-{})" , table. len ( ) ) ;
34
+ async fn set_last_read ( & mut self , table : & HashMap < u16 , ( usize , usize ) > ) -> Res < ( ) > {
35
+ self . session . op_text = format ! ( "(1-{})" , table. keys ( ) . max ( ) . unwrap_or ( & 0 ) ) ;
36
36
let input = self
37
37
. input_field (
38
38
IceText :: SelectArea ,
@@ -44,10 +44,10 @@ impl IcyBoardState {
44
44
)
45
45
. await ?;
46
46
47
- let Ok ( number) = input. parse :: < usize > ( ) else {
47
+ let Ok ( number) = input. parse :: < u16 > ( ) else {
48
48
return Ok ( ( ) ) ;
49
49
} ;
50
- let Some ( ( conf_num, area_num) ) = table. get ( number) else {
50
+ let Some ( ( conf_num, area_num) ) = table. get ( & number) else {
51
51
return Ok ( ( ) ) ;
52
52
} ;
53
53
let high_msg = self . board . lock ( ) . await . conferences [ * conf_num] . areas . as_ref ( ) . unwrap ( ) [ * area_num] . get_high_msg ( ) as usize ;
@@ -119,6 +119,42 @@ impl IcyBoardState {
119
119
Ok ( ( ) )
120
120
}
121
121
122
+ async fn get_number_to_msgid ( & self ) -> ( HashMap < u16 , ( usize , usize ) > , HashMap < ( usize , usize ) , u16 > ) {
123
+ let conferences = & self . board . lock ( ) . await . conferences ;
124
+ let mut number_to_msgid = HashMap :: new ( ) ;
125
+ for ( i, conf) in conferences. iter ( ) . enumerate ( ) {
126
+ if let Some ( areas) = & conf. areas {
127
+ for ( j, area) in areas. iter ( ) . enumerate ( ) {
128
+ if area. qwk_conference_number != 0 {
129
+ number_to_msgid. insert ( area. qwk_conference_number , ( i, j) ) ;
130
+ }
131
+ }
132
+ }
133
+ }
134
+
135
+ let mut number = 1 ;
136
+ for ( i, conf) in conferences. iter ( ) . enumerate ( ) {
137
+ if let Some ( areas) = & conf. areas {
138
+ for ( j, area) in areas. iter ( ) . enumerate ( ) {
139
+ if area. qwk_conference_number != 0 {
140
+ while number_to_msgid. contains_key ( & number) {
141
+ number += 1 ;
142
+ }
143
+ number_to_msgid. insert ( number, ( i, j) ) ;
144
+ number += 1 ;
145
+ }
146
+ }
147
+ }
148
+ }
149
+ let mut msgid_to_number = HashMap :: new ( ) ;
150
+
151
+ for ( k, v) in number_to_msgid. iter ( ) {
152
+ msgid_to_number. insert ( * v, * k) ;
153
+ }
154
+
155
+ ( number_to_msgid, msgid_to_number)
156
+ }
157
+
122
158
async fn select_qwk_areas ( & mut self ) -> Res < ( ) > {
123
159
let divider = "-" . repeat ( 79 ) ;
124
160
let num_lines = if self . session . page_len < 4 || self . session . page_len > 50 {
@@ -129,14 +165,7 @@ impl IcyBoardState {
129
165
let mut done = false ;
130
166
131
167
let conferences = & self . board . lock ( ) . await . conferences . clone ( ) ;
132
- let mut number_to_msgid = Vec :: new ( ) ;
133
- for ( i, conf) in conferences. iter ( ) . enumerate ( ) {
134
- if let Some ( areas) = & conf. areas {
135
- for ( j, _area) in areas. iter ( ) . enumerate ( ) {
136
- number_to_msgid. push ( ( i, j) ) ;
137
- }
138
- }
139
- }
168
+ let ( number_to_msgid, msgid_to_number) = self . get_number_to_msgid ( ) . await ;
140
169
141
170
while !done {
142
171
if self . session . tokens . is_empty ( ) {
@@ -145,7 +174,7 @@ impl IcyBoardState {
145
174
for ( i, conf) in conferences. iter ( ) . enumerate ( ) {
146
175
if let Some ( areas) = & conf. areas {
147
176
for ( j, area) in areas. iter ( ) . enumerate ( ) {
148
- self . print_area_line ( line_number , i, j, area) . await ?;
177
+ self . print_area_line ( * msgid_to_number . get ( & ( i , j ) ) . unwrap ( ) , i, j, area) . await ?;
149
178
line_number += 1 ;
150
179
}
151
180
}
@@ -236,7 +265,7 @@ impl IcyBoardState {
236
265
Ok ( ( ) )
237
266
}
238
267
239
- async fn print_area_line ( & mut self , area_number : usize , conference : usize , num : usize , area : & MessageArea ) -> Res < ( ) > {
268
+ async fn print_area_line ( & mut self , area_number : u16 , conference : usize , num : usize , area : & MessageArea ) -> Res < ( ) > {
240
269
self . reset_color ( TerminalTarget :: Both ) . await ?;
241
270
242
271
let str = format ! ( "{:5}{}" , area_number, ' ' ) ;
@@ -273,10 +302,10 @@ impl IcyBoardState {
273
302
Ok ( ( ) )
274
303
}
275
304
276
- async fn change_qkw_selection ( & mut self , table : & Vec < ( usize , usize ) > , from : usize , to : usize , set_selection_to : Option < bool > ) -> Res < ( ) > {
305
+ async fn change_qkw_selection ( & mut self , table : & HashMap < u16 , ( usize , usize ) > , from : usize , to : usize , set_selection_to : Option < bool > ) -> Res < ( ) > {
277
306
if let Some ( user) = & mut self . session . current_user {
278
307
for i in from..=to {
279
- if let Some ( ( conference, num) ) = table. get ( i ) {
308
+ if let Some ( ( conference, num) ) = table. get ( & ( i as u16 ) ) {
280
309
user. lastread_ptr_flags
281
310
. entry ( ( * conference, * num) )
282
311
. or_insert_with ( || LastReadStatus {
@@ -305,6 +334,7 @@ impl IcyBoardState {
305
334
let output_path = temp_file:: empty ( ) . path ( ) . to_path_buf ( ) ;
306
335
fs:: create_dir_all ( & output_path) . await ?;
307
336
let mut qwk_package = output_path. join ( "mail.qwk" ) ;
337
+ let ( _number_to_msgid, msgid_to_number) = self . get_number_to_msgid ( ) . await ;
308
338
309
339
{
310
340
let board = self . board . lock ( ) . await ;
@@ -355,7 +385,6 @@ impl IcyBoardState {
355
385
}
356
386
357
387
let conferences = board. conferences . clone ( ) ;
358
- let mut conference_number = 1 ;
359
388
let mut msg_writer = format ! ( "Produced by Icy Board {}" , env!( "CARGO_PKG_VERSION" ) ) . bytes ( ) . collect :: < Vec < u8 > > ( ) ;
360
389
msg_writer. resize ( 128 , b' ' ) ;
361
390
@@ -372,10 +401,14 @@ impl IcyBoardState {
372
401
if !ptr. include_qwk {
373
402
continue ;
374
403
}
375
- let number = control_dat . conferences . len ( ) as u16 + 1 ;
404
+ let conference_number = * msgid_to_number . get ( & ( i , j ) ) . unwrap ( ) ;
376
405
control_dat. conferences . push ( jamjam:: qwk:: control:: Conference {
377
- number,
378
- name : area. name . clone ( ) . into ( ) ,
406
+ number : conference_number,
407
+ name : if area. qwk_name . is_empty ( ) {
408
+ area. name . clone ( ) . into ( )
409
+ } else {
410
+ area. qwk_name . clone ( ) . into ( )
411
+ } ,
379
412
} ) ;
380
413
381
414
let is_extended = true ;
@@ -419,7 +452,6 @@ impl IcyBoardState {
419
452
log:: error!( "Creating new message index at {}" , message_base_file. display( ) ) ;
420
453
}
421
454
}
422
- conference_number += 1 ;
423
455
}
424
456
}
425
457
}
@@ -484,7 +516,7 @@ impl IcyBoardState {
484
516
self . display_text ( IceText :: TransferSuccessful , display_flags:: NEWLINE | display_flags:: LFBEFORE )
485
517
. await ?;
486
518
487
- for ( x , path) in state. recieve_state . finished_files {
519
+ for ( _x , path) in state. recieve_state . finished_files {
488
520
self . display_text ( IceText :: ExtractingMessages , display_flags:: NEWLINE | display_flags:: LFBEFORE )
489
521
. await ?;
490
522
0 commit comments