Skip to content
Snippets Groups Projects
plugin.go 1.80 KiB
package statusscreen

import (
	"time"

	"github.com/iotaledger/goshimmer/packages/shutdown"
	"github.com/iotaledger/hive.go/daemon"
	"github.com/iotaledger/hive.go/events"
	"github.com/iotaledger/hive.go/logger"
	"github.com/iotaledger/hive.go/node"
)

const (
	name            = "Statusscreen"
	repaintInterval = 1 * time.Second
)

var PLUGIN = node.NewPlugin(name, node.Enabled, configure, run)

var (
	stdLogMsgClosure   = events.NewClosure(stdLogMsg)
	storeLogMsgClosure = events.NewClosure(storeLogMsg)
)

func init() {
	// use standard go logger by default
	logger.Events.AnyMsg.Attach(stdLogMsgClosure)
}

func configure(*node.Plugin) {
	if !isTerminal() {
		return
	}

	// store any log message for display
	logger.Events.AnyMsg.Attach(storeLogMsgClosure)

	log = logger.NewLogger(name)
	configureTview()
}

func run(*node.Plugin) {
	if !isTerminal() {
		return
	}

	stopped := make(chan struct{})
	if err := daemon.BackgroundWorker(name+" Refresher", func(shutdown <-chan struct{}) {
		for {
			select {
			case <-time.After(repaintInterval):
				app.QueueUpdateDraw(func() {})
			case <-shutdown:
				logger.Events.AnyMsg.Detach(storeLogMsgClosure)
				app.Stop()
				return
			case <-stopped:
				return
			}
		}
	}, shutdown.ShutdownPriorityStatusScreen); err != nil {
		log.Errorf("Failed to start as daemon: %s", err)
		return
	}

	if err := daemon.BackgroundWorker(name+" App", func(<-chan struct{}) {
		defer close(stopped)

		// switch logging to status screen
		logger.Events.AnyMsg.Detach(stdLogMsgClosure)
		defer logger.Events.AnyMsg.Attach(stdLogMsgClosure)

		if err := app.SetRoot(frame, true).SetFocus(frame).Run(); err != nil {
			log.Errorf("Error running application: %s", err)
		}
	}, shutdown.ShutdownPriorityStatusScreen); err != nil {
		log.Errorf("Failed to start as daemon: %s", err)
		close(stopped)
	}
}