use futures::prelude::*; use irc::{client::prelude::*, error}; #[tokio::main] async fn main() -> irc::error::Result<()> { env_logger::init(); let cfg1 = Config { nickname: Some("pickles".to_owned()), server: Some("chat.freenode.net".to_owned()), channels: vec!["#rust-spam".to_owned()], ..Default::default() }; let cfg2 = Config { nickname: Some("bananas".to_owned()), server: Some("chat.freenode.net".to_owned()), channels: vec!["#rust-spam".to_owned()], ..Default::default() }; let configs = vec![cfg1, cfg2]; let mut streams = Vec::new(); let mut senders = Vec::new(); for config in configs { // Immediate errors like failure to resolve the server's domain or to establish any connection will // manifest here in the result of prepare_client_and_connect. let mut client = Client::from_config(config).await?; client.identify()?; streams.push(client.stream()?); senders.push(client.sender()); } loop { let (message, index, _) = futures::future::select_all(streams.iter_mut().map(|s| s.select_next_some())).await; let message = message?; let sender = &senders[index]; process_msg(sender, message)?; } } fn process_msg(sender: &Sender, message: Message) -> error::Result<()> { print!("{}", message); match message.command { Command::PRIVMSG(ref target, ref msg) => { if msg.contains("pickles") { sender.send_privmsg(target, "Hi!")?; } } _ => (), } Ok(()) }