From 63cf4a12c6e2c71cd6db78cecc4423082fe5a51a Mon Sep 17 00:00:00 2001 From: syui Date: Tue, 12 Nov 2024 16:38:53 +0900 Subject: [PATCH] add scpt --- at.zsh | 96 +++++++++++++++++++ .../frontpage/lib/data/atproto/record.ts | 50 ++++++++++ 2 files changed, 146 insertions(+) create mode 100755 at.zsh create mode 100644 repos_extra/frontpage/packages/frontpage/lib/data/atproto/record.ts diff --git a/at.zsh b/at.zsh new file mode 100755 index 0000000..f10906a --- /dev/null +++ b/at.zsh @@ -0,0 +1,96 @@ +#!/bin/zsh + +help=( + at.zsh d handle + at.zsh u at-uri + at.zsh c at-uri -r + at.zsh docs +) +host=( + bsky.social + public.api.bsky.app + plc.directory +) +lexicon=( + com.atproto.repo.describeRepo + com.atproto.repo.getRecord + com.atproto.repo.listRecords + com.atproto.identity.resolveHandle +) + +function at-env(){ + host=bsky.social + at_uri=at://did:plc:4hqjfn7m6n5hno3doamuhgef/ai.syui.game.user/syui + docs_uri=https://docs.bsky.app/docs/api + handle=yui.syui.ai + did=`echo $at_uri|cut -d / -f 3` + collection=`echo $at_uri|cut -d / -f 4` + rkey=`echo $at_uri|cut -d / -f 5` +} + +function at-uri-search(){ + if [ -n "$1" ];then + at_uri=$1 + fi + req=/xrpc/com.atproto.repo.getRecord + url=https://${host}${req} + did=`echo $at_uri|cut -d / -f 3` + collection=`echo $at_uri|cut -d / -f 4` + rkey=`echo $at_uri|cut -d / -f 5` + curl -sL "$url?repo=$did&collection=$collection&rkey=$rkey"|jq . +} + +function at-did-search(){ + if [ -n "$1" ];then + handle=$1 + fi + req=/xrpc/com.atproto.repo.describeRepo + url=https://${host}${req} + curl -sL "$url?repo=$handle"|jq . +} + +function at-collection-search(){ + reverse=false + if [ -n "$1" ];then + at_uri=$1 + fi + if [ "$2" = "-r" ];then + reverse=true + fi + req=/xrpc/com.atproto.repo.listRecords + url=https://${host}${req} + did=`echo $at_uri|cut -d / -f 3` + collection=`echo $at_uri|cut -d / -f 4` + curl -sL "$url?repo=$did&collection=$collection&reverse=$reverse"|jq . +} + + +function at-docs(){ +for i in $lexicon; do + req=`echo $i|tr '.' '-'|sed 's/[A-Z]/-&/g'|tr '[A-Z]' '[a-z]'` + url=$docs_uri/$req + echo $url +done +} + +at-env +case $1 in + uri|u) + at-uri-search $2 + ;; + did|d) + at-did-search $2 + ;; + collection|c) + at-collection-search $2 $3 + ;; + at-docs|docs) + at-docs + ;; + *) + echo "${help[@]}" + echo "${host[@]}" + echo "${lexicon[@]}" + ;; +esac + diff --git a/repos_extra/frontpage/packages/frontpage/lib/data/atproto/record.ts b/repos_extra/frontpage/packages/frontpage/lib/data/atproto/record.ts new file mode 100644 index 0000000..8445f27 --- /dev/null +++ b/repos_extra/frontpage/packages/frontpage/lib/data/atproto/record.ts @@ -0,0 +1,50 @@ +import "server-only"; +import { z } from "zod"; +import { ensureUser } from "../user"; +import { DataLayerError } from "../error"; +import { fetchAuthenticatedAtproto } from "@/lib/auth"; +import { AtUri } from "./uri"; + +const PutRecordResponse = z.object({ + uri: AtUri, + cid: z.string(), +}); + +type PutRecordInput = { + rkey?: string; + record: unknown; + collection: string; +}; + +export async function atprotoPutRecord({ + rkey, + record, + collection, +}: PutRecordInput) { + const user = await ensureUser(); + const pdsUrl = new URL(user.pdsUrl); + pdsUrl.pathname = "/xrpc/com.atproto.repo.putRecord"; + + const response = await fetchAuthenticatedAtproto(pdsUrl.toString(), { + method: "POST", + headers: { + "Content-Type": "application/json", + }, + body: JSON.stringify({ + rkey: rkey || "self", + repo: user.did, + collection, + validate: false, + record: record, + }), + }); + + if (!response.ok) { + throw new DataLayerError(`Failed to create record ${response.status}`, { + cause: response, + }); + } + + return PutRecordResponse.parse(await response.json()); +} +