clean up resolver a bit.
This commit is contained in:
+47
-51
@@ -5,6 +5,7 @@ import (
|
|||||||
"git.aiterp.net/lucifer3/server/commands"
|
"git.aiterp.net/lucifer3/server/commands"
|
||||||
"git.aiterp.net/lucifer3/server/events"
|
"git.aiterp.net/lucifer3/server/events"
|
||||||
"git.aiterp.net/lucifer3/server/internal/gentools"
|
"git.aiterp.net/lucifer3/server/internal/gentools"
|
||||||
|
"reflect"
|
||||||
"strings"
|
"strings"
|
||||||
)
|
)
|
||||||
|
|
||||||
@@ -46,20 +47,56 @@ func (r *resolver) HandleEvent(_ *lucifer3.EventBus, event lucifer3.Event) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func (r *resolver) rerun(bus *lucifer3.EventBus, resolveList *[]string, command interface{}) {
|
||||||
|
newList := make([]string, 0, 16)
|
||||||
|
|
||||||
|
for _, id := range *resolveList {
|
||||||
|
switch {
|
||||||
|
case strings.HasPrefix(id, "lucifer:tag:"):
|
||||||
|
tag := id[12:]
|
||||||
|
if len(newList) == 0 {
|
||||||
|
newList = append(newList, r.tags[tag]...)
|
||||||
|
} else {
|
||||||
|
gentools.AddUniques(&newList, r.tags[tag]...)
|
||||||
|
}
|
||||||
|
case strings.HasPrefix(id, "lucifer:name:"):
|
||||||
|
name := id[13:]
|
||||||
|
if strings.HasSuffix(name, "*") {
|
||||||
|
prefix := name[:len(name)-1]
|
||||||
|
for name, ids := range r.names {
|
||||||
|
if strings.HasPrefix(name, prefix) {
|
||||||
|
gentools.AddUniques(&newList, ids...)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} else if strings.HasPrefix(name, "*") {
|
||||||
|
suffix := name[1:]
|
||||||
|
for name, ids := range r.names {
|
||||||
|
if strings.HasSuffix(name, suffix) {
|
||||||
|
gentools.AddUniques(&newList, ids...)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
gentools.AddUniques(&newList, r.names[name]...)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if len(newList) > 0 {
|
||||||
|
*resolveList = newList
|
||||||
|
|
||||||
|
bus.RunCommand(reflect.Indirect(reflect.ValueOf(command)).Interface().(lucifer3.Command))
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
func (r *resolver) HandleCommand(bus *lucifer3.EventBus, command lucifer3.Command) {
|
func (r *resolver) HandleCommand(bus *lucifer3.EventBus, command lucifer3.Command) {
|
||||||
var resolveList []string
|
|
||||||
var resolveCB func(newIDs []string) lucifer3.Command
|
|
||||||
|
|
||||||
switch command := command.(type) {
|
switch command := command.(type) {
|
||||||
case commands.Assign:
|
case commands.Assign:
|
||||||
resolveList = command.IDs
|
r.rerun(bus, &command.IDs, &command)
|
||||||
resolveCB = func(newIDs []string) lucifer3.Command { command.IDs = newIDs; return command }
|
|
||||||
case commands.ReplaceScene:
|
case commands.ReplaceScene:
|
||||||
resolveList = command.IDs
|
r.rerun(bus, &command.IDs, &command)
|
||||||
resolveCB = func(newIDs []string) lucifer3.Command { command.IDs = newIDs; return command }
|
|
||||||
case commands.ClearScene:
|
case commands.ClearScene:
|
||||||
resolveList = command.IDs
|
r.rerun(bus, &command.IDs, &command)
|
||||||
resolveCB = func(newIDs []string) lucifer3.Command { command.IDs = newIDs; return command }
|
|
||||||
case commands.SetName:
|
case commands.SetName:
|
||||||
if !strings.HasPrefix(command.ID, "lucifer:") {
|
if !strings.HasPrefix(command.ID, "lucifer:") {
|
||||||
for name := range r.names {
|
for name := range r.names {
|
||||||
@@ -88,8 +125,7 @@ func (r *resolver) HandleCommand(bus *lucifer3.EventBus, command lucifer3.Comman
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
resolveList = command.IDs
|
r.rerun(bus, &command.IDs, &command)
|
||||||
resolveCB = func(newIDs []string) lucifer3.Command { command.IDs = newIDs; return command }
|
|
||||||
case commands.RemoveTag:
|
case commands.RemoveTag:
|
||||||
for _, id := range command.IDs {
|
for _, id := range command.IDs {
|
||||||
if strings.HasPrefix(id, "lucifer:") {
|
if strings.HasPrefix(id, "lucifer:") {
|
||||||
@@ -104,46 +140,6 @@ func (r *resolver) HandleCommand(bus *lucifer3.EventBus, command lucifer3.Comman
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
resolveList = command.IDs
|
r.rerun(bus, &command.IDs, &command)
|
||||||
resolveCB = func(newIDs []string) lucifer3.Command { command.IDs = newIDs; return command }
|
|
||||||
}
|
|
||||||
|
|
||||||
if resolveList != nil && resolveCB != nil {
|
|
||||||
newList := make([]string, 0, 16)
|
|
||||||
|
|
||||||
for _, id := range resolveList {
|
|
||||||
switch {
|
|
||||||
case strings.HasPrefix(id, "lucifer:tag:"):
|
|
||||||
tag := id[12:]
|
|
||||||
if len(newList) == 0 {
|
|
||||||
newList = append(newList, r.tags[tag]...)
|
|
||||||
} else {
|
|
||||||
gentools.AddUniques(&newList, r.tags[tag]...)
|
|
||||||
}
|
|
||||||
case strings.HasPrefix(id, "lucifer:name:"):
|
|
||||||
name := id[13:]
|
|
||||||
if strings.HasSuffix(name, "*") {
|
|
||||||
prefix := name[:len(name)-1]
|
|
||||||
for name, ids := range r.names {
|
|
||||||
if strings.HasPrefix(name, prefix) {
|
|
||||||
gentools.AddUniques(&newList, ids...)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
} else if strings.HasPrefix(name, "*") {
|
|
||||||
suffix := name[1:]
|
|
||||||
for name, ids := range r.names {
|
|
||||||
if strings.HasSuffix(name, suffix) {
|
|
||||||
gentools.AddUniques(&newList, ids...)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
gentools.AddUniques(&newList, r.names[name]...)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if len(newList) > 0 {
|
|
||||||
bus.RunCommand(resolveCB(newList))
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user