diff --git a/src/main.rs b/src/main.rs index 537d562..0039c7a 100644 --- a/src/main.rs +++ b/src/main.rs @@ -8,6 +8,7 @@ use curve25519_dalek::scalar::Scalar; use getopts::Options; use lox_library::bridge_table::BridgeLine; use lox_library::bridge_table::MAX_BRIDGES_PER_BUCKET; +use lox_library::scalar_u32; use lox_library::IssuerPubKey; use serde::Serialize; use std::env::args; @@ -42,6 +43,7 @@ async fn main() { "increase server days by NUM_DAYS", "NUM_DAYS", ); + opts.optflag("I", "invite", "generate invitation for a friend"); opts.optflag("L", "level-up", "increase trust level"); opts.optflag("N", "new-lox-cred", "get a new Lox Credential"); opts.optopt( @@ -171,4 +173,34 @@ async fn main() { } else { lox_cred }; + + // Invite a friend + let lox_cred = if matches.opt_present("I") { + if scalar_u32(&lox_cred.invites_remaining).unwrap() > 0 { + let (cred, invite) = issue_invite( + &net, + &lox_cred, + &get_reachability_credential(&net).await, + get_lox_pub(&lox_auth_pubkeys), + get_reachability_pub(&lox_auth_pubkeys), + get_invitation_pub(&lox_auth_pubkeys), + ) + .await; + // TODO: Make this unique per-run (e.g., add timestamp) + let invite_filename = "invite.json"; + save_object(&invite, &invite_filename); + save_object(&cred, &lox_cred_filename); + println!("Invite saved in {}", &invite_filename); + println!( + "Invites left: {}", + scalar_u32(&cred.invites_remaining).unwrap() + ); + cred + } else { + println!("No invites left"); + lox_cred + } + } else { + lox_cred + }; }