1
0
forked from x/icebergs
icebergs/base/mdb/search.go
2020-06-22 08:53:45 +08:00

179 lines
6.0 KiB
Go

package mdb
import (
"github.com/shylinux/icebergs"
"github.com/shylinux/toolkits"
"strings"
"sync"
)
const SEARCH = "search"
func init() {
Index.Merge(&ice.Context{
Configs: map[string]*ice.Config{
SEARCH: {Name: "search", Help: "搜索引擎", Value: kit.Data(kit.MDB_SHORT, kit.MDB_TYPE)},
},
Commands: map[string]*ice.Command{
SEARCH: {Name: "search word type...", Help: "搜索引擎", Action: map[string]*ice.Action{
CREATE: {Name: "create type name [text]", Help: "创建", Hand: func(m *ice.Message, arg ...string) {
m.Rich(SEARCH, nil, kit.Dict(kit.MDB_TYPE, arg[0], kit.MDB_NAME, arg[1], kit.MDB_TEXT, kit.Select("", arg, 2)))
}},
}, Hand: func(m *ice.Message, c *ice.Context, cmd string, arg ...string) {
if strings.Contains(arg[0], ";") {
arg = strings.Split(arg[0], ";")
}
if len(arg) > 2 {
for _, k := range strings.Split(arg[2], ",") {
m.Richs(SEARCH, nil, k, func(key string, value map[string]interface{}) {
m.Cmdy(kit.Keys(value[kit.MDB_TEXT], value[kit.MDB_NAME]), SEARCH, value[kit.MDB_TYPE], arg[0], kit.Select("", arg, 1))
})
}
} else {
m.Richs(SEARCH, nil, kit.MDB_FOREACH, func(key string, value map[string]interface{}) {
m.Cmdy(kit.Keys(value[kit.MDB_TEXT], value[kit.MDB_NAME]), SEARCH, value[kit.MDB_TYPE], arg[0], kit.Select("", arg, 1))
})
}
return
if len(arg) < 2 {
m.Cmdy("web.label", arg)
return
}
switch arg[0] {
case "add":
if m.Richs(cmd, nil, arg[1], nil) == nil {
m.Rich(cmd, nil, kit.Data(kit.MDB_NAME, arg[1]))
}
m.Richs(cmd, nil, arg[1], func(key string, value map[string]interface{}) {
m.Grow(cmd, kit.Keys(kit.MDB_HASH, key), kit.Dict(
kit.MDB_NAME, arg[2], kit.MDB_TEXT, arg[3:],
))
})
case "get":
wg := &sync.WaitGroup{}
m.Richs(cmd, nil, arg[1], func(key string, value map[string]interface{}) {
wg.Add(1)
m.Gos(m, func(m *ice.Message) {
m.Grows(cmd, kit.Keys(kit.MDB_HASH, key), "", "", func(index int, value map[string]interface{}) {
m.Cmdy(value[kit.MDB_TEXT], arg[2:])
})
wg.Done()
})
})
wg.Wait()
case "set":
if arg[1] != "" {
m.Cmdy("web.space", arg[1], "web.chat.search", "set", "", arg[2:])
break
}
m.Richs(cmd, nil, arg[2], func(key string, value map[string]interface{}) {
m.Grows(cmd, kit.Keys(kit.MDB_HASH, key), "", "", func(index int, value map[string]interface{}) {
m.Cmdy(value[kit.MDB_TEXT], "set", arg[3:])
})
})
default:
if len(arg) < 4 {
m.Richs(cmd, nil, kit.Select(kit.MDB_FOREACH, arg, 2), func(key string, val map[string]interface{}) {
if len(arg) < 3 {
m.Push(key, val[kit.MDB_META], []string{kit.MDB_TIME, kit.MDB_NAME, kit.MDB_COUNT})
return
}
m.Grows(cmd, kit.Keys(kit.MDB_HASH, key), "", "", func(index int, value map[string]interface{}) {
m.Push("", value, []string{kit.MDB_TIME})
m.Push("group", arg[2])
m.Push("", value, []string{kit.MDB_NAME, kit.MDB_TEXT})
})
})
break
}
m.Option("pod", "")
m.Cmdy("web.label", arg[0], arg[1], "web.chat.search", "get", arg[2:])
m.Sort("time", "time_r")
}
}},
"commend": {Name: "commend label pod engine work auto", Help: "推荐引擎", Hand: func(m *ice.Message, c *ice.Context, cmd string, arg ...string) {
if len(arg) < 2 {
m.Cmdy("web.label", arg)
return
}
switch arg[0] {
case "add":
if m.Richs(cmd, nil, arg[1], nil) == nil {
m.Rich(cmd, nil, kit.Data(kit.MDB_NAME, arg[1]))
}
m.Richs(cmd, nil, arg[1], func(key string, value map[string]interface{}) {
m.Grow(cmd, kit.Keys(kit.MDB_HASH, key), kit.Dict(
kit.MDB_NAME, arg[2], kit.MDB_TEXT, arg[3:],
))
})
case "get":
wg := &sync.WaitGroup{}
m.Richs(cmd, nil, arg[1], func(key string, value map[string]interface{}) {
wg.Add(1)
m.Gos(m, func(m *ice.Message) {
m.Grows(cmd, kit.Keys(kit.MDB_HASH, key), "", "", func(index int, value map[string]interface{}) {
m.Cmdy(value[kit.MDB_TEXT], arg[2:])
})
wg.Done()
})
})
m.Sort("time", "time_r")
wg.Wait()
case "set":
if arg[1] != "" {
m.Cmdy("web.space", arg[1], "web.chat.commend", "set", "", arg[2:])
break
}
if m.Richs(cmd, "meta.user", m.Option(ice.MSG_USERNAME), nil) == nil {
m.Rich(cmd, "meta.user", kit.Dict(
kit.MDB_NAME, m.Option(ice.MSG_USERNAME),
))
}
switch m.Option("_action") {
case "喜欢":
m.Richs(cmd, "meta.user", m.Option(ice.MSG_USERNAME), func(key string, value map[string]interface{}) {
m.Grow(cmd, kit.Keys("meta.user", kit.MDB_HASH, key, "like"), kit.Dict(
kit.MDB_EXTRA, kit.Dict("engine", arg[2], "favor", arg[3], "id", arg[4]),
kit.MDB_TYPE, arg[5], kit.MDB_NAME, arg[6], kit.MDB_TEXT, arg[7],
))
})
case "讨厌":
m.Richs(cmd, "meta.user", m.Option(ice.MSG_USERNAME), func(key string, value map[string]interface{}) {
m.Grow(cmd, kit.Keys("meta.user", kit.MDB_HASH, key, "hate"), kit.Dict(
kit.MDB_EXTRA, kit.Dict("engine", arg[2], "favor", arg[3], "id", arg[4]),
kit.MDB_TYPE, arg[5], kit.MDB_NAME, arg[6], kit.MDB_TEXT, arg[7],
))
})
}
m.Richs(cmd, nil, arg[2], func(key string, value map[string]interface{}) {
m.Grows(cmd, kit.Keys(kit.MDB_HASH, key), "", "", func(index int, value map[string]interface{}) {
m.Cmdy(value[kit.MDB_TEXT], "set", arg[3:])
})
})
default:
if len(arg) == 2 {
m.Richs(cmd, nil, "*", func(key string, value map[string]interface{}) {
m.Push(key, value)
})
break
}
if len(arg) == 3 {
m.Richs(cmd, nil, "*", func(key string, value map[string]interface{}) {
m.Push(key, value)
})
break
}
m.Cmdy("web.label", arg[0], arg[1], "web.chat.commend", "get", arg[2:])
// m.Cmdy("web.chat.commend", "get", arg[2:])
}
}},
}}, nil)
}