From 0d7804f67723107f4e78beca8229d2fbb82ce4a3 Mon Sep 17 00:00:00 2001 From: 2 * r + 2 * t <61896496+soramanew@users.noreply.github.com> Date: Sun, 29 Jun 2025 21:00:24 +1000 Subject: weather: use xmlhttprequest Remove curl dependency Also add buffer period so it doesnt spam api requests --- README.md | 1 - services/Requests.qml | 36 ++++++++++++++++++++++++++++++++++++ services/Weather.qml | 39 ++++++++++++++------------------------- 3 files changed, 50 insertions(+), 26 deletions(-) create mode 100644 services/Requests.qml diff --git a/README.md b/README.md index 0dcbe6a..467c1d3 100644 --- a/README.md +++ b/README.md @@ -45,7 +45,6 @@ Dependencies: - [`networkmanager`](https://networkmanager.dev) - [`lm-sensors`](https://github.com/lm-sensors/lm-sensors) - [`fish`](https://github.com/fish-shell/fish-shell) -- [`curl`](https://github.com/curl/curl) - [`aubio`](https://github.com/aubio/aubio) - [`libpipewire`](https://pipewire.org) - `glibc` diff --git a/services/Requests.qml b/services/Requests.qml new file mode 100644 index 0000000..36e9120 --- /dev/null +++ b/services/Requests.qml @@ -0,0 +1,36 @@ +pragma Singleton + +import "root:/config" +import "root:/utils" +import Quickshell + +Singleton { + id: root + + function get(url: string, callback: var): void { + const xhr = new XMLHttpRequest(); + + const cleanup = () => { + xhr.abort(); + xhr.onreadystatechange = null; + xhr.onerror = null; + }; + + xhr.open("GET", url, true); + xhr.onreadystatechange = () => { + if (xhr.readyState === XMLHttpRequest.DONE) { + if (xhr.status === 200) + callback(xhr.responseText); + else + console.warn(`[REQUESTS] GET request to ${url} failed with status ${xhr.status}`); + cleanup(); + } + }; + xhr.onerror = () => { + console.warn(`[REQUESTS] GET request to ${url} failed`); + cleanup(); + }; + + xhr.send(); + } +} diff --git a/services/Weather.qml b/services/Weather.qml index 998fdb8..ad80e48 100644 --- a/services/Weather.qml +++ b/services/Weather.qml @@ -3,7 +3,6 @@ pragma Singleton import "root:/config" import "root:/utils" import Quickshell -import Quickshell.Io import QtQuick Singleton { @@ -17,33 +16,23 @@ Singleton { function reload(): void { if (Config.dashboard.weatherLocation) loc = Config.dashboard.weatherLocation; - else - ipProc.running = true; + else if (!loc || timer.elapsed() > 900) + Requests.get("https://ipinfo.io/json", text => { + loc = JSON.parse(text).loc ?? ""; + timer.restart(); + }); } - onLocChanged: wttrProc.running = true - Component.onCompleted: reload() - - Process { - id: ipProc + onLocChanged: Requests.get(`https://wttr.in/${loc}?format=j1`, text => { + const json = JSON.parse(text).current_condition[0]; + icon = Icons.getWeatherIcon(json.weatherCode); + description = json.weatherDesc[0].value; + temperature = parseFloat(json.temp_C); + }) - command: ["curl", "ipinfo.io"] - stdout: StdioCollector { - onStreamFinished: root.loc = JSON.parse(text).loc ?? "" - } - } - - Process { - id: wttrProc + Component.onCompleted: reload() - command: ["curl", `https://wttr.in/${root.loc}?format=j1`] - stdout: StdioCollector { - onStreamFinished: { - const json = JSON.parse(text).current_condition[0]; - root.icon = Icons.getWeatherIcon(json.weatherCode); - root.description = json.weatherDesc[0].value; - root.temperature = parseFloat(json.temp_C); - } - } + ElapsedTimer { + id: timer } } -- cgit v1.2.3-freya