feat(ircv3): add client-batches feature
Some checks failed
CI / rustfmt (pull_request) Failing after 25s
CI / test (pull_request) Failing after 53s

Signed-off-by: Raito Bezarius <masterancpp@gmail.com>
This commit is contained in:
Raito Bezarius 2024-10-13 22:23:31 +02:00 committed by Ryan Lahfa
parent b1fc58ac42
commit 381ecddfee
2 changed files with 21 additions and 1 deletions

View file

@ -71,6 +71,7 @@ tokio-rustls = { version = "0.24.0", features = ["dangerous_configuration"], opt
rustls-pemfile = { version = "1.0.2", optional = true }
tokio-native-tls = { version = "0.3.1", optional = true }
webpki-roots = { version = "0.23.0", optional = true }
atomic-counter = "1.0.1"
[dev-dependencies]

View file

@ -47,6 +47,7 @@
//! # }
//! ```
use atomic_counter::{AtomicCounter, RelaxedCounter};
#[cfg(feature = "ctcp")]
use chrono::prelude::*;
use futures_util::{
@ -82,7 +83,7 @@ use crate::{
Capability, ChannelMode, Command,
Command::{
ChannelMODE, AUTHENTICATE, CAP, INVITE, JOIN, KICK, KILL, NICK, NICKSERV, NOTICE, OPER,
PART, PASS, PONG, PRIVMSG, QUIT, SAMODE, SANICK, TOPIC, USER,
PART, PASS, PONG, PRIVMSG, QUIT, SAMODE, SANICK, TOPIC, USER, BATCH
},
Message, Mode, NegotiationVersion, Response,
},
@ -497,6 +498,8 @@ struct ClientState {
sender: Sender,
/// The configuration used with this connection.
config: Config,
/// A thread-safe counter for batch IDs
batch_id: RelaxedCounter,
/// A thread-safe map of channels to the list of users in them.
chanlists: RwLock<HashMap<String, Vec<User>>>,
/// A thread-safe map of in-progress batch
@ -512,6 +515,7 @@ impl ClientState {
ClientState {
sender,
config,
batch_id: RelaxedCounter::new(0),
inflight_batches: RwLock::new(HashMap::new()),
chanlists: RwLock::new(HashMap::new()),
alt_nick_index: RwLock::new(0),
@ -870,6 +874,21 @@ impl ClientState {
}
pub_state_base!();
/// Sends a client batch with an iterator as the body.
pub fn send_client_batch<I: Iterator<Item=Message>>(&mut self, msg_iterator: I) -> error::Result<()> {
let batch_id = format!("{}", self.batch_id.get());
self.send(BATCH(batch_id.clone(), None, None))?;
// Attach to all message that batch ID.
msg_iterator.for_each(|msg| {
self.send(msg);
});
// Close the batch.
self.send(BATCH(batch_id, None, None))?;
self.batch_id.inc();
Ok(())
}
}
/// Thread-safe sender that can be used with the client.