From eeea68789caeebc3709dc5dcc513298c6af27b91 Mon Sep 17 00:00:00 2001
From: matt1432 <matt@nelim.org>
Date: Mon, 26 Feb 2024 01:23:19 -0500
Subject: [PATCH] feat(ags razer): add more props to monitor

---
 .../ags/config/ts/bar/items/razer-stats.ts    | 106 ++++++++++++------
 1 file changed, 69 insertions(+), 37 deletions(-)

diff --git a/modules/ags/config/ts/bar/items/razer-stats.ts b/modules/ags/config/ts/bar/items/razer-stats.ts
index 74170d3f..ebf068b9 100644
--- a/modules/ags/config/ts/bar/items/razer-stats.ts
+++ b/modules/ags/config/ts/bar/items/razer-stats.ts
@@ -1,63 +1,90 @@
+import { execAsync, interval } from 'resource:///com/github/Aylur/ags/utils.js';
 
 const { Box, Icon, Label } = Widget;
 
-const RAZER_POLL = 30000;
+const RAZER_POLL = 10000;
 const LOW_BATT = 20;
 
-
-// TODO: add charging indicator
-const RazerBat = Variable(-1, {
-    poll: [
-        RAZER_POLL,
-        [
-            'bash',
-            '-c',
-            "polychromatic-cli -n 'Razer Naga Pro (Wired)' -k" +
-            ' || ' +
-            "polychromatic-cli -n 'Razer Naga Pro (Wireless)' -k",
-        ],
-        (out) => {
-            const batteryMatches = out.split('\n')
-                .filter((i) => i.includes('Battery'))[0]
-                .match(/[0-9]+/);
-
-            let battery = batteryMatches !== null ?
-                parseInt(batteryMatches[0]) :
-                -1;
-
-            // Don't set to zero when in sleep mode
-            if (battery === 0 && RazerBat.value > 10) {
-                battery = RazerBat.value;
-            }
-
-            return battery;
-        },
-    ],
+const RazerBat = Variable({
+    battery: 0,
+    charging: false,
+    sleeping: false,
+    disconnected: true,
 });
 
+
+const fetchInfo = () => {
+    execAsync([
+        'bash',
+        '-c',
+        "polychromatic-cli -n 'Razer Naga Pro (Wired)' -k" +
+        ' || ' +
+        "polychromatic-cli -n 'Razer Naga Pro (Wireless)' -k",
+
+    ]).then((out) => {
+        const batteryMatches = out.split('\n')
+            .filter((i) => i.includes('Battery'))[0]
+            .match(/[0-9]+/);
+
+        let sleeping = false;
+        let battery = batteryMatches !== null ?
+            parseInt(batteryMatches[0]) :
+            0;
+
+        // Don't set to zero when in sleep mode
+        if (battery === 0 && RazerBat.value.battery > 10) {
+            battery = RazerBat.value.battery;
+            sleeping = true;
+        }
+
+        // If 'Wireless' isn't in the logs it means the cmd found 'Wired'
+        const charging = !out.includes('Wireless');
+
+        RazerBat.value = {
+            battery,
+            charging,
+            sleeping,
+            disconnected: false,
+        };
+    }).catch(() => {
+        RazerBat.value.disconnected = true;
+    });
+};
+
+interval(RAZER_POLL, fetchInfo);
+
+// TODO: add charging indicator
 export default () => Box({
     class_name: 'razer',
     children: [
         Icon({
             hpack: 'start',
             icon: RazerBat.bind().transform((v) => {
-                return v > -1 ?
-                    'mouse-razer-symbolic' :
-                    'content-loading-symbolic';
+                return v.disconnected ?
+                    'content-loading-symbolic' :
+                    'mouse-razer-symbolic';
             }),
             setup: (self) => {
                 self.hook(RazerBat, () => {
+                    const v = RazerBat.value;
+
+                    self.setCss(
+                        v.disconnected ?
+                            'margin-right: -5px;' :
+                            '',
+                    );
+
                     self.toggleClassName(
                         'high',
-                        RazerBat.value > 66,
+                        v.battery > 66,
                     );
                     self.toggleClassName(
                         'medium',
-                        RazerBat.value > LOW_BATT && RazerBat.value <= 66,
+                        v.battery > LOW_BATT && v.battery <= 66,
                     );
                     self.toggleClassName(
                         'low',
-                        RazerBat.value <= LOW_BATT,
+                        v.battery <= LOW_BATT,
                     );
                 });
             },
@@ -66,7 +93,12 @@ export default () => Box({
         Label({
             vpack: 'center',
             label: RazerBat.bind().transform((v) => {
-                return v !== -1 ? `${v}%` : '';
+                if (!v.disconnected) {
+                    // TODO: find better way to indicate charging
+                    return v.battery + (v.charging ? '󱐋' : '%');
+                }
+
+                return '';
             }),
         }),
     ],