Skip to content

Commit cfa6d95

Browse files
committed
Added message area options to change qwk settings.
1 parent 2e6083e commit cfa6d95

File tree

6 files changed

+95
-26
lines changed

6 files changed

+95
-26
lines changed

crates/icbsetup/src/editors/areas.rs

+17
Original file line numberDiff line numberDiff line change
@@ -227,6 +227,13 @@ impl<'a> Page for MessageAreasEditor<'a> {
227227
list.lock().unwrap()[*i].name = value;
228228
}),
229229
),
230+
ConfigEntry::Item(
231+
ListItem::new(get_text("area_editor_qwk_name"), ListValue::Text(25, item.qwk_name.to_string()))
232+
.with_label_width(16)
233+
.with_update_text_value(&|(i, list): &(usize, Arc<Mutex<AreaList>>), value: String| {
234+
list.lock().unwrap()[*i].qwk_name = value;
235+
}),
236+
),
230237
ConfigEntry::Item(
231238
ListItem::new(get_text("area_editor_file"), ListValue::Path(item.path.clone()))
232239
.with_label_width(16)
@@ -284,6 +291,16 @@ impl<'a> Page for MessageAreasEditor<'a> {
284291
},
285292
),
286293
),
294+
ConfigEntry::Item(
295+
ListItem::new(
296+
get_text("area_editor_qwk_number"),
297+
ListValue::U32(item.qwk_conference_number as u32, 0, u16::MAX as u32),
298+
)
299+
.with_label_width(16)
300+
.with_update_text_value(&|(i, list): &(usize, Arc<Mutex<AreaList>>), value: String| {
301+
list.lock().unwrap()[*i].qwk_name = value;
302+
}),
303+
),
287304
],
288305
});
289306
} else {

crates/icy_board_engine/src/icy_board/conferences.rs

+2
Original file line numberDiff line numberDiff line change
@@ -267,6 +267,8 @@ impl ConferenceBase {
267267
let general_area: MessageArea = MessageArea {
268268
name: "General".to_string(),
269269
path: PathBuf::from(&c.message_file),
270+
qwk_name: "General".to_string(),
271+
qwk_conference_number: 0,
270272
is_read_only: d.read_only,
271273
allow_aliases: d.allow_aliases,
272274
req_level_to_list: SecurityExpression::from_req_security(d.req_level_to_enter),

crates/icy_board_engine/src/icy_board/message_area.rs

+10
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@ use serde_with::{DisplayFromStr, serde_as};
1111
use crate::{
1212
compiler::user_data::{UserData, UserDataMemberRegistry, UserDataValue},
1313
executable::{VariableType, VariableValue},
14+
icy_board::is_null_16,
1415
};
1516

1617
use super::{IcyBoardSerializer, security_expr::SecurityExpression};
@@ -19,6 +20,15 @@ use super::{IcyBoardSerializer, security_expr::SecurityExpression};
1920
#[derive(Default, Clone, Serialize, Deserialize, PartialEq)]
2021
pub struct MessageArea {
2122
pub name: String,
23+
24+
#[serde(default)]
25+
#[serde(skip_serializing_if = "String::is_empty")]
26+
pub qwk_name: String,
27+
28+
#[serde(default)]
29+
#[serde(skip_serializing_if = "is_null_16")]
30+
pub qwk_conference_number: u16,
31+
2232
pub path: PathBuf,
2333
pub is_read_only: bool,
2434
pub allow_aliases: bool,

crates/icy_board_engine/src/icy_board/state/user_commands/pcb/qwk.rs

+54-22
Original file line numberDiff line numberDiff line change
@@ -31,8 +31,8 @@ use super::u_upload_file::create_protocol;
3131
const MASK_CONFNUMBERS: &str = "0123456789-SDL?";
3232

3333
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));
3636
let input = self
3737
.input_field(
3838
IceText::SelectArea,
@@ -44,10 +44,10 @@ impl IcyBoardState {
4444
)
4545
.await?;
4646

47-
let Ok(number) = input.parse::<usize>() else {
47+
let Ok(number) = input.parse::<u16>() else {
4848
return Ok(());
4949
};
50-
let Some((conf_num, area_num)) = table.get(number) else {
50+
let Some((conf_num, area_num)) = table.get(&number) else {
5151
return Ok(());
5252
};
5353
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 {
119119
Ok(())
120120
}
121121

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+
122158
async fn select_qwk_areas(&mut self) -> Res<()> {
123159
let divider = "-".repeat(79);
124160
let num_lines = if self.session.page_len < 4 || self.session.page_len > 50 {
@@ -129,14 +165,7 @@ impl IcyBoardState {
129165
let mut done = false;
130166

131167
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;
140169

141170
while !done {
142171
if self.session.tokens.is_empty() {
@@ -145,7 +174,7 @@ impl IcyBoardState {
145174
for (i, conf) in conferences.iter().enumerate() {
146175
if let Some(areas) = &conf.areas {
147176
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?;
149178
line_number += 1;
150179
}
151180
}
@@ -236,7 +265,7 @@ impl IcyBoardState {
236265
Ok(())
237266
}
238267

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<()> {
240269
self.reset_color(TerminalTarget::Both).await?;
241270

242271
let str = format!("{:5}{}", area_number, ' ');
@@ -273,10 +302,10 @@ impl IcyBoardState {
273302
Ok(())
274303
}
275304

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<()> {
277306
if let Some(user) = &mut self.session.current_user {
278307
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)) {
280309
user.lastread_ptr_flags
281310
.entry((*conference, *num))
282311
.or_insert_with(|| LastReadStatus {
@@ -305,6 +334,7 @@ impl IcyBoardState {
305334
let output_path = temp_file::empty().path().to_path_buf();
306335
fs::create_dir_all(&output_path).await?;
307336
let mut qwk_package = output_path.join("mail.qwk");
337+
let (_number_to_msgid, msgid_to_number) = self.get_number_to_msgid().await;
308338

309339
{
310340
let board = self.board.lock().await;
@@ -355,7 +385,6 @@ impl IcyBoardState {
355385
}
356386

357387
let conferences = board.conferences.clone();
358-
let mut conference_number = 1;
359388
let mut msg_writer = format!("Produced by Icy Board {}", env!("CARGO_PKG_VERSION")).bytes().collect::<Vec<u8>>();
360389
msg_writer.resize(128, b' ');
361390

@@ -372,10 +401,14 @@ impl IcyBoardState {
372401
if !ptr.include_qwk {
373402
continue;
374403
}
375-
let number = control_dat.conferences.len() as u16 + 1;
404+
let conference_number = *msgid_to_number.get(&(i, j)).unwrap();
376405
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+
},
379412
});
380413

381414
let is_extended = true;
@@ -419,7 +452,6 @@ impl IcyBoardState {
419452
log::error!("Creating new message index at {}", message_base_file.display());
420453
}
421454
}
422-
conference_number += 1;
423455
}
424456
}
425457
}
@@ -484,7 +516,7 @@ impl IcyBoardState {
484516
self.display_text(IceText::TransferSuccessful, display_flags::NEWLINE | display_flags::LFBEFORE)
485517
.await?;
486518

487-
for (x, path) in state.recieve_state.finished_files {
519+
for (_x, path) in state.recieve_state.finished_files {
488520
self.display_text(IceText::ExtractingMessages, display_flags::NEWLINE | display_flags::LFBEFORE)
489521
.await?;
490522

crates/icy_board_tui/i18n/en/icy_board_tui.ftl

+11
Original file line numberDiff line numberDiff line change
@@ -1631,6 +1631,11 @@ area_editor_name=Name
16311631
area_editor_name-status=Name
16321632
area_editor_name-help=TODO
16331633
1634+
area_editor_qwk_name=QWK Name
1635+
area_editor_qwk_name-status=QWK Name (BLANK=Use Name)
1636+
area_editor_qwk_name-help=
1637+
Area name as it appears in QWK packets.
1638+
16341639
area_editor_file=File
16351640
area_editor_file-status=File
16361641
area_editor_file-help=TODO
@@ -1655,6 +1660,12 @@ area_editor_attach_sec=Attach Security
16551660
area_editor_attach_sec-status=Attach Security
16561661
area_editor_attach_sec-help=TODO
16571662
1663+
area_editor_qwk_number=QWK Number
1664+
area_editor_qwk_number-status=QWK Number (=0 automatic)
1665+
area_editor_qwk_number-help=
1666+
Area number as it appears in QWK packets. This allows to use fixed numbers for QWK packets.
1667+
This is useful for beeing able to add/remove areas without changing the QWK numbers.
1668+
16581669
doors_editor_title=DOORS File Editor { $conference }
16591670
doors_editor_edit_title=Edit Door
16601671
doors_editor_key_help=↑ Up ↓ Down Tab Edit Doors ␛ Back

crates/jamjam/src/qwk/qwk_message.rs

+1-4
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,7 @@
11
use bstr::{BString, ByteSlice};
22

33
use crate::{pcboard::PCB_TXT_EOL_PTR, qwk::QwkError};
4-
use std::{
5-
fs::File,
6-
io::{BufReader, Read, Write},
7-
};
4+
use std::io::{Read, Write};
85

96
pub enum MessageType {
107
Public,

0 commit comments

Comments
 (0)