From 70e0a1d0b45c1645235dcd39ae617cbe3a45d7a0 Mon Sep 17 00:00:00 2001 From: Tobias Reisinger Date: Mon, 15 Apr 2024 14:23:09 +0200 Subject: [PATCH] Fix events caused by yourself being shown --- Cargo.lock | 2 +- Cargo.toml | 2 +- src/command_utils/events.rs | 40 +++++++++++++++++++++++-------------- src/main.rs | 9 ++++++++- src/wrappers.rs | 2 +- 5 files changed, 36 insertions(+), 19 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index c66e204..c541dfd 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -182,7 +182,7 @@ dependencies = [ [[package]] name = "teamspeak-query-lib" -version = "0.1.4" +version = "0.1.5" dependencies = [ "clap", "serde", diff --git a/Cargo.toml b/Cargo.toml index abc17c0..78a7388 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "teamspeak-query-lib" -version = "0.1.4" +version = "0.1.5" edition = "2021" [dependencies] diff --git a/src/command_utils/events.rs b/src/command_utils/events.rs index 8e3e585..6689a3f 100644 --- a/src/command_utils/events.rs +++ b/src/command_utils/events.rs @@ -1,4 +1,5 @@ use telnet::Telnet; + use crate::{commands, wrappers}; use crate::models::{Client, Event, EventType}; use crate::response::Response; @@ -12,29 +13,38 @@ pub fn register_events(connection: &mut Telnet, events: Vec) -> Resul Ok(()) } -pub fn handle_event_response(connection: &mut Telnet, response: Response, known_clients: &mut Vec) { - if let Response::Event(event_type, params) = response { - - let event = Event::new(connection, event_type, params, known_clients); - match serde_json::to_string(&event) { - Ok(json) => println!("{}", json), - Err(err) => { - // TODO: Handle serialization error - eprintln!("Serialization error: {}", err); - } +pub fn handle_event_response(connection: &mut Telnet, event: Event, known_clients: &mut Vec) { + match serde_json::to_string(&event) { + Ok(json) => println!("{}", json), + Err(err) => { + // TODO: Handle serialization error + eprintln!("Serialization error: {}", err); } + } - if let Ok(new_clients) = wrappers::get_clients(connection) { - *known_clients = new_clients; - } + if let Ok(new_clients) = wrappers::get_clients(connection) { + *known_clients = new_clients; } } -pub fn loop_response_reader(connection: &mut Telnet) { +pub fn loop_response_reader(connection: &mut Telnet, self_clid: i32) { let mut known_clients = wrappers::get_clients(connection).unwrap_or_else(|_| Vec::new()); + loop { match commands::read_response(connection, true, String::new()) { - Ok(response) => handle_event_response(connection, response, &mut known_clients), + Ok(response) => { + if let Response::Event(event_type, params) = response { + let event = Event::new(connection, event_type, params, &known_clients); + + if let Some(client) = &event.client { + if client.clid == self_clid { + continue; + } + } + + handle_event_response(connection, event, &mut known_clients); + } + } Err(_) => { // print error? return; diff --git a/src/main.rs b/src/main.rs index 24d8645..5ada48b 100644 --- a/src/main.rs +++ b/src/main.rs @@ -1,4 +1,5 @@ use std::io::{Error, ErrorKind}; +use std::num::ParseIntError; use telnet::Telnet; @@ -147,7 +148,13 @@ fn main() -> Result<(), Error> { loop { command_utils::events::register_events(&mut connection, args.event.clone()) .map_err(to_other_error)?; - command_utils::events::loop_response_reader(&mut connection); + + let self_clid: i32 = wrappers::get_self_clid(&mut connection) + .map_err(|msg| make_action_error("get self clid", msg))? + .parse() + .map_err(|err: ParseIntError| make_action_error("parse clid", err.to_string()))?; + + command_utils::events::loop_response_reader(&mut connection, self_clid); // loop_response_reader failed. Let's try to reconnect after 1 second. std::thread::sleep(std::time::Duration::from_secs(1)); diff --git a/src/wrappers.rs b/src/wrappers.rs index fd9f64f..546cd86 100644 --- a/src/wrappers.rs +++ b/src/wrappers.rs @@ -110,7 +110,7 @@ pub fn get_channel_clients(connection: &mut Telnet, channel: &Channel) -> Result } } -fn get_self_clid(connection: &mut Telnet) -> Result { +pub fn get_self_clid(connection: &mut Telnet) -> Result { match commands::whoami(connection)? { Response::Data(params) => { match parameter::parameter_find(¶ms, "clid") {