28 releases
0.11.0 | Jun 4, 2024 |
---|---|
0.10.0 | Mar 21, 2024 |
0.9.1 | Nov 12, 2023 |
0.8.0 | Jun 26, 2023 |
0.3.0 | Oct 4, 2018 |
#39 in HTTP client
1,740 downloads per month
Used in modbot
275KB
7K
SLoC
modio
provides a set of building blocks for interacting with the mod.io API.
The client uses asynchronous I/O, backed by the futures
and tokio
crates, and requires both to be used alongside.
mod.io
mod.io is a drop-in modding solution from the founders of ModDB.com, that facilitates the upload, search, browsing, downloading and trading of mods in-game.
Usage
To use modio
, execute cargo add modio
.
Basic Setup
use modio::{Credentials, Modio, Result};
#[tokio::main]
async fn main() -> Result<()> {
let modio = Modio::new(
Credentials::new("user-or-game-apikey"),
)?;
// create some tasks and execute them
// let result = task.await?;
Ok(())
}
Authentication
// Request a security code be sent to the email address.
modio.auth().request_code("john@example.com").await?;
// Wait for the 5-digit security code
let token = modio.auth().security_code("QWERT").await?;
// Create an endpoint with the new credentials
let modio = modio.with_credentials(token);
See full example.
Games
use modio::filter::prelude::*;
// List games with filter `name_id = "0ad"`
let games = modio.games().search(NameId::eq("0ad")).collect().await?;
Mods
use modio::filter::prelude::*;
// List all mods for 0 A.D.
let mods = modio.game(5).mods().search(Filter::default()).collect().await?;
// Get the details of the `balancing-mod` mod
let balancing_mod = modio.mod_(5, 110).get().await?;
Streaming search result
use futures::TryStreamExt;
let filter = Fulltext::eq("tftd").limit(10);
let mut st = modio.game(51).mods().search(filter).paged().await?;
let (_page_count, _) = st.size_hint();
// Stream of paged results `Page<Mod>` with page size = 10
while let Some(page) = st.try_next().await? {
println!("Page {}/{} - Items #{}", page.current(), page.page_count(), page.len());
for item in page {
println!(" {}. {}", item.id, item.name);
}
}
let filter = Fulltext::eq("soldier");
let mut st = modio.game(51).mods().search(filter).iter().await?;
let (_total, _) = st.size_hint();
// Stream of `Mod`
while let Some(mod_) = st.try_next().await? {
println!("{}. {}", mod_.id, mod_.name);
}
Download
use future_util::{future, TryStreamExt};
use modio::download::{ResolvePolicy, DownloadAction};
// Download the primary file of a mod.
let action = DownloadAction::Primary {
game_id: 5,
mod_id: 19,
};
modio
.download(action)
.await?
.save_to_file("mod.zip")
.await?;
// Download the specific file of a mod.
let action = DownloadAction::File {
game_id: 5,
mod_id: 19,
file_id: 101,
};
modio
.download(action)
.await?.save_to_file("mod.zip")
.await?;
// Download the specific version of a mod.
// if multiple files are found then the latest file is downloaded.
// Set policy to `ResolvePolicy::Fail` to return with `modio::download::Error::MultipleFilesFound`
// as source error.
let action = DownloadAction::Version {
game_id: 5,
mod_id: 19,
version: "0.1".to_string(),
policy: ResolvePolicy::Latest,
};
modio
.download(action)
.await?
.stream()
.try_for_each(|bytes| {
println!("bytes: {:?}")
future::ok(())
})
.await?;
Examples
See examples directory for some getting started examples.
License
Licensed under either of
- Apache License, Version 2.0 (LICENSE-APACHE or http://apache.org/licenses/LICENSE-2.0)
- MIT license (LICENSE-MIT or http://opensource.org/licenses/MIT)
Contribution
Unless you explicitly state otherwise, any contribution intentionally submitted for inclusion in the work by you, as defined in the Apache-2.0 license, shall be dual licensed as above, without any additional terms or conditions.
Dependencies
~7–18MB
~239K SLoC