From 49761167d08235a5dd09072d3da9ad951ef0a3b6 Mon Sep 17 00:00:00 2001 From: Josh Slate <6371351+joshuaslate@users.noreply.github.com> Date: Tue, 14 Jul 2026 19:55:48 -0700 Subject: [PATCH] feat: add shelly plugin (#2) * feat: add shelly plugin * docs: document click action * add license * feat: add setting to hide when there are no updates * remove some tags * address tags feedback * Update tags in plugin.toml for clarity --------- Co-authored-by: Lemmy --- shelly/README.md | 28 +++++++++ shelly/plugin.toml | 74 +++++++++++++++++++++++ shelly/poller.luau | 57 ++++++++++++++++++ shelly/thumbnail.webp | Bin 0 -> 43236 bytes shelly/translations/en.json | 68 +++++++++++++++++++++ shelly/widget.luau | 116 ++++++++++++++++++++++++++++++++++++ 6 files changed, 343 insertions(+) create mode 100644 shelly/README.md create mode 100644 shelly/plugin.toml create mode 100644 shelly/poller.luau create mode 100644 shelly/thumbnail.webp create mode 100644 shelly/translations/en.json create mode 100644 shelly/widget.luau diff --git a/shelly/README.md b/shelly/README.md new file mode 100644 index 0000000..cadadd4 --- /dev/null +++ b/shelly/README.md @@ -0,0 +1,28 @@ +# Shelly + +Shelly is a plugin that uses the [Shelly Arch Package Manager](https://github.com/Seafoam-Labs/Shelly-ALPM) to display package update information in a bar widget. + +## Plugin + +| Field | Value | +| ------- | --------------------------------------- | +| ID | `joshuaslate/shelly` | +| Entries | Service: `poller`; bar widget: `shelly` | + +## Requirements + +Install the Shelly Arch Package Manager from the [AUR](https://aur.archlinux.org/packages/shelly). + +Test that it works by running `shelly check-updates` in a terminal. If it returns a list of packages, then it is working correctly. + +## Settings + +| Setting | Type | Default | Description | +| ---------------------- | -------- | ------------ | -------------------------------------------------------------------------------------------------- | +| `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 | +| `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 | +| `glyph` | `glyph` | `package` | Bar widget icon. | +| `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 | diff --git a/shelly/plugin.toml b/shelly/plugin.toml new file mode 100644 index 0000000..4978028 --- /dev/null +++ b/shelly/plugin.toml @@ -0,0 +1,74 @@ +id = "joshuaslate/shelly" +name = "Shelly" +icon = "package" +version = "1.0.0" +min_noctalia = "5.0.0" +license = "MIT" +author = "joshuaslate" +dependencies = ["shelly"] +description = "A plugin that provides a widget for displaying system update information." +tags = ["system", "arch"] +deprecated = false + +[[setting]] +key = "interval" +type = "int" +label_key = "settings.interval.label" +description_key = "settings.interval.description" +default = 300 +min = 0 + +[[setting]] +key = "notify" +type = "bool" +label_key = "settings.notify.label" +description_key = "settings.notify.description" +default = false + +[[service]] +id = "update_poller" +entry = "poller.luau" + +[[widget]] +id = "shelly" +entry = "widget.luau" + + [[widget.setting]] + key = "hide_when_up_to_date" + type = "bool" + label_key = "settings.hide_when_up_to_date.label" + description_key = "settings.hide_when_up_to_date.description" + default = false + + [[widget.setting]] + key = "color" + type = "color" + label_key = "settings.color.label" + description_key = "settings.color.description" + default = "on_surface" + + [[widget.setting]] + key = "glyph" + type = "glyph" + label_key = "settings.glyph.label" + description_key = "settings.glyph.description" + default = "package" + + [[widget.setting]] + key = "glyph_color" + type = "color" + label_key = "settings.glyph_color.label" + description_key = "settings.glyph_color.description" + default = "on_surface" + + [[widget.setting]] + key = "click_action" + type = "select" + label_key = "settings.click_action.label" + description_key = "settings.click_action.description" + default = "open_gui" + options = [ + { value = "none", label_key = "settings.click_action.options.none" }, + { value = "open_gui", label_key = "settings.click_action.options.open_gui" }, + { value = "open_updater", label_key = "settings.click_action.options.open_updater" } + ] diff --git a/shelly/poller.luau b/shelly/poller.luau new file mode 100644 index 0000000..fdfd089 --- /dev/null +++ b/shelly/poller.luau @@ -0,0 +1,57 @@ +--!nonstrict + +type Update = { Name: string, Version: string, OldVersion: string?, DownloadSize: string? } + +type UpdateResult = { + Packages: { [number]: Update }, + Aur: { [number]: Update }, + Flatpak: { [number]: Update }, +} + +local updates: UpdateResult = { Packages = {}, Aur = {}, Flatpak = {} } +local updateError: string | nil = nil +local updateInterval = (noctalia.getConfig("interval") or 300)*1000 +local isPolling = false + +noctalia.setUpdateInterval(updateInterval) + +function refresh() + isPolling = true + + noctalia.runAsync("shelly check-updates --json", function(result) + isPolling = false + + if result.exitCode ~= 0 then + updateError = result.stderr + noctalia.state.set("updates", nil) + noctalia.state.set("update_error", updateError) + return + end + + local decoded = noctalia.json.decode(result.stdout) + if type(decoded) ~= "table" then + updateError = noctalia.tr("bar.tooltip.error.decode_json") + noctalia.state.set("update_error", updateError) + return + end + + updates = { + Packages = decoded.Packages or {}, + Aur = decoded.Aur or {}, + Flatpak = decoded.Flatpak or {}, + } + + noctalia.state.set("updates", updates) + noctalia.state.set("update_error", nil) + end) +end + +function update() + if isPolling then + return + end + + refresh() +end + +refresh() diff --git a/shelly/thumbnail.webp b/shelly/thumbnail.webp new file mode 100644 index 0000000000000000000000000000000000000000..0cbd49a89dfd0172b98737afff090614d82e19e3 GIT binary patch literal 43236 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 yD=KUSjm#$LCM3Kt<(? 0 }, { + ui.glyph({ name = glyph, size = 14, color = glyphColor, visible = glyph ~= "" }), + ui.label({ text = noctalia.trp("bar.text.updates", count), color = color }), + })) + + updateTooltip(count) +end + +noctalia.state.watch("updates", function(value) + local prevCount = countUpdates(updates) + local newCount = countUpdates(value) + + updates = value + + if notifyOnNewUpdates and newCount > prevCount then + noctalia.notify(noctalia.tr("notify.new_updates.title"), noctalia.trp("notify.new_updates.description", newCount)) + end + + render() +end) + +function onClick() + if click_action == "open_gui" then + local cmd = "shelly-ui" + + if not noctalia.commandExists(cmd) then + noctalia.notifyError("Shelly", noctalia.tr("bar.click_handler.error.missing_gui")) + return + end + + noctalia.runAsync(cmd) + elseif click_action == "open_updater" then + local cmd = "shelly" + + if not noctalia.commandExists(cmd) then + noctalia.notifyError("Shelly", noctalia.tr("bar.click_handler.error.missing_cli")) + return + end + + noctalia.runInTerminal(cmd .. " upgrade-all") + end +end + +render()