Skip to content

Commit 5286c18

Browse files
committed
Implemented ReadMemorized command.
1 parent 89f4923 commit 5286c18

File tree

8 files changed

+149
-54
lines changed

8 files changed

+149
-54
lines changed

crates/icy_board_engine/src/icy_board/commands.rs

+5-3
Original file line numberDiff line numberDiff line change
@@ -251,7 +251,7 @@ pub enum CommandType {
251251
BatchUpload,
252252

253253
/// RM command
254-
ReadMemorizedMessage,
254+
ReadMemorizedMessage(u8),
255255

256256
// 'AREA'
257257
ChangeMessageArea,
@@ -328,7 +328,7 @@ impl Display for CommandType {
328328
CommandType::BatchDownload => write!(f, "BatchDownload"),
329329
CommandType::BatchUpload => write!(f, "BatchUpload"),
330330
CommandType::ChangeMessageArea => write!(f, "MessageArea"),
331-
CommandType::ReadMemorizedMessage => write!(f, "ReadMemorizedMessage"),
331+
CommandType::ReadMemorizedMessage(_) => write!(f, "ReadMemorizedMessage"),
332332
CommandType::GotoXY => write!(f, "GotoXY"),
333333
CommandType::PrintText => write!(f, "PrintText"),
334334
CommandType::RefreshDisplayString => write!(f, "RefreshDisplayString"),
@@ -561,7 +561,9 @@ impl CommandType {
561561
CommandType::SelectConferences,
562562
CommandType::BatchDownload,
563563
CommandType::BatchUpload,
564-
CommandType::ReadMemorizedMessage,
564+
CommandType::ReadMemorizedMessage(0),
565+
CommandType::ReadMemorizedMessage(1),
566+
CommandType::ReadMemorizedMessage(2),
565567
]
566568
.into_iter()
567569
}

crates/icy_board_engine/src/icy_board/state/menu_runner.rs

+2-3
Original file line numberDiff line numberDiff line change
@@ -542,13 +542,12 @@ impl IcyBoardState {
542542
// BU
543543
self.batch_upload_command().await?;
544544
}
545-
CommandType::ReadMemorizedMessage => {
545+
CommandType::ReadMemorizedMessage(t) => {
546546
let sec = self.session.user_command_level.cmd_r.clone();
547547
if !self.check_sec("RM", &sec).await? {
548548
return Ok(());
549549
}
550-
// QWK
551-
self.read_memorized_messages_command().await?;
550+
self.read_memorized_messages_command(t).await?;
552551
}
553552
CommandType::ChangeMessageArea => {
554553
let sec: SecurityExpression = self.session.user_command_level.cmd_j.clone();

crates/icy_board_engine/src/icy_board/state/mod.rs

+3-1
Original file line numberDiff line numberDiff line change
@@ -814,7 +814,9 @@ impl IcyBoardState {
814814
"B" => convert_cmd(CommandType::BulletinList),
815815
"C" => convert_cmd(CommandType::CommentToSysop),
816816
"E" => convert_cmd(CommandType::EnterMessage),
817-
"RM" | "RM+" | "RM-" => convert_cmd(CommandType::ReadMemorizedMessage), // backward
817+
"RM" => convert_cmd(CommandType::ReadMemorizedMessage(0)),
818+
"RM+" => convert_cmd(CommandType::ReadMemorizedMessage(1)),
819+
"RM-" => convert_cmd(CommandType::ReadMemorizedMessage(2)),
818820
"F" => convert_cmd(CommandType::FileDirectory),
819821
"BD" => convert_cmd(CommandType::BatchDownload),
820822
"BU" => convert_cmd(CommandType::BatchUpload),

crates/icy_board_engine/src/icy_board/state/user_commands/mods/messagereader/mod.rs

+104-39
Original file line numberDiff line numberDiff line change
@@ -235,26 +235,78 @@ impl IcyBoardState {
235235
};
236236
self.session.op_text = format!("{}-{}", base_number, active_messages);
237237

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);
250253
}
251254

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+
}
256309
}
257-
self.read_message_number(&mut message_base, &viewer, number, Box::new(|_, _| true)).await?;
258310
}
259311
}
260312
Ok(())
@@ -264,14 +316,17 @@ impl IcyBoardState {
264316
&mut self,
265317
message_base: &mut JamMessageBase,
266318
viewer: &MessageViewer,
267-
mut number: u32,
319+
mut first: u32,
320+
mut last: u32,
321+
mut keep_going: bool,
268322
_filter: Box<dyn Fn(&JamMessageHeader, &str) -> bool>,
269323
) -> Res<()> {
324+
let mut number = first;
270325
if number == 0 {
271326
return Ok(());
272327
}
273328
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();
275330
self.session.high_msg_num = message_base.base_messagenumber() + message_base.active_messages();
276331

277332
unsafe {
@@ -287,33 +342,34 @@ impl IcyBoardState {
287342
message_base.write_last_read(opt)?;
288343
}
289344
let mut flag = ReadLoopType::InsideReadLoop;
290-
let mut first = number;
291-
let mut last = number;
292345
let mut since = false;
293-
let mut keep_going = false;
294-
346+
let mut display_msg = true;
295347
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 {
305362
viewer.display_body(self, &text).await?;
306363
}
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?;
309369
}
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?;
315370
}
316371
}
372+
317373
let prompt = if self.session.expert_mode() {
318374
IceText::EndOfMessageExpertmode
319375
} else {
@@ -412,6 +468,7 @@ impl IcyBoardState {
412468
}
413469
"/" => {
414470
// Redisplay
471+
display_msg = true;
415472
continue;
416473
}
417474
text => {
@@ -425,8 +482,16 @@ impl IcyBoardState {
425482
if keep_going {
426483
if last < number {
427484
number -= 1;
485+
486+
if number < self.session.low_msg_num {
487+
break;
488+
}
428489
} else if number > first {
429490
number += 1;
491+
492+
if number > self.session.high_msg_num {
493+
break;
494+
}
430495
}
431496
}
432497
}

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

+6-3
Original file line numberDiff line numberDiff line change
@@ -8,14 +8,17 @@ use crate::{Res, icy_board::state::IcyBoardState};
88

99
impl IcyBoardState {
1010
pub async fn read_messages(&mut self) -> Res<()> {
11+
self.read_messages_in_area(self.session.current_message_area).await?;
12+
Ok(())
13+
}
14+
15+
pub async fn read_messages_in_area(&mut self, msg_area: usize) -> Res<()> {
1116
self.set_activity(NodeStatus::HandlingMail).await;
1217
// loop for recreating the message base without async recursion problem.
1318
let mut tries = 0;
1419
while tries < 2 {
1520
tries += 1;
16-
let message_base_file = self.session.current_conference.areas.as_ref().unwrap()[self.session.current_message_area]
17-
.path
18-
.clone();
21+
let message_base_file = self.session.current_conference.areas.as_ref().unwrap()[msg_area].path.clone();
1922
match JamMessageBase::open(&message_base_file) {
2023
Ok(message_base) => {
2124
self.read_msgs_from_base(message_base, false).await?;
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,32 @@
1-
use crate::{Res, icy_board::state::IcyBoardState};
1+
use crate::{
2+
Res,
3+
icy_board::{
4+
icb_text::IceText,
5+
state::{IcyBoardState, functions::display_flags},
6+
},
7+
};
28

39
impl IcyBoardState {
4-
pub async fn read_memorized_messages_command(&mut self) -> Res<()> {
5-
// TODO
10+
pub async fn read_memorized_messages_command(&mut self, t: u8) -> Res<()> {
11+
let Some((area, _num)) = self.session.memorized_msg else {
12+
self.display_text(IceText::NotMemorized, display_flags::NEWLINE | display_flags::LFBEFORE)
13+
.await?;
14+
return Ok(());
15+
};
16+
17+
match t {
18+
1 => {
19+
self.session.push_tokens("RM+");
20+
}
21+
2 => {
22+
self.session.push_tokens("RM-");
23+
}
24+
_ => {
25+
self.session.push_tokens("RM+");
26+
}
27+
}
28+
self.read_messages_in_area(area).await?;
29+
630
Ok(())
731
}
832
}

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

+1-1
Original file line numberDiff line numberDiff line change
@@ -94,7 +94,7 @@ impl IcyBoardState {
9494
let viewer = MessageViewer::load(&self.display_text)?;
9595
match JamMessageBase::open(path) {
9696
Ok(mut message_base) => {
97-
self.read_message_number(&mut message_base, &viewer, 1, Box::new(|_, _| true)).await?;
97+
self.read_message_number(&mut message_base, &viewer, 1, 1, false, Box::new(|_, _| true)).await?;
9898
return Ok(());
9999
}
100100
Err(_err) => {

docs/feature_parity.md

+1-1
Original file line numberDiff line numberDiff line change
@@ -87,7 +87,7 @@ If something is missing just let me know.
8787
| CHAT | Group Chat| 0% | Note: There are working PPEs for that
8888
| BD/DB | Batch Download | 0% |
8989
| BU/UB | Batch Upload | 0% |
90-
| RM | Read Message | 0% | Read remembered message
90+
| RM | Read Message | 💯 | Read remembered message
9191
| SELECT | Select Conference | 99% | Changes were needed due to message areas [^1]
9292
| TEST | Test File | 💯 | Slight improvements - search for pattern
9393

0 commit comments

Comments
 (0)