[shelly](fix): support shelly v3 (#182)

* updates for shelly v3

* new major for shelly v3

* fix: default option value
This commit is contained in:
Josh Slate
2026-07-31 17:18:32 -04:00
committed by GitHub
parent 125086f8f5
commit 083230d7f9
5 changed files with 78 additions and 22 deletions
+20 -15
View File
@@ -4,36 +4,41 @@ Shelly is a plugin that uses the [Shelly Arch Package Manager](https://github.co
## Plugin ## Plugin
| Field | Value | | Field | Value |
| ------- | --------------------------------------- | | ------- | ---------------------------------------------- |
| ID | `joshuaslate/shelly` | | ID | `joshuaslate/shelly` |
| Entries | Service: `update_poller`; bar widget: `shelly` | | Entries | Service: `update_poller`; bar widget: `shelly` |
## Requirements ## Requirements
Install the Shelly Arch Package Manager from the [AUR](https://aur.archlinux.org/packages/shelly). The `shelly` Install the Shelly Arch Package Manager (>= v3.0.0) from the [AUR](https://aur.archlinux.org/packages/shelly). The `shelly`
command must be available on `PATH`. command must be available on `PATH`.
Test that it works by running `shelly check-updates` in a terminal. If it returns a list of packages, then it is working correctly. Verify the correct version is installed by running `shelly --version` in a terminal. It should return a version number >= 3.0.0.
Test that it works by running `shelly list updates all` in a terminal. If it returns a list of packages, then it is working correctly.
## Usage ## Usage
Add the `shelly` widget from Noctalia's widget picker. It periodically checks Add the `shelly` widget from Noctalia's widget picker. It periodically checks
for available Arch package updates and shows their count and names in the bar for available Arch package updates and shows their count and names in the bar
tooltip. Click behavior is configurable: open Shelly's graphical interface, tooltip. Click behavior is configurable: open Shelly's graphical interface,
run `shelly upgrade-all` in a terminal, or do nothing. run `shelly upgrade all` in a terminal, or do nothing.
The `update_poller` service owns the periodic checks and can notify you when The `update_poller` service owns the periodic checks and can notify you when
new updates become available. new updates become available.
## Settings ## Settings
| Setting | Type | Default | Description | | Setting | Type | Default | Description |
| ---------------------- | -------- | ------------ | -------------------------------------------------------------------------------------------------- | | ---------------------- | -------- | ----------------- | -------------------------------------------------------------------------------------------------------- |
| `interval` | `int` | `300` | The interval (in seconds) between update checks | | `interval` | `int` | `300` | The interval (in seconds) between update checks |
| `notify` | `bool` | `false` | Whether or not you want to receive notifications when there are new package updates available | | `notify` | `bool` | `false` | Whether or not you want to receive notifications when there are new package updates available |
| `color` | `color` | `on_surface` | The text color for the bar widget | | `color` | `color` | `on_surface` | The text color for the bar widget |
| `glyph_color` | `color` | `on_surface` | The color of the glyph on the bar widget | | `bar_label` | `select` | `count_and_label` | The label to display in the bar widget when there are updates. Options: `count_only`, `count_and_label`. |
| `glyph` | `glyph` | `package` | Bar widget icon. | | `bar_font_size` | `int` | `14` | The size of the font displayed in the bar widget |
| `click_action` | `select` | `open_gui` | The action to perform when the bar widget is clicked. Options: `open_gui`, `open_updater`, `none`. | | `glyph_color` | `color` | `on_surface` | The color of the glyph on the bar widget |
| `hide_when_up_to_date` | `bool` | `false` | Whether or not to hide the bar widget when there are no package updates available | | `glyph` | `glyph` | `package` | Bar widget icon |
| `glyph_size` | `int` | `14` | The size of the glyph in the bar widget |
| `click_action` | `select` | `open_gui` | The action to perform when the bar widget is clicked. Options: `open_gui`, `open_updater`, `none`. |
| `hide_when_up_to_date` | `bool` | `false` | Whether or not to hide the bar widget when there are no package updates available |
+26 -1
View File
@@ -1,7 +1,7 @@
id = "joshuaslate/shelly" id = "joshuaslate/shelly"
name = "Shelly" name = "Shelly"
icon = "package" icon = "package"
version = "1.0.1" version = "2.0.0"
plugin_api = 3 plugin_api = 3
license = "MIT" license = "MIT"
author = "joshuaslate" author = "joshuaslate"
@@ -47,6 +47,24 @@ entry = "widget.luau"
description_key = "settings.color.description" description_key = "settings.color.description"
default = "on_surface" default = "on_surface"
[[widget.setting]]
key = "bar_label"
type = "select"
label_key = "settings.bar_label.label"
description_key = "settings.bar_label.description"
default = "count_and_label"
options = [
{ value = "count_and_label", label_key = "settings.bar_label.options.count_and_label" },
{ value = "count_only", label_key = "settings.bar_label.options.count_only" }
]
[[widget.setting]]
key = "bar_font_size"
type = "int"
label_key = "settings.bar_font_size.label"
description_key = "settings.bar_font_size.description"
default = 14
[[widget.setting]] [[widget.setting]]
key = "glyph" key = "glyph"
type = "glyph" type = "glyph"
@@ -61,6 +79,13 @@ entry = "widget.luau"
description_key = "settings.glyph_color.description" description_key = "settings.glyph_color.description"
default = "on_surface" default = "on_surface"
[[widget.setting]]
key = "glyph_size"
type = "int"
label_key = "settings.glyph_size.label"
description_key = "settings.glyph_size.description"
default = 14
[[widget.setting]] [[widget.setting]]
key = "click_action" key = "click_action"
type = "select" type = "select"
+9 -2
View File
@@ -18,7 +18,7 @@ noctalia.setUpdateInterval(updateInterval)
function refresh() function refresh()
isPolling = true isPolling = true
noctalia.runAsync("shelly check-updates --json", function(result) noctalia.runAsync("shelly list-updates all --json", function(result)
isPolling = false isPolling = false
if result.exitCode ~= 0 then if result.exitCode ~= 0 then
@@ -28,7 +28,14 @@ function refresh()
return return
end end
local decoded = noctalia.json.decode(result.stdout) local stdout = result.stdout
-- Shelly's JSON output may leak stderr into stdout. Remove stderr value to ensure valid JSON.
if result.stderr ~= "" then
stdout = stdout:gsub(result.stderr, "")
end
local decoded = noctalia.json.decode(stdout)
if type(decoded) ~= "table" then if type(decoded) ~= "table" then
updateError = noctalia.tr("bar.tooltip.error.decode_json") updateError = noctalia.tr("bar.tooltip.error.decode_json")
noctalia.state.set("update_error", updateError) noctalia.state.set("update_error", updateError)
+17 -1
View File
@@ -16,7 +16,7 @@
"tooltip": { "tooltip": {
"aur_title": "AUR", "aur_title": "AUR",
"error": { "error": {
"decode_json": "Failed to decode output from `shelly check-updates --json`" "decode_json": "Failed to decode output from `shelly list-updates all --json`"
}, },
"flatpak_title": "Flatpak", "flatpak_title": "Flatpak",
"no_updates": "System is up to date", "no_updates": "System is up to date",
@@ -30,6 +30,18 @@
} }
}, },
"settings": { "settings": {
"bar_font_size": {
"description": "The font size of the bar text.",
"label": "Bar Font Size"
},
"bar_label": {
"description": "Label to display in the bar.",
"label": "Bar Label",
"options": {
"count_only": "Count Only (e.g., 5)",
"count_and_label": "Count and Label (e.g., 5 Updates)"
}
},
"click_action": { "click_action": {
"description": "What happens when you click on the bar.", "description": "What happens when you click on the bar.",
"label": "Click Action", "label": "Click Action",
@@ -51,6 +63,10 @@
"description": "The color of the glyph.", "description": "The color of the glyph.",
"label": "Glyph Color" "label": "Glyph Color"
}, },
"glyph_size": {
"description": "The size of the glyph.",
"label": "Glyph Size"
},
"hide_when_up_to_date": { "hide_when_up_to_date": {
"description": "Whether to hide the bar when there are no updates available.", "description": "Whether to hide the bar when there are no updates available.",
"label": "Hide When Up-to-Date" "label": "Hide When Up-to-Date"
+6 -3
View File
@@ -2,10 +2,13 @@
local glyph = noctalia.getConfig("glyph") local glyph = noctalia.getConfig("glyph")
local color = noctalia.getConfig("color") or "on_surface" local color = noctalia.getConfig("color") or "on_surface"
local glyphColor = noctalia.getConfig("glyph_color") or color local glyphColor = noctalia.getConfig("glyph_color") or color
local glyphSize = noctalia.getConfig("glyph_size") or 14
local updateError = noctalia.state.get("update_error") local updateError = noctalia.state.get("update_error")
local notifyOnNewUpdates = noctalia.getConfig("notify") local notifyOnNewUpdates = noctalia.getConfig("notify")
local hideWhenUpToDate = noctalia.getConfig("hide_when_up_to_date") local hideWhenUpToDate = noctalia.getConfig("hide_when_up_to_date")
local click_action = noctalia.getConfig("click_action") or "open_gui" local click_action = noctalia.getConfig("click_action") or "open_gui"
local barLabelType = noctalia.getConfig("bar_label") or "count_and_label"
local barFontSize = noctalia.getConfig("bar_font_size") or 14
local updates = noctalia.state.get("updates") or { Packages = {}, Aur = {}, Flatpak = {} } local updates = noctalia.state.get("updates") or { Packages = {}, Aur = {}, Flatpak = {} }
local function countUpdates(scopedUpdates) local function countUpdates(scopedUpdates)
@@ -71,8 +74,8 @@ local function render()
local count = countUpdates(updates) local count = countUpdates(updates)
barWidget.render(container({ gap = 6, align = "center", visible = not hideWhenUpToDate or count > 0 }, { barWidget.render(container({ gap = 6, align = "center", visible = not hideWhenUpToDate or count > 0 }, {
ui.glyph({ name = glyph, size = 14, color = glyphColor, visible = glyph ~= "" }), ui.glyph({ name = glyph, size = glyphSize, color = glyphColor, visible = glyph ~= "" }),
ui.label({ text = noctalia.trp("bar.text.updates", count), color = color }), ui.label({ text = barLabelType == "count_only" and string.format("%d", count) or noctalia.trp("bar.text.updates", count), color = color, fontSize = barFontSize }),
})) }))
updateTooltip(count) updateTooltip(count)
@@ -109,7 +112,7 @@ function onClick()
return return
end end
noctalia.runInTerminal(cmd .. " upgrade-all") noctalia.runInTerminal(cmd .. " upgrade all")
end end
end end