notify

ここまでたどり着いた人は、最初のクイックスタートを開いてみてください。

そこにはprofilenotifyについてこのように記述されています。

# 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";

results matching ""

    No results matching ""