summaryrefslogtreecommitdiff
path: root/services/Network.qml
blob: bfe6c12864b9a3e8aaedd9925c68e949c702d20d (plain)
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
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
pragma Singleton
// pragma ComponentBehavior: Bound

// TODO: move to rust or native Network modules
import Quickshell
import Quickshell.Io
import QtQuick

import qs.config

Singleton {
	id: root

	property bool wifi: true
	property bool ethernet: false
	property string networkName: ""
	property int networkStrength
	property string state: ethernet ? Icons.resource.network.wifi : (networkName.length >= 0 && networkName !== "lo") ? (networkStrength >= 90 ? Icons.resource.network.wifi.max : networkStrength >= 80 ? Icons.resource.network.wifi.high : networkStrength >= 60 ? Icons.resource.network.wifi.mid : networkStrength >= 40 ? Icons.resource.network.wifi.low : networkStrength >= 20 ? Icons.resource.network.wifi.min : Icons.resource.network.disconnected) : Icons.resource.network.disconnected

	function update() {
		updateConnectionType.startCheck();
		updateNetworkName.running = true;
		updateNetworkStrength.running = true;
	}

	Timer {
		interval: General.resourceUpdateInterval
		running: true
		repeat: true
		onTriggered: {
			root.update();
			interval = General.resourceUpdateInterval * 1000;
		}
	}

	Process {
		id: updateConnectionType
		property string buffer
		command: ["nmcli", "-t", "-f", "NAME,TYPE,DEVICE", "c", "show", "--active"]
		running: true
		function startCheck() {
			buffer = "";
			updateConnectionType.running = true;
		}
		stdout: SplitParser {
			onRead: data => {
				updateConnectionType.buffer += data + "\n";
			}
		}
		onExited: (exitCode, exitStatus) => {
			const lines = updateConnectionType.buffer.trim().split('\n');
			let hasEthernet = false;
			let hasWifi = false;
			lines.forEach(line => {
				if (line.includes("ethernet"))
					hasEthernet = true;
				else if (line.includes("wireless"))
					hasWifi = true;
			});
			root.ethernet = hasEthernet;
			root.wifi = hasWifi;
		}
	}

	Process {
		id: updateNetworkName
		command: ["sh", "-c", "nmcli -t -f NAME c show --active | head -1"]
		running: true
		stdout: SplitParser {
			onRead: data => {
				root.networkName = data;
			}
		}
	}

	Process {
		id: updateNetworkStrength
		running: true
		command: ["sh", "-c", "nmcli -f IN-USE,SIGNAL,SSID device wifi | awk '/^\*/{if (NR!=1) {print $2}}'"]
		stdout: SplitParser {
			onRead: data => {
				root.networkStrength = parseInt(data);
			}
		}
	}
}