You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
108 lines
2.5 KiB
108 lines
2.5 KiB
package main
|
|
|
|
import (
|
|
"context"
|
|
"fmt"
|
|
"git.aiterp.net/lucifer/new-server/app/client"
|
|
"git.aiterp.net/lucifer/new-server/models"
|
|
"log"
|
|
"os"
|
|
)
|
|
|
|
func handlerCmd(
|
|
ctx context.Context,
|
|
c client.Client,
|
|
) {
|
|
cmd := parseCommand(os.Args[2:])
|
|
|
|
switch cmd.Name {
|
|
case "list":
|
|
handlers, err := c.GetHandlers(ctx)
|
|
if err != nil {
|
|
log.Fatalln(err)
|
|
}
|
|
|
|
WriteHandlerInfoTable(os.Stdout, handlers)
|
|
case "add":
|
|
model := models.EventHandler{}
|
|
|
|
// Event name
|
|
model.EventName = cmd.Params.Get(0).StringOr("")
|
|
if len(model.EventName) == 0 {
|
|
log.Fatalln("Event name needed!")
|
|
}
|
|
|
|
// Search
|
|
fetchStr := cmd.Params.Get(1).String()
|
|
if fetchStr == nil {
|
|
log.Fatalln("Search filter needed!")
|
|
}
|
|
model.TargetKind, model.TargetValue = models.ParseFetchString(*fetchStr)
|
|
|
|
// From / To
|
|
model.From = cmd.Params.Get("from").TimeOfDayOr(models.Never)
|
|
model.To = cmd.Params.Get("to").TimeOfDayOr(models.Never)
|
|
if model.From.IsNever() != model.To.IsNever() {
|
|
log.Fatalln("from and to must be specified together!")
|
|
}
|
|
|
|
// One shot
|
|
model.OneShot = cmd.Params.Get("one-shot").StringOr("false") == "true"
|
|
|
|
// Priority
|
|
model.Priority = cmd.Params.Get("priority").IntOr(100)
|
|
|
|
// Conditions
|
|
model.Conditions = cmd.Params.Subset("conditions").EventConditions()
|
|
|
|
// Power, Color, Intensity, Temperature
|
|
nds := cmd.Params.DeviceState("set-")
|
|
model.Actions.SetPower = nds.Power
|
|
model.Actions.SetColor = nds.Color
|
|
model.Actions.SetIntensity = nds.Intensity
|
|
|
|
// Add intensity
|
|
model.Actions.AddIntensity = cmd.Params.Get("add-intensity").Float()
|
|
|
|
// Fire
|
|
fireParams := cmd.Params.Subset("fire")
|
|
fireName := fireParams.Get("name").String()
|
|
if fireName != nil {
|
|
firePayloadParams := fireParams.Subset("payload")
|
|
|
|
model.Actions.FireEvent = &models.Event{
|
|
Name: *fireName,
|
|
Payload: make(map[string]string, len(firePayloadParams)),
|
|
}
|
|
|
|
for key, value := range firePayloadParams.StringMap() {
|
|
model.Actions.FireEvent.Payload[key] = value
|
|
}
|
|
}
|
|
|
|
newHandler, err := c.AddHandler(ctx, model)
|
|
if err != nil {
|
|
log.Fatalln(err)
|
|
}
|
|
|
|
WriteHandlerInfoTable(os.Stdout, []models.EventHandler{*newHandler})
|
|
case "delete":
|
|
id := cmd.Params.Get(0).Int()
|
|
if id == nil {
|
|
log.Fatalln("ID missing")
|
|
}
|
|
|
|
handler, err := c.DeleteHandler(ctx, *id)
|
|
if err != nil {
|
|
log.Fatalln(err)
|
|
}
|
|
|
|
WriteHandlerInfoTable(os.Stdout, []models.EventHandler{*handler})
|
|
default:
|
|
if cmd.Name != "help" {
|
|
log.Println("Unknown command:", cmd.Name)
|
|
}
|
|
|
|
_, _ = fmt.Fprintln(os.Stderr, helpString[1:])
|
|
}
|
|
}
|