diff options
-rw-r--r-- | adenosine-cli/src/bin/adenosine.rs | 98 | ||||
-rw-r--r-- | extra/adenosine.1 | 12 | ||||
-rw-r--r-- | extra/adenosine.1.md | 12 | ||||
-rw-r--r-- | extra/adenosine.1.scdoc | 10 | ||||
-rw-r--r-- | extra/adenosine.bash_completions | 22 | ||||
-rw-r--r-- | extra/adenosine.zsh_completions | 22 |
6 files changed, 104 insertions, 72 deletions
diff --git a/adenosine-cli/src/bin/adenosine.rs b/adenosine-cli/src/bin/adenosine.rs index 2a8cfc4..0f04926 100644 --- a/adenosine-cli/src/bin/adenosine.rs +++ b/adenosine-cli/src/bin/adenosine.rs @@ -62,10 +62,13 @@ enum AccountCommand { email: String, #[structopt(long, short)] - username: String, + handle: String, #[structopt(long, short)] password: String, + + #[structopt(long, short)] + recovery_key: Option<String>, }, /// Delete the currently logged-in account (danger!) Delete, @@ -75,7 +78,7 @@ enum AccountCommand { /// variable Login { #[structopt(long, short)] - username: String, + handle: String, #[structopt(long, short)] password: String, @@ -138,7 +141,7 @@ enum BskyCommand { */ /// Display a profile record (or self if not provided) Profile { name: Option<DidOrHost> }, - /// Query by partial username + /// Query by partial handle SearchUsers { query: String }, } @@ -177,7 +180,7 @@ enum Command { /// Print user/repository-level description (including DID document) Describe { name: Option<DidOrHost> }, - /// Have PDS resolve the DID for a username + /// Have PDS resolve the DID for a handle Resolve { name: DidOrHost }, /// Generic HTTP XRPC helper, printing any result @@ -296,12 +299,12 @@ fn run(opt: Opt) -> Result<()> { .or(jwt_did) .ok_or(anyhow!("expected a name, or self via auth token"))?; params.insert("user".to_string(), name); - xrpc_client.get(&Nsid::from_str("com.atproto.repoDescribe")?, Some(params))? + xrpc_client.get(&Nsid::from_str("com.atproto.repo.describe")?, Some(params))? } Command::Resolve { name } => { let mut params: HashMap<String, String> = HashMap::new(); params.insert("name".to_string(), name.to_string()); - xrpc_client.get(&Nsid::from_str("com.atproto.resolveName")?, Some(params))? + xrpc_client.get(&Nsid::from_str("com.atproto.handle.resolve")?, Some(params))? } Command::Get { uri, cid } => { params.insert("user".to_string(), uri.repository.to_string()); @@ -324,8 +327,8 @@ fn run(opt: Opt) -> Result<()> { if uri.collection.is_none() { // if a repository, but no collection, list the collections let describe = xrpc_client - .get(&Nsid::from_str("com.atproto.repoDescribe")?, Some(params))? - .ok_or(anyhow!("expected a repoDescribe response"))?; + .get(&Nsid::from_str("com.atproto.repo.describe")?, Some(params))? + .ok_or(anyhow!("expected a repo.describe response"))?; for c in describe["collections"] .as_array() .ok_or(anyhow!("expected collection list"))? @@ -363,7 +366,7 @@ fn run(opt: Opt) -> Result<()> { update_params_from_fields(&fields, &mut params); let val = value_from_fields(fields); xrpc_client.post( - &Nsid::from_str("com.atproto.repoCreateRecord")?, + &Nsid::from_str("com.atproto.repo.createRecord")?, Some(params), Some(val), )? @@ -382,14 +385,14 @@ fn run(opt: Opt) -> Result<()> { // fetch existing, extend map with fields, put the updated value let mut record = xrpc_client .get( - &Nsid::from_str("com.atproto.repoGetRecord")?, + &Nsid::from_str("com.atproto.repo.getRecord")?, Some(params.clone()), )? .unwrap_or(json!({})); update_params_from_fields(&fields, &mut params); update_value_from_fields(fields, &mut record); xrpc_client.post( - &Nsid::from_str("com.atproto.repoPutRecord")?, + &Nsid::from_str("com.atproto.repo.putRecord")?, Some(params), Some(record), )? @@ -405,7 +408,7 @@ fn run(opt: Opt) -> Result<()> { uri.record.ok_or(anyhow!("record key required"))?, ); xrpc_client.post( - &Nsid::from_str("com.atproto.repoDeleteRecord")?, + &Nsid::from_str("com.atproto.repo.deleteRecord")?, Some(params), None, )? @@ -426,37 +429,44 @@ fn run(opt: Opt) -> Result<()> { cmd: AccountCommand::Register { email, - username, + handle, password, + recovery_key, }, - } => xrpc_client.post( - &Nsid::from_str("com.atproto.createAccount")?, - None, - Some(json!({ + } => { + let mut body = json!({ "email": email, - "username": username, + "handle": handle, "password": password, - })), - )?, + }); + if let Some(key) = recovery_key { + body["recoveryKey"] = json!(key); + } + xrpc_client.post( + &Nsid::from_str("com.atproto.account.create")?, + None, + Some(body), + )? + } Command::Account { - cmd: AccountCommand::Login { username, password }, + cmd: AccountCommand::Login { handle, password }, } => xrpc_client.post( - &Nsid::from_str("com.atproto.createSession")?, + &Nsid::from_str("com.atproto.session.create")?, None, Some(json!({ - "username": username, + "handle": handle, "password": password, })), )?, Command::Account { cmd: AccountCommand::Logout, - } => xrpc_client.post(&Nsid::from_str("com.atproto.deleteSession")?, None, None)?, + } => xrpc_client.post(&Nsid::from_str("com.atproto.session.delete")?, None, None)?, Command::Account { cmd: AccountCommand::Delete, - } => xrpc_client.post(&Nsid::from_str("com.atproto.deleteAccount")?, None, None)?, + } => xrpc_client.post(&Nsid::from_str("com.atproto.account.delete")?, None, None)?, Command::Account { cmd: AccountCommand::Info, - } => xrpc_client.get(&Nsid::from_str("com.atproto.getAccount")?, None)?, + } => xrpc_client.get(&Nsid::from_str("com.atproto.account.get")?, None)?, Command::Repo { cmd: RepoCommand::Root { did }, } => { @@ -466,7 +476,7 @@ fn run(opt: Opt) -> Result<()> { None => jwt_did.ok_or(anyhow!("expected a DID"))?, }; params.insert("did".to_string(), did); - xrpc_client.get(&Nsid::from_str("com.atproto.syncGetRoot")?, Some(params))? + xrpc_client.get(&Nsid::from_str("com.atproto.sync.getRoot")?, Some(params))? } Command::Repo { cmd: RepoCommand::Export { did, from }, @@ -481,7 +491,7 @@ fn run(opt: Opt) -> Result<()> { params.insert("from".to_string(), from); }; xrpc_client.get_to_writer( - &Nsid::from_str("com.atproto.syncGetRepo")?, + &Nsid::from_str("com.atproto.sync.getRepo")?, Some(params), &mut std::io::stdout(), )?; @@ -497,7 +507,7 @@ fn run(opt: Opt) -> Result<()> { }; params.insert("did".to_string(), did); xrpc_client.post_cbor_from_reader( - &Nsid::from_str("com.atproto.syncUpdateRepo")?, + &Nsid::from_str("com.atproto.sync.updateRepo")?, Some(params), &mut std::io::stdin(), )? @@ -507,9 +517,12 @@ fn run(opt: Opt) -> Result<()> { } => { if let Some(name) = name { params.insert("author".to_string(), name.to_string()); - xrpc_client.get(&Nsid::from_str("app.bsky.getAuthorFeed")?, Some(params))? + xrpc_client.get( + &Nsid::from_str("app.bsky.feed.getAuthorFeed")?, + Some(params), + )? } else { - xrpc_client.get(&Nsid::from_str("app.bsky.getHomeFeed")?, None)? + xrpc_client.get(&Nsid::from_str("app.bsky.feed.getTimeline")?, None)? } } Command::Bsky { @@ -522,9 +535,9 @@ fn run(opt: Opt) -> Result<()> { "did".to_string(), jwt_did.ok_or(anyhow!("need auth token"))?, ); - params.insert("collection".to_string(), "app.bsky.post".to_string()); + params.insert("collection".to_string(), "app.bsky.feed.post".to_string()); xrpc_client.post( - &Nsid::from_str("com.atproto.repoCreateRecord")?, + &Nsid::from_str("com.atproto.repo.createRecord")?, Some(params), Some(json!({ "text": text, @@ -538,9 +551,9 @@ fn run(opt: Opt) -> Result<()> { "did".to_string(), jwt_did.ok_or(anyhow!("need auth token"))?, ); - params.insert("collection".to_string(), "app.bsky.repost".to_string()); + params.insert("collection".to_string(), "app.bsky.feed.repost".to_string()); xrpc_client.post( - &Nsid::from_str("com.atproto.repoCreateRecord")?, + &Nsid::from_str("com.atproto.repo.createRecord")?, Some(params), Some(json!({ "subject": uri.to_string(), @@ -555,9 +568,9 @@ fn run(opt: Opt) -> Result<()> { "did".to_string(), jwt_did.ok_or(anyhow!("need auth token"))?, ); - params.insert("collection".to_string(), "app.bsky.like".to_string()); + params.insert("collection".to_string(), "app.bsky.feed.like".to_string()); xrpc_client.post( - &Nsid::from_str("com.atproto.repoCreateRecord")?, + &Nsid::from_str("com.atproto.repo.createRecord")?, Some(params), Some(json!({ "subject": uri.to_string(), @@ -572,9 +585,12 @@ fn run(opt: Opt) -> Result<()> { "did".to_string(), jwt_did.ok_or(anyhow!("need auth token"))?, ); - params.insert("collection".to_string(), "app.bsky.follow".to_string()); + params.insert( + "collection".to_string(), + "app.bsky.graph.follow".to_string(), + ); xrpc_client.post( - &Nsid::from_str("com.atproto.repoCreateRecord")?, + &Nsid::from_str("com.atproto.repo.createRecord")?, Some(params), Some(json!({ "subject": uri.to_string(), @@ -590,13 +606,13 @@ fn run(opt: Opt) -> Result<()> { .or(jwt_did) .ok_or(anyhow!("expected a name, or self via auth token"))?; params.insert("user".to_string(), name); - xrpc_client.get(&Nsid::from_str("app.bsky.getProfile")?, Some(params))? + xrpc_client.get(&Nsid::from_str("app.bsky.actor.getProfile")?, Some(params))? } Command::Bsky { cmd: BskyCommand::SearchUsers { query }, } => { params.insert("term".to_string(), query); - xrpc_client.get(&Nsid::from_str("app.bsky.getUsersSearch")?, Some(params))? + xrpc_client.get(&Nsid::from_str("app.bsky.actor.search")?, Some(params))? } }; print_result_json(result)?; diff --git a/extra/adenosine.1 b/extra/adenosine.1 index dcac2dd..24ebdb2 100644 --- a/extra/adenosine.1 +++ b/extra/adenosine.1 @@ -5,7 +5,7 @@ .nh .ad l .\" Begin generated content: -.TH "adenosine" "1" "2022-10-28" "adenosine CLI Client Manual Page" +.TH "adenosine" "1" "2022-11-07" "adenosine CLI Client Manual Page" .P .SH NAME .P @@ -65,7 +65,7 @@ Prints repository description fetched from PDS .RE \fBresolve\fR <name> .RS 4 -Has PDS resolve username to a DID +Has PDS resolve handle to a DID .P .RE .SS Generic XRPC Requests @@ -142,20 +142,20 @@ Create a 'repost' record for the target by AT URI .RE \fBbsky search-users\fR .RS 4 -Query by partial username +Query by partial handle .P .P .RE .SS Account Management .P -\fBaccount register --email <email> --password <password> --username <username>\fR +\fBaccount register --email <email> --password <password> --handle <handle>\fR .P \fBaccount info\fR .RS 4 Fetches account metadata for the current session .P .RE -\fBaccount login --password <password> --username <username>\fR +\fBaccount login --password <password> --handle <handle>\fR .RS 4 Create a new authenticated session .P @@ -220,7 +220,7 @@ adenosine account register -u voltaire\&.test -p bogus -e voltaire@example\&.com { "did": "did:plc:yqtuksvatmmgngd5nkkw75hn", "jwt": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9\&.eyJzdWIiOiJkaWQ6cGxjOnlxdHVrc3ZhdG1tZ25nZDVua2t3NzVobiIsImlhdCI6MTY2Njk5NjMwNn0\&.MMQa4JIQdwvhy-rjJ0kO-z8-KdoOL0Lto9JtOkK-lwE", - "username": "voltaire\&.test" + "handle": "voltaire\&.test" } export ATP_AUTH_TOKEN=eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9\&.eyJzdWIiOiJkaWQ6cGxjOnlxdHVrc3ZhdG1tZ25nZDVua2t3NzVobiIsImlhdCI6MTY2Njk5NjMwNn0\&.MMQa4JIQdwvhy-rjJ0kO-z8-KdoOL0Lto9JtOkK-lwE diff --git a/extra/adenosine.1.md b/extra/adenosine.1.md index dc44e59..424312d 100644 --- a/extra/adenosine.1.md +++ b/extra/adenosine.1.md @@ -61,7 +61,7 @@ COMMANDS **resolve** \<name\> -> Has PDS resolve username to a DID +> Has PDS resolve handle to a DID Generic XRPC Requests --------------------- @@ -130,19 +130,19 @@ Bluesky (bsky.app) **bsky search-users** -> Query by partial username +> Query by partial handle Account Management ------------------ -**account register \--email \<email\> \--password \<password\> -\--username \<username\>** +**account register \--email \<email\> \--password \<password\> \--handle +\<handle\>** **account info** > Fetches account metadata for the current session -**account login \--password \<password\> \--username \<username\>** +**account login \--password \<password\> \--handle \<handle\>** > Create a new authenticated session @@ -202,7 +202,7 @@ for an existing account, and save the JWT token to the { "did": "did:plc:yqtuksvatmmgngd5nkkw75hn", "jwt": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiJkaWQ6cGxjOnlxdHVrc3ZhdG1tZ25nZDVua2t3NzVobiIsImlhdCI6MTY2Njk5NjMwNn0.MMQa4JIQdwvhy-rjJ0kO-z8-KdoOL0Lto9JtOkK-lwE", - "username": "voltaire.test" + "handle": "voltaire.test" } export ATP_AUTH_TOKEN=eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiJkaWQ6cGxjOnlxdHVrc3ZhdG1tZ25nZDVua2t3NzVobiIsImlhdCI6MTY2Njk5NjMwNn0.MMQa4JIQdwvhy-rjJ0kO-z8-KdoOL0Lto9JtOkK-lwE diff --git a/extra/adenosine.1.scdoc b/extra/adenosine.1.scdoc index 2c55801..41d7413 100644 --- a/extra/adenosine.1.scdoc +++ b/extra/adenosine.1.scdoc @@ -49,7 +49,7 @@ JSON object with keys "title" (string value), "year" (number value), "tags" Prints repository description fetched from PDS *resolve* <name> - Has PDS resolve username to a DID + Has PDS resolve handle to a DID ## Generic XRPC Requests @@ -100,17 +100,17 @@ body fields. Body fields only used for "post" requests. Create a 'repost' record for the target by AT URI *bsky search-users* - Query by partial username + Query by partial handle ## Account Management -*account register --email <email> --password <password> --username <username>* +*account register --email <email> --password <password> --handle <handle>* *account info* Fetches account metadata for the current session -*account login --password <password> --username <username>* +*account login --password <password> --handle <handle>* Create a new authenticated session *account logout* @@ -158,7 +158,7 @@ adenosine account register -u voltaire.test -p bogus -e voltaire@example.com { "did": "did:plc:yqtuksvatmmgngd5nkkw75hn", "jwt": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiJkaWQ6cGxjOnlxdHVrc3ZhdG1tZ25nZDVua2t3NzVobiIsImlhdCI6MTY2Njk5NjMwNn0.MMQa4JIQdwvhy-rjJ0kO-z8-KdoOL0Lto9JtOkK-lwE", - "username": "voltaire.test" + "handle": "voltaire.test" } export ATP_AUTH_TOKEN=eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiJkaWQ6cGxjOnlxdHVrc3ZhdG1tZ25nZDVua2t3NzVobiIsImlhdCI6MTY2Njk5NjMwNn0.MMQa4JIQdwvhy-rjJ0kO-z8-KdoOL0Lto9JtOkK-lwE diff --git a/extra/adenosine.bash_completions b/extra/adenosine.bash_completions index d9d5644..068a82f 100644 --- a/extra/adenosine.bash_completions +++ b/extra/adenosine.bash_completions @@ -104,7 +104,7 @@ _adenosine() { case "${cmd}" in adenosine) - opts=" -v -h -V --verbose --help --version --host --auth-token --shell-completions get ls create update delete describe resolve xrpc account repo bsky status help" + opts=" -v -h -V --verbose --help --version --host --auth-token --shell-completions status ls get create update delete describe resolve xrpc account repo bsky help" if [[ ${cur} == -* || ${COMP_CWORD} -eq 1 ]] ; then COMPREPLY=( $(compgen -W "${opts}" -- "${cur}") ) return 0 @@ -224,18 +224,18 @@ _adenosine() { return 0 ;; adenosine__account__login) - opts=" -h -V -v -u -p --help --version --verbose --username --password --host --auth-token " + opts=" -V -v -h -p --help --version --verbose --handle --password --host --auth-token " if [[ ${cur} == -* || ${COMP_CWORD} -eq 3 ]] ; then COMPREPLY=( $(compgen -W "${opts}" -- "${cur}") ) return 0 fi case "${prev}" in - --username) + --handle) COMPREPLY=($(compgen -f "${cur}")) return 0 ;; - -u) + -h) COMPREPLY=($(compgen -f "${cur}")) return 0 ;; @@ -286,7 +286,7 @@ _adenosine() { return 0 ;; adenosine__account__register) - opts=" -h -V -v -e -u -p --help --version --verbose --email --username --password --host --auth-token " + opts=" -V -v -e -h -p -r --help --version --verbose --email --handle --password --recovery-key --host --auth-token " if [[ ${cur} == -* || ${COMP_CWORD} -eq 3 ]] ; then COMPREPLY=( $(compgen -W "${opts}" -- "${cur}") ) return 0 @@ -301,11 +301,11 @@ _adenosine() { COMPREPLY=($(compgen -f "${cur}")) return 0 ;; - --username) + --handle) COMPREPLY=($(compgen -f "${cur}")) return 0 ;; - -u) + -h) COMPREPLY=($(compgen -f "${cur}")) return 0 ;; @@ -317,6 +317,14 @@ _adenosine() { COMPREPLY=($(compgen -f "${cur}")) return 0 ;; + --recovery-key) + COMPREPLY=($(compgen -f "${cur}")) + return 0 + ;; + -r) + COMPREPLY=($(compgen -f "${cur}")) + return 0 + ;; --host) COMPREPLY=($(compgen -f "${cur}")) return 0 diff --git a/extra/adenosine.zsh_completions b/extra/adenosine.zsh_completions index d9d5644..068a82f 100644 --- a/extra/adenosine.zsh_completions +++ b/extra/adenosine.zsh_completions @@ -104,7 +104,7 @@ _adenosine() { case "${cmd}" in adenosine) - opts=" -v -h -V --verbose --help --version --host --auth-token --shell-completions get ls create update delete describe resolve xrpc account repo bsky status help" + opts=" -v -h -V --verbose --help --version --host --auth-token --shell-completions status ls get create update delete describe resolve xrpc account repo bsky help" if [[ ${cur} == -* || ${COMP_CWORD} -eq 1 ]] ; then COMPREPLY=( $(compgen -W "${opts}" -- "${cur}") ) return 0 @@ -224,18 +224,18 @@ _adenosine() { return 0 ;; adenosine__account__login) - opts=" -h -V -v -u -p --help --version --verbose --username --password --host --auth-token " + opts=" -V -v -h -p --help --version --verbose --handle --password --host --auth-token " if [[ ${cur} == -* || ${COMP_CWORD} -eq 3 ]] ; then COMPREPLY=( $(compgen -W "${opts}" -- "${cur}") ) return 0 fi case "${prev}" in - --username) + --handle) COMPREPLY=($(compgen -f "${cur}")) return 0 ;; - -u) + -h) COMPREPLY=($(compgen -f "${cur}")) return 0 ;; @@ -286,7 +286,7 @@ _adenosine() { return 0 ;; adenosine__account__register) - opts=" -h -V -v -e -u -p --help --version --verbose --email --username --password --host --auth-token " + opts=" -V -v -e -h -p -r --help --version --verbose --email --handle --password --recovery-key --host --auth-token " if [[ ${cur} == -* || ${COMP_CWORD} -eq 3 ]] ; then COMPREPLY=( $(compgen -W "${opts}" -- "${cur}") ) return 0 @@ -301,11 +301,11 @@ _adenosine() { COMPREPLY=($(compgen -f "${cur}")) return 0 ;; - --username) + --handle) COMPREPLY=($(compgen -f "${cur}")) return 0 ;; - -u) + -h) COMPREPLY=($(compgen -f "${cur}")) return 0 ;; @@ -317,6 +317,14 @@ _adenosine() { COMPREPLY=($(compgen -f "${cur}")) return 0 ;; + --recovery-key) + COMPREPLY=($(compgen -f "${cur}")) + return 0 + ;; + -r) + COMPREPLY=($(compgen -f "${cur}")) + return 0 + ;; --host) COMPREPLY=($(compgen -f "${cur}")) return 0 |