@@ -0,0 +1,16 @@
|
|||||||
|
package client
|
||||||
|
|
||||||
|
import (
|
||||||
|
"context"
|
||||||
|
"git.aiterp.net/lucifer/new-server/models"
|
||||||
|
)
|
||||||
|
|
||||||
|
func (client *Client) GetHandlers(ctx context.Context, fetchStr string) ([]models.EventHandler, error) {
|
||||||
|
handlers := make([]models.EventHandler, 0, 16)
|
||||||
|
err := client.Fetch(ctx, "GET", "/api/event-handlers", &handlers, nil)
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
|
||||||
|
return handlers, nil
|
||||||
|
}
|
||||||
@@ -0,0 +1,32 @@
|
|||||||
|
package main
|
||||||
|
|
||||||
|
import (
|
||||||
|
"context"
|
||||||
|
"fmt"
|
||||||
|
"git.aiterp.net/lucifer/new-server/app/client"
|
||||||
|
"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, cmd.Params.Get(0).StringOr("all"))
|
||||||
|
if err != nil {
|
||||||
|
log.Fatalln(err)
|
||||||
|
}
|
||||||
|
|
||||||
|
WriteHandlerInfoTable(os.Stdout, handlers)
|
||||||
|
default:
|
||||||
|
if cmd.Name != "help" {
|
||||||
|
log.Println("Unknown command:", cmd.Name)
|
||||||
|
}
|
||||||
|
|
||||||
|
_, _ = fmt.Fprintln(os.Stderr, helpString[1:])
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -8,6 +8,7 @@ EXAMPLES
|
|||||||
lucy run SetProfile name=evening
|
lucy run SetProfile name=evening
|
||||||
|
|
||||||
DEVICE COMMANDS
|
DEVICE COMMANDS
|
||||||
|
handler list <search>
|
||||||
list <search>
|
list <search>
|
||||||
set <search> <power=B> <color=C> <intensity=F> <temperature=N>
|
set <search> <power=B> <color=C> <intensity=F> <temperature=N>
|
||||||
tag <search> <[+/-]tag-name>
|
tag <search> <[+/-]tag-name>
|
||||||
|
|||||||
+10
-5
@@ -17,6 +17,8 @@ func main() {
|
|||||||
cfg = &Config{Remote: "http://localhost:8000"}
|
cfg = &Config{Remote: "http://localhost:8000"}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
ctx := context.Background()
|
||||||
|
|
||||||
c := client.Client{APIRoot: cfg.Remote}
|
c := client.Client{APIRoot: cfg.Remote}
|
||||||
cmd := parseCommand(os.Args[1:])
|
cmd := parseCommand(os.Args[1:])
|
||||||
|
|
||||||
@@ -30,7 +32,7 @@ func main() {
|
|||||||
fetchStr = &s
|
fetchStr = &s
|
||||||
}
|
}
|
||||||
|
|
||||||
devices, err := c.GetDevices(context.Background(), *fetchStr)
|
devices, err := c.GetDevices(ctx, *fetchStr)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
log.Fatalln(err)
|
log.Fatalln(err)
|
||||||
}
|
}
|
||||||
@@ -39,7 +41,7 @@ func main() {
|
|||||||
}
|
}
|
||||||
case "set":
|
case "set":
|
||||||
{
|
{
|
||||||
devices, err := c.PutDeviceState(context.Background(), cmd.Params.Get(0).StringOr("all"), models.NewDeviceState{
|
devices, err := c.PutDeviceState(ctx, cmd.Params.Get(0).StringOr("all"), models.NewDeviceState{
|
||||||
Power: cmd.Params.Get("power").Bool(),
|
Power: cmd.Params.Get("power").Bool(),
|
||||||
Color: cmd.Params.Get("color").String(),
|
Color: cmd.Params.Get("color").String(),
|
||||||
Intensity: cmd.Params.Get("intensity").Float(),
|
Intensity: cmd.Params.Get("intensity").Float(),
|
||||||
@@ -67,7 +69,7 @@ func main() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
devices, err := c.PutDeviceTags(
|
devices, err := c.PutDeviceTags(
|
||||||
context.Background(),
|
ctx,
|
||||||
cmd.Params.Get(0).StringOr("all"),
|
cmd.Params.Get(0).StringOr("all"),
|
||||||
addTags,
|
addTags,
|
||||||
removeTags,
|
removeTags,
|
||||||
@@ -80,7 +82,7 @@ func main() {
|
|||||||
}
|
}
|
||||||
case "update":
|
case "update":
|
||||||
{
|
{
|
||||||
devices, err := c.PutDevice(context.Background(), cmd.Params.Get(0).StringOr("all"), models.DeviceUpdate{
|
devices, err := c.PutDevice(ctx, cmd.Params.Get(0).StringOr("all"), models.DeviceUpdate{
|
||||||
Name: cmd.Params.Get("name").String(),
|
Name: cmd.Params.Get("name").String(),
|
||||||
Icon: cmd.Params.Get("icon").String(),
|
Icon: cmd.Params.Get("icon").String(),
|
||||||
UserProperties: cmd.Params.Subset("prop.").StringPtrMap(),
|
UserProperties: cmd.Params.Subset("prop.").StringPtrMap(),
|
||||||
@@ -92,6 +94,9 @@ func main() {
|
|||||||
WriteDeviceInfoTable(os.Stdout, devices)
|
WriteDeviceInfoTable(os.Stdout, devices)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
case "handler":
|
||||||
|
handlerCmd(ctx, c)
|
||||||
|
|
||||||
// EVENT
|
// EVENT
|
||||||
case "run":
|
case "run":
|
||||||
{
|
{
|
||||||
@@ -105,7 +110,7 @@ func main() {
|
|||||||
Payload: cmd.Params.StringMap(),
|
Payload: cmd.Params.StringMap(),
|
||||||
}
|
}
|
||||||
|
|
||||||
err := c.FireEvent(context.Background(), event)
|
err := c.FireEvent(ctx, event)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
log.Fatalln(err)
|
log.Fatalln(err)
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,6 +1,7 @@
|
|||||||
package main
|
package main
|
||||||
|
|
||||||
import (
|
import (
|
||||||
|
"fmt"
|
||||||
"git.aiterp.net/lucifer/new-server/models"
|
"git.aiterp.net/lucifer/new-server/models"
|
||||||
"github.com/olekukonko/tablewriter"
|
"github.com/olekukonko/tablewriter"
|
||||||
"io"
|
"io"
|
||||||
@@ -72,3 +73,45 @@ func WriteDeviceInfoTable(w io.Writer, devices []models.Device) {
|
|||||||
|
|
||||||
table.Render()
|
table.Render()
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func WriteHandlerInfoTable(w io.Writer, handlers []models.EventHandler) {
|
||||||
|
table := tablewriter.NewWriter(w)
|
||||||
|
table.SetHeader([]string{"ID", "EVENT NAME", "ONE SHOT", "PRIORITY", "CONDITIONS", "TARGET", "ACTION"})
|
||||||
|
table.SetReflowDuringAutoWrap(false)
|
||||||
|
|
||||||
|
for _, h := range handlers {
|
||||||
|
condStr := ""
|
||||||
|
for key, value := range h.Conditions {
|
||||||
|
condStr += fmt.Sprintf("%s=%s ", key, value)
|
||||||
|
}
|
||||||
|
|
||||||
|
actionStr := ""
|
||||||
|
if h.Actions.SetPower != nil {
|
||||||
|
actionStr += fmt.Sprintf("setPower=%t ", *h.Actions.SetPower)
|
||||||
|
}
|
||||||
|
if h.Actions.SetColor != nil {
|
||||||
|
actionStr += fmt.Sprintf("setColor=%s ", *h.Actions.SetColor)
|
||||||
|
}
|
||||||
|
if h.Actions.SetIntensity != nil {
|
||||||
|
actionStr += fmt.Sprintf("setIntensity=%.02f ", *h.Actions.SetIntensity)
|
||||||
|
}
|
||||||
|
if h.Actions.AddIntensity != nil {
|
||||||
|
actionStr += fmt.Sprintf("addIntensity=%.02f ", *h.Actions.AddIntensity)
|
||||||
|
}
|
||||||
|
if h.Actions.FireEvent != nil {
|
||||||
|
actionStr += fmt.Sprintf("fireEvent=%s ", (*h.Actions.FireEvent).Name)
|
||||||
|
}
|
||||||
|
|
||||||
|
table.Append([]string{
|
||||||
|
strconv.Itoa(h.ID),
|
||||||
|
h.EventName,
|
||||||
|
strconv.FormatBool(h.OneShot),
|
||||||
|
strconv.Itoa(h.Priority),
|
||||||
|
condStr,
|
||||||
|
fmt.Sprintf("%s:%s", h.TargetKind, h.TargetValue),
|
||||||
|
actionStr,
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
table.Render()
|
||||||
|
}
|
||||||
|
|||||||
@@ -20,6 +20,7 @@ github.com/go-sql-driver/mysql v1.6.0 h1:BCTh4TKNUYmOmMUcQ3IipzF5prigylS7XXjEkfC
|
|||||||
github.com/go-sql-driver/mysql v1.6.0/go.mod h1:DCzpHaOWr8IXmIStZouvnhqoel9Qv2LBy8hT2VhHyBg=
|
github.com/go-sql-driver/mysql v1.6.0/go.mod h1:DCzpHaOWr8IXmIStZouvnhqoel9Qv2LBy8hT2VhHyBg=
|
||||||
github.com/golang/protobuf v1.3.3 h1:gyjaxf+svBWX08ZjK86iN9geUJF0H6gp2IRKX6Nf6/I=
|
github.com/golang/protobuf v1.3.3 h1:gyjaxf+svBWX08ZjK86iN9geUJF0H6gp2IRKX6Nf6/I=
|
||||||
github.com/golang/protobuf v1.3.3/go.mod h1:vzj43D7+SQXF/4pzW/hwtAqwc6iTitCiVSaWz5lYuqw=
|
github.com/golang/protobuf v1.3.3/go.mod h1:vzj43D7+SQXF/4pzW/hwtAqwc6iTitCiVSaWz5lYuqw=
|
||||||
|
github.com/google/gofuzz v1.0.0 h1:A8PeW59pxE9IoFRqBp37U+mSNaQoZ46F1f0f863XSXw=
|
||||||
github.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg=
|
github.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg=
|
||||||
github.com/jmoiron/sqlx v1.3.4 h1:wv+0IJZfL5z0uZoUjlpKgHkgaFSYD+r9CfrXjEXsO7w=
|
github.com/jmoiron/sqlx v1.3.4 h1:wv+0IJZfL5z0uZoUjlpKgHkgaFSYD+r9CfrXjEXsO7w=
|
||||||
github.com/jmoiron/sqlx v1.3.4/go.mod h1:2BljVx/86SuTyjE+aPYlHCTNvZrnJXghYGpNiXLBMCQ=
|
github.com/jmoiron/sqlx v1.3.4/go.mod h1:2BljVx/86SuTyjE+aPYlHCTNvZrnJXghYGpNiXLBMCQ=
|
||||||
@@ -55,6 +56,7 @@ github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZb
|
|||||||
github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=
|
github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=
|
||||||
github.com/pressly/goose v2.7.0+incompatible h1:PWejVEv07LCerQEzMMeAtjuyCKbyprZ/LBa6K5P0OCQ=
|
github.com/pressly/goose v2.7.0+incompatible h1:PWejVEv07LCerQEzMMeAtjuyCKbyprZ/LBa6K5P0OCQ=
|
||||||
github.com/pressly/goose v2.7.0+incompatible/go.mod h1:m+QHWCqxR3k8D9l7qfzuC/djtlfzxr34mozWDYEu1z8=
|
github.com/pressly/goose v2.7.0+incompatible/go.mod h1:m+QHWCqxR3k8D9l7qfzuC/djtlfzxr34mozWDYEu1z8=
|
||||||
|
github.com/stretchr/objx v0.1.0 h1:4G4v2dO3VZwixGIRoQ5Lfboy6nUhCyYzaqnIAPPhYs4=
|
||||||
github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=
|
github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=
|
||||||
github.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs=
|
github.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs=
|
||||||
github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI=
|
github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI=
|
||||||
@@ -69,6 +71,7 @@ golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPh
|
|||||||
golang.org/x/crypto v0.0.0-20210915214749-c084706c2272 h1:3erb+vDS8lU1sxfDHF4/hhWyaXnhIaO+7RgL4fDZORA=
|
golang.org/x/crypto v0.0.0-20210915214749-c084706c2272 h1:3erb+vDS8lU1sxfDHF4/hhWyaXnhIaO+7RgL4fDZORA=
|
||||||
golang.org/x/crypto v0.0.0-20210915214749-c084706c2272/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc=
|
golang.org/x/crypto v0.0.0-20210915214749-c084706c2272/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc=
|
||||||
golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=
|
golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=
|
||||||
|
golang.org/x/net v0.0.0-20210226172049-e18ecbb05110 h1:qWPm9rbaAMKs8Bq/9LRpbMqxWRVUAQwMI9fVrssnTfw=
|
||||||
golang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg=
|
golang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg=
|
||||||
golang.org/x/sync v0.0.0-20210220032951-036812b2e83c h1:5KslGYwFpkhGh+Q16bwMP3cOontH8FOep7tGV86Y7SQ=
|
golang.org/x/sync v0.0.0-20210220032951-036812b2e83c h1:5KslGYwFpkhGh+Q16bwMP3cOontH8FOep7tGV86Y7SQ=
|
||||||
golang.org/x/sync v0.0.0-20210220032951-036812b2e83c/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
|
golang.org/x/sync v0.0.0-20210220032951-036812b2e83c/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
|
||||||
@@ -78,10 +81,13 @@ golang.org/x/sys v0.0.0-20200116001909-b77594299b42/go.mod h1:h1NjWce9XRLGQEsW7w
|
|||||||
golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
||||||
golang.org/x/sys v0.0.0-20210615035016-665e8c7367d1 h1:SrN+KX8Art/Sf4HNj6Zcz06G7VEz+7w9tdXTPOZ7+l4=
|
golang.org/x/sys v0.0.0-20210615035016-665e8c7367d1 h1:SrN+KX8Art/Sf4HNj6Zcz06G7VEz+7w9tdXTPOZ7+l4=
|
||||||
golang.org/x/sys v0.0.0-20210615035016-665e8c7367d1/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
|
golang.org/x/sys v0.0.0-20210615035016-665e8c7367d1/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
|
||||||
|
golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1 h1:v+OssWQX+hTHEmOBgwxdZxK4zHq3yOs8F9J7mk0PY8E=
|
||||||
golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo=
|
golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo=
|
||||||
golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
|
golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
|
||||||
golang.org/x/text v0.3.2/go.mod h1:bEr9sfX3Q8Zfm5fL9x+3itogRgK3+ptLWKqgva+5dAk=
|
golang.org/x/text v0.3.2/go.mod h1:bEr9sfX3Q8Zfm5fL9x+3itogRgK3+ptLWKqgva+5dAk=
|
||||||
|
golang.org/x/text v0.3.3 h1:cokOdA+Jmi5PJGXLlLllQSgYigAEfHXJAERHVMaCc2k=
|
||||||
golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=
|
golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=
|
||||||
|
golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e h1:FDhOuMEY4JVRztM/gsbk+IKUQ8kj74bxZrgw87eMMVc=
|
||||||
golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=
|
golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=
|
||||||
gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405 h1:yhCVgyC4o1eVCa2tZl7eS0r+SDo693bJlVdllGtEeKM=
|
gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405 h1:yhCVgyC4o1eVCa2tZl7eS0r+SDo693bJlVdllGtEeKM=
|
||||||
gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
|
gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
|
||||||
|
|||||||
Executable
+11
@@ -0,0 +1,11 @@
|
|||||||
|
#!/bin/bash
|
||||||
|
|
||||||
|
printf "Building lucy...\n"
|
||||||
|
go mod download || exit 1
|
||||||
|
go build -ldflags "-w -s" -o lucy ./cmd/lucy || exit 1
|
||||||
|
|
||||||
|
printf "Removing old lucy...\n"
|
||||||
|
sudo rm /usr/local/bin/lucy > /dev/null 2&>1
|
||||||
|
|
||||||
|
printf "Installing...\n"
|
||||||
|
sudo mv ./lucy /usr/local/bin/lucy
|
||||||
@@ -220,3 +220,24 @@ func (action *EventAction) Apply(other EventAction) {
|
|||||||
action.FireEvent = other.FireEvent
|
action.FireEvent = other.FireEvent
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func (c EventCondition) String() string {
|
||||||
|
str := make([]string, 0, 5)
|
||||||
|
if len(c.LT) > 0 {
|
||||||
|
str = append(str, "lt:" + c.LT)
|
||||||
|
}
|
||||||
|
if len(c.LTE) > 0 {
|
||||||
|
str = append(str, "lte:" + c.LTE)
|
||||||
|
}
|
||||||
|
if len(c.EQ) > 0 {
|
||||||
|
str = append(str, c.EQ)
|
||||||
|
}
|
||||||
|
if len(c.GTE) > 0 {
|
||||||
|
str = append(str, "gte:" + c.GTE)
|
||||||
|
}
|
||||||
|
if len(c.GT) > 0 {
|
||||||
|
str = append(str, "gte:" + c.GT)
|
||||||
|
}
|
||||||
|
|
||||||
|
return strings.Join(str, ";")
|
||||||
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user