aboutsummaryrefslogtreecommitdiffstats
path: root/lib/locations.ts
blob: 11981c19450ebc43f4155b6316c18b8771adeaf0 (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
import { err } from "$lib/logging";
import got from "got";
import { g, s } from "$lib/db";
import { fields, pick, uniq } from "$lib/utils";

export let getLocations = async () => {
  try {
    let previous = await g("locations");
    let since = await g("locations:since");
    if (!since) since = "2022-09-19T00:00:00Z";
    if (Date.now() - new Date(since).getTime() < 60000) return;

    let locations: Array<any> = await got(
      `https://api.btcmap.org/v2/elements?updated_since=${since}`,
    ).json();

    locations = locations.filter(
      (l) =>
        l["osm_json"].tags &&
        l["osm_json"].tags["payment:coinos"] === "yes" &&
        l["osm_json"].tags.name &&
        !l["deleted_at"],
    );

    locations.map((l) => {
      let { bounds, lat, lon } = l["osm_json"];

      l["osm_json"].lat = lat || (bounds.minlat + bounds.maxlat) / 2;
      l["osm_json"].lon = lon || (bounds.minlon + bounds.maxlon) / 2;
    });

    for await (let l of locations) {
      let username = l.tags["payment:coinos"];
      if (username) {
        let uid = await g(`user:${username}`);
        let user = await g(`user:${uid}`);
        if (user) l["osm_json"].tags.user = pick(user, fields);
      }
    }

    locations.push(...previous);

    await s(
      "locations",
      uniq(locations, (l) => l.id),
    );
    await s("locations:since", new Date().toISOString().split(".")[0] + "Z");
  } catch (e) {
    err("problem fetching locations", e);
  }

  setTimeout(getLocations, 60000);
};