1import { API_URL } from "https://esm.town/v/std/API_URL";
2
3export async function api<T = any>(
4 path: string,
5 options?: RequestInit & {
11 if (options?.paginate) {
12 const data = [];
13 let url = new URL(`${API_URL}${path}`);
14 url.searchParams.set("limit", "100");
15
32 return { data } as T;
33 }
34 const resp = await fetch(`${API_URL}${path}`, {
35 ...options,
36 headers: {
7 console.log("fetchCast", { fid, hash });
8 const res = await fetch(
9 `https://api.neynar.com/v2/farcaster/cast?identifier=${hash}&type=hash`,
10 {
11 method: "GET",
12 headers: {
13 accept: "application/json",
14 api_key: "NEYNAR_API_DOCS", // FIXME add my own API key pls
15 },
16 },
31 const body = { id, inputs };
32 const headers = {
33 Authorization: `Bearer ${process.env.GLIF_API_TOKEN}`,
34 };
35
36 const res = await fetch(`https://simple-api.glif.app`, {
37 method: "POST",
38 body: JSON.stringify(body),
41 if (res.status !== 200) {
42 const text = await res.text();
43 return { error: `${res.status} error from glif API: ${text}` };
44 }
45
66 };
67
68 const url = "https://api.pinata.cloud/v3/farcaster/casts";
69 const options = {
70 method: "POST",
100export default async function(req: Request): Promise<Response> {
101 // console.log("req", req);
102 if (!process.env.GLIF_API_TOKEN) {
103 return Response.json(
104 { message: "GLIF_API_TOKEN env var is missing" },
105 { status: 500 },
106 );
140 }
141
142 // TODO verify signature w/ hub API
143 const data = reqBody?.untrustedData;
144 // console.log({ reqBody, data });
4export const discordWebhookEx = discordWebhook({
5 url:
6 "https://discord.com/api/webhooks/1220801040870281357/1aA_0F-CcEY64yQsvVxOx0mP8E_XbdduAxlqFtiix5H72p9g0WxIGkFoDGNlyr7Q-LaH",
7 content: "Hi from val town!",
8});
11How does this new shiny search engine work? Well, it's quite simple.
12
131. I wrote a [Deno script](https://github.com/pomdtr/val-town-mirror/blob/main/scripts/pull.ts) that fetches all vals from the Val Town API.
142. I pushed the data to a [Github Repository](https://github.com/pomdtr/val-town-mirror)
153. I added a [Github Action](https://github.com/pomdtr/val-town-mirror/blob/main/.github/workflows/sync.yaml) that runs the script every hour to refresh the data.
164. I created a simple frontend on top of the Github Search API that allows you to search the data. It's [hosted on Val Town](https://www.val.town/v/pomdtr/val_town_search) (obviously).
17
18That was it. I didn't have to build a complex search engine, I just used the tools that were available to me.
19
20Is this a scalable solution for Val Town? Probably not.\
21Am I abusing the Github API? Maybe.\
22Does it work better than the current search feature of Val Town? Absolutely!
23
11How does this new shiny search engine work? Well, it's quite simple.
12
131. I wrote a [Deno script](https://github.com/pomdtr/val-town-mirror/blob/main/scripts/pull.ts) that fetches all vals from the Val Town API.
142. I pushed the data to a [Github Repository](https://github.com/pomdtr/val-town-mirror)
153. I added a [Github Action](https://github.com/pomdtr/val-town-mirror/blob/main/.github/workflows/sync.yaml) that runs the script every hour to refresh the data.
164. I created a simple frontend on top of the Github Search API that allows you to search the data. It's [hosted on Val Town](https://www.val.town/v/pomdtr/val_town_search) (obviously).
17
18That was it. I didn't have to build a complex search engine, I just used the tools that were available to me.
19
20Is this a scalable solution for Val Town? Probably not.\
21Am I abusing the Github API? Maybe.\
22Does it work better than the current search feature of Val Town? Absolutely!
23
1import { api } from "https://esm.town/v/pomdtr/api";
2import { gfm } from "https://esm.town/v/pomdtr/gfm";
3import { callerRef } from "https://esm.town/v/pomdtr/refs";
11 title = `@${val.author}/${val.name}`;
12 }
13 const { readme = "" } = await api(`/v1/alias/${val.author}/${val.name}`);
14 return readme;
15}
11How does this new shiny search engine work? Well, it's quite simple.
12
131. I wrote a Deno script that fetches all vals from the Val Town API.
14
15```ts
24 .filter((line) => line.length > 0);
25
26let url = `https://api.val.town/v1/search/vals?limit=100&query=+`;
27const vals = [];
28while (true) {
73 .filter((line) => line.length > 0);
74
75let url = `https://api.val.town/v1/search/vals?limit=100&query=+`;
76const vals = [];
77while (true) {
108```
109
1104. I created a simple frontend on top of the Github Search API that allows you to search the data. It's [hosted on Val Town](https://www.val.town/v/pomdtr/val_town_search) (obviously).
111
112That was it. I didn't have to build a complex search engine, I just used the tools that were available to me.
113
114Is this a scalable solution for Val Town? Probably not.\
115Am I abusing the Github API? Maybe.\
116Does it work better than the current search feature of Val Town? Absolutely!
117
8
91. Click `Fork`
102. Change `location` (Line 4) to describe your location. It accepts fairly flexible English descriptions which it turns into locations via [nominatim's geocoder API](https://www.val.town/v/stevekrouse/nominatimSearch).
113. Click `Run`
12
8
91. Click `Fork`
102. Change `location` (Line 4) to describe your location. It accepts fairly flexible English descriptions which it turns into locations via [nominatim's geocoder API](https://www.val.town/v/stevekrouse/nominatimSearch).
113. Click `Run`
12
4
5PoV: You just hacked together a portfolio website or launched a blog as a static website. *Some people who visit might be interested in hearing more from you.* ❤️
6But you don't want to get lost building your backend, API, DB or fancy apps like SubstandardStack or MailMachineGun for people to sign up to your newsletter. 😩
7
8**All you want is a simple input box on your website - when someone types their `email`, `username` or `social link` in and submits it, you want to be notified.**