Instaliraj widgete

  1. Scriptable → + → zalijepi → naziv skripte Instaliraj → pokreni.
  2. Upiši kod koji ispiše sudo pregled-parovanje na darko-hz1 (vrijedi 10 min, jednom).
  3. Skripta postavi eTime, Zapp, Gonzales i Pregled + ključeve. Ažuriranje kasnije: pokreni Instaliraj, kod prazan.
// Instaliraj — postavi ili ažurira Darkove widgete u Scriptableu (bez iClouda i bez lijepljenja tokena).
//
// Prvi put: na darko-hz1 pokreni `sudo pregled-parovanje`, ovdje upiši ispisani 6-znamenkasti kod
// (vrijedi 10 min, jednom). Skripta spremi 5 tokena u Keychain i skine 4 widget skripte:
// eTime, Zapp, Gonzales, Pregled (postojeće prepiše). Kasnije ažuriranje: pokreni opet i ostavi kod prazan.
// Izvor: https://darko-hz1.tail434259.ts.net/instaliraj (krezicdarko/darko-server pregled-widget).

const BASE = "https://darko-hz1.tail434259.ts.net";
const KLJUCEVI = ["zapp-widget-token", "gonzales-widget-token", "pregled-widget-token",
  "etime-task-widget-token", "etime-clickup-widget-token"];
const SKRIPTE = [["etime", "eTime"], ["zapp-narudzbe", "Zapp"], ["gonzales-promet", "Gonzales"], ["pregled", "Pregled"]];

async function poruka(naslov, tekst) {
  const a = new Alert();
  a.title = naslov;
  a.message = tekst;
  a.addAction("OK");
  await a.presentAlert();
}

async function main() {
  const a = new Alert();
  a.title = "Instaliraj widgete";
  a.message = "Upiši 6-znamenkasti kod sa servera (sudo pregled-parovanje).\nPrazno = samo ažuriraj skripte.";
  a.addTextField("kod", "");
  a.addAction("Dalje");
  a.addCancelAction("Odustani");
  if ((await a.presentAlert()) === -1) return;
  const kod = a.textFieldValue(0).replace(/\D/g, "");

  let kljucevi = 0;
  if (kod) {
    const r = new Request(`${BASE}/parovanje?kod=${kod}`);
    r.timeoutInterval = 20;
    const d = await r.loadJSON();
    if (r.response.statusCode !== 200) {
      await poruka("✗ Kod ne vrijedi", "Kriv, istekao ili već iskorišten. Na serveru pokreni opet: sudo pregled-parovanje");
      return;
    }
    for (const [k, v] of Object.entries(d)) {
      if (KLJUCEVI.includes(k) && v) {
        Keychain.set(k, v);
        kljucevi++;
      }
    }
  } else {
    const fali = KLJUCEVI.filter((k) => !Keychain.contains(k));
    if (fali.length) {
      await poruka("✗ Nedostaju ključevi", `${fali.join(", ")}\nPokreni opet s kodom (sudo pregled-parovanje).`);
      return;
    }
  }

  // Skripte idu u istu mapu u kojoj je ova skripta (lokalno ili iCloud, kako je Scriptable postavljen).
  const ovdje = module.filename;
  const dir = ovdje.substring(0, ovdje.lastIndexOf("/"));
  const fm = dir.includes("Mobile Documents") ? FileManager.iCloud() : FileManager.local();
  const ok = [];
  for (const [ime, naziv] of SKRIPTE) {
    const r = new Request(`${BASE}/instaliraj/${ime}.js`);
    r.timeoutInterval = 20;
    const t = await r.loadString();
    if (r.response.statusCode !== 200 || !t.includes("Scriptable")) {
      await poruka("✗ Greška", `${naziv}: HTTP ${r.response.statusCode}`);
      return;
    }
    fm.writeString(fm.joinPath(dir, `${naziv}.js`), t);
    ok.push(naziv);
  }
  await poruka(`✓ ${ok.length} widgeta${kod ? ` i ${kljucevi} ključeva` : ""}`,
    `${ok.join(", ")}.\nNa početnom ekranu: dugi pritisak → + → Scriptable → widget → Script: odaberi.`);
}

await main();
Script.complete();