Added the tooter example, an async version of tweeter.
This commit is contained in:
parent
88b7b5f18b
commit
a23f3417f1
2 changed files with 52 additions and 0 deletions
51
examples/tooter.rs
Normal file
51
examples/tooter.rs
Normal file
|
@ -0,0 +1,51 @@
|
||||||
|
extern crate irc;
|
||||||
|
extern crate tokio_timer;
|
||||||
|
|
||||||
|
use std::default::Default;
|
||||||
|
use std::time::Duration;
|
||||||
|
use irc::client::prelude::*;
|
||||||
|
use irc::error::IrcError;
|
||||||
|
|
||||||
|
// NOTE: this example is a conversion of `tweeter.rs` to an asynchronous style with `IrcReactor`.
|
||||||
|
fn main() {
|
||||||
|
let config = Config {
|
||||||
|
nickname: Some("mastodon".to_owned()),
|
||||||
|
server: Some("irc.fyrechat.net".to_owned()),
|
||||||
|
channels: Some(vec!["#irc-crate".to_owned()]),
|
||||||
|
..Default::default()
|
||||||
|
};
|
||||||
|
|
||||||
|
// We need to create a reactor first and foremost
|
||||||
|
let mut reactor = IrcReactor::new().unwrap();
|
||||||
|
// and then create a client via its API.
|
||||||
|
let client = reactor.prepare_client_and_connect(&config).unwrap();
|
||||||
|
// Then, we identify
|
||||||
|
client.identify().unwrap();
|
||||||
|
// and clone just as before.
|
||||||
|
let send_client = client.clone();
|
||||||
|
|
||||||
|
// Rather than spawn a thread that reads the messages separately, we register a handler with the
|
||||||
|
// reactor. just as in the original version, we don't do any real handling and instead just print
|
||||||
|
// the messages that are received.
|
||||||
|
reactor.register_client_with_handler(client, |_, message| {
|
||||||
|
print!("{}", message);
|
||||||
|
Ok(())
|
||||||
|
});
|
||||||
|
|
||||||
|
// We construct an interval using a wheel timer from tokio_timer. This interval will fire
|
||||||
|
// every 10 seconds (and is roughly accurate to the second).
|
||||||
|
let send_interval = tokio_timer::wheel()
|
||||||
|
.tick_duration(Duration::from_secs(1))
|
||||||
|
.num_slots(256)
|
||||||
|
.build()
|
||||||
|
.interval(Duration::from_secs(10));
|
||||||
|
|
||||||
|
// And then spawn a new future that performs the given action each time it fires.
|
||||||
|
reactor.register_future(send_interval.map_err(IrcError::Timer).for_each(move |()| {
|
||||||
|
// Anything in here will happen every 10 seconds!
|
||||||
|
send_client.send_privmsg("#irc-crate", "TOOT TOOT")
|
||||||
|
}));
|
||||||
|
|
||||||
|
// Then, on the main thread, we finally run the reactor which blocks the program indefinitely.
|
||||||
|
reactor.run().unwrap();
|
||||||
|
}
|
|
@ -5,6 +5,7 @@ use std::thread;
|
||||||
use std::time::Duration;
|
use std::time::Duration;
|
||||||
use irc::client::prelude::*;
|
use irc::client::prelude::*;
|
||||||
|
|
||||||
|
// NOTE: you can find an asynchronous version of this example with `IrcReactor` in `tooter.rs`.
|
||||||
fn main() {
|
fn main() {
|
||||||
let config = Config {
|
let config = Config {
|
||||||
nickname: Some("pickles".to_owned()),
|
nickname: Some("pickles".to_owned()),
|
||||||
|
|
Loading…
Reference in a new issue