import { AtpAgent } from "@atproto/api"; export async function getTheme(agent: AtpAgent, did: string) { try { const response = await agent.com.atproto.repo.getRecord({ repo: did, collection: "lol.skittr.actor.theme", rkey: "self", }); return response.data; } catch (error: any) { if (error.error === "RecordNotFound" || error.error === "InvalidRequest") { // dummy record return { value: { $type: "lol.skittr.actor.theme", bg_color: "#9ae4e8", text_color: "#000000", link_color: "#0000ff", side_color: "#e0ff92", side_border: "#87bc44", }, }; } throw error; } } export async function getBackground(agent: AtpAgent, did: string, cid: string) { try { const response = await agent.com.atproto.sync.getBlob({ did: did, cid: cid, }); return response; } catch (error: any) { throw error; } } export async function getBackgroundBase64(agent: AtpAgent, did: string, cid: string) { const blob = await getBackground(agent, did, cid); const mimetype = blob.headers["content-type"] ?? "application/octet-stream"; const base64 = Buffer.from(blob.data).toString("base64"); return `data:${mimetype};base64,${base64}`; } // this code is incomplete export async function loadTheme(agent: AtpAgent, did: string) { const theme = await getTheme(agent, did); const cid = (theme as any).value?.background?.ref?.$link; let bg = null; if (cid) { bg = await getBackgroundBase64(agent, did, cid); } else { bg = "../../../img/bg.gif"; } return { theme, bg }; } export async function putTheme(agent: AtpAgent, did: string, theme: any, bg?: any) { const { bg_color, text_color, link_color, side_color, side_border, repeat = false } = theme; const bgBuffer = Buffer.from(bg, "base64"); let output = {}; if (bg) { const blob = await agent.uploadBlob(bgBuffer); output = { $type: "lol.skittr.actor.theme", bg_color: bg_color, text_color: text_color, link_color: link_color, side_color: side_color, side_border: side_border, background: { $type: "blob", ref: blob.data.blob.ref, mimeType: blob.data.blob.mimeType, size: blob.data.blob.size, }, repeat: repeat, }; } else { output = { $type: "lol.skittr.actor.theme", bg_color: bg_color, text_color: text_color, link_color: link_color, side_color: side_color, side_border: side_border, }; } const response = await agent.com.atproto.repo.putRecord({ repo: did, collection: "lol.skittr.actor.theme", rkey: "self", record: output, }); return response.data; }