From e3e9b8f3ff03bd202ea826df7ae60e1024830b3c Mon Sep 17 00:00:00 2001 From: owldyn Date: Mon, 18 May 2026 19:39:21 -0500 Subject: [PATCH] working tray application Squashed commit of the following: commit 4e216b90c24e73b40c96d4b61a96b3a5be6cea99 Author: owldyn Date: Mon May 18 19:36:05 2026 -0500 workaround for icon bug, couldnt reproduce commit cc2ccc9b8a8fb83c30ded93bf4a0a28d73470424 Author: owldyn Date: Fri May 8 20:04:29 2026 -0500 merge tray into desktop commit 445c9a5a465e71b05a45f07fe220b1c357222e03 Author: owldyn Date: Mon Apr 27 20:41:35 2026 -0500 add new thrown together icon commit 7a67a0af05f644ba8924f9b9d6713f2eebb4b950 Author: owldyn Date: Sat Apr 18 13:03:11 2026 -0500 working tray application --- cmd/confirmation.go | 2 +- cmd/desktop.go | 208 +++++++++++++++++++++++++++++-- cmd/icons/bare.png | Bin 0 -> 40243 bytes cmd/icons/icons.go | 29 +++++ cmd/icons/notify.png | Bin 0 -> 44643 bytes docs/generated-module-options.md | 29 +++++ go.mod | 1 + go.sum | 2 + internal/manager/confirmer.go | 4 + nix/module-options.nix | 1 + nix/module.nix | 4 +- nix/package.nix | 2 +- 12 files changed, 269 insertions(+), 13 deletions(-) create mode 100644 cmd/icons/bare.png create mode 100644 cmd/icons/icons.go create mode 100644 cmd/icons/notify.png diff --git a/cmd/confirmation.go b/cmd/confirmation.go index 346b2f6d..abe378cb 100644 --- a/cmd/confirmation.go +++ b/cmd/confirmation.go @@ -67,7 +67,7 @@ var confirmationShowCmd = &cobra.Command{ } func confirmerShow(c *protobuf.Confirmer, for_ string) { - empty := false + empty := true if c.Confirmed != "" { empty = false fmt.Printf("Confirmation submitted for %s: %s\n", for_, c.Confirmed) diff --git a/cmd/desktop.go b/cmd/desktop.go index 3dde565c..c6993d62 100644 --- a/cmd/desktop.go +++ b/cmd/desktop.go @@ -2,20 +2,26 @@ package cmd import ( "fmt" - "log" "time" + "fyne.io/systray" + "github.com/dustin/go-humanize" "github.com/gen2brain/beeep" + "github.com/nlewo/comin/cmd/icons" "github.com/nlewo/comin/internal/builder" "github.com/nlewo/comin/internal/client" - "github.com/nlewo/comin/pkg/protobuf" + "github.com/nlewo/comin/internal/manager" "github.com/nlewo/comin/internal/store" + "github.com/nlewo/comin/pkg/protobuf" "github.com/sirupsen/logrus" "github.com/spf13/cobra" ) var title string +const buildTitle = "build" +const deployTitle = "deploy" + var desktopCmd = &cobra.Command{ Use: "desktop", Short: "Send desktop notifications ", @@ -42,8 +48,14 @@ var desktopCmd = &cobra.Command{ if err != nil { logrus.Fatal(err) } - err = client.Events(handler) - log.Fatalf("failed to consume to the event stream: %s", err) + tray, _ := (cmd.Flags().GetBool("tray")) + if tray { + logrus.Println("Loading tray.") + systray.Run(func() { onTrayReady(client) }, onTrayExit) + } else { + err = client.Events(desktopEventHandler) + logrus.Fatalf("failed to consume to the event stream: %s", err) + } } }, } @@ -55,33 +67,35 @@ func scenario() { SelectedBranchName: "main", } e := protobuf.Event{Type: &protobuf.Event_BuildStartedType{BuildStartedType: &protobuf.Event_BuildStarted{Generation: &g}}} - handler(&e) // nolint: errcheck + desktopEventHandler(&e) // nolint: errcheck time.Sleep(time.Second) d := protobuf.Deployment{ Status: store.StatusToString(store.Init), } e = protobuf.Event{Type: &protobuf.Event_DeploymentStartedType{DeploymentStartedType: &protobuf.Event_DeploymentStarted{Deployment: &d}}} - handler(&e) // nolint: errcheck + desktopEventHandler(&e) // nolint: errcheck time.Sleep(time.Second) d = protobuf.Deployment{ Status: store.StatusToString(store.Done), } e = protobuf.Event{Type: &protobuf.Event_DeploymentFinishedType{DeploymentFinishedType: &protobuf.Event_DeploymentFinished{Deployment: &d}}} - handler(&e) // nolint: errcheck + desktopEventHandler(&e) // nolint: errcheck time.Sleep(time.Second) e = protobuf.Event{Type: &protobuf.Event_RebootRequired_{RebootRequired: &protobuf.Event_RebootRequired{Deployment: &d}}} - handler(&e) // nolint: errcheck + desktopEventHandler(&e) // nolint: errcheck } -func handler(event *protobuf.Event) error { +func generateEventMessage(event *protobuf.Event) string { var message string logrus.Debugf("received event: %s", event) switch v := event.Type.(type) { default: logrus.Errorf("unexpected type %T", v) + case *protobuf.Event_Fetched_: + case *protobuf.Event_ManagerState_: case *protobuf.Event_Suspend_: message = "The agent is suspended." case *protobuf.Event_Resume_: @@ -124,19 +138,193 @@ func handler(event *protobuf.Event) error { } case *protobuf.Event_RebootRequired_: message = "The machine needs to be rebooted to take the deployment into account." + case *protobuf.Event_ConfirmationSubmittedType: + uuid := event.Type.(*protobuf.Event_ConfirmationSubmittedType).ConfirmationSubmittedType.GetUuid() + message = fmt.Sprintf("A confirmation request was submitted. %s", uuid) } + return message +} + +func desktopEventHandler(event *protobuf.Event) error { + message := generateEventMessage(event) + displayNotification(message) + return nil +} + +func displayNotification(message string) { if message != "" { + logrus.Println(fmt.Sprintf("Displaying notification: %s", message)) err := beeep.Notify(title, message, []byte{}) if err != nil { logrus.Errorf("failed to send the notification: %s", err) } } - return nil +} + +func onTrayReady(client client.Client) { + systray.SetIcon(icons.GetIcon(client)) + systray.SetTitle("comin") + systray.SetTooltip("comin") + go refreshAvailableConfirmationsLoop(client) + go client.Events(trayEventHandler(client)) // nolint: errcheck +} + +func onTrayExit() {} + +func trayEventHandler(client client.Client) func(*protobuf.Event) error { + return func(event *protobuf.Event) error { + // Reuse the notification handler + go desktopEventHandler(event) // nolint: errcheck + // Watch the events for specifically the confirmation events so we can update the tray icon. + switch event.Type.(type) { + case *protobuf.Event_ConfirmationSubmittedType: + systray.SetIcon(icons.GetIcon(client)) + case *protobuf.Event_ConfirmationConfirmedType: + systray.SetIcon(icons.GetIcon(client)) + case *protobuf.Event_ConfirmationCancelledType: + systray.SetIcon(icons.GetIcon(client)) + } + return nil + } +} + +func refreshAvailableConfirmationsLoop(client client.Client) { + buildItem, deployItem := initializeTrayMenu(client) + // Reload statuses when the tray is opened. + for range systray.TrayOpenedCh { + status, err := client.GetManagerState() + if err != nil { + logrus.Errorln("Failed to retrieve manager state.") + } + logrus.Debugln(fmt.Sprintf("status is %s", status)) + if status == nil { + updatePendingItem(nil, buildTitle, buildItem) + updatePendingItem(nil, deployTitle, deployItem) + } else { + updatePendingItem(status.BuildConfirmer, buildTitle, buildItem) + updatePendingItem(status.DeployConfirmer, deployTitle, deployItem) + } + // Also refresh the icon in case it's desynced for any reason. + systray.SetIcon(icons.GetIcon(client)) + } +} + +func generateTrayMessage(c *protobuf.Confirmer, for_ string) (string, bool) { + if c.Confirmed != "" { + return fmt.Sprintf("%s: Confirmed: %s.", for_, c.Confirmed), false + } else if c.Submitted != "" { + base := fmt.Sprintf("%s: Confirmation needed: %s.", for_, c.Submitted) + if c.Mode == int64(manager.Auto) { + return fmt.Sprintf("%s\nAuto confirmation in %s\n", + base, + humanize.Time(c.AutoconfirmStartedAt.AsTime().Add(time.Duration(c.AutoconfirmDuration*int64(time.Second))))), + true + } else { + return base, true + } + } else { + return fmt.Sprintf("%s: No confirmations needed.", for_), false + } +} + +// Initialize the items in the tray menu. +func initializeTrayMenu(client client.Client) (*systray.MenuItem, *systray.MenuItem) { + // Header + addMenuItem("comin", "", func() {}).Disable() + systray.AddSeparator() + + // Status items + var buildItem *systray.MenuItem + var deployItem *systray.MenuItem + status, err := client.GetManagerState() + if err != nil { + logrus.Errorln("Failed to retrieve manager state.") + } + var buildConfirmer *protobuf.Confirmer + var deployConfirmer *protobuf.Confirmer + // If the status can't be loaded, we still want to create the tray items. + if status != nil { + buildConfirmer = status.BuildConfirmer + deployConfirmer = status.DeployConfirmer + } + buildItem = makePendingItem(buildConfirmer, buildTitle, func() { + status, err := client.GetManagerState() + if err != nil { + displayNotification("Failed to confirm build.") + logrus.Errorln("Failed to retrieve manager state.") + } else { + if status.BuildConfirmer.Submitted != "" { + client.Confirm(status.BuildConfirmer.Submitted, buildTitle) // nolint: errcheck + } + } + }) + deployItem = makePendingItem(deployConfirmer, deployTitle, func() { + status, err := client.GetManagerState() + if err != nil { + displayNotification("Failed to confirm deployment.") + logrus.Errorln("Failed to retrieve manager state.") + } else { + if status.DeployConfirmer.Submitted != "" { + client.Confirm(status.DeployConfirmer.Submitted, deployTitle) // nolint: errcheck + } + } + }) + // Quit item + systray.AddSeparator() + addMenuItem("Quit", "Quit the tray application", func() { + logrus.Println("Quit was pressed. Closing.") + systray.Quit() + }) + return buildItem, deployItem +} + +func updatePendingItem(c *protobuf.Confirmer, for_ string, item *systray.MenuItem) { + if c == nil { + item.SetTitle(fmt.Sprintf("%s: Failed to connect to comin service.", for_)) + item.Disable() + return + } + title, shouldEnable := generateTrayMessage(c, for_) + item.SetTitle(title) + if shouldEnable { + item.Enable() + } else { + item.Disable() + } +} + +func makePendingItem(c *protobuf.Confirmer, for_ string, callback func()) *systray.MenuItem { + if c == nil { + item := addMenuItem(fmt.Sprintf("%s: Failed to connect to comin service.", for_), "", callback) + item.Disable() + return item + } + title, shouldEnable := generateTrayMessage(c, for_) + item := addMenuItem(title, "", callback) + if shouldEnable { + item.Enable() + } else { + item.Disable() + } + return item +} + +// Helper function to create a tray item with a callback. +// The goroutine is never stopped, so only use for items that will not be removed from the tray. +func addMenuItem(title string, tooltip string, callback func()) *systray.MenuItem { + item := systray.AddMenuItem(title, tooltip) + go func() { + for range item.ClickedCh { + callback() + } + }() + return item } func init() { desktopCmd.Flags().StringVarP(&title, "title", "", "comin", "the notification title") desktopCmd.Flags().StringP("unix-socket-path", "", "/var/lib/comin/grpc.sock", "the GRPC Unix socket path") desktopCmd.Flags().BoolP("test", "", false, "do not get events from the agent but from predefined scenari") + desktopCmd.Flags().BoolP("tray", "", false, "Show in the system tray") rootCmd.AddCommand(desktopCmd) } diff --git a/cmd/icons/bare.png b/cmd/icons/bare.png new file mode 100644 index 0000000000000000000000000000000000000000..fbb1316d703d4ce19e209c3d81ea4c5b2cf2bddd GIT binary patch literal 40243 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 z48�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ʡ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 literal 0 HcmV?d00001 diff --git a/cmd/icons/icons.go b/cmd/icons/icons.go new file mode 100644 index 00000000..0d459fdc --- /dev/null +++ b/cmd/icons/icons.go @@ -0,0 +1,29 @@ +package icons + +import ( + _ "embed" + + "github.com/nlewo/comin/internal/client" + "github.com/sirupsen/logrus" +) + +type Icon []byte + +//go:embed bare.png +var Bare Icon + +//go:embed notify.png +var Notify Icon + +func GetIcon(client client.Client) Icon { + status, err := client.GetManagerState() + if err != nil { + logrus.Errorln("Failed to retrieve manager state.") + return Notify + } + + if status.BuildConfirmer.Submitted != "" || status.DeployConfirmer.Submitted != "" { + return Notify + } + return Bare +} diff --git a/cmd/icons/notify.png b/cmd/icons/notify.png new file mode 100644 index 0000000000000000000000000000000000000000..7226d5bb65df0e1913c7ca423e002c92ccdf24da GIT binary patch literal 44643 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�BbD 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 D$DuT) literal 0 HcmV?d00001 diff --git a/docs/generated-module-options.md b/docs/generated-module-options.md index ae2bf298..eacb9454 100644 --- a/docs/generated-module-options.md +++ b/docs/generated-module-options.md @@ -252,6 +252,35 @@ string +## services\.comin\.desktop\.tray + + + +Whether to enable Whether to run the tray with the desktop service\. This tray item allows confirming deployments and builds… + + + +*Type:* +boolean + + + +*Default:* + +```nix +false +``` + + + +*Example:* + +```nix +true +``` + + + ## services\.comin\.exporter diff --git a/go.mod b/go.mod index a405b6c5..df080aa3 100644 --- a/go.mod +++ b/go.mod @@ -22,6 +22,7 @@ require ( require ( dario.cat/mergo v1.0.0 // indirect + fyne.io/systray v1.12.0 // indirect git.sr.ht/~jackmordaunt/go-toast v1.1.2 // indirect github.com/Microsoft/go-winio v0.6.1 // indirect github.com/aymanbagabas/go-osc52/v2 v2.0.1 // indirect diff --git a/go.sum b/go.sum index 68b5548e..0c4b30c5 100644 --- a/go.sum +++ b/go.sum @@ -2,6 +2,8 @@ charm.land/lipgloss/v2 v2.0.2 h1:xFolbF8JdpNkM2cEPTfXEcW1p6NRzOWTSamRfYEw8cs= charm.land/lipgloss/v2 v2.0.2/go.mod h1:KjPle2Qd3YmvP1KL5OMHiHysGcNwq6u83MUjYkFvEkM= dario.cat/mergo v1.0.0 h1:AGCNq9Evsj31mOgNPcLyXc+4PNABt905YmuqPYYpBWk= dario.cat/mergo v1.0.0/go.mod h1:uNxQE+84aUszobStD9th8a29P2fMDhsBdgRYvZOxGmk= +fyne.io/systray v1.12.0 h1:CA1Kk0e2zwFlxtc02L3QFSiIbxJ/P0n582YrZHT7aTM= +fyne.io/systray v1.12.0/go.mod h1:RVwqP9nYMo7h5zViCBHri2FgjXF7H2cub7MAq4NSoLs= git.sr.ht/~jackmordaunt/go-toast v1.1.2 h1:/yrfI55LRt1M7H1vkaw+NaH1+L1CDxrqDltwm5euVuE= git.sr.ht/~jackmordaunt/go-toast v1.1.2/go.mod h1:jA4OqHKTQ4AFBdwrSnwnskUIIS3HYzlJSgdzCKqfavo= github.com/Microsoft/go-winio v0.5.2/go.mod h1:WpS1mjBmmwHBEWmogvA2mj8546UReBk4v8QkMxJ6pZY= diff --git a/internal/manager/confirmer.go b/internal/manager/confirmer.go index fb0ad628..cb981885 100644 --- a/internal/manager/confirmer.go +++ b/internal/manager/confirmer.go @@ -117,6 +117,8 @@ func (c *Confirmer) start() { switch Mode(c.state.Mode) { case Manual: logrus.Infof("confirmer: generation %s has been submitted", command.uuid) + e := &protobuf.Event_ConfirmationSubmitted{Uuid: command.uuid} + c.broker.Publish(&protobuf.Event{Type: &protobuf.Event_ConfirmationSubmittedType{ConfirmationSubmittedType: e}}) case Without: logrus.Infof("confirmer: generation %s has been submitted and confirmed", command.uuid) c.state.Confirmed = command.uuid @@ -129,6 +131,8 @@ func (c *Confirmer) start() { timer = c.timer.C c.state.AutoconfirmStarted = wrapperspb.Bool(true) c.state.AutoconfirmStartedAt = timestamppb.New(time.Now().UTC()) + e := &protobuf.Event_ConfirmationSubmitted{Uuid: command.uuid} + c.broker.Publish(&protobuf.Event{Type: &protobuf.Event_ConfirmationSubmittedType{ConfirmationSubmittedType: e}}) } case "confirm": logrus.Infof("confirmer: generation %s has been confirmed", command.uuid) diff --git a/nix/module-options.nix b/nix/module-options.nix index c41b4fea..2690bbe3 100644 --- a/nix/module-options.nix +++ b/nix/module-options.nix @@ -347,6 +347,7 @@ in default = "comin"; description = "The notification title."; }; + tray = mkEnableOption "Whether to run the tray with the desktop service. This tray item allows confirming deployments and builds."; }; retention = mkOption { description = "The deployments and profiles retention policyes."; diff --git a/nix/module.nix b/nix/module.nix index 95c97617..f93d8f8b 100644 --- a/nix/module.nix +++ b/nix/module.nix @@ -43,7 +43,9 @@ in wantedBy = [ "graphical-session.target" ]; path = [ pkgs.libnotify ]; serviceConfig = { - ExecStart = ''${lib.getExe package} desktop --title "${cfg.services.comin.desktop.title}"''; + ExecStart = ''${lib.getExe package} desktop --title "${cfg.services.comin.desktop.title}"${ + if cfg.services.comin.desktop.tray then " --tray" else "" + }''; }; }; diff --git a/nix/package.nix b/nix/package.nix index 853f5d86..d71acca7 100644 --- a/nix/package.nix +++ b/nix/package.nix @@ -39,7 +39,7 @@ buildGoModule rec { ../main.go ]; }; - vendorHash = "sha256-M+0YUoMRnObCSUqnygPNiv1sKl3YB9Cb4nzK39zWwBg="; + vendorHash = "sha256-8dOmQ2tqUgiPH0+44rtu/nZgpP/O8dn3ULl/VB5dYw4="; ldflags = [ "-X github.com/nlewo/comin/cmd.version=${version}" ];