Files
aiden-niri-noctalia/home/aiden/.config/noctalia/plugins/update-count/Main.qml
2025-12-28 10:41:44 -06:00

127 lines
3.4 KiB
QML

import QtQuick
import Quickshell
import Quickshell.Io
import qs.Commons
Item {
id: root
property var pluginApi: null
readonly property url updaterJson: Qt.resolvedUrl("file://" + Settings.configDir + "/plugins/update-count/updaterConfigs.json")
readonly property int minutesToMillis: 60_000
readonly property int updateIntervalMinutes: pluginApi?.pluginSettings.updateIntervalMinutes || pluginApi?.manifest?.metadata.defaultSettings?.updateIntervalMinutes || 30
readonly property string updateTerminalCommand: pluginApi?.pluginSettings.updateTerminalCommand || pluginApi?.manifest?.metadata.defaultSettings?.updateTerminalCommand || ""
property int updateCount: 0
property var updater: null
property var customUpdater: ({
name: "custom",
cmdGetNumUpdates: pluginApi?.pluginSettings.customCmdGetNumUpdates || "",
cmdDoSystemUpdate: pluginApi?.pluginSettings.customCmdDoSystemUpdate || ""
})
//
// ------ Initialization ------
//
property var updaters: []
property int checkIndex: 0
property var current: null
FileView {
id: updaterFile
path: root.updaterJson
onLoaded: {
try {
root.updaters = JSON.parse(updaterFile.text());
root.runAllCmdChecks();
} catch (e) {
Logger.e("UpdateCount", "JSON Error in", root.updaterJson, ":", e);
}
}
}
function runAllCmdChecks() {
if (!root.updaters || root.updaters.length === 0) {
return;
}
root.checkIndex = 0;
root.checkNext();
}
function checkNext() {
if (root.checkIndex >= root.updaters.length) {
startGetNumUpdates();
return;
}
root.current = root.updaters[root.checkIndex++];
cmdCheckProc.command = ["sh", "-c", root.current.cmdCheck];
cmdCheckProc.running = true;
}
Process {
id: cmdCheckProc
onExited: function (exitCode, exitStatus) {
if (exitCode === 0) {
root.updater = root.current
Logger.i("UpdateCount", `Initialization finished. Detected updater: ${root.updater.name}.`);
root.startGetNumUpdates()
} else {
root.checkNext();
}
}
}
//
// ------ Get number of updates ------
//
Timer {
id: timerGetNumUpdates
interval: root.updateIntervalMinutes * root.minutesToMillis
running: true
repeat: true
onTriggered: root.startGetNumUpdates()
}
function startGetNumUpdates() {
const cmd = root.customUpdater.cmdGetNumUpdates || root.updater.cmdGetNumUpdates || "exit 1"
getNumUpdates.command = ["sh", "-c", cmd]
getNumUpdates.running = true;
}
Process {
id: getNumUpdates
stdout: StdioCollector {
onStreamFinished: {
var count = parseInt(text.trim());
root.updateCount = isNaN(count) ? -1 : count;
if (root.updateCount >= 0) {
Logger.i("UpdateCount", `Updates available: ${root.updateCount}`);
} else {
Logger.e("UpdateCount", `getNumUpdates return '${text.trim()}' cannot be parsed into int`);
}
}
}
}
//
// ------ Start update ------
//
function startDoSystemUpdate() {
const cmd = root.customUpdater.cmdDoSystemUpdate || root.updater.cmdDoSystemUpdate || "echo 'No update cmd found.'"
const term = root.updateTerminalCommand.trim();
const fullCmd = (term.indexOf("{}") !== -1) ? term.replace("{}", cmd) : term + " " + cmd;
Quickshell.execDetached(["sh", "-c", fullCmd]);
Logger.i("UpdateCount", `Executed update command: ${fullCmd}`);
}
}