notify
ここまでたどり着いた人は、最初のクイックスタートを開いてみてください。
そこにはprofile
とnotify
についてこのように記述されています。
# profile
curl -sL -X GET -H "Content-Type: application/json" \
-H "Authorization: Bearer $token" \
"https://bsky.social/xrpc/app.bsky.actor.getProfile?actor=${handle}"
# notify
curl -sL -X GET -H "Content-Type: application/json" \
-H "Authorization: Bearer $token" \
https://bsky.social/xrpc/app.bsky.notification.listNotifications
非常に似ていますね。
まずは、先程作ったアプリのprofile
コマンドの使い方を紹介します。
$ ./target/debug/ai p yui.syui.ai
調べたいhandle
を引数にすることで、プロフィールを取得するコマンドです。
では、profile
コマンドのコードの中身を見てみましょう。
src/profile.rs
extern crate reqwest;
use crate::token_toml;
pub async fn get_request(handle: String) -> String {
let token = token_toml(&"access");
let url = "https://bsky.social/xrpc/app.bsky.actor.getProfile".to_owned() + &"?actor=" + &handle;
let client = reqwest::Client::new();
let res = client
.get(url)
.header("Authorization", "Bearer ".to_owned() + &token)
.send()
.await
.unwrap()
.text()
.await
.unwrap();
return res
}
例えば、これをnotify
を取得するurlに変更すると、notify
コマンドに変化します。以下のように書き換えてみてください。
src/profile.rs
extern crate reqwest;
use crate::token_toml;
pub async fn get_request(handle: String) -> String {
let token = token_toml(&"access");
//let url = "https://bsky.social/xrpc/app.bsky.actor.getProfile".to_owned() + &"?actor=" + &handle;
let url = "https://bsky.social/xrpc/app.bsky.notification.listNotifications";
let client = reqwest::Client::new();
let res = client
.get(url)
.header("Authorization", "Bearer ".to_owned() + &token)
.send()
.await
.unwrap()
.text()
.await
.unwrap();
return res
}
これをbuild
して実行してみましょう。
$ cargo build
$ ./target/debug/ai p yui.syui.ai
コマンド結果が通知の取得に変化しています。
ただし、引数であるyui.syui.ai
は全く関係ありません。引数がなんでも通ります。
ですが、このsrc/profile.rs
を引用するsrc/main.rs
側のコードが引数を必要とするため、これを省略すると動かなくなってしまうのです。
src/main.rs
fn profile(c: &Context) {
// ここで引数を取得している
let m = c.args[0].to_string();
let h = async {
// 先程のコードはhandleを欲しがるため、ここで引数を取得した"m"を入れている
let str = profile::get_request(m.to_string()).await;
println!("{}",str);
};
let res = tokio::runtime::Runtime::new().unwrap().block_on(h);
return res
}
逆に言うと、src/profile.rs
をコピーして一部を削除することで、新たに通知コマンドを作れるということです。
新しくnotify
コマンドを作成してみましょう。
$ cp src/profile.rs src/notify.rs
src/notify.rs
extern crate reqwest;
use crate::token_toml;
pub async fn get_request() -> String {
let token = token_toml(&"access");
let url = "https://bsky.social/xrpc/app.bsky.notification.listNotifications";
let client = reqwest::Client::new();
let res = client
.get(url)
.header("Authorization", "Bearer ".to_owned() + &token)
.send()
.await
.unwrap()
.text()
.await
.unwrap();
return res
}
src/main.rs
// 適切な場所に以下のコードを追加
// code:1
pub mod profile;
// code:2
.command(
Command::new("notify")
.alias("n")
.action(c_notify),
)
// code:3
fn notify() {
let h = async {
let str = notify::get_request().await;
println!("{}",str);
};
let res = tokio::runtime::Runtime::new().unwrap().block_on(h);
return res
}
fn c_notify(_c: &Context) {
access_token().unwrap();
notify();
}
これをbuild
して実行してみます。
$ cargo build
$ ./target/debug/ai n
新しいコマンドの追加ができました。
timeline
の取得も似たような感じです。是非、チャレンジしてみてください。
src/timeline.rs
// timeline
// https://github.com/bluesky-social/atproto/blob/main/lexicons/app/bsky/feed/getTimeline.json
let url = "https://bsky.social/xrpc/app.bsky.feed.getTimeline";