ziggs/internal/interactive/cli.go

214 lines
4.5 KiB
Go
Raw Normal View History

2022-03-07 14:57:42 +00:00
package interactive
import (
"errors"
"fmt"
"os"
"strings"
"time"
cli "git.tcp.direct/Mirrors/go-prompt"
tui "github.com/manifoldco/promptui"
"github.com/rs/zerolog"
2022-07-29 10:44:08 +00:00
"git.tcp.direct/kayos/ziggs/internal/common"
"git.tcp.direct/kayos/ziggs/internal/config"
"git.tcp.direct/kayos/ziggs/internal/ziggy"
2022-03-07 14:57:42 +00:00
)
var log *zerolog.Logger
func validate(input string) error {
if len(strings.TrimSpace(input)) < 1 {
return errors.New("no input detected")
}
return nil
}
func InteractiveAuth() string {
passPrompt := tui.Prompt{
Label: "API Key (AKA user)",
Validate: validate,
Mask: '',
}
for {
key, perr := passPrompt.Run()
if perr != nil {
fmt.Println(tui.IconBad + perr.Error())
continue
}
return key
}
}
// Interpret is where we will actuall define our commands
func executor(cmd string) {
cmd = strings.TrimSpace(cmd)
2022-07-31 08:23:26 +00:00
var args = strings.Fields(cmd)
2022-03-07 14:57:42 +00:00
switch args[0] {
case "quit", "exit":
os.Exit(0)
case "use":
2022-07-08 21:35:11 +00:00
if len(args) < 2 {
println("use: use <bridge>")
return
2022-03-07 14:57:42 +00:00
}
2022-07-09 00:09:49 +00:00
if br, ok := ziggy.Lucifer.Bridges[args[1]]; !ok {
2022-03-07 14:57:42 +00:00
println("invalid bridge: " + args[1])
} else {
selectedBridge = args[1]
log.Info().Str("host", br.Host).Int("lights", len(br.HueLights)).Msg("switched to bridge: " + selectedBridge)
}
case "debug":
levelsdebug := map[string]zerolog.Level{"info": zerolog.InfoLevel, "debug": zerolog.DebugLevel, "trace": zerolog.TraceLevel}
debuglevels := map[zerolog.Level]string{zerolog.InfoLevel: "info", zerolog.DebugLevel: "debug", zerolog.TraceLevel: "trace"}
if len(args) < 2 {
println("current debug level: " + debuglevels[log.GetLevel()])
}
if newlevel, ok := levelsdebug[args[1]]; ok {
zerolog.SetGlobalLevel(newlevel)
}
case "help":
if len(args) < 2 {
getHelp("meta")
return
}
getHelp(args[len(args)-1])
case "clear":
print("\033[H\033[2J")
default:
bcmd, ok := bridgeCMD[args[0]]
if !ok {
return
}
2022-07-09 00:09:49 +00:00
br, ok := ziggy.Lucifer.Bridges[selectedBridge]
2022-03-07 14:57:42 +00:00
if selectedBridge == "" || !ok {
2022-07-09 00:09:49 +00:00
prompt := tui.Select{
Label: "Send to all known bridges?",
Items: []string{"yes", "no"},
Pointer: common.ZiggsPointer,
}
_, ch, _ := prompt.Run()
if ch != "yes" {
return
}
for _, br := range ziggy.Lucifer.Bridges {
2022-03-07 14:57:42 +00:00
go bcmd(br, args[1:])
}
} else {
2022-07-08 21:35:11 +00:00
err := bcmd(br, args[1:])
if err != nil {
log.Error().Err(err).Msg("error executing command")
}
2022-03-07 14:57:42 +00:00
}
}
}
func getHelp(target string) {
fmt.Printf("pRaNkeD! (help not available just yet.)\n")
/*
var lines []string
lines = append(lines, "help: "+target)
switch target {
case "meta":
var list string
for _, cmd := range cmds {
list = list + cmd + ", "
}
fmt.Println("Enabled commands: ")
list = strings.TrimSuffix(list, ", ")
fmt.Println(list)
fmt.Println()
default:
log.Error().Msg("Help entry not found!")
fmt.Println()
}
*/
}
2022-07-09 00:09:49 +00:00
func cmdScan(br *ziggy.Bridge, args []string) error {
2022-03-07 14:57:42 +00:00
r, err := br.FindLights()
if err != nil {
return err
}
for resp := range r.Success {
2022-03-07 14:57:42 +00:00
log.Info().Msg(resp)
}
var count = 0
timer := time.NewTimer(5 * time.Second)
var newLights []string
loop:
for {
select {
case <-timer.C:
break loop
default:
newl, _ := br.GetNewLights()
if len(newl.Lights) <= count {
time.Sleep(250 * time.Millisecond)
print(".")
continue
}
count = len(newl.Lights)
timer.Reset(5 * time.Second)
newLights = append(newLights, newl.Lights...)
}
}
for _, nl := range newLights {
log.Info().Str("caller", nl).Msg("discovered light")
}
return nil
}
var selectedBridge = ""
const bulb = ``
2022-07-31 08:23:26 +00:00
func getHist() []string {
return []string{}
}
2022-03-07 14:57:42 +00:00
func StartCLI() {
log = config.GetLogger()
2022-07-09 00:09:49 +00:00
processBridges(ziggy.Lucifer.Bridges)
2022-07-31 08:23:26 +00:00
for _, br := range ziggy.Lucifer.Bridges {
grpmap, err := getGroupMap(br)
if err != nil {
log.Warn().Err(err).Msg("error getting group map")
} else {
processGroups(br, grpmap)
}
}
2022-03-07 14:57:42 +00:00
p := cli.New(
executor,
completer,
// cli.OptionPrefixBackgroundColor(cli.Black),
cli.OptionPrefixTextColor(cli.Yellow),
2022-07-31 08:23:26 +00:00
cli.OptionHistory(getHist()),
2022-03-07 14:57:42 +00:00
cli.OptionSuggestionBGColor(cli.Black),
cli.OptionSuggestionTextColor(cli.White),
cli.OptionSelectedSuggestionBGColor(cli.Black),
cli.OptionSelectedSuggestionTextColor(cli.Green),
cli.OptionLivePrefix(
func() (prefix string, useLivePrefix bool) {
sel := "~"
2022-07-31 08:23:26 +00:00
if len(ziggy.Lucifer.Bridges) > 1 && selectedBridge != "" {
2022-03-07 14:57:42 +00:00
sel = selectedBridge
}
return fmt.Sprintf("ziggs[%s] %s ", sel, bulb), true
}),
cli.OptionTitle("ziggs"),
2022-07-29 10:44:08 +00:00
cli.OptionCompletionOnDown(),
)
2022-03-07 14:57:42 +00:00
p.Run()
}