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.

101 lines
2.3 KiB

  1. package main
  2. import (
  3. "context"
  4. "fmt"
  5. "git.aiterp.net/lucifer/new-server/app/client"
  6. "git.aiterp.net/lucifer/new-server/models"
  7. "log"
  8. "os"
  9. )
  10. func handlerCmd(
  11. ctx context.Context,
  12. c client.Client,
  13. ) {
  14. cmd := parseCommand(os.Args[2:])
  15. switch cmd.Name {
  16. case "list":
  17. handlers, err := c.GetHandlers(ctx)
  18. if err != nil {
  19. log.Fatalln(err)
  20. }
  21. WriteHandlerInfoTable(os.Stdout, handlers)
  22. case "add":
  23. model := models.EventHandler{}
  24. // Event name
  25. model.EventName = cmd.Params.Get(0).StringOr("")
  26. if len(model.EventName) == 0 {
  27. log.Fatalln("Event name needed!")
  28. }
  29. // Search
  30. fetchStr := cmd.Params.Get(1).String()
  31. if fetchStr == nil {
  32. log.Fatalln("Search filter needed!")
  33. }
  34. model.TargetKind, model.TargetValue = models.ParseFetchString(*fetchStr)
  35. // One shot
  36. model.OneShot = cmd.Params.Get("one-shot").StringOr("false") == "true"
  37. // Priority
  38. model.Priority = cmd.Params.Get("priority").IntOr(100)
  39. // Conditions
  40. model.Conditions = cmd.Params.Subset("conditions").EventConditions()
  41. // Power, Color, Intensity, Temperature
  42. nds := cmd.NewDeviceState("set-")
  43. model.Actions.SetPower = nds.Power
  44. model.Actions.SetColor = nds.Color
  45. model.Actions.SetIntensity = nds.Intensity
  46. // Add intensity
  47. model.Actions.AddIntensity = cmd.Params.Get("add-intensity").Float()
  48. // Fire
  49. fireParams := cmd.Params.Subset("fire")
  50. fireName := fireParams.Get("name").String()
  51. if fireName != nil {
  52. firePayloadParams := fireParams.Subset("payload")
  53. model.Actions.FireEvent = &models.Event{
  54. Name: *fireName,
  55. Payload: make(map[string]string, len(firePayloadParams)),
  56. }
  57. for key, value := range firePayloadParams.StringMap() {
  58. model.Actions.FireEvent.Payload[key] = value
  59. }
  60. }
  61. newHandler, err := c.AddHandler(ctx, model)
  62. if err != nil {
  63. log.Fatalln(err)
  64. }
  65. WriteHandlerInfoTable(os.Stdout, []models.EventHandler{*newHandler})
  66. case "delete":
  67. id := cmd.Params.Get(0).Int()
  68. if id == nil {
  69. log.Fatalln("ID missing")
  70. }
  71. handler, err := c.DeleteHandler(ctx, *id)
  72. if err != nil {
  73. log.Fatalln(err)
  74. }
  75. WriteHandlerInfoTable(os.Stdout, []models.EventHandler{*handler})
  76. default:
  77. if cmd.Name != "help" {
  78. log.Println("Unknown command:", cmd.Name)
  79. }
  80. _, _ = fmt.Fprintln(os.Stderr, helpString[1:])
  81. }
  82. }