2018-04-22 01:20:58 +02:00
|
|
|
# the irc crate [![Build Status][ci-badge]][ci] [![Crates.io][cr-badge]][cr] ![Downloads][dl-badge] [![Docs][doc-badge]][doc]
|
2017-12-13 20:31:28 +01:00
|
|
|
|
2018-01-09 05:42:03 +01:00
|
|
|
[ci-badge]: https://travis-ci.org/aatxe/irc.svg?branch=stable
|
2017-12-13 20:31:28 +01:00
|
|
|
[ci]: https://travis-ci.org/aatxe/irc
|
|
|
|
[cr-badge]: https://img.shields.io/crates/v/irc.svg
|
|
|
|
[cr]: https://crates.io/crates/irc
|
2018-03-07 19:43:56 +01:00
|
|
|
[dl-badge]: https://img.shields.io/crates/d/irc.svg
|
2017-12-13 20:31:28 +01:00
|
|
|
[doc-badge]: https://docs.rs/irc/badge.svg
|
|
|
|
[doc]: https://docs.rs/irc
|
|
|
|
|
2018-01-30 03:10:05 +01:00
|
|
|
[rfc2812]: http://tools.ietf.org/html/rfc2812
|
2018-09-17 23:50:53 +02:00
|
|
|
[ircv3.1]: http://ircv3.net/irc/3.1.html
|
2018-01-30 03:10:05 +01:00
|
|
|
[ircv3.2]: http://ircv3.net/irc/3.2.html
|
|
|
|
|
|
|
|
"the irc crate" is a thread-safe and async-friendly IRC client library written in Rust. It's
|
|
|
|
compliant with [RFC 2812][rfc2812], [IRCv3.1][ircv3.1], [IRCv3.2][ircv3.2], and includes some
|
|
|
|
additional, common features from popular IRCds. You can find up-to-date, ready-to-use documentation
|
|
|
|
online [on docs.rs][doc].
|
2014-12-02 18:26:50 +01:00
|
|
|
|
2018-03-31 16:03:19 +02:00
|
|
|
## Built with the irc crate
|
2018-01-30 03:41:36 +01:00
|
|
|
|
|
|
|
the irc crate is being used to build new IRC software in Rust. Here are some of our favorite
|
|
|
|
projects:
|
|
|
|
|
|
|
|
- [alectro][alectro] — a terminal IRC client
|
|
|
|
- [spilo][spilo] — a minimalistic IRC bouncer
|
|
|
|
- [irc-bot.rs][ircbot] — a library for writing IRC bots
|
2018-03-26 04:01:56 +02:00
|
|
|
- [playbot_ng][playbot_ng] — a Rust-evaluating IRC bot in Rust
|
2018-01-30 03:41:36 +01:00
|
|
|
- [bunnybutt-rs][bunnybutt] — an IRC bot for the [Feed The Beast Wiki][ftb-wiki]
|
2018-10-03 17:00:18 +02:00
|
|
|
- [url-bot-rs][url-bot-rs] — a URL-fetching IRC bot
|
2018-01-30 03:41:36 +01:00
|
|
|
|
|
|
|
[alectro]: https://github.com/aatxe/alectro
|
|
|
|
[spilo]: https://github.com/aatxe/spilo
|
|
|
|
[ircbot]: https://github.com/8573/irc-bot.rs
|
|
|
|
[bunnybutt]: https://github.com/FTB-Gamepedia/bunnybutt-rs
|
2018-03-26 04:01:56 +02:00
|
|
|
[playbot_ng]: https://github.com/panicbit/playbot_ng
|
2018-01-30 03:41:36 +01:00
|
|
|
[ftb-wiki]: https://ftb.gamepedia.com/FTB_Wiki
|
2018-10-03 17:00:18 +02:00
|
|
|
[url-bot-rs]: https://github.com/nuxeh/url-bot-rs
|
2018-01-30 03:41:36 +01:00
|
|
|
|
|
|
|
Making your own project? [Submit a pull request](https://github.com/aatxe/irc/pulls) to add it!
|
|
|
|
|
2018-03-31 16:03:19 +02:00
|
|
|
## Getting Started
|
2014-12-02 18:26:50 +01:00
|
|
|
|
2018-09-17 23:50:53 +02:00
|
|
|
To start using the irc crate with cargo, you can add `irc = "0.13"` to your dependencies in
|
2018-03-31 16:03:19 +02:00
|
|
|
your Cargo.toml file. The high-level API can be found in [`irc::client::prelude`][irc-prelude].
|
|
|
|
You'll find a number of examples to help you get started in `examples/`, throughout the
|
|
|
|
documentation, and below.
|
2018-01-30 03:10:05 +01:00
|
|
|
|
2018-03-31 16:03:19 +02:00
|
|
|
[irc-prelude]: https://docs.rs/irc/*/irc/client/prelude/index.html
|
2018-01-30 03:10:05 +01:00
|
|
|
|
2019-08-27 15:05:51 +02:00
|
|
|
## Using Futures
|
2018-03-31 16:03:19 +02:00
|
|
|
|
2019-08-27 15:05:51 +02:00
|
|
|
The release of v0.14 replaced all existing APIs with one based on async/await.
|
2014-12-05 16:27:58 +01:00
|
|
|
|
2019-08-27 15:05:51 +02:00
|
|
|
```rust,no_run,edition2018
|
2015-02-23 03:22:33 +01:00
|
|
|
use irc::client::prelude::*;
|
2019-08-27 15:05:51 +02:00
|
|
|
use futures::prelude::*;
|
2014-12-05 16:27:58 +01:00
|
|
|
|
2019-08-27 15:05:51 +02:00
|
|
|
#[tokio::main]
|
|
|
|
async fn main() -> Result<(), failure::Error> {
|
2018-01-30 03:10:05 +01:00
|
|
|
// We can also load the Config at runtime via Config::load("path/to/config.toml")
|
|
|
|
let config = Config {
|
|
|
|
nickname: Some("the-irc-crate".to_owned()),
|
2020-07-23 19:40:10 +02:00
|
|
|
server: Some("chat.freenode.net".to_owned()),
|
2018-01-30 03:10:05 +01:00
|
|
|
channels: Some(vec!["#test".to_owned()]),
|
|
|
|
..Config::default()
|
2016-06-30 20:09:25 +02:00
|
|
|
};
|
2018-01-30 03:10:05 +01:00
|
|
|
|
2019-08-27 15:05:51 +02:00
|
|
|
let mut client = Client::from_config(config).await?;
|
|
|
|
client.identify()?;
|
2016-06-30 20:09:25 +02:00
|
|
|
|
2019-08-27 15:05:51 +02:00
|
|
|
let mut stream = client.stream()?;
|
2018-01-30 03:10:05 +01:00
|
|
|
|
2019-08-27 15:05:51 +02:00
|
|
|
while let Some(message) = stream.next().await.transpose()? {
|
2018-01-30 03:10:05 +01:00
|
|
|
print!("{}", message);
|
2019-08-27 15:05:51 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
Ok(())
|
2016-06-30 20:09:25 +02:00
|
|
|
}
|
|
|
|
```
|
|
|
|
|
2018-03-31 16:03:19 +02:00
|
|
|
## Configuring IRC Clients
|
2016-01-18 07:17:32 +01:00
|
|
|
|
2018-01-30 03:10:05 +01:00
|
|
|
As seen above, there are two techniques for configuring the irc crate: runtime loading and
|
|
|
|
programmatic configuration. Runtime loading is done via the function `Config::load`, and is likely
|
|
|
|
sufficient for most IRC bots. Programmatic configuration is convenient for writing tests, but can
|
|
|
|
also be useful when defining your own custom configuration format that can be converted to `Config`.
|
|
|
|
The primary configuration format is TOML, but if you are so inclined, you can use JSON and/or YAML
|
2020-01-29 02:58:38 +01:00
|
|
|
via the optional `json_config` and `yaml_config` features respectively. At the minimum, a configuration
|
|
|
|
requires `nickname` and `server` to be defined, and all other fields are optional. You can find
|
|
|
|
detailed explanations of the various fields on [docs.rs][config-fields].
|
2018-03-31 16:03:19 +02:00
|
|
|
|
|
|
|
[config-fields]: https://docs.rs/irc/*/irc/client/data/config/struct.Config.html#fields
|
2017-08-05 02:31:45 +02:00
|
|
|
|
2018-01-30 03:10:05 +01:00
|
|
|
Alternatively, you can look at the example below of a TOML configuration with all the fields:
|
2017-08-05 02:31:45 +02:00
|
|
|
|
|
|
|
```toml
|
|
|
|
owners = []
|
|
|
|
nickname = "user"
|
|
|
|
nick_password = "password"
|
|
|
|
alt_nicks = ["user_", "user__"]
|
|
|
|
username = "user"
|
|
|
|
realname = "Test User"
|
|
|
|
server = "chat.freenode.net"
|
|
|
|
port = 6697
|
|
|
|
password = ""
|
2020-03-04 07:38:01 +01:00
|
|
|
proxy_type = "None"
|
|
|
|
proxy_server = "127.0.0.1"
|
|
|
|
proxy_port = "1080"
|
|
|
|
proxy_username = ""
|
|
|
|
proxy_password = ""
|
2020-03-07 06:17:35 +01:00
|
|
|
use_tls = true
|
2017-08-05 02:31:45 +02:00
|
|
|
cert_path = "cert.der"
|
2018-03-31 21:09:42 +02:00
|
|
|
client_cert_path = "client.der"
|
|
|
|
client_cert_pass = "password"
|
2017-08-05 02:31:45 +02:00
|
|
|
encoding = "UTF-8"
|
|
|
|
channels = ["#rust", "#haskell", "#fake"]
|
|
|
|
umodes = "+RB-x"
|
2018-01-30 01:27:23 +01:00
|
|
|
user_info = "I'm a test user for the irc crate."
|
2017-08-05 02:31:45 +02:00
|
|
|
version = "irc:git:Rust"
|
|
|
|
source = "https://github.com/aatxe/irc"
|
|
|
|
ping_time = 180
|
|
|
|
ping_timeout = 10
|
|
|
|
burst_window_length = 8
|
|
|
|
max_messages_in_burst = 15
|
|
|
|
should_ghost = false
|
|
|
|
ghost_sequence = []
|
|
|
|
|
|
|
|
[channel_keys]
|
|
|
|
"#fake" = "password"
|
|
|
|
|
|
|
|
[options]
|
|
|
|
note = "anything you want can be in here!"
|
|
|
|
and = "you can use it to build your own additional configuration options."
|
|
|
|
key = "value"
|
2016-01-18 07:17:32 +01:00
|
|
|
```
|
|
|
|
|
2017-12-13 20:31:28 +01:00
|
|
|
You can convert between different configuration formats with `convertconf` like so:
|
|
|
|
|
2018-01-30 03:10:05 +01:00
|
|
|
```shell
|
2017-12-13 20:31:28 +01:00
|
|
|
cargo run --example convertconf -- -i client_config.json -o client_config.toml
|
|
|
|
```
|
|
|
|
|
2018-09-17 23:50:53 +02:00
|
|
|
Note that the formats are automatically determined based on the selected file extensions. This
|
|
|
|
tool should make it easier for users to migrate their old configurations to TOML.
|
2017-12-13 20:31:28 +01:00
|
|
|
|
2018-03-31 16:03:19 +02:00
|
|
|
## Contributing
|
2018-02-14 14:13:44 +01:00
|
|
|
the irc crate is a free, open source library that relies on contributions from its maintainers,
|
2018-01-30 03:12:19 +01:00
|
|
|
Aaron Weiss ([@aatxe][awe]) and Peter Atashian ([@retep998][bun]), as well as the broader Rust
|
|
|
|
community. It's licensed under the Mozilla Public License 2.0 whose text can be found in
|
|
|
|
`LICENSE.md`. To foster an inclusive community around the irc crate, we have adopted a Code of
|
2018-02-14 14:11:43 +01:00
|
|
|
Conduct whose text can be found in `CODE_OF_CONDUCT.md`. You can find details about how to
|
|
|
|
contribute in `CONTRIBUTING.md`.
|
2018-01-30 03:12:19 +01:00
|
|
|
|
|
|
|
[awe]: https://github.com/aatxe/
|
|
|
|
[bun]: https://github.com/retep998/
|