/* Example Zot API command line utility, part of zotapi. * Copyright (C) 2018 Harald Eilertsen * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see . */ use clap::{clap_app, crate_authors, crate_version}; use dotenv::dotenv; use std::env; use std::str::FromStr; mod zot; #[tokio::main] async fn main() { dotenv().ok(); let site = env::var("HZ_SITE").expect("SITE variable expected"); let user = env::var("HZ_USER").expect("USER variable expected"); let password = env::var("HZ_PASSWORD").expect("PASSWORD variable expected"); let matches = clap_app!(app => (name: "zot") (version: crate_version!()) (author: crate_authors!()) (about: "zotapi command line client") (@subcommand channel => (about: "Fetch the channel stream") (@arg raw: --raw "Display raw json payload") ) (@subcommand network => (about: "Fetch the network stream") (@arg raw: --raw "Display raw json payload") ) (@subcommand abook => (about: "Fetch address book/contact info") (@arg raw: --raw "Display raw json payload") ) (@subcommand abconfig => (about: "Fetch abconfig") ) (@subcommand group => (about: "Fetch privacy groups") (@arg raw: --raw "Display raw json payload") (@group selector => (@arg ID: --id +takes_value "Fetch members of group ") (@arg GNAME: --name +takes_value "Fetch members of group ") ) ) (@subcommand xchan => (about: "Fetch xchan info") (@arg raw: --raw "Display raw json payload") (@arg addr: --addr "ID is given as webbie (default)") (@arg hash: --hash "ID is given as xchan hash") (@arg guid: --guid "ID is given as a GUID") (@arg ID: +required "id (webbie, hash or GUID) of xchan to fetch") ) (@subcommand post => (about: "Post a new message") (@arg FILE: "A text file containing the body of the message") (@arg TITLE: --title +takes_value "Set a title for the message") (@arg ATTACH: --attach [FILE] "Attach a file or image to the post") (@arg GROUP: --group [groups] "Limit distribution to the specified group(s) separated by comma") ) ) .get_matches(); let client = zotapi::client(&site, &user, &password); match matches.subcommand() { ("channel", Some(m)) => { let raw = m.is_present("raw"); zot::channel_stream::fetch(&client, raw).await; } ("network", Some(m)) => { let raw = m.is_present("raw"); zot::network_stream::fetch(&client, raw).await; } ("abconfig", _) => { zot::abconfig::fetch(&client).await; } ("abook", Some(m)) => { let raw = m.is_present("raw"); zot::abook::fetch(&client, raw).await; } ("group", Some(m)) => { if let Some(id) = m.value_of("ID") { let res = zotapi::group_members() .by_group_id(u64::from_str(id).unwrap()) .fetch(&client) .await .unwrap(); if m.is_present("raw") { println!("{}", res); } else { zot::group::list_members(&res); } } else if let Some(gname) = m.value_of("GNAME") { let res = zotapi::group_members() .by_group_name(gname) .fetch(&client) .await .unwrap(); if m.is_present("raw") { println!("{}", res); } else { zot::group::list_members(&res); } } else { let res = zotapi::group().fetch(&client).await.unwrap(); if m.is_present("raw") { println!("{}", res); } else { zot::group::list(&res); } } } ("xchan", Some(m)) => { let raw = m.is_present("raw"); let t = if m.is_present("guid") { zot::xchan::Type::GUID } else if m.is_present("hash") { zot::xchan::Type::Hash } else { zot::xchan::Type::Addr }; zot::xchan::fetch(&client, raw, t, m.value_of("ID").unwrap()).await; } ("post", Some(m)) => { zot::item::post(&client, m).await; } _ => { println!("{}", matches.usage()); } } }