From dae75f4aab4f28ccff50733257fa606d8b8f6137 Mon Sep 17 00:00:00 2001 From: shaoying Date: Tue, 8 Sep 2020 19:52:25 +0800 Subject: [PATCH] opt chat.river --- base/mdb/mdb.go | 16 ++-- base/ssh/server.go | 43 +---------- core/chat/chat.go | 5 -- core/chat/river.go | 171 ++++++++++++++++++++----------------------- core/code/compile.go | 2 +- core/wiki/word.go | 1 + type.go | 37 ++++++++++ 7 files changed, 130 insertions(+), 145 deletions(-) diff --git a/base/mdb/mdb.go b/base/mdb/mdb.go index e5cb0623..223977ea 100644 --- a/base/mdb/mdb.go +++ b/base/mdb/mdb.go @@ -38,7 +38,7 @@ func _hash_select(m *ice.Message, prefix, key, field, value string) { if m.Option(FIELDS) == "detail" { m.Push("detail", val) } else { - m.Push(key, val, fields) + m.Push(key, val, fields, val[kit.MDB_META]) } }) if m.Option(FIELDS) != "detail" { @@ -47,6 +47,9 @@ func _hash_select(m *ice.Message, prefix, key, field, value string) { } func _hash_modify(m *ice.Message, prefix, key string, field, value string, arg ...string) { m.Richs(prefix, key, value, func(key string, value map[string]interface{}) { + if value[kit.MDB_META] != nil { + value = value[kit.MDB_META].(map[string]interface{}) + } for i := 0; i < len(arg)-1; i += 2 { if arg[i] == field { continue @@ -136,16 +139,19 @@ func _list_delete(m *ice.Message, prefix, chain, field, value string) { } func _list_select(m *ice.Message, prefix, key, field, value string) { fields := strings.Split(kit.Select("time,type,name,text", m.Option("fields")), ",") - m.Grows(prefix, key, field, value, func(index int, value map[string]interface{}) { - if field == kit.MDB_ID { - m.Push("detail", value) + m.Grows(prefix, key, field, value, func(index int, val map[string]interface{}) { + if field == kit.MDB_ID && value != "" { + m.Push("detail", val) return } - m.Push("", value, fields) + m.Push("", val, fields, val[kit.MDB_META]) }) } func _list_modify(m *ice.Message, prefix, key string, field, value string, arg ...string) { m.Grows(prefix, key, field, value, func(index int, value map[string]interface{}) { + if value[kit.MDB_META] != nil { + value = value[kit.MDB_META].(map[string]interface{}) + } for i := 0; i < len(arg)-1; i += 2 { if arg[i] == field { continue diff --git a/base/ssh/server.go b/base/ssh/server.go index f1af69e6..ae3cd0e4 100644 --- a/base/ssh/server.go +++ b/base/ssh/server.go @@ -10,7 +10,6 @@ import ( "bytes" "encoding/base64" - "encoding/binary" "errors" "fmt" "io" @@ -20,9 +19,7 @@ import ( "os/exec" "path" "strings" - "syscall" "time" - "unsafe" "github.com/kr/pty" "golang.org/x/crypto/ssh" @@ -35,13 +32,6 @@ type Winsize struct { y uint16 } -func _ssh_size(fd uintptr, b []byte) { - w := binary.BigEndian.Uint32(b) - h := binary.BigEndian.Uint32(b[4:]) - - ws := &Winsize{Width: uint16(w), Height: uint16(h)} - syscall.Syscall(syscall.SYS_IOCTL, fd, uintptr(syscall.TIOCSWINSZ), uintptr(unsafe.Pointer(ws))) -} func _ssh_exec(m *ice.Message, cmd string, arg []string, env []string, tty io.ReadWriter, done func()) { m.Log_IMPORT("cmd", cmd, "arg", arg, "env", env) c := exec.Command(cmd, arg...) @@ -135,25 +125,6 @@ func _ssh_handle(m *ice.Message, meta map[string]string, c net.Conn, channel ssh list = append(list, env.Name+"="+env.Value) case "exec": - if meta["username"] == "revert" { - n, e := channel.Write([]byte("pwd")) - n, e = channel.Write([]byte("pwd")) - n, e = channel.Write([]byte("pwd")) - n, e = channel.Write([]byte("pwd")) - n, e = channel.Write([]byte("pwd")) - m.Debug("what %v %v", n, e) - m.Debug("what %v %v", n, e) - m.Debug("what %v %v", n, e) - m.Debug("what %v %v", n, e) - m.Debug("what %v %v", n, e) - m.Debug("what %v %v", n, e) - m.Debug("what %v %v", n, e) - m.Debug("what %v %v", n, e) - m.Debug("what %v %v", n, e) - m.Debug("what %v %v", n, e) - m.Debug("what %v %v", n, e) - break - } _ssh_exec(m, shell, []string{"-c", string(request.Payload[4 : request.Payload[3]+4])}, list, channel, func() { channel.Close() }) case "shell": @@ -168,16 +139,6 @@ func _ssh_handle(m *ice.Message, meta map[string]string, c net.Conn, channel ssh if meta["username"] == "revert" { n, e := channel.Write([]byte("pwd")) m.Debug("what %v %v", n, e) - m.Debug("what %v %v", n, e) - m.Debug("what %v %v", n, e) - m.Debug("what %v %v", n, e) - m.Debug("what %v %v", n, e) - m.Debug("what %v %v", n, e) - m.Debug("what %v %v", n, e) - m.Debug("what %v %v", n, e) - m.Debug("what %v %v", n, e) - m.Debug("what %v %v", n, e) - m.Debug("what %v %v", n, e) break } else if meta["username"] == "ssh" { @@ -286,14 +247,14 @@ func _ssh_config(m *ice.Message) *ssh.ServerConfig { return &ssh.Permissions{Extensions: meta}, res }, PasswordCallback: func(conn ssh.ConnMetadata, password []byte) (*ssh.Permissions, error) { - res := errors.New(ice.ErrNotAuth) + meta, res := map[string]string{"username": conn.User()}, errors.New(ice.ErrNotAuth) m.Richs(aaa.USER, "", conn.User(), func(k string, value map[string]interface{}) { if string(password) == kit.Format(value[aaa.PASSWORD]) { m.Log_AUTH(aaa.HOSTPORT, conn.RemoteAddr(), aaa.USERNAME, conn.User(), aaa.PASSWORD, strings.Repeat("*", len(kit.Format(value[aaa.PASSWORD])))) res = nil } }) - return &ssh.Permissions{}, res + return &ssh.Permissions{Extensions: meta}, res }, } diff --git a/core/chat/chat.go b/core/chat/chat.go index 49833f3c..3184b6b2 100644 --- a/core/chat/chat.go +++ b/core/chat/chat.go @@ -198,11 +198,6 @@ var Index = &ice.Context{Name: "chat", Help: "聊天中心", }}, - "tool": {Name: "tool", Help: "应用", Hand: func(m *ice.Message, c *ice.Context, cmd string, arg ...string) { - }}, - "node": {Name: "node", Help: "设备", Hand: func(m *ice.Message, c *ice.Context, cmd string, arg ...string) { - }}, - "/ocean": {Name: "/ocean", Help: "大海洋", Hand: func(m *ice.Message, c *ice.Context, cmd string, arg ...string) { if len(arg) == 0 { // 用户列表 diff --git a/core/chat/river.go b/core/chat/river.go index ab1de7fc..2b1e8da2 100644 --- a/core/chat/river.go +++ b/core/chat/river.go @@ -4,6 +4,7 @@ import ( ice "github.com/shylinux/icebergs" "github.com/shylinux/icebergs/base/aaa" "github.com/shylinux/icebergs/base/cli" + "github.com/shylinux/icebergs/base/ctx" "github.com/shylinux/icebergs/base/mdb" "github.com/shylinux/icebergs/base/tcp" "github.com/shylinux/icebergs/base/web" @@ -29,20 +30,6 @@ func _river_list(m *ice.Message) { }) }) } -func _river_node(m *ice.Message, river string, node ...string) { - prefix := kit.Keys(kit.MDB_HASH, river, NODE) - for _, v := range node { - m.Rich(RIVER, prefix, kit.Data(kit.MDB_NAME, v)) - m.Log_INSERT(RIVER, river, NODE, v) - } -} -func _river_user(m *ice.Message, river string, user ...string) { - prefix := kit.Keys(kit.MDB_HASH, river, USER) - for _, v := range user { - m.Rich(RIVER, prefix, kit.Data(aaa.USERNAME, v)) - m.Log_INSERT(RIVER, river, USER, v) - } -} func _river_share(m *ice.Message, river, name string, arg ...string) { m.Cmdy(web.SHARE, RIVER, name, river, arg) } @@ -68,7 +55,10 @@ func _river_create(m *ice.Message, kind, name, text string, arg ...string) { )) m.Log_CREATE(kit.MDB_META, RIVER, kit.MDB_TYPE, kind, kit.MDB_NAME, name) - _river_user(m, h, cli.UserName, m.Option(ice.MSG_USERNAME)) + m.Option(ice.MSG_RIVER, h) + m.Cmdy(m.Prefix(USER), mdb.INSERT, aaa.USERNAME, cli.UserName) + m.Cmdy(m.Prefix(USER), mdb.INSERT, aaa.USERNAME, m.Option(ice.MSG_USERNAME)) + kit.Fetch(m.Confv(RIVER, kit.Keys("meta.template", "base")), func(storm string, value interface{}) { list := []string{} kit.Fetch(value, func(index int, value string) { @@ -97,9 +87,10 @@ func init() { "template", kit.Dict( "base", kit.Dict( "info", []interface{}{ - "web.chat.user", - "web.chat.tool", "web.chat.info", + "web.chat.tool", + "web.chat.node", + "web.chat.user", }, "miss", []interface{}{ "web.team.task", @@ -143,84 +134,84 @@ func init() { m.Push("detail", value[kit.MDB_META]) }) }}, - - "user": {Name: "user auto", Help: "用户", Action: map[string]*ice.Action{ - mdb.DELETE: {Name: "delete", Help: "删除", Hand: func(m *ice.Message, arg ...string) { - if m.Option(aaa.USERNAME) == cli.UserName { - return + TOOL: {Name: "tool hash=auto auto 添加 创建", Help: "工具", Action: map[string]*ice.Action{ + mdb.INPUTS: {Name: "inputs", Help: "补全", Hand: func(m *ice.Message, arg ...string) { + switch arg[0] { + case "storm": + _storm_list(m, m.Option(ice.MSG_RIVER)) + case "ctx": + m.Cmdy(ctx.COMMAND) + case "cmd", "help": + m.Cmdy(ctx.COMMAND) } - if m.Option(aaa.USERNAME) == m.Option(ice.MSG_USERNAME) { - return - } - m.Richs(RIVER, nil, m.Option(ice.MSG_RIVER), func(key string, value map[string]interface{}) { - m.Richs(RIVER, kit.Keys(kit.MDB_HASH, m.Option(ice.MSG_RIVER), USER), m.Option(aaa.USERNAME), func(key string, value map[string]interface{}) { - m.Conf(RIVER, kit.Keys(kit.MDB_HASH, m.Option(ice.MSG_RIVER), USER, kit.MDB_HASH, key), "") - m.Log_DELETE(RIVER, m.Option(ice.MSG_RIVER), USER, m.Option(aaa.USERNAME)) - }) - }) }}, - }, Hand: func(m *ice.Message, c *ice.Context, cmd string, arg ...string) { - m.Richs(RIVER, nil, m.Option(ice.MSG_RIVER), func(key string, value map[string]interface{}) { - m.Richs(RIVER, kit.Keys(kit.MDB_HASH, m.Option(ice.MSG_RIVER), USER), kit.MDB_FOREACH, func(key string, value map[string]interface{}) { - value = value[kit.MDB_META].(map[string]interface{}) - m.Push(key, value, []string{kit.MDB_TIME}) - m.Push(aaa.USERZONE, aaa.UserZone(m, value[aaa.USERNAME])) - m.Push(aaa.USERNICK, aaa.UserNick(m, value[aaa.USERNAME])) - m.Push(key, value, []string{aaa.USERNAME}) - }) - }) - m.PushAction("删除") - }}, - "tool": {Name: "tool storm=auto id=auto auto", Help: "工具", Action: map[string]*ice.Action{ + mdb.CREATE: {Name: "create type=public,protected,private name=hi text=hello", Help: "创建", Hand: func(m *ice.Message, arg ...string) { + _storm_create(m, m.Option(ice.MSG_RIVER), m.Option("type"), m.Option("name"), m.Option("text")) + }}, + mdb.INSERT: {Name: "insert storm ctx cmd help", Help: "添加", Hand: func(m *ice.Message, arg ...string) { + m.Cmdy(mdb.INSERT, RIVER, kit.Keys(kit.MDB_HASH, m.Option(ice.MSG_RIVER), TOOL, kit.MDB_HASH, m.Option(kit.MDB_HASH)), mdb.LIST, arg) + }}, mdb.MODIFY: {Name: "modify", Help: "编辑", Hand: func(m *ice.Message, arg ...string) { - m.Richs(RIVER, nil, m.Option(ice.MSG_RIVER), func(key string, value map[string]interface{}) { - m.Richs(RIVER, kit.Keys(kit.MDB_HASH, m.Option(ice.MSG_RIVER), TOOL), m.Option("storm"), func(key string, value map[string]interface{}) { - switch arg[0] { - case kit.MDB_TIME, kit.MDB_ID: - return - } - if m.Option(kit.MDB_ID) == "" { - m.Log_MODIFY(RIVER, m.Option(ice.MSG_RIVER), arg[0], arg[1], "old", kit.Value(value, kit.Keys(kit.MDB_META, arg[0]))) - kit.Value(value, kit.Keys(kit.MDB_META, arg[0]), arg[1]) - return - } - m.Grows(RIVER, kit.Keys(kit.MDB_HASH, m.Option(ice.MSG_RIVER), TOOL, kit.MDB_HASH, key), kit.MDB_ID, m.Option(kit.MDB_ID), func(index int, value map[string]interface{}) { - m.Log_MODIFY(RIVER, m.Option(ice.MSG_RIVER), arg[0], arg[1], "old", kit.Value(value, kit.Keys(kit.MDB_META, arg[0]))) - kit.Value(value, kit.Keys(kit.MDB_META, arg[0]), arg[1]) - }) - }) - }) + if m.Option(kit.MDB_ID) != "" { + m.Cmdy(mdb.MODIFY, RIVER, kit.Keys(kit.MDB_HASH, m.Option(ice.MSG_RIVER), TOOL, kit.MDB_HASH, m.Option(kit.MDB_HASH)), mdb.LIST, kit.MDB_ID, m.Option(kit.MDB_ID), arg) + } else { + m.Cmdy(mdb.MODIFY, RIVER, kit.Keys(kit.MDB_HASH, m.Option(ice.MSG_RIVER), TOOL), mdb.HASH, kit.MDB_HASH, m.Option(kit.MDB_HASH), arg) + } }}, }, Hand: func(m *ice.Message, c *ice.Context, cmd string, arg ...string) { if len(arg) == 0 { - m.Richs(RIVER, nil, m.Option(ice.MSG_RIVER), func(key string, value map[string]interface{}) { - m.Richs(RIVER, kit.Keys(kit.MDB_HASH, m.Option(ice.MSG_RIVER), TOOL), kit.MDB_FOREACH, func(key string, value map[string]interface{}) { - value = value[kit.MDB_META].(map[string]interface{}) - m.Push("time", value[kit.MDB_TIME]) - m.Push("storm", key) - m.Push("name", value[kit.MDB_NAME]) - m.Push("count", value[kit.MDB_COUNT]) - }) - }) - return + m.Option(mdb.FIELDS, "time,hash,name,count") + m.Cmdy(mdb.SELECT, RIVER, kit.Keys(kit.MDB_HASH, m.Option(ice.MSG_RIVER), TOOL), mdb.HASH) + } else { + m.Option(mdb.FIELDS, "time,id,ctx,cmd,help") + m.Cmdy(mdb.SELECT, RIVER, kit.Keys(kit.MDB_HASH, m.Option(ice.MSG_RIVER), TOOL, kit.MDB_HASH, arg[0]), mdb.LIST, kit.MDB_ID, arg[1:]) } - - m.Richs(RIVER, nil, m.Option(ice.MSG_RIVER), func(key string, value map[string]interface{}) { - if len(arg) == 1 { - m.Grows(RIVER, kit.Keys(kit.MDB_HASH, m.Option(ice.MSG_RIVER), TOOL, kit.MDB_HASH, arg[0]), "", "", func(index int, value map[string]interface{}) { - value = value[kit.MDB_META].(map[string]interface{}) - m.Push("time", value[kit.MDB_TIME]) - m.Push("id", value[kit.MDB_ID]) - m.Push("ctx", value["ctx"]) - m.Push("cmd", value["cmd"]) - }) - return - } - m.Grows(RIVER, kit.Keys(kit.MDB_HASH, m.Option(ice.MSG_RIVER), TOOL, kit.MDB_HASH, arg[0]), kit.MDB_ID, arg[1], func(index int, value map[string]interface{}) { - value = value[kit.MDB_META].(map[string]interface{}) - m.Push("detail", value) - }) + m.PushAction("删除") + }}, + NODE: {Name: "node hash=auto auto 添加 启动", Help: "设备", Action: map[string]*ice.Action{ + "start": {Name: "start", Help: "启动", Hand: func(m *ice.Message, arg ...string) { + m.Cmdy("web.code.install", "contexts", "base") + }}, + mdb.INPUTS: {Name: "inputs", Help: "补全", Hand: func(m *ice.Message, arg ...string) { + m.Cmdy(web.ROUTE) + }}, + mdb.INSERT: {Name: "insert route", Help: "添加", Hand: func(m *ice.Message, arg ...string) { + m.Cmdy(mdb.INSERT, RIVER, kit.Keys(kit.MDB_HASH, m.Option(ice.MSG_RIVER), NODE), mdb.HASH, arg) + }}, + mdb.DELETE: {Name: "delete", Help: "删除", Hand: func(m *ice.Message, arg ...string) { + m.Cmdy(mdb.DELETE, RIVER, kit.Keys(kit.MDB_HASH, m.Option(ice.MSG_RIVER), NODE), mdb.HASH, kit.MDB_HASH, m.Option(kit.MDB_HASH)) + }}, + }, Hand: func(m *ice.Message, c *ice.Context, cmd string, arg ...string) { + m.Option(mdb.FIELDS, "time,hash,route") + m.Cmdy(mdb.SELECT, RIVER, kit.Keys(kit.MDB_HASH, m.Option(ice.MSG_RIVER), NODE), mdb.HASH) + m.Table(func(index int, value map[string]string, head []string) { + m.Push(kit.MDB_LINK, kit.MergeURL(m.Option(ice.MSG_USERWEB), "pod", kit.Keys(m.Option("pod"), value["route"]))) }) + m.PushAction("删除") + }}, + USER: {Name: "user hash=auto auto 添加 邀请", Help: "用户", Action: map[string]*ice.Action{ + "invite": {Name: "invite", Help: "邀请", Hand: func(m *ice.Message, arg ...string) { + m.Cmdy("web.wiki.spark", "inner", kit.MergeURL(m.Option(ice.MSG_USERWEB), "river", m.Option(ice.MSG_RIVER))) + m.Cmdy("web.wiki.image", "qrcode", kit.MergeURL(m.Option(ice.MSG_USERWEB), "river", m.Option(ice.MSG_RIVER))) + m.Render("") + }}, + mdb.INPUTS: {Name: "inputs", Help: "补全", Hand: func(m *ice.Message, arg ...string) { + m.Cmdy(aaa.USER) + }}, + mdb.INSERT: {Name: "insert username", Help: "添加", Hand: func(m *ice.Message, arg ...string) { + m.Cmdy(mdb.INSERT, RIVER, kit.Keys(kit.MDB_HASH, m.Option(ice.MSG_RIVER), USER), mdb.HASH, arg) + }}, + mdb.DELETE: {Name: "delete", Help: "删除", Hand: func(m *ice.Message, arg ...string) { + m.Cmdy(mdb.DELETE, RIVER, kit.Keys(kit.MDB_HASH, m.Option(ice.MSG_RIVER), USER), mdb.HASH, kit.MDB_HASH, m.Option(kit.MDB_HASH)) + }}, + }, Hand: func(m *ice.Message, c *ice.Context, cmd string, arg ...string) { + m.Option(mdb.FIELDS, "time,hash,username") + m.Cmdy(mdb.SELECT, RIVER, kit.Keys(kit.MDB_HASH, m.Option(ice.MSG_RIVER), USER), mdb.HASH) + m.Table(func(index int, value map[string]string, head []string) { + m.Push(aaa.USERZONE, aaa.UserZone(m, value[aaa.USERNAME])) + m.Push(aaa.USERNICK, aaa.UserNick(m, value[aaa.USERNAME])) + }) + m.PushAction("删除") }}, "/river": {Name: "/river", Help: "小河流", @@ -237,12 +228,6 @@ func init() { web.SHARE: {Name: "share name", Help: "共享", Hand: func(m *ice.Message, arg ...string) { _river_share(m, m.Option(ice.MSG_RIVER), arg[0]) }}, - USER: {Name: "user user...", Help: "添加用户", Hand: func(m *ice.Message, arg ...string) { - _river_user(m, m.Option(ice.MSG_RIVER), arg...) - }}, - NODE: {Name: "node node...", Help: "添加设备", Hand: func(m *ice.Message, arg ...string) { - _river_node(m, m.Option(ice.MSG_RIVER), arg...) - }}, }, Hand: func(m *ice.Message, c *ice.Context, cmd string, arg ...string) { if len(arg) > 0 && arg[0] == "storm" { m.Cmdy("/storm", arg[1:]) diff --git a/core/code/compile.go b/core/code/compile.go index 17f8678b..c5b26386 100644 --- a/core/code/compile.go +++ b/core/code/compile.go @@ -45,7 +45,7 @@ func init() { file = kit.Keys(kit.Select("ice", m.Option("name")), goos, arch) } if goos == "windows" { - file += ".exe" + // file += ".exe" } // 编译参数 diff --git a/core/wiki/word.go b/core/wiki/word.go index 9c933f26..444ca181 100644 --- a/core/wiki/word.go +++ b/core/wiki/word.go @@ -456,6 +456,7 @@ func init() { arg = []string{"", arg[0]} } _image_show(m, arg[0], kit.Select(arg[0], arg[1]), arg[2:]...) + m.Render("") }}, VIDEO: {Name: "video name url", Help: "视频", Hand: func(m *ice.Message, c *ice.Context, cmd string, arg ...string) { if len(arg) == 1 { diff --git a/type.go b/type.go index 67dff6e9..7ea97dd2 100644 --- a/type.go +++ b/type.go @@ -94,6 +94,10 @@ func (c *Context) cmd(m *Message, cmd *Command, key string, arg ...string) *Mess m.Option("_action", "") } m.Log(LOG_CMDS, "%s.%s %d %v %s", c.Name, key, len(arg), arg, kit.FileLine(h.Hand, 3)) + for i := 0; i < len(args)-1; i += 2 { + m.Debug("option %v %v", args[i], args[i+1]) + m.Option(args[i], args[i+1]) + } h.Hand(m, args...) return m } @@ -103,6 +107,9 @@ func (c *Context) cmd(m *Message, cmd *Command, key string, arg ...string) *Mess m.Option("_action", "") } m.Log(LOG_CMDS, "%s.%s %d %v %s", c.Name, key, len(arg), arg, kit.FileLine(h.Hand, 3)) + for i := 0; i < len(args)-1; i += 2 { + m.Option(args[i], args[i+1]) + } h.Hand(m, args...) return m } @@ -111,6 +118,9 @@ func (c *Context) cmd(m *Message, cmd *Command, key string, arg ...string) *Mess if len(arg) > 0 && cmd.Action != nil { if h, ok := cmd.Action[arg[0]]; ok { m.Log(LOG_CMDS, "%s.%s %d %v %s", c.Name, key, len(arg), arg, kit.FileLine(h.Hand, 3)) + for i := 1; i < len(arg)-1; i += 2 { + m.Option(arg[i], arg[i+1]) + } h.Hand(m, arg[1:]...) return m } @@ -161,6 +171,33 @@ func (c *Context) Merge(s *Context, x Server) *Context { v.Meta = kit.Dict() } for k, a := range v.Action { + if a.List == nil { + list := []interface{}{} + for _, v := range kit.Split(kit.Select(k, a.Name), " ", " ")[1:] { + item := kit.Dict(kit.MDB_INPUT, "text", kit.MDB_VALUE, "@key") + ls := kit.Split(v, " ", ":=@") + kit.Value(item, kit.MDB_NAME, ls[0]) + for i := 1; i < len(ls); i += 2 { + switch ls[i] { + case ":": + kit.Value(item, kit.MDB_INPUT, ls[i+1]) + case "=": + if strings.Contains(ls[i+1], ",") { + kit.Value(item, kit.MDB_INPUT, "select") + kit.Value(item, "values", strings.Split(ls[i+1], ",")) + } else { + kit.Value(item, kit.MDB_VALUE, ls[i+1]) + } + case "@": + kit.Value(item, kit.MDB_VALUE, "@"+ls[i+1]+"=") + } + } + list = append(list, item) + } + if len(list) > 0 { + a.List = list + } + } if a.List != nil { v.Meta[a.Help] = a.List v.Meta[k] = a.List