Skip to content
master
Switch branches/tags
Code

Latest commit

 

Git stats

Files

Permalink
Failed to load latest commit information.
Type
Name
Latest commit message
Commit time
 
 
src
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

mod.io

Crates.io Released API docs Master API docs Rust version License Workflow Status

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, add this to your Cargo.toml

[dependencies]
modio = "0.6"

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

// List all mods for 0 A.D.
let mods = modio.game(5).mods().search(Default::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).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).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)
    .stream()
    .try_for_each(|bytes| {
        println!("bytes: {:?}")
        future::ok(())
    })
    .await?;

Examples

See examples directory for some getting started examples.

License

Licensed under either of

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.

About

πŸ¦€ Rust interface for integrating https://mod.io - a modding API for game developers

Topics

Resources

License

Languages