bhcli

"Strange's fork of n0tr1v's bhcli (onion)"
git clone https://git.dasho.dev/Strange/bhcli.git
Log | Files | Refs | README

commit a9ea0b6e2c9e6f66ce420b6ebff68bfbe3299e85
parent b606ee17b2d7602e6a013a670efbce4424589324
Author: n0tr1v <n0tr1v@protonmail.com>
Date:   Thu, 30 Mar 2023 22:50:16 -0700

cleanup

Diffstat:
Msrc/main.rs | 393++++++++++++++++++++++++++++++++++++++++++++-----------------------------------
1 file changed, 218 insertions(+), 175 deletions(-)

diff --git a/src/main.rs b/src/main.rs @@ -1078,199 +1078,242 @@ impl LeChatPHPClient { Ok(()) } - fn handle_normal_mode_key_event( - &mut self, - app: &mut App, - key_event: KeyEvent, - messages: &Arc<Mutex<Vec<Message>>>, - ) -> std::result::Result<(), ExitSignal> { - match key_event { - KeyEvent { code: KeyCode::Char('/'), modifiers: KeyModifiers::NONE, .. } => { - app.items.unselect(); - app.input = "/".to_owned(); - app.input_idx = app.input.width(); - app.input_mode = InputMode::Editing; - } - KeyEvent { code: KeyCode::Char('j'), modifiers: KeyModifiers::NONE, .. } - | KeyEvent { code: KeyCode::Down, modifiers: KeyModifiers::NONE, .. } => { - app.items.next(); - } - KeyEvent { code: KeyCode::Char('k'), modifiers: KeyModifiers::NONE, .. } - | KeyEvent { code: KeyCode::Up, modifiers: KeyModifiers::NONE, .. } => { - app.items.previous(); - } - KeyEvent { code: KeyCode::Enter, modifiers: KeyModifiers::NONE, .. } => { - if let Some(idx) = app.items.state.selected() { - if let Some(item) = app.items.items.get(idx) { - app.long_message = Some(item.clone()); - app.input_mode = InputMode::LongMessage; - } - } - } - KeyEvent { code: KeyCode::Backspace, modifiers: KeyModifiers::NONE, .. } => { - if let Some(idx) = app.items.state.selected() { - if let Some(item) = app.items.items.get(idx) { - let mut messages = messages.lock().unwrap(); - if let Some(pos) = messages - .iter() - .position(|m| m.date == item.date && m.text.text() == item.text.text()) - { - if item.deleted { - messages.remove(pos); - } else { - messages[pos].hide = !messages[pos].hide; - } - } - } - } - } - KeyEvent { code: KeyCode::Char('y'), modifiers: KeyModifiers::NONE, .. } - | KeyEvent { code: KeyCode::Char('c'), modifiers: KeyModifiers::CONTROL, .. } => { - if let Some(idx) = app.items.state.selected() { - if let Some(item) = app.items.items.get(idx) { - if let Some(upload_link) = &item.upload_link { - let mut ctx: ClipboardContext = ClipboardProvider::new().unwrap(); - let mut out = format!("{}{}", self.config.url, upload_link); - if let Some((_, _, msg)) = - get_message(&item.text, &self.config.members_tag) - { - out = format!("{} {}", msg, out); - } - ctx.set_contents(out).unwrap(); - } else if let Some((_, _, msg)) = - get_message(&item.text, &self.config.members_tag) - { - let mut ctx: ClipboardContext = ClipboardProvider::new().unwrap(); - ctx.set_contents(msg).unwrap(); - } - } - } + fn handle_normal_mode_key_event_up(&mut self, app: &mut App) { + app.items.previous() + } + + fn handle_normal_mode_key_event_down(&mut self, app: &mut App) { + app.items.next() + } + + fn handle_normal_mode_key_event_slash(&mut self, app: &mut App) { + app.items.unselect(); + app.input = "/".to_owned(); + app.input_idx = app.input.width(); + app.input_mode = InputMode::Editing; + } + + fn handle_normal_mode_key_event_enter(&mut self, app: &mut App) { + if let Some(idx) = app.items.state.selected() { + if let Some(item) = app.items.items.get(idx) { + app.long_message = Some(item.clone()); + app.input_mode = InputMode::LongMessage; } - KeyEvent { code: KeyCode::Char('Y'), modifiers: KeyModifiers::SHIFT, .. } => { - if let Some(idx) = app.items.state.selected() { - if let Some(item) = app.items.items.get(idx) { - if let Some(upload_link) = &item.upload_link { - let mut ctx: ClipboardContext = ClipboardProvider::new().unwrap(); - let out = format!("{}{}", self.config.url, upload_link); - ctx.set_contents(out).unwrap(); - } else if let Some((_, _, msg)) = - get_message(&item.text, &self.config.members_tag) - { - let finder = LinkFinder::new(); - let links: Vec<_> = finder.links(msg.as_str()).collect(); - if let Some(link) = links.get(0) { - let mut ctx: ClipboardContext = ClipboardProvider::new().unwrap(); - ctx.set_contents(link.as_str().to_owned()).unwrap(); - } - } + } + } + + fn handle_normal_mode_key_event_backspace(&mut self, app: &mut App, messages: &Arc<Mutex<Vec<Message>>>) { + if let Some(idx) = app.items.state.selected() { + if let Some(item) = app.items.items.get(idx) { + let mut messages = messages.lock().unwrap(); + if let Some(pos) = messages.iter().position(|m| m.date == item.date && m.text.text() == item.text.text()) { + if item.deleted { + messages.remove(pos); + } else { + messages[pos].hide = !messages[pos].hide; } } } - KeyEvent { code: KeyCode::Char('d'), modifiers: KeyModifiers::NONE, .. } => { - if let Some(idx) = app.items.state.selected() { - if let Some(item) = app.items.items.get(idx) { - eprintln!("{:?}", item.text.text()); + } + } + + fn handle_normal_mode_key_event_yank(&mut self, app: &mut App) { + if let Some(idx) = app.items.state.selected() { + if let Some(item) = app.items.items.get(idx) { + if let Some(upload_link) = &item.upload_link { + let mut ctx: ClipboardContext = ClipboardProvider::new().unwrap(); + let mut out = format!("{}{}", self.config.url, upload_link); + if let Some((_, _, msg)) = + get_message(&item.text, &self.config.members_tag) + { + out = format!("{} {}", msg, out); } + ctx.set_contents(out).unwrap(); + } else if let Some((_, _, msg)) = + get_message(&item.text, &self.config.members_tag) + { + let mut ctx: ClipboardContext = ClipboardProvider::new().unwrap(); + ctx.set_contents(msg).unwrap(); } } - KeyEvent { code: KeyCode::Char('D'), modifiers: KeyModifiers::SHIFT, .. } => { - if let Some(idx) = app.items.state.selected() { - if let Some(item) = app.items.items.get(idx) { - eprintln!("{:?} {:?}", item.text, item.upload_link); + } + } + + fn handle_normal_mode_key_event_yank_link(&mut self, app: &mut App) { + if let Some(idx) = app.items.state.selected() { + if let Some(item) = app.items.items.get(idx) { + if let Some(upload_link) = &item.upload_link { + let mut ctx: ClipboardContext = ClipboardProvider::new().unwrap(); + let out = format!("{}{}", self.config.url, upload_link); + ctx.set_contents(out).unwrap(); + } else if let Some((_, _, msg)) = + get_message(&item.text, &self.config.members_tag) + { + let finder = LinkFinder::new(); + let links: Vec<_> = finder.links(msg.as_str()).collect(); + if let Some(link) = links.get(0) { + let mut ctx: ClipboardContext = ClipboardProvider::new().unwrap(); + ctx.set_contents(link.as_str().to_owned()).unwrap(); } } } - KeyEvent { code: KeyCode::Char('m'), modifiers: KeyModifiers::NONE, .. } => { - let mut is_muted = self.is_muted.lock().unwrap(); - *is_muted = !*is_muted; - } - KeyEvent { code: KeyCode::Char('M'), modifiers: KeyModifiers::SHIFT, .. } => { - self.show_sys = !self.show_sys; - } - KeyEvent { code: KeyCode::Char('G'), modifiers: KeyModifiers::SHIFT, .. } => { - self.display_guest_view = !self.display_guest_view; + } + } + + fn handle_normal_mode_key_event_debug(&mut self, app: &mut App) { + if let Some(idx) = app.items.state.selected() { + if let Some(item) = app.items.items.get(idx) { + eprintln!("{:?}", item.text.text()); } - KeyEvent { code: KeyCode::Char('H'), modifiers: KeyModifiers::SHIFT, .. } => { - self.display_hidden_msgs = !self.display_hidden_msgs; + } + } + + fn handle_normal_mode_key_event_debug2(&mut self, app: &mut App) { + if let Some(idx) = app.items.state.selected() { + if let Some(item) = app.items.items.get(idx) { + eprintln!("{:?} {:?}", item.text, item.upload_link); } - KeyEvent { code: KeyCode::Char('i'), modifiers: KeyModifiers::NONE, .. } => { + } + } + + fn handle_normal_mode_key_event_toggle_mute(&mut self) { + let mut is_muted = self.is_muted.lock().unwrap(); + *is_muted = !*is_muted; + } + + fn handle_normal_mode_key_event_toggle_sys(&mut self) { + self.show_sys = !self.show_sys; + } + + fn handle_normal_mode_key_event_toggle_guest_view(&mut self) { + self.display_guest_view = !self.display_guest_view; + } + + fn handle_normal_mode_key_event_toggle_hidden(&mut self) { + self.display_hidden_msgs = !self.display_hidden_msgs; + } + + fn handle_normal_mode_key_event_input_mode(&mut self, app: &mut App) { + app.input_mode = InputMode::Editing; + app.items.unselect(); + } + + fn handle_normal_mode_key_event_logout(&mut self) -> std::result::Result<(), ExitSignal> { + self.logout().unwrap(); + return Err(ExitSignal::Terminate); + } + + fn handle_normal_mode_key_event_exit(&mut self) -> std::result::Result<(), ExitSignal> { + return Err(ExitSignal::Terminate); + } + + fn handle_normal_mode_key_event_tag(&mut self, app: &mut App) { + if let Some(idx) = app.items.state.selected() { + if let Some(username) = get_username( + &self.base_client.username, + &app.items.items.get(idx).unwrap().text, + &self.config.members_tag, + ) { + app.input = format!("@{} ", username); + app.input_idx = app.input.width(); app.input_mode = InputMode::Editing; app.items.unselect(); } - KeyEvent { code: KeyCode::Char('Q'), modifiers: KeyModifiers::SHIFT, .. } => { - self.logout().unwrap(); - return Err(ExitSignal::Terminate); - } - KeyEvent { code: KeyCode::Char('q'), modifiers: KeyModifiers::NONE, .. } => { - return Err(ExitSignal::Terminate); - } - KeyEvent { code: KeyCode::Char('t'), modifiers: KeyModifiers::NONE, .. } => { - if let Some(idx) = app.items.state.selected() { - if let Some(username) = get_username( - &self.base_client.username, - &app.items.items.get(idx).unwrap().text, - &self.config.members_tag, - ) { - app.input = format!("@{} ", username); - app.input_idx = app.input.width(); - app.input_mode = InputMode::Editing; - app.items.unselect(); - } - } - } - KeyEvent { code: KeyCode::Char('p'), modifiers: KeyModifiers::NONE, .. } => { - if let Some(idx) = app.items.state.selected() { - if let Some(username) = get_username( - &self.base_client.username, - &app.items.items.get(idx).unwrap().text, - &self.config.members_tag, - ) { - app.input = format!("/pm {} ", username); - app.input_idx = app.input.width(); - app.input_mode = InputMode::Editing; - app.items.unselect(); - } - } - } - KeyEvent { code: KeyCode::Char('k'), modifiers: KeyModifiers::CONTROL, .. } => { - if let Some(idx) = app.items.state.selected() { - if let Some(username) = get_username( - &self.base_client.username, - &app.items.items.get(idx).unwrap().text, - &self.config.members_tag, - ) { - app.input = format!("/kick {} ", username); - app.input_idx = app.input.width(); - app.input_mode = InputMode::Editing; - app.items.unselect(); - } - } - } - KeyEvent { code: KeyCode::Char('u'), modifiers: KeyModifiers::CONTROL, .. } - | KeyEvent { code: KeyCode::PageUp, modifiers: KeyModifiers::NONE, .. } => { - if let Some(idx) = app.items.state.selected() { - app.items.state.select(idx.checked_sub(10).or(Some(0))); - } else { - app.items.next(); - } - } - KeyEvent { code: KeyCode::Char('d'), modifiers: KeyModifiers::CONTROL, .. } - | KeyEvent { code: KeyCode::PageDown, modifiers: KeyModifiers::NONE, .. } => { - if let Some(idx) = app.items.state.selected() { - let wanted_idx = idx + 10; - let max_idx = app.items.items.len() - 1; - let new_idx = std::cmp::min(wanted_idx, max_idx); - app.items.state.select(Some(new_idx)); - } else { - app.items.next(); - } - } - KeyEvent { code: KeyCode::Esc, modifiers: KeyModifiers::NONE, .. } => { + } + } + + fn handle_normal_mode_key_event_pm(&mut self, app: &mut App) { + if let Some(idx) = app.items.state.selected() { + if let Some(username) = get_username( + &self.base_client.username, + &app.items.items.get(idx).unwrap().text, + &self.config.members_tag, + ) { + app.input = format!("/pm {} ", username); + app.input_idx = app.input.width(); + app.input_mode = InputMode::Editing; app.items.unselect(); } - KeyEvent { code: KeyCode::Char('u'), modifiers: KeyModifiers::SHIFT, .. } => { - app.items.state.select(Some(0)); + } + } + + fn handle_normal_mode_key_event_kick(&mut self, app: &mut App) { + if let Some(idx) = app.items.state.selected() { + if let Some(username) = get_username( + &self.base_client.username, + &app.items.items.get(idx).unwrap().text, + &self.config.members_tag, + ) { + app.input = format!("/kick {} ", username); + app.input_idx = app.input.width(); + app.input_mode = InputMode::Editing; + app.items.unselect(); } + } + } + + fn handle_normal_mode_key_event_page_up(&mut self, app: &mut App) { + if let Some(idx) = app.items.state.selected() { + app.items.state.select(idx.checked_sub(10).or(Some(0))); + } else { + app.items.next(); + } + } + + fn handle_normal_mode_key_event_page_down(&mut self, app: &mut App) { + if let Some(idx) = app.items.state.selected() { + let wanted_idx = idx + 10; + let max_idx = app.items.items.len() - 1; + let new_idx = std::cmp::min(wanted_idx, max_idx); + app.items.state.select(Some(new_idx)); + } else { + app.items.next(); + } + } + + fn handle_normal_mode_key_event_esc(&mut self, app: &mut App) { + app.items.unselect(); + } + + fn handle_normal_mode_key_event_shift_u(&mut self, app: &mut App) { + app.items.state.select(Some(0)); + } + + fn handle_normal_mode_key_event( + &mut self, + app: &mut App, + key_event: KeyEvent, + messages: &Arc<Mutex<Vec<Message>>>, + ) -> std::result::Result<(), ExitSignal> { + match key_event { + KeyEvent { code: KeyCode::Char('/'), modifiers: KeyModifiers::NONE, .. } => self.handle_normal_mode_key_event_slash(app), + KeyEvent { code: KeyCode::Char('j'), modifiers: KeyModifiers::NONE, .. } | + KeyEvent { code: KeyCode::Down, modifiers: KeyModifiers::NONE, .. } => self.handle_normal_mode_key_event_down(app), + KeyEvent { code: KeyCode::Char('k'), modifiers: KeyModifiers::NONE, .. } | + KeyEvent { code: KeyCode::Up, modifiers: KeyModifiers::NONE, .. } => self.handle_normal_mode_key_event_up(app), + KeyEvent { code: KeyCode::Enter, modifiers: KeyModifiers::NONE, .. } => self.handle_normal_mode_key_event_enter(app), + KeyEvent { code: KeyCode::Backspace, modifiers: KeyModifiers::NONE, .. } => self.handle_normal_mode_key_event_backspace(app, messages), + KeyEvent { code: KeyCode::Char('y'), modifiers: KeyModifiers::NONE, .. } | + KeyEvent { code: KeyCode::Char('c'), modifiers: KeyModifiers::CONTROL, .. } => self.handle_normal_mode_key_event_yank(app), + KeyEvent { code: KeyCode::Char('Y'), modifiers: KeyModifiers::SHIFT, .. } => self.handle_normal_mode_key_event_yank_link(app), + KeyEvent { code: KeyCode::Char('d'), modifiers: KeyModifiers::NONE, .. } => self.handle_normal_mode_key_event_debug(app), + KeyEvent { code: KeyCode::Char('D'), modifiers: KeyModifiers::SHIFT, .. } => self.handle_normal_mode_key_event_debug2(app), + KeyEvent { code: KeyCode::Char('m'), modifiers: KeyModifiers::NONE, .. } => self.handle_normal_mode_key_event_toggle_mute(), + KeyEvent { code: KeyCode::Char('M'), modifiers: KeyModifiers::SHIFT, .. } => self.handle_normal_mode_key_event_toggle_sys(), + KeyEvent { code: KeyCode::Char('G'), modifiers: KeyModifiers::SHIFT, .. } => self.handle_normal_mode_key_event_toggle_guest_view(), + KeyEvent { code: KeyCode::Char('H'), modifiers: KeyModifiers::SHIFT, .. } => self.handle_normal_mode_key_event_toggle_hidden(), + KeyEvent { code: KeyCode::Char('i'), modifiers: KeyModifiers::NONE, .. } => self.handle_normal_mode_key_event_input_mode(app), + KeyEvent { code: KeyCode::Char('Q'), modifiers: KeyModifiers::SHIFT, .. } => self.handle_normal_mode_key_event_logout()?, + KeyEvent { code: KeyCode::Char('q'), modifiers: KeyModifiers::NONE, .. } => self.handle_normal_mode_key_event_exit()?, + KeyEvent { code: KeyCode::Char('t'), modifiers: KeyModifiers::NONE, .. } => self.handle_normal_mode_key_event_tag(app), + KeyEvent { code: KeyCode::Char('p'), modifiers: KeyModifiers::NONE, .. } => self.handle_normal_mode_key_event_pm(app), + KeyEvent { code: KeyCode::Char('k'), modifiers: KeyModifiers::CONTROL, .. } => self.handle_normal_mode_key_event_kick(app), + KeyEvent { code: KeyCode::Char('u'), modifiers: KeyModifiers::CONTROL, .. } | + KeyEvent { code: KeyCode::PageUp, modifiers: KeyModifiers::NONE, .. } => self.handle_normal_mode_key_event_page_up(app), + KeyEvent { code: KeyCode::Char('d'), modifiers: KeyModifiers::CONTROL, .. } | + KeyEvent { code: KeyCode::PageDown, modifiers: KeyModifiers::NONE, .. } => self.handle_normal_mode_key_event_page_down(app), + KeyEvent { code: KeyCode::Esc, modifiers: KeyModifiers::NONE, .. } => self.handle_normal_mode_key_event_esc(app), + KeyEvent { code: KeyCode::Char('u'), modifiers: KeyModifiers::SHIFT, .. } => self.handle_normal_mode_key_event_shift_u(app), _ => {} } Ok(())