From 222fec4875813ce382080bd7904b8a12e8bde25e Mon Sep 17 00:00:00 2001 From: MA Dingjie Date: Wed, 12 Aug 2026 21:34:17 +0800 Subject: [PATCH] Dev/mihomo control (#339) * Add Mihomo Control plugin Monitor and control a Mihomo (Clash Meta) external controller from the bar: live traffic graph, proxy mode, proxy-group management with latency tests, and core restart. Works locally (127.0.0.1) or remotely via host/port/secret settings. * Add Chinese (Simplified) translation * Add test-all latency button Adds a Test all button next to the Proxy groups heading that runs latency tests on every group sequentially, with a single summary notification. * Unify traffic and proxy groups section styles Give both sections the same card look: muted medium-weight heading on the left, secondary info on the right, and proxy-group cards restyled as bordered sub-cards inside the section. * Polish proxy group cards Show the selected proxy next to the bold group name (ECS > ecs-proxy), move the expand chevron to the type/members row where the list opens, and drop the list glyph from the card header. * Decouple heights of paired group cards Keep each card in a two-column row at its natural height instead of stretching the neighbor when one is expanded. * Use thumbnail generator to generate thumbnail * mihomo-control: theme-aware panel colors Use theme roles for traffic and latency colors so they stay readable in light mode, and keep the status chip's green/amber/red identity with darker light-mode shades. --- mihomo-control/README.md | 95 ++++ mihomo-control/icon-connecting.png | Bin 0 -> 25303 bytes mihomo-control/icon-offline.png | Bin 0 -> 23950 bytes mihomo-control/icon-online.png | Bin 0 -> 24491 bytes mihomo-control/icon.png | Bin 0 -> 14428 bytes mihomo-control/panel.luau | 482 ++++++++++++++++++ mihomo-control/plugin.toml | 94 ++++ mihomo-control/service.luau | 613 +++++++++++++++++++++++ mihomo-control/shortcut.luau | 33 ++ mihomo-control/thumbnail.webp | Bin 0 -> 55744 bytes mihomo-control/translations/en.json | 92 ++++ mihomo-control/translations/zh-Hans.json | 92 ++++ mihomo-control/widget.luau | 100 ++++ 13 files changed, 1601 insertions(+) create mode 100644 mihomo-control/README.md create mode 100644 mihomo-control/icon-connecting.png create mode 100644 mihomo-control/icon-offline.png create mode 100644 mihomo-control/icon-online.png create mode 100644 mihomo-control/icon.png create mode 100644 mihomo-control/panel.luau create mode 100644 mihomo-control/plugin.toml create mode 100644 mihomo-control/service.luau create mode 100644 mihomo-control/shortcut.luau create mode 100644 mihomo-control/thumbnail.webp create mode 100644 mihomo-control/translations/en.json create mode 100644 mihomo-control/translations/zh-Hans.json create mode 100644 mihomo-control/widget.luau diff --git a/mihomo-control/README.md b/mihomo-control/README.md new file mode 100644 index 0000000..13fbd34 --- /dev/null +++ b/mihomo-control/README.md @@ -0,0 +1,95 @@ +# Mihomo Control + +Monitor and control a Mihomo (Clash Meta) instance right from the Noctalia +bar: live traffic, proxy mode, proxy-group selection, latency tests and active +connections. It talks to the Mihomo external controller, which can run on this +machine (`127.0.0.1`) or on a remote host — just configure the IP, port and +secret. + +## Plugin + +| Field | Value | +| ------- | --------------------------- | +| ID | `mdj2812/mihomo-control` | +| Entries | Bar widget: `widget`; panel: `panel`; service: `service`; shortcut: `mode` | + +## Usage + +Add the **Mihomo Control** widget from the Add-widget picker. It shows the +current proxy mode (rule / global / direct); hover it for the connection +status, live download and upload rates, connection count and each proxy +group's current selection. Left-click the widget to toggle the control panel, +or open it with: + +```sh +noctalia msg panel-toggle mdj2812/mihomo-control:panel +``` + +The panel lets you switch the proxy mode (rule / global / direct), restart the +server, refresh the status, and manage every proxy group. Each group card +lists all of its members with their latency — sourced from mihomo's health +checks and refreshed by the group's **Test latency** button. Each card also +shows an overall latency (the selected member's, or the best tested one) right +in its subtitle, visible without expanding. Member lists are collapsed by +default; click a group header to expand it. Click a member to select it; the +current selection is marked with a dot. Use **Test all** next to the Proxy +groups heading to run a latency test on every group at once. + +Add the **Mihomo: Rule** shortcut from Settings → Control Center shortcuts to +quickly toggle between rule and global mode. + +Before the widget shows anything, enable the plugin's `service` entry — it owns +all communication with the external controller and streams the traffic data. + +## Settings + +| Setting | Type | Default | Description | +| ------------------- | ------- | ------------ | --------------------------------------------------------------------------- | +| Host | string | `127.0.0.1` | Hostname or IP of the Mihomo external controller. | +| Port | string | `9090` | Port of the Mihomo external controller. | +| Secret | string | *(empty)* | `secret` from your Mihomo config; empty when authentication is disabled. | +| HTTPS | bool | off | Use `https://` (external-controller-tls or a TLS reverse proxy). | +| Allow insecure TLS | bool | off | Skip certificate verification for self-signed TLS controllers. | +| Test URL | string | `https://www.gstatic.com/generate_204` | URL used for latency tests; empty uses each group's configured test URL. | +| Refresh interval | int | `2` | Seconds between status polls (1–60); traffic rates stream in real time. | + +## IPC + +The service exposes two IPC events for scripting and debugging: + +```sh +noctalia msg plugin mdj2812/mihomo-control:service all refresh +noctalia msg plugin mdj2812/mihomo-control:service all cmd '{"op":"mode","mode":"global"}' +``` + +`refresh` re-polls version, config, connections and proxy groups. `cmd` accepts +the same command tables the panel sends (`mode`, `select`, `delay_test`, +`delay_test_all`, `restart`, `close_connections`, `refresh`). + +## Notes + +- The plugin only talks HTTP to the configured external controller. It spawns + no processes, runs no external commands, and writes no files. +- The bar widget and card use the Clash cat logo (`icon.png`), the official + mascot of the Clash / mihomo project. In the bar widget the cat is tinted by + connection status: green online, amber while connecting, red offline; the + panel uses the neutral logo next to its own status indicator. +- The traffic rate uses mihomo's streaming `GET /traffic` endpoint; status, + connections and proxy groups are polled every refresh interval. +- The secret is stored in your Noctalia config and sent as the standard + `Authorization: Bearer ` header. It is sent in plain text unless + HTTPS is enabled — use HTTPS for remote controllers. +- **Restart** posts to `/restart`, which re-executes the core; the plugin + reconnects automatically once it is back. There is no API endpoint that + stops the core — switching the mode to `direct` is the closest equivalent. +- A latency test where every node fails is reported as *all nodes timed out*: + mihomo answers the delay endpoint with HTTP 504 in that case. If that keeps + happening, set **Test URL** to an endpoint your network can reach. + +## Development + +- `service.luau` — headless API backend, publishes `mihomo.*` state. +- `widget.luau` — bar widget (rates + tooltip). +- `panel.luau` — control panel. +- `shortcut.luau` — rule/global mode toggle. +- `translations/` — user-facing strings. diff --git a/mihomo-control/icon-connecting.png b/mihomo-control/icon-connecting.png new file mode 100644 index 0000000000000000000000000000000000000000..b48ff0d17e1f781ae81e12adbba61a531f65ce17 GIT binary patch literal 25303 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 literal 0 HcmV?d00001 diff --git a/mihomo-control/icon-online.png b/mihomo-control/icon-online.png new file mode 100644 index 0000000000000000000000000000000000000000..a4cfddb7d343a1192c175cb78744405c828d4cfa GIT binary patch literal 24491 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 literal 0 HcmV?d00001 diff --git a/mihomo-control/icon.png b/mihomo-control/icon.png new file mode 100644 index 0000000000000000000000000000000000000000..c624b94d23b333e4cb2406ccc04c9599552e0bac GIT binary patch literal 14428 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 literal 0 HcmV?d00001 diff --git a/mihomo-control/panel.luau b/mihomo-control/panel.luau new file mode 100644 index 0000000..955edfa --- /dev/null +++ b/mihomo-control/panel.luau @@ -0,0 +1,482 @@ +--!nonstrict +-- Mihomo Control — control panel. +-- +-- A settings-style panel driven by the service's "mihomo.*" state. Every +-- action goes through the "mihomo.command" channel so the service stays the +-- single owner of HTTP access. +-- +-- Sections: +-- 1. Header: title, connection status, close button. +-- 2. Connection: mode select (rule/global/direct) and refresh button. +-- 3. Traffic: live up/down rates, totals, memory, active connections, and +-- a "close all connections" action. +-- 4. Proxy groups: one card per group — current selection, member select, +-- and a latency-test button. + +local MODES = { "rule", "global", "direct" } + +local snapshot = { + connection = {}, + config = {}, + traffic = {}, + connections = {}, + groups = {}, +} + +-- Rolling traffic-rate history for the graph: one sample per published value +-- change, capped so the window stays fixed. +local TRAFFIC_HISTORY = 90 +local down_history = {} +local up_history = {} + +local function record_traffic(traffic) + local down = tonumber(traffic.down) or 0 + local up = tonumber(traffic.up) or 0 + local last_index = #down_history + if last_index == 0 or down_history[last_index] ~= down or up_history[last_index] ~= up then + table.insert(down_history, down) + table.insert(up_history, up) + if #down_history > TRAFFIC_HISTORY then + table.remove(down_history, 1) + table.remove(up_history, 1) + end + end +end + +local function normalized_series(values, peak) + local out = {} + for i, value in ipairs(values) do + out[i] = peak > 0 and value / peak or 0 + end + return out +end + +local function refresh_snapshot() + snapshot.connection = noctalia.state.get("mihomo.connection") or snapshot.connection + snapshot.config = noctalia.state.get("mihomo.config") or snapshot.config + snapshot.traffic = noctalia.state.get("mihomo.traffic") or snapshot.traffic + snapshot.connections = noctalia.state.get("mihomo.connections") or snapshot.connections + snapshot.groups = noctalia.state.get("mihomo.groups") or snapshot.groups + record_traffic(snapshot.traffic) +end + +local function send_command(cmd) + cmd.seq = math.floor(os.clock() * 1000000) + noctalia.state.set("mihomo.command", cmd) +end + +-- Expansion state for proxy-group cards: collapsed by default so long member +-- lists do not flood the panel. Persists across re-renders while the panel +-- script stays loaded; a fresh panel starts collapsed again. +local expanded_groups = {} +local render -- forward declaration; assigned below + +local function toggle_group(group_name) + expanded_groups[group_name] = not expanded_groups[group_name] + render() +end + +-- ── Formatting helpers (small duplicates per the plugin sandbox) ──────────── + +local function format_rate(bytes_per_second) + local value = tonumber(bytes_per_second) or 0 + if value >= 1024 * 1024 * 1024 then + return string.format("%.2f GB/s", value / (1024 * 1024 * 1024)) + end + if value >= 1024 * 1024 then + return string.format("%.1f MB/s", value / (1024 * 1024)) + end + if value >= 1024 then + return string.format("%.1f KB/s", value / 1024) + end + return string.format("%d B/s", value) +end + +local function format_total(bytes) + local value = tonumber(bytes) or 0 + if value >= 1024 ^ 4 then + return string.format("%.2f TB", value / (1024 ^ 4)) + end + if value >= 1024 ^ 3 then + return string.format("%.2f GB", value / (1024 ^ 3)) + end + if value >= 1024 ^ 2 then + return string.format("%.1f MB", value / (1024 ^ 2)) + end + if value >= 1024 then + return string.format("%.1f KB", value / 1024) + end + return string.format("%d B", value) +end + +local function latency_text(delay) + if delay == nil then + return "—" + end + if delay > 0 then + return `{delay} ms` + end + return noctalia.tr("panel.timeout") +end + +local function latency_color(delay) + if delay == nil then + return "on_surface_variant" + end + if delay > 0 then + if delay <= 300 then + return "primary" + end + if delay <= 800 then + return "warning" + end + return "error" + end + return "error" +end + +-- The status chip keeps the classic green/amber/red identity instead of theme +-- roles, but uses darker shades in light mode so it stays readable on light +-- surfaces. +local function status_color() + if noctalia.isDarkMode() then + return { online = "#4ade80", connecting = "#facc15", offline = "#f87171" } + end + return { online = "#15803d", connecting = "#a16207", offline = "#b91c1c" } +end + +-- A single "overall" latency per group: the currently selected member's delay +-- (Selector/URLTest/Fallback), or the best tested member latency otherwise +-- (LoadBalance has no selection). Returns 0 when every tested member failed. +local function group_latency(group) + if group.now and group.now ~= "" then + for _, member in ipairs(group.members) do + if member.name == group.now and member.delay ~= nil then + return member.delay + end + end + end + + local best = nil + local any_tested = false + for _, member in ipairs(group.members) do + local delay = member.delay + if delay ~= nil then + any_tested = true + if delay > 0 and (best == nil or delay < best) then + best = delay + end + end + end + if best ~= nil then + return best + end + if any_tested then + return 0 + end + return nil +end + +-- ── UI helpers ────────────────────────────────────────────────────────────── + +local function connection_text() + local conn = snapshot.connection + local endpoint = `{conn.host or ""}:{conn.port or ""}` + if conn.status == "online" then + local version = tostring(conn.version or "") + return version ~= "" + and noctalia.tr("panel.online_with_version", { version = version, endpoint = endpoint }) + or noctalia.tr("panel.online_plain", { endpoint = endpoint }) + end + if conn.status == "connecting" then + return endpoint + end + local err = tostring(conn.error or "") + return err ~= "" + and noctalia.tr("panel.offline_with_error", { error = err }) + or noctalia.tr("panel.offline_plain", { endpoint = endpoint }) +end + +local function status_chip() + local conn = snapshot.connection + local online = conn.status == "online" + local connecting = conn.status == "connecting" + local colors = status_color() + local text = online + and noctalia.tr("panel.status_online") + or (connecting and noctalia.tr("panel.status_connecting") or noctalia.tr("panel.status_offline")) + local color = online and colors.online or (connecting and colors.connecting or colors.offline) + return ui.row({ gap = 6, align = "center", fill = "surface/0.6", radius = 999, paddingH = 10, paddingV = 4 }, { + ui.box({ width = 8, height = 8, radius = 4, fill = color }), + ui.label({ text = text, fontSize = 12, color = "on_surface_variant" }), + }) +end + +local function controls_row() + local mode = snapshot.config.mode or "rule" + local index = 0 + for i, candidate in MODES do + if candidate == mode then + index = i - 1 + break + end + end + return ui.row({ gap = 8, align = "center" }, { + ui.select({ + options = { + noctalia.tr("panel.mode_rule"), + noctalia.tr("panel.mode_global"), + noctalia.tr("panel.mode_direct"), + }, + selectedIndex = index, + onChange = function(index_text) + local chosen = MODES[(tonumber(index_text) or 0) + 1] + if chosen then + send_command({ op = "mode", mode = chosen }) + end + end, + }), + ui.button({ + text = noctalia.tr("panel.restart"), + variant = "outline", + onClick = function() + send_command({ op = "restart" }) + end, + }), + }) +end + +local function traffic_card() + local traffic = snapshot.traffic + local connections = snapshot.connections + local peak = 1 + for _, value in ipairs(down_history) do + if value > peak then + peak = value + end + end + for _, value in ipairs(up_history) do + if value > peak then + peak = value + end + end + return ui.column({ gap = 10, fill = "surface/0.5", radius = 12, padding = 12 }, { + ui.row({ justify = "space_between", align = "center" }, { + ui.label({ text = noctalia.tr("panel.traffic"), fontWeight = "medium", color = "on_surface_variant" }), + ui.label({ + text = `{connections.count or 0} {noctalia.tr("panel.connections")}`, + color = "on_surface_variant", + fontSize = 12, + }), + }), + ui.graph({ + values = normalized_series(down_history, peak), + values2 = normalized_series(up_history, peak), + color = "primary", + color2 = "secondary", + lineWidth = 2, + fillOpacity = 0.15, + height = 72, + }), + ui.row({ gap = 16, align = "center" }, { + ui.label({ text = `▼ {format_rate(traffic.down)}`, fontSize = 16, fontWeight = "bold", color = "primary" }), + ui.label({ text = `▲ {format_rate(traffic.up)}`, fontSize = 16, fontWeight = "bold", color = "secondary" }), + }), + ui.row({ gap = 16, align = "center" }, { + ui.label({ + text = `↓ {format_total(traffic.downTotal)} · ↑ {format_total(traffic.upTotal)} · {format_total(connections.memory)} {noctalia.tr("panel.memory")}`, + color = "on_surface_variant", + fontSize = 12, + }), + }), + }) +end + +local function group_card(group) + local name_text = group.name + if group.hidden == true then + name_text = name_text .. ` ({noctalia.tr("panel.hidden")})` + end + local expanded = expanded_groups[group.name] == true + local overall = group_latency(group) + + local name_children = { + ui.label({ text = name_text, fontWeight = "bold" }), + } + if group.now and group.now ~= "" then + table.insert(name_children, ui.label({ text = ">", color = "on_surface_variant" })) + table.insert(name_children, ui.label({ + text = group.now, + color = "on_surface_variant", + fontSize = 12, + flexGrow = 1, + })) + end + + local children = { + ui.row({ gap = 6, align = "center", justify = "space_between", onClick = function() + toggle_group(group.name) + end }, { + ui.row({ gap = 4, align = "center", flexGrow = 1 }, name_children), + ui.button({ + glyph = "activity", + tooltip = noctalia.tr("panel.delay_test"), + variant = "ghost", + onClick = function() + send_command({ op = "delay_test", group = group.name }) + end, + }), + }), + ui.row({ gap = 6, align = "center", justify = "space_between", onClick = function() + toggle_group(group.name) + end }, { + ui.button({ + glyph = expanded and "chevron-down" or "chevron-right", + variant = "ghost", + onClick = function() + toggle_group(group.name) + end, + }), + ui.label({ + text = `{group.type or ""} · {noctalia.trp("panel.members_count", #group.members)}`, + color = "on_surface_variant", + fontSize = 12, + flexGrow = 1, + }), + ui.label({ + text = latency_text(overall), + fontSize = 12, + fontWeight = "medium", + color = latency_color(overall), + }), + }), + } + + if expanded and #group.members > 0 then + local member_rows = {} + for _, member in ipairs(group.members) do + local is_current = member.name == group.now + local delay_text = latency_text(member.delay) + local delay_color = latency_color(member.delay) + table.insert(member_rows, ui.row({ gap = 6, align = "center", onClick = function() + send_command({ op = "select", group = group.name, proxy = member.name }) + end }, { + ui.box({ width = 6, height = 6, radius = 3, fill = is_current and "primary" or "surface_variant" }), + ui.label({ + text = member.name, + flexGrow = 1, + color = is_current and "on_surface" or "on_surface_variant", + fontSize = 12, + }), + ui.label({ text = delay_text, fontSize = 12, color = delay_color }), + })) + end + table.insert(children, ui.column({ gap = 3 }, member_rows)) + elseif expanded then + table.insert(children, ui.label({ + text = noctalia.tr("panel.no_members"), + color = "on_surface_variant", + fontSize = 12, + })) + end + + return ui.column({ + gap = 8, + border = "outline", + borderWidth = 1, + radius = 10, + padding = 10, + flexGrow = 1, + }, children) +end + +render = function() + local groups = type(snapshot.groups) == "table" and snapshot.groups or {} + + local body = { + controls_row(), + traffic_card(), + } + + if #groups > 0 then + local group_children = { + ui.row({ align = "center", gap = 8 }, { + ui.label({ + text = noctalia.tr("panel.proxy_groups"), + fontWeight = "medium", + color = "on_surface_variant", + flexGrow = 1, + }), + ui.button({ + text = noctalia.tr("panel.test_all"), + variant = "ghost", + onClick = function() + send_command({ op = "delay_test_all" }) + end, + }), + }), + } + for i = 1, #groups, 2 do + local row_children = { group_card(groups[i]) } + if groups[i + 1] then + table.insert(row_children, group_card(groups[i + 1])) + else + table.insert(row_children, ui.box({ flexGrow = 1 })) + end + table.insert(group_children, ui.row({ gap = 10, align = "start" }, row_children)) + end + table.insert(body, ui.column({ gap = 10, fill = "surface/0.5", radius = 12, padding = 12 }, group_children)) + else + table.insert(body, ui.column({ gap = 10, fill = "surface/0.5", radius = 12, padding = 12 }, { + ui.label({ text = noctalia.tr("panel.proxy_groups"), fontWeight = "medium", color = "on_surface_variant" }), + ui.label({ text = noctalia.tr("panel.no_groups"), color = "on_surface_variant" }), + })) + end + + panel.render(ui.column({ flexGrow = 1, gap = 12 }, { + ui.column({ gap = 6 }, { + ui.row({ align = "center", gap = 8 }, { + ui.image({ path = "icon.png", width = 16, height = 16 }), + ui.label({ text = noctalia.tr("panel.title"), fontSize = 16, fontWeight = "bold", flexGrow = 1 }), + status_chip(), + ui.button({ + glyph = "refresh", + tooltip = noctalia.tr("panel.refresh"), + variant = "ghost", + onClick = function() + send_command({ op = "refresh" }) + end, + }), + ui.button({ + glyph = "close", + onClick = function() + panel.close() + end, + }), + }), + ui.label({ text = connection_text(), color = "on_surface_variant", fontSize = 12 }), + }), + ui.scroll({ flexGrow = 1, gap = 12 }, body), + })) +end + +for _, key in { + "mihomo.connection", + "mihomo.config", + "mihomo.traffic", + "mihomo.connections", + "mihomo.groups", +} do + noctalia.state.watch(key, function(_value) + refresh_snapshot() + render() + end) +end + +function onOpen(_context) + refresh_snapshot() + render() +end + +refresh_snapshot() +render() diff --git a/mihomo-control/plugin.toml b/mihomo-control/plugin.toml new file mode 100644 index 0000000..8d13564 --- /dev/null +++ b/mihomo-control/plugin.toml @@ -0,0 +1,94 @@ +# Mihomo Control — monitor and control a Mihomo (Clash Meta) external +# controller: live traffic, proxy mode, group selection, latency tests and +# active connections, locally (127.0.0.1) or on a remote host. +# +# The service entry owns every HTTP request and publishes "mihomo.*" state; +# the widget, panel and shortcut are pure subscribers and send commands +# through the "mihomo.command" state channel. + +id = "mdj2812/mihomo-control" +name = "Mihomo Control" +version = "0.1.0" +plugin_api = 9 +author = "mdj2812" +license = "MIT" +icon = "cat" +description = "Monitor and control Mihomo (Clash Meta) — live traffic, proxy mode, group selection, and connections, local or remote." +tags = ["network", "indicator", "utility", "bar", "panel", "service", "shortcut"] +dependencies = [] + +# ── Shared settings ────────────────────────────────────────────────────────── +[[setting]] +key = "host" +type = "string" +default = "127.0.0.1" +label_key = "settings.host.label" +description_key = "settings.host.description" + +[[setting]] +key = "port" +type = "string" +default = "9090" +label_key = "settings.port.label" +description_key = "settings.port.description" + +[[setting]] +key = "secret" +type = "string" +default = "" +label_key = "settings.secret.label" +description_key = "settings.secret.description" + +[[setting]] +key = "use_https" +type = "bool" +default = false +advanced = true +label_key = "settings.use_https.label" +description_key = "settings.use_https.description" + +[[setting]] +key = "allow_insecure_tls" +type = "bool" +default = false +advanced = true +label_key = "settings.allow_insecure_tls.label" +description_key = "settings.allow_insecure_tls.description" + +[[setting]] +key = "test_url" +type = "string" +default = "https://www.gstatic.com/generate_204" +label_key = "settings.test_url.label" +description_key = "settings.test_url.description" + +[[setting]] +key = "refresh_interval" +type = "int" +default = 2 +min = 1 +max = 60 +advanced = true +label_key = "settings.refresh_interval.label" +description_key = "settings.refresh_interval.description" + +# ── Entries ────────────────────────────────────────────────────────────────── +[[widget]] +id = "widget" +entry = "widget.luau" + +[[panel]] +id = "panel" +entry = "panel.luau" +width = 560 +height = 720 +placement = "floating" +position = "center" + +[[service]] +id = "service" +entry = "service.luau" + +[[shortcut]] +id = "mode" +entry = "shortcut.luau" diff --git a/mihomo-control/service.luau b/mihomo-control/service.luau new file mode 100644 index 0000000..bd0f24b --- /dev/null +++ b/mihomo-control/service.luau @@ -0,0 +1,613 @@ +--!nonstrict +-- Mihomo Control — background service. +-- +-- This entry owns every request to the Mihomo external controller +-- (http(s)://host:port) and publishes the results as shared "mihomo.*" state. +-- The widget, panel and shortcut never touch the network; to make the service +-- act they write a command table to "mihomo.command": +-- +-- { op = "select", group = "", proxy = "" } +-- { op = "mode", mode = "rule" | "global" | "direct" } +-- { op = "delay_test", group = "" } +-- { op = "restart" } POST /restart (core re-execs) +-- { op = "close_connections" } +-- { op = "refresh" } +-- +-- Endpoints used (MetaCubeX/Meta-Docs "API" reference): +-- GET /version /configs /connections /proxies polling +-- GET /traffic streamed (httpStream) +-- PATCH /configs {"mode": ...} switch proxy mode +-- PUT /proxies/ {"name": ...} select group member +-- GET /group//delay?url=..&timeout=.. latency test +-- DELETE /connections close all connections + +local MODES = { rule = true, global = true, direct = true } +local DEFAULT_TEST_URL = "https://www.gstatic.com/generate_204" +local GROUPS_REFRESH_EVERY = 5 -- every Nth tick, re-fetch /proxies +local STREAM_RETRY_EVERY = 5 -- ticks between traffic-stream retry attempts + +-- ── Settings ──────────────────────────────────────────────────────────────── + +local settings = { + host = "127.0.0.1", + port = 9090, + secret = "", + use_https = false, + insecure = false, + test_url = "", + interval = 2, +} + +local function reload_settings() + local host = noctalia.getConfig("host") + local port = noctalia.getConfig("port") + local secret = noctalia.getConfig("secret") + local test_url = noctalia.getConfig("test_url") + local interval = tonumber(noctalia.getConfig("refresh_interval")) or 2 + + settings.host = type(host) == "string" and host ~= "" and host or "127.0.0.1" + local port_number = tonumber(port) + settings.port = (type(port_number) == "number" and port_number >= 1 and port_number <= 65535) + and math.floor(port_number) + or 9090 + settings.secret = type(secret) == "string" and secret or "" + settings.use_https = noctalia.getConfig("use_https") == true + settings.insecure = noctalia.getConfig("allow_insecure_tls") == true + settings.test_url = type(test_url) == "string" and noctalia.string.trim(test_url) or "" + settings.interval = math.max(1, math.min(60, interval)) +end + +local function base_url() + local scheme = settings.use_https and "https" or "http" + return `{scheme}://{settings.host}:{settings.port}` +end + +local function auth_headers() + if settings.secret == "" then + return {} + end + return { `Authorization: Bearer {settings.secret}` } +end + +local function json_headers() + local headers = { "Content-Type: application/json" } + for _, header in auth_headers() do + table.insert(headers, header) + end + return headers +end + +-- ── Shared state ──────────────────────────────────────────────────────────── + +local state = { + connection = { + status = "connecting", -- connecting | online | offline + host = settings.host, + port = settings.port, + version = "", + meta = false, + error = "", + }, + config = { mode = "rule", mixedPort = 0, port = 0, socksPort = 0, allowLan = false, ipv6 = false }, + traffic = { up = 0, down = 0, upTotal = 0, downTotal = 0 }, + connections = { count = 0, downloadTotal = 0, uploadTotal = 0, memory = 0 }, + groups = {}, + delay = {}, +} + +local function publish(key) + noctalia.state.set("mihomo." .. key, state[key]) +end + +local function set_online() + state.connection.status = "online" + state.connection.error = "" + publish("connection") +end + +local function set_offline(err) + state.connection.status = "offline" + state.connection.error = err or "" + publish("connection") +end + +-- ── HTTP helpers ──────────────────────────────────────────────────────────── + +local function request(method, path, headers, body, on_done) + local req = { + url = base_url() .. path, + method = method, + headers = headers, + } + if body ~= nil then + req.body = noctalia.json.encode(body) + end + if settings.insecure then + req.allow_insecure_tls = true + end + noctalia.http(req, function(res) + on_done(res) + end) +end + +local function success(res) + return res.ok and res.status >= 200 and res.status < 300 +end + +local function decode(body) + local ok, data = pcall(noctalia.json.decode, body) + if ok and type(data) == "table" then + return data + end + return nil +end + +-- ── Polling ───────────────────────────────────────────────────────────────── + +local function poll_version() + request("GET", "/version", auth_headers(), nil, function(res) + if not success(res) then + local reason + if res.status == 401 then + reason = "unauthorized" + elseif not res.ok then + reason = "connection failed" + else + reason = `HTTP {res.status}` + end + set_offline(reason) + return + end + local data = decode(res.body) + if data then + -- Some builds report "v1.19.0", others "1.19.0"; normalize so the UI + -- never shows a doubled or forced "v". + state.connection.version = tostring(data.version or ""):gsub("^v", "") + state.connection.meta = data.meta == true + set_online() + end + end) +end + +local function poll_configs() + request("GET", "/configs", auth_headers(), nil, function(res) + if not success(res) then + return + end + local data = decode(res.body) + if data then + state.config.mode = type(data.mode) == "string" and data.mode or state.config.mode + state.config.mixedPort = tonumber(data["mixed-port"]) or 0 + state.config.port = tonumber(data.port) or 0 + state.config.socksPort = tonumber(data["socks-port"]) or 0 + state.config.allowLan = data["allow-lan"] == true + state.config.ipv6 = data.ipv6 == true + publish("config") + end + end) +end + +local function poll_connections() + request("GET", "/connections", auth_headers(), nil, function(res) + if not success(res) then + return + end + local data = decode(res.body) + if data then + state.connections.count = type(data.connections) == "table" and #data.connections or 0 + state.connections.downloadTotal = tonumber(data.downloadTotal) or 0 + state.connections.uploadTotal = tonumber(data.uploadTotal) or 0 + state.connections.memory = tonumber(data.memory) or 0 + publish("connections") + end + end) +end + +-- ── Proxy groups ──────────────────────────────────────────────────────────── + +local function merge_delays(group_name) + local delays = state.delay[group_name] + if type(delays) ~= "table" or type(delays.byName) ~= "table" then + return + end + for _, group in state.groups do + if group.name == group_name then + for _, member in group.members do + local delay = delays.byName[member.name] + if delay ~= nil then + member.delay = delay + end + end + end + end +end + +local function poll_proxies() + request("GET", "/proxies", auth_headers(), nil, function(res) + if not success(res) then + return + end + local data = decode(res.body) + if not data or type(data.proxies) ~= "table" then + return + end + + -- Every proxy (and nested group) carries a `history` array with the last + -- known delay from mihomo's health checks; 0 means the last probe failed. + -- Use the newest entry as each proxy's latency so the panel can show + -- per-node latencies without waiting for a manual test. + local proxy_delays = {} + for name, info in data.proxies do + if type(info) == "table" and type(info.history) == "table" and #info.history > 0 then + local last = info.history[#info.history] + if type(last) == "table" and last.delay ~= nil then + proxy_delays[tostring(name)] = tonumber(last.delay) or 0 + end + end + end + + local groups = {} + for name, info in data.proxies do + -- Any entry with an `all` list is a proxy group (Selector, URLTest, + -- Fallback, LoadBalance, and Relay on forks that still ship it). + -- Filtering by type would silently drop group kinds we did not think of. + if type(info) == "table" and type(info.all) == "table" then + local members = {} + for _, member_name in info.all do + table.insert(members, { + name = tostring(member_name), + delay = proxy_delays[tostring(member_name)], + }) + end + table.insert(groups, { + name = tostring(name), + type = tostring(info.type), + now = info.now ~= nil and tostring(info.now) or nil, + hidden = info.hidden == true, + testUrl = type(info.testUrl) == "string" and info.testUrl or DEFAULT_TEST_URL, + members = members, + }) + end + end + table.sort(groups, function(a, b) + return a.name < b.name + end) + state.groups = groups + for _, group in groups do + merge_delays(group.name) + end + publish("groups") + end) +end + +-- ── Traffic stream ────────────────────────────────────────────────────────── + +local traffic_stream = nil +local stream_attempt_tick = -100 + +local function start_traffic_stream() + if traffic_stream ~= nil then + return + end + traffic_stream = noctalia.httpStream( + { + url = base_url() .. "/traffic", + headers = auth_headers(), + allow_insecure_tls = settings.insecure, + }, + function(line) + if line == "" then + return + end + local data = decode(line) + if data then + state.traffic.up = tonumber(data.up) or state.traffic.up + state.traffic.down = tonumber(data.down) or state.traffic.down + state.traffic.upTotal = tonumber(data.upTotal) or state.traffic.upTotal + state.traffic.downTotal = tonumber(data.downTotal) or state.traffic.downTotal + publish("traffic") + end + end, + function(result) + traffic_stream = nil + if result and not result.ok then + stream_attempt_tick = -1 -- retry soon + end + end + ) + if traffic_stream == nil then + stream_attempt_tick = -1 -- could not start; retry later + end +end + +-- ── Commands ──────────────────────────────────────────────────────────────── + +local last_cmd_seq = 0 + +local function run_delay_test(group_name, opts) + local silent = opts ~= nil and opts.silent == true + local on_done = opts ~= nil and opts.on_done + local function finish() + if on_done then + on_done() + end + end + + local group = nil + for _, candidate in state.groups do + if candidate.name == group_name then + group = candidate + end + end + local test_url = settings.test_url ~= "" + and settings.test_url + or (group and group.testUrl or DEFAULT_TEST_URL) + local path = "/group/" + .. noctalia.string.urlEncode(group_name) + .. "/delay?url=" + .. noctalia.string.urlEncode(test_url) + .. "&timeout=5000" + + request("GET", path, auth_headers(), nil, function(res) + if res.status == 504 then + -- mihomo reports a failed group latency test as HTTP 504 Gateway Timeout + -- (every node timed out or errored). That is a test result, not a + -- request failure, so surface it as such and drop stale latencies. + state.delay[group_name] = { tested = 0, timedOut = true, byName = {}, at = os.time() } + for _, candidate in state.groups do + if candidate.name == group_name then + for _, member in candidate.members do + member.delay = 0 -- every member failed, show as timeout + end + end + end + publish("groups") + publish("delay") + if not silent then + noctalia.notify(noctalia.tr("notify.delay_done"), noctalia.tr("notify.delay_timeout")) + end + finish() + return + end + if not success(res) then + if not silent then + noctalia.notifyError(noctalia.tr("notify.request_failed"), `HTTP {res.status}`) + end + finish() + return + end + local data = decode(res.body) + if not data then + finish() + return + end + + local count = 0 + local by_name = {} + for name, delay in data do + count += 1 + by_name[tostring(name)] = tonumber(delay) + end + + local selected_delay = nil + local selected = group and group.now + if selected and by_name[selected] ~= nil then + selected_delay = by_name[selected] + end + + state.delay[group_name] = { + tested = count, + selectedDelay = selected_delay, + byName = by_name, + at = os.time(), + } + merge_delays(group_name) + publish("groups") + publish("delay") + + local message = selected_delay ~= nil + and noctalia.tr("notify.delay_body", { count = count, delay = selected_delay }) + or noctalia.tr("notify.delay_body_no_selection", { count = count }) + if not silent then + noctalia.notify(noctalia.tr("notify.delay_done"), message) + end + finish() + end) +end + +-- Run latency tests for every group, one at a time, with a single summary +-- notification at the end. +local function test_all_groups() + local queue = {} + for _, group in state.groups do + table.insert(queue, group.name) + end + if #queue == 0 then + return + end + + local index = 1 + local function next_test() + if index > #queue then + noctalia.notify(noctalia.tr("notify.delay_all_done")) + return + end + local name = queue[index] + index += 1 + run_delay_test(name, { silent = true, on_done = next_test }) + end + next_test() +end + +local function handle_command(cmd) + local op = cmd.op + if op == "refresh" then + poll_version() + poll_configs() + poll_connections() + poll_proxies() + return + end + if op == "mode" then + local mode = cmd.mode + if MODES[mode] then + request("PATCH", "/configs", json_headers(), { mode = mode }, function(res) + if success(res) then + state.config.mode = mode + publish("config") + noctalia.notify( + noctalia.tr("notify.mode_changed"), + noctalia.tr("panel.mode_" .. mode) + ) + else + noctalia.notifyError(noctalia.tr("notify.request_failed"), `HTTP {res.status}`) + end + end) + end + return + end + if op == "select" then + local group = tostring(cmd.group or "") + local proxy = tostring(cmd.proxy or "") + if group ~= "" and proxy ~= "" then + local path = "/proxies/" .. noctalia.string.urlEncode(group) + request("PUT", path, json_headers(), { name = proxy }, function(res) + if success(res) then + for _, candidate in state.groups do + if candidate.name == group then + candidate.now = proxy + end + end + publish("groups") + noctalia.notify( + noctalia.tr("notify.proxy_selected"), + noctalia.tr("notify.proxy_selected_body", { group = group, proxy = proxy }) + ) + else + noctalia.notifyError(noctalia.tr("notify.request_failed"), `HTTP {res.status}`) + end + end) + end + return + end + if op == "delay_test_all" then + test_all_groups() + return + end + if op == "delay_test" then + local group = tostring(cmd.group or "") + if group ~= "" then + run_delay_test(group) + end + return + end + if op == "restart" then + state.connection.status = "connecting" + state.connection.error = "" + publish("connection") + noctalia.notify(noctalia.tr("notify.restarting")) + request("POST", "/restart", auth_headers(), nil, function(res) + -- The core re-execs and drops the connection mid-response; a transport + -- failure with no status is the expected outcome, anything else is an error. + if success(res) or (not res.ok and res.status == 0) then + return + end + noctalia.notifyError(noctalia.tr("notify.request_failed"), `HTTP {res.status}`) + end) + return + end + if op == "close_connections" then + request("DELETE", "/connections", auth_headers(), nil, function(res) + if success(res) then + state.connections.count = 0 + publish("connections") + noctalia.notify(noctalia.tr("notify.connections_closed")) + else + noctalia.notifyError(noctalia.tr("notify.request_failed"), `HTTP {res.status}`) + end + end) + end +end + +noctalia.state.watch("mihomo.command", function(cmd) + if type(cmd) ~= "table" then + return + end + local seq = tonumber(cmd.seq) or 0 + if seq <= last_cmd_seq then + return + end + last_cmd_seq = seq + handle_command(cmd) +end) + +-- ── Entry-point callbacks ─────────────────────────────────────────────────── + +local tick = 0 + +function update() + tick += 1 + noctalia.setUpdateInterval(settings.interval * 1000) + + poll_version() + poll_configs() + poll_connections() + if tick % GROUPS_REFRESH_EVERY == 1 then + poll_proxies() + end + + if traffic_stream == nil and tick - stream_attempt_tick >= STREAM_RETRY_EVERY then + stream_attempt_tick = tick + start_traffic_stream() + end +end + +function onConfigChanged() + reload_settings() + state.connection.host = settings.host + state.connection.port = settings.port + publish("connection") + + if traffic_stream ~= nil then + traffic_stream.stop() + traffic_stream = nil + end + stream_attempt_tick = -1 + + poll_version() + poll_configs() + poll_connections() + poll_proxies() +end + +function onIpc(event, payload) + if event == "refresh" then + poll_version() + poll_configs() + poll_connections() + poll_proxies() + elseif event == "cmd" and payload then + local ok, cmd = pcall(noctalia.json.decode, payload) + if ok and type(cmd) == "table" then + handle_command(cmd) + end + end +end + +-- ── Init ──────────────────────────────────────────────────────────────────── + +reload_settings() +state.connection.host = settings.host +state.connection.port = settings.port +publish("connection") +publish("config") +publish("traffic") +publish("connections") +publish("groups") +publish("delay") + +poll_version() +poll_configs() +poll_connections() +poll_proxies() +start_traffic_stream() diff --git a/mihomo-control/shortcut.luau b/mihomo-control/shortcut.luau new file mode 100644 index 0000000..9726e07 --- /dev/null +++ b/mihomo-control/shortcut.luau @@ -0,0 +1,33 @@ +--!nonstrict +-- Mihomo Control — control-center shortcut. +-- +-- Quick toggle for the proxy mode: clicking switches between rule and global. +-- The tile shows the current mode and lights up while global mode is active. + +local function current_mode() + local config = noctalia.state.get("mihomo.config") or {} + return config.mode or "rule" +end + +local function render() + local mode = current_mode() + shortcut.setLabel(noctalia.tr("shortcut.label", { mode = noctalia.tr("shortcut.mode_" .. mode) })) + shortcut.setIcon("cat") + shortcut.setActive(mode == "global") + shortcut.setEnabled(true) +end + +noctalia.state.watch("mihomo.config", function(_value) + render() +end) + +function onClick() + local next_mode = current_mode() == "global" and "rule" or "global" + noctalia.state.set("mihomo.command", { + op = "mode", + mode = next_mode, + seq = math.floor(os.clock() * 1000000), + }) +end + +render() diff --git a/mihomo-control/thumbnail.webp b/mihomo-control/thumbnail.webp new file mode 100644 index 0000000000000000000000000000000000000000..6e69fd8c076ecacf49a5af0d62d3a781baf5f18a GIT binary patch literal 55744 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 Q4_qt3^NP6P$`lJ8qAH1oY>3)N`XN8XV*7T~Q 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 Lp9Ib@FfafB;TQvu literal 0 HcmV?d00001 diff --git a/mihomo-control/translations/en.json b/mihomo-control/translations/en.json new file mode 100644 index 0000000..9c67085 --- /dev/null +++ b/mihomo-control/translations/en.json @@ -0,0 +1,92 @@ +{ + "settings": { + "host": { + "label": "Host", + "description": "Hostname or IP of the Mihomo external controller." + }, + "port": { + "label": "Port", + "description": "Port of the Mihomo external controller (9090 by default)." + }, + "secret": { + "label": "Secret", + "description": "External-controller secret from your Mihomo config; empty when authentication is disabled." + }, + "use_https": { + "label": "HTTPS", + "description": "Connect with https:// instead of http:// (external-controller-tls or a TLS reverse proxy)." + }, + "allow_insecure_tls": { + "label": "Allow insecure TLS", + "description": "Skip certificate verification when the controller uses a self-signed certificate." + }, + "test_url": { + "label": "Test URL", + "description": "URL used for latency tests; empty uses each group's configured test URL." + }, + "refresh_interval": { + "label": "Refresh interval", + "description": "Seconds between status polls (1–60)." + } + }, + "panel": { + "title": "Mihomo Control", + "status_online": "Online", + "status_offline": "Offline", + "status_connecting": "Connecting", + "mode_rule": "Rule", + "mode_global": "Global", + "mode_direct": "Direct", + "refresh": "Refresh", + "traffic": "Traffic", + "connections": "connections", + "memory": "RAM", + "proxy_groups": "Proxy groups", + "no_groups": "No proxy groups found.", + "delay_test": "Test latency", + "test_all": "Test all", + "restart": "Restart", + "timeout": "timeout", + "no_members": "no members", + "members_count": { + "one": "{count} member", + "other": "{count} members" + }, + "hidden": "hidden", + "online_with_version": "{version} · {endpoint}", + "online_plain": "{endpoint}", + "offline_with_error": "{error}", + "offline_plain": "{endpoint}" + }, + "widget": { + "status": "Status", + "mode": "Mode", + "connections": "Connections", + "up": "Up total", + "down": "Down total", + "status_online_with_version": "Online · {version}", + "status_online_plain": "Online", + "status_connecting": "Connecting", + "status_offline_with_error": "Offline — {error}", + "status_offline_plain": "Offline" + }, + "shortcut": { + "label": "Mihomo: {mode}", + "mode_rule": "Rule", + "mode_global": "Global", + "mode_direct": "Direct" + }, + "notify": { + "mode_changed": "Mihomo mode changed", + "proxy_selected": "Proxy selected", + "proxy_selected_body": "{group} → {proxy}", + "delay_done": "Latency test finished", + "delay_all_done": "All groups tested", + "delay_body": "{count} nodes tested, selected {delay} ms", + "delay_body_no_selection": "{count} nodes tested", + "delay_timeout": "All nodes timed out (504) — check the test URL", + "restarting": "Mihomo is restarting", + "connections_closed": "All connections closed", + "request_failed": "Mihomo request failed" + } +} diff --git a/mihomo-control/translations/zh-Hans.json b/mihomo-control/translations/zh-Hans.json new file mode 100644 index 0000000..838ca6e --- /dev/null +++ b/mihomo-control/translations/zh-Hans.json @@ -0,0 +1,92 @@ +{ + "settings": { + "host": { + "label": "主机", + "description": "Mihomo 外部控制器的地址或 IP。" + }, + "port": { + "label": "端口", + "description": "Mihomo 外部控制器的端口(默认为 9090)。" + }, + "secret": { + "label": "密钥", + "description": "Mihomo 配置中的外部控制器密钥;未启用认证时留空。" + }, + "use_https": { + "label": "HTTPS", + "description": "使用 https:// 而非 http://(external-controller-tls 或 TLS 反向代理)。" + }, + "allow_insecure_tls": { + "label": "允许不安全的 TLS", + "description": "控制器使用自签名证书时跳过证书校验。" + }, + "test_url": { + "label": "测试 URL", + "description": "延迟测试使用的 URL;留空则使用各策略组配置的测试 URL。" + }, + "refresh_interval": { + "label": "刷新间隔", + "description": "状态轮询间隔(1–60 秒)。" + } + }, + "panel": { + "title": "Mihomo 控制", + "status_online": "在线", + "status_offline": "离线", + "status_connecting": "连接中", + "mode_rule": "规则", + "mode_global": "全局", + "mode_direct": "直连", + "refresh": "刷新", + "traffic": "流量", + "connections": "条连接", + "memory": "内存", + "proxy_groups": "策略组", + "no_groups": "未找到策略组。", + "delay_test": "测试延迟", + "test_all": "全部测试", + "restart": "重启", + "timeout": "超时", + "no_members": "无成员", + "members_count": { + "one": "{count} 个成员", + "other": "{count} 个成员" + }, + "hidden": "隐藏", + "online_with_version": "{version} · {endpoint}", + "online_plain": "{endpoint}", + "offline_with_error": "{error}", + "offline_plain": "{endpoint}" + }, + "widget": { + "status": "状态", + "mode": "模式", + "connections": "连接数", + "up": "上传", + "down": "下载", + "status_online_with_version": "在线 · {version}", + "status_online_plain": "在线", + "status_connecting": "连接中", + "status_offline_with_error": "离线 — {error}", + "status_offline_plain": "离线" + }, + "shortcut": { + "label": "Mihomo:{mode}", + "mode_rule": "规则", + "mode_global": "全局", + "mode_direct": "直连" + }, + "notify": { + "mode_changed": "Mihomo 模式已更改", + "proxy_selected": "已选择代理", + "proxy_selected_body": "{group} → {proxy}", + "delay_done": "延迟测试完成", + "delay_all_done": "全部策略组测试完成", + "delay_body": "已测试 {count} 个节点,选中 {delay} 毫秒", + "delay_body_no_selection": "已测试 {count} 个节点", + "delay_timeout": "所有节点均超时(504)——请检查测试 URL", + "restarting": "Mihomo 正在重启", + "connections_closed": "所有连接已关闭", + "request_failed": "Mihomo 请求失败" + } +} diff --git a/mihomo-control/widget.luau b/mihomo-control/widget.luau new file mode 100644 index 0000000..cd5011c --- /dev/null +++ b/mihomo-control/widget.luau @@ -0,0 +1,100 @@ +--!nonstrict +-- Mihomo Control — bar widget. +-- +-- Shows live download/upload rates from the service's streamed /traffic data. +-- Left click toggles the control panel; the tooltip holds the connection +-- status, mode, totals, connection count and the current selection of every +-- proxy group. + +local PLUGIN_ID = "mdj2812/mihomo-control" + +local function format_rate(bytes_per_second) + local value = tonumber(bytes_per_second) or 0 + if value >= 1024 * 1024 * 1024 then + return string.format("%.2f GB/s", value / (1024 * 1024 * 1024)) + end + if value >= 1024 * 1024 then + return string.format("%.1f MB/s", value / (1024 * 1024)) + end + if value >= 1024 then + return string.format("%.1f KB/s", value / 1024) + end + return string.format("%d B/s", value) +end + +local function render() + local conn = noctalia.state.get("mihomo.connection") or {} + local config = noctalia.state.get("mihomo.config") or {} + local traffic = noctalia.state.get("mihomo.traffic") or {} + local connections = noctalia.state.get("mihomo.connections") or {} + local groups = noctalia.state.get("mihomo.groups") or {} + + local online = conn.status == "online" + local mode = noctalia.tr("panel.mode_" .. (config.mode or "rule")) + local icon_path = "icon-offline.png" + if online then + icon_path = "icon-online.png" + elseif conn.status == "connecting" then + icon_path = "icon-connecting.png" + end + + local container = barWidget.isVertical() and ui.column or ui.row + barWidget.render(container({ gap = 6, align = "center" }, { + ui.image({ path = icon_path, width = 16, height = 16 }), + ui.label({ text = mode, fontSize = 12, color = "on_surface", fontWeight = "medium" }), + })) + + local status_value = "Offline" + if online then + local version = tostring(conn.version or "") + status_value = version ~= "" + and noctalia.tr("widget.status_online_with_version", { version = version }) + or noctalia.tr("widget.status_online_plain") + elseif conn.status == "connecting" then + status_value = noctalia.tr("widget.status_connecting") + elseif tostring(conn.error or "") ~= "" then + status_value = noctalia.tr("widget.status_offline_with_error", { error = conn.error }) + else + status_value = noctalia.tr("widget.status_offline_plain") + end + + local tooltip = { + { key = noctalia.tr("widget.status"), value = status_value }, + { key = noctalia.tr("widget.mode"), value = noctalia.tr("panel.mode_" .. (config.mode or "rule")) }, + { key = noctalia.tr("widget.down"), value = `▼ {format_rate(traffic.down)}` }, + { key = noctalia.tr("widget.up"), value = `▲ {format_rate(traffic.up)}` }, + { key = noctalia.tr("widget.connections"), value = tostring(connections.count or 0) }, + } + for _, group in ipairs(type(groups) == "table" and groups or {}) do + if #tooltip < 14 then + table.insert(tooltip, { + key = tostring(group.name or ""), + value = tostring(group.now or "—"), + }) + end + end + barWidget.setTooltip(tooltip) +end + +for _, key in { + "mihomo.connection", + "mihomo.config", + "mihomo.traffic", + "mihomo.connections", + "mihomo.groups", +} do + noctalia.state.watch(key, function(_value) + render() + end) +end + +function update() + noctalia.setUpdateInterval(1000) + render() +end + +function onClick() + noctalia.togglePanel(PLUGIN_ID .. ":panel") +end + +render()