Instaliraj widgete
- Scriptable → + → zalijepi → naziv skripte Instaliraj → pokreni.
- Upiši kod koji ispiše
sudo pregled-parovanje na darko-hz1 (vrijedi 10 min, jednom).
- 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();