feat(ircv3): add client-batches feature
Signed-off-by: Raito Bezarius <masterancpp@gmail.com>
This commit is contained in:
parent
e85fd07719
commit
30748d7ba3
2 changed files with 21 additions and 1 deletions
|
@ -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]
|
||||
|
|
|
@ -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.
|
||||
|
|
Loading…
Reference in a new issue