Track peeked state only on explicit selection

This commit is contained in:
TheGeneralist 2026-02-15 20:50:42 +01:00
parent 2ef848ffb8
commit 18bc0bd57f
Signed by: thegeneralist01
SSH key fingerprint: SHA256:pp9qddbCNmVNoSjevdvQvM5z0DHN7LTa8qBMbcMq/R4

View file

@ -940,14 +940,12 @@ async fn handle_search_command(
}; };
let peeked_snapshot = state.peeked.lock().await.clone(); let peeked_snapshot = state.peeked.lock().await.clone();
let displayed_indices = displayed_indices_for_view(&session, &peeked_snapshot);
let (text, kb) = render_list_view(&session_id, &session, &peeked_snapshot); let (text, kb) = render_list_view(&session_id, &session, &peeked_snapshot);
let sent = bot let sent = bot
.send_message(msg.chat.id, text) .send_message(msg.chat.id, text)
.reply_markup(kb) .reply_markup(kb)
.await?; .await?;
session.message_id = Some(sent.id); session.message_id = Some(sent.id);
mark_displayed_entries_as_peeked(&state, &session, &displayed_indices).await;
state state
.sessions .sessions
.lock() .lock()
@ -1830,7 +1828,6 @@ async fn handle_finish_title_response(
} }
let peeked_snapshot = state.peeked.lock().await.clone(); let peeked_snapshot = state.peeked.lock().await.clone();
let displayed_indices = displayed_indices_for_view(&session, &peeked_snapshot);
let (text, kb) = render_list_view(&session.id, &session, &peeked_snapshot); let (text, kb) = render_list_view(&session.id, &session, &peeked_snapshot);
if let Some(list_message_id) = session.message_id { if let Some(list_message_id) = session.message_id {
bot.edit_message_text(chat_id, list_message_id, text) bot.edit_message_text(chat_id, list_message_id, text)
@ -1840,8 +1837,6 @@ async fn handle_finish_title_response(
let sent = bot.send_message(chat_id, text).reply_markup(kb).await?; let sent = bot.send_message(chat_id, text).reply_markup(kb).await?;
session.message_id = Some(sent.id); session.message_id = Some(sent.id);
} }
mark_displayed_entries_as_peeked(state, &session, &displayed_indices).await;
state state
.sessions .sessions
.lock() .lock()
@ -1982,13 +1977,19 @@ async fn handle_list_callback(
// Stay in place. // Stay in place.
session.view = ListView::Menu; session.view = ListView::Menu;
} else { } else {
let mut rng = rand::thread_rng(); let index = {
remaining.shuffle(&mut rng); let mut rng = rand::thread_rng();
if let Some(index) = remaining.first().copied() { remaining.shuffle(&mut rng);
session.seen_random.insert(index); remaining.first().copied()
let return_to = Box::new(session.view.clone()); };
session.view = ListView::Selected { return_to, index }; if let Some(index) = index {
} session.seen_random.insert(index);
let return_to = Box::new(session.view.clone());
session.view = ListView::Selected { return_to, index };
if let Some(entry) = session.entries.get(index) {
state.peeked.lock().await.insert(entry.block_string());
}
}
} }
} }
} }
@ -2007,6 +2008,11 @@ async fn handle_list_callback(
return_to, return_to,
index: entry_index, index: entry_index,
}; };
if matches!(&session.kind, SessionKind::List) {
if let Some(entry) = session.entries.get(entry_index) {
state.peeked.lock().await.insert(entry.block_string());
}
}
} }
} }
} }
@ -2209,7 +2215,6 @@ async fn handle_list_callback(
} }
session.message_id = Some(message.id); session.message_id = Some(message.id);
let displayed_indices = displayed_indices_for_view(&session, &peeked_snapshot);
let (text, kb) = render_list_view(&session.id, &session, &peeked_snapshot); let (text, kb) = render_list_view(&session.id, &session, &peeked_snapshot);
let session_clone = session.clone(); let session_clone = session.clone();
state state
@ -2225,7 +2230,6 @@ async fn handle_list_callback(
bot.edit_message_text(message.chat.id, message.id, text) bot.edit_message_text(message.chat.id, message.id, text)
.reply_markup(kb) .reply_markup(kb)
.await?; .await?;
mark_displayed_entries_as_peeked(&state, &session_clone, &displayed_indices).await;
if let Err(err) = send_embedded_media_for_selected(&bot, message.chat.id, &state, &session_clone).await { if let Err(err) = send_embedded_media_for_selected(&bot, message.chat.id, &state, &session_clone).await {
error!("send embedded media failed: {:#}", err); error!("send embedded media failed: {:#}", err);
} }
@ -3247,6 +3251,7 @@ fn matches_query(entry: &EntryBlock, query: &str) -> bool {
.all(|term| haystack.contains(term)) .all(|term| haystack.contains(term))
} }
#[cfg(test)]
fn displayed_indices_for_view( fn displayed_indices_for_view(
session: &ListSession, session: &ListSession,
peeked: &HashSet<String>, peeked: &HashSet<String>,
@ -3259,23 +3264,6 @@ fn displayed_indices_for_view(
} }
} }
async fn mark_displayed_entries_as_peeked(
state: &std::sync::Arc<AppState>,
session: &ListSession,
displayed_indices: &[usize],
) {
if displayed_indices.is_empty() || !matches!(&session.kind, SessionKind::List) {
return;
}
let mut peeked = state.peeked.lock().await;
for idx in displayed_indices {
if let Some(entry) = session.entries.get(*idx) {
peeked.insert(entry.block_string());
}
}
}
fn norm_target_index(session: &ListSession, peeked: &HashSet<String>) -> Option<usize> { fn norm_target_index(session: &ListSession, peeked: &HashSet<String>) -> Option<usize> {
match &session.view { match &session.view {
ListView::Selected { index, .. } => Some(*index), ListView::Selected { index, .. } => Some(*index),