1
0
mirror of https://shylinux.com/x/icebergs synced 2025-04-28 10:12:02 +08:00
This commit is contained in:
shaoying 2021-07-28 08:22:22 +08:00
parent d8c03d6331
commit b015003088
17 changed files with 161 additions and 175 deletions

View File

@ -7,6 +7,7 @@ import (
"strings" "strings"
ice "github.com/shylinux/icebergs" ice "github.com/shylinux/icebergs"
"github.com/shylinux/icebergs/base/ctx"
"github.com/shylinux/icebergs/base/mdb" "github.com/shylinux/icebergs/base/mdb"
kit "github.com/shylinux/toolkits" kit "github.com/shylinux/toolkits"
) )
@ -66,15 +67,35 @@ func _daemon_show(m *ice.Message, cmd *exec.Cmd, out, err string) {
}) })
} }
func Inputs(m *ice.Message, field, value string) bool {
switch strings.TrimPrefix(field, "extra.") {
case POD:
m.Cmdy("route")
case CTX:
m.Cmdy(ctx.CONTEXT)
case CMD:
m.Cmdy(ctx.CONTEXT, kit.Select(m.Option(CTX), m.Option(kit.Keys("extra", CTX))), ctx.COMMAND)
case ARG:
default:
return false
}
return true
}
const ( const (
PID = "pid"
PWD = "pwd"
DIR = "dir" DIR = "dir"
ENV = "env" ENV = "env"
PID = "pid"
PWD = "pwd"
POD = "pod"
CTX = "ctx"
CMD = "cmd" CMD = "cmd"
API = "api"
ARG = "arg" ARG = "arg"
RUN = "run" RUN = "run"
API = "api"
RES = "res" RES = "res"
ERR = "err" ERR = "err"
) )

View File

@ -139,3 +139,34 @@ func _hash_inputs(m *ice.Message, prefix, chain string, field, value string) {
} }
m.Sort(kit.MDB_COUNT, "int_r") m.Sort(kit.MDB_COUNT, "int_r")
} }
func HashAction(key string, fields ...string) map[string]*ice.Action {
list := map[string]*ice.Action{
MODIFY: {Name: "modify", Help: "编辑", Hand: func(m *ice.Message, arg ...string) {
m.Cmdy(MODIFY, m.Prefix(key), "", HASH, m.OptionSimple(kit.MDB_HASH), arg)
}},
REMOVE: {Name: "remove", Help: "删除", Hand: func(m *ice.Message, arg ...string) {
m.Cmdy(DELETE, m.Prefix(key), "", HASH, m.OptionSimple(kit.MDB_HASH))
}},
EXPORT: {Name: "export", Help: "导出", Hand: func(m *ice.Message, arg ...string) {
m.Cmdy(EXPORT, m.Prefix(key), "", HASH)
}},
IMPORT: {Name: "import", Help: "导入", Hand: func(m *ice.Message, arg ...string) {
m.Cmdy(IMPORT, m.Prefix(key), "", HASH)
}},
INPUTS: {Name: "inputs", Help: "补全", Hand: func(m *ice.Message, arg ...string) {
m.Cmdy(INPUTS, m.Prefix(key), "", HASH, arg)
}},
}
if len(fields) == 0 {
return list
}
res := map[string]*ice.Action{}
for _, field := range fields {
res[field] = list[field]
}
return res
}
const HASH = "hash"

View File

@ -129,3 +129,5 @@ func _list_inputs(m *ice.Message, prefix, chain string, field, value string) {
} }
m.SortIntR(kit.MDB_COUNT) m.SortIntR(kit.MDB_COUNT)
} }
const LIST = "list"

View File

@ -140,8 +140,6 @@ const (
const ( const (
DICT = "dict" DICT = "dict"
META = "meta" META = "meta"
HASH = "hash"
LIST = "list"
ZONE = "zone" ZONE = "zone"
) )
const ( const (

View File

@ -59,6 +59,12 @@ func _islocalhost(m *ice.Message, ip string) (ok bool) {
return false return false
} }
func IsLocalHost(m *ice.Message, ip string) bool { return _islocalhost(m, ip) } func IsLocalHost(m *ice.Message, ip string) bool { return _islocalhost(m, ip) }
func ReplaceLocalhost(m *ice.Message, url string) string {
if strings.Contains(url, "://"+LOCALHOST) {
url = strings.Replace(url, "://"+LOCALHOST, "://"+m.Cmd(HOST, ice.OptionFields(IP)).Append(IP), 1)
}
return url
}
const ( const (
HOSTPORT = "hostport" HOSTPORT = "hostport"

View File

@ -103,7 +103,7 @@ func _action_share(m *ice.Message, arg ...string) {
func _action_list(m *ice.Message, river, storm string) { func _action_list(m *ice.Message, river, storm string) {
m.Option(ice.MSG_RIVER, river) m.Option(ice.MSG_RIVER, river)
m.Cmdy(TOOL, storm).Table(func(index int, value map[string]string, head []string) { m.Cmdy(TOOL, storm).Table(func(index int, value map[string]string, head []string) {
m.Cmdy(m.Space(kit.Select(m.Option(POD), value[POD])), ctx.COMMAND, kit.Keys(value[CTX], value[CMD])) m.Cmdy(m.Space(kit.Select(m.Option(cli.POD), value[cli.POD])), ctx.COMMAND, kit.Keys(value[cli.CTX], value[cli.CMD]))
}) })
m.SortInt(kit.MDB_ID) m.SortInt(kit.MDB_ID)
} }
@ -114,8 +114,8 @@ func _action_show(m *ice.Message, river, storm, index string, arg ...string) {
cmds := []string{index} cmds := []string{index}
prefix := kit.Keys(kit.MDB_HASH, river, TOOL, kit.MDB_HASH, storm) prefix := kit.Keys(kit.MDB_HASH, river, TOOL, kit.MDB_HASH, storm)
if m.Grows(RIVER, prefix, kit.MDB_ID, index, func(index int, value map[string]interface{}) { if m.Grows(RIVER, prefix, kit.MDB_ID, index, func(index int, value map[string]interface{}) {
if cmds = kit.Simple(kit.Keys(value[CTX], value[CMD])); kit.Format(value[POD]) != "" { if cmds = kit.Simple(kit.Keys(value[cli.CTX], value[cli.CMD])); kit.Format(value[cli.POD]) != "" {
m.Option(POD, value[POD]) m.Option(cli.POD, value[cli.POD])
} }
}) == nil && m.Warn(!m.Right(cmds), ice.ErrNotRight) { }) == nil && m.Warn(!m.Right(cmds), ice.ErrNotRight) {
return return
@ -127,9 +127,9 @@ func _action_show(m *ice.Message, river, storm, index string, arg ...string) {
m.Cmdy(_action_proxy(m), cmds, arg) m.Cmdy(_action_proxy(m), cmds, arg)
} }
func _action_proxy(m *ice.Message) (proxy []string) { func _action_proxy(m *ice.Message) (proxy []string) {
if p := m.Option(POD); p != "" { if p := m.Option(cli.POD); p != "" {
proxy = append(proxy, web.SPACE, p) proxy = append(proxy, web.SPACE, p)
m.Option(POD, "") m.Option(cli.POD, "")
} }
return proxy return proxy
} }

View File

@ -2,6 +2,7 @@ package chat
import ( import (
ice "github.com/shylinux/icebergs" ice "github.com/shylinux/icebergs"
"github.com/shylinux/icebergs/base/cli"
"github.com/shylinux/icebergs/base/mdb" "github.com/shylinux/icebergs/base/mdb"
"github.com/shylinux/icebergs/base/web" "github.com/shylinux/icebergs/base/web"
kit "github.com/shylinux/toolkits" kit "github.com/shylinux/toolkits"
@ -17,19 +18,16 @@ func init() {
)}, )},
}, },
Commands: map[string]*ice.Command{ Commands: map[string]*ice.Command{
FILES: {Name: "files hash auto upload", Help: "文件夹", Action: map[string]*ice.Action{ FILES: {Name: "files hash auto upload", Help: "文件夹", Action: ice.MergeAction(map[string]*ice.Action{
web.UPLOAD: {Name: "upload", Help: "上传", Hand: func(m *ice.Message, arg ...string) { web.UPLOAD: {Name: "upload", Help: "上传", Hand: func(m *ice.Message, arg ...string) {
up := kit.Simple(m.Optionv(ice.MSG_UPLOAD)) up := kit.Simple(m.Optionv(ice.MSG_UPLOAD))
m.Cmdy(mdb.INSERT, m.Prefix(FILES), "", mdb.HASH, kit.MDB_TYPE, kit.Ext(up[1]), kit.MDB_NAME, up[1], kit.MDB_SIZE, up[2], kit.MDB_DATA, up[0]) m.Cmdy(mdb.INSERT, m.Prefix(FILES), "", mdb.HASH, kit.MDB_TYPE, kit.Ext(up[1]), kit.MDB_NAME, up[1], kit.MDB_SIZE, up[2], kit.MDB_DATA, up[0])
}}, }},
mdb.REMOVE: {Name: "remove", Help: "删除", Hand: func(m *ice.Message, arg ...string) { }, mdb.HashAction(FILES)), Hand: func(m *ice.Message, c *ice.Context, cmd string, arg ...string) {
m.Cmdy(mdb.DELETE, m.Prefix(FILES), "", mdb.HASH, m.OptionSimple(kit.MDB_HASH))
}},
}, Hand: func(m *ice.Message, c *ice.Context, cmd string, arg ...string) {
m.Fields(len(arg), m.Conf(FILES, kit.META_FIELD)) m.Fields(len(arg), m.Conf(FILES, kit.META_FIELD))
m.Cmdy(mdb.SELECT, m.Prefix(FILES), "", mdb.HASH, kit.MDB_HASH, arg) m.Cmdy(mdb.SELECT, m.Prefix(FILES), "", mdb.HASH, kit.MDB_HASH, arg)
m.Table(func(index int, value map[string]string, head []string) { m.Table(func(index int, value map[string]string, head []string) {
link := kit.MergeURL("/share/cache/"+value[kit.MDB_DATA], "pod", m.Option(ice.MSG_USERPOD)) link := kit.MergeURL("/share/cache/"+value[kit.MDB_DATA], cli.POD, m.Option(ice.MSG_USERPOD))
if m.PushDownload(kit.MDB_LINK, value[kit.MDB_NAME], link); len(arg) > 0 && kit.ExtIsImage(value[kit.MDB_NAME]) { if m.PushDownload(kit.MDB_LINK, value[kit.MDB_NAME], link); len(arg) > 0 && kit.ExtIsImage(value[kit.MDB_NAME]) {
m.PushImages(kit.MDB_IMAGE, link) m.PushImages(kit.MDB_IMAGE, link)
} }

View File

@ -1,10 +1,9 @@
package chat package chat
import ( import (
"strings"
ice "github.com/shylinux/icebergs" ice "github.com/shylinux/icebergs"
"github.com/shylinux/icebergs/base/aaa" "github.com/shylinux/icebergs/base/aaa"
"github.com/shylinux/icebergs/base/ctx"
"github.com/shylinux/icebergs/base/mdb" "github.com/shylinux/icebergs/base/mdb"
"github.com/shylinux/icebergs/base/tcp" "github.com/shylinux/icebergs/base/tcp"
"github.com/shylinux/icebergs/base/web" "github.com/shylinux/icebergs/base/web"
@ -12,7 +11,7 @@ import (
kit "github.com/shylinux/toolkits" kit "github.com/shylinux/toolkits"
) )
func _header_check(m *ice.Message) { func _header_check(m *ice.Message, arg ...string) {
if m.Option(web.SHARE) != "" { if m.Option(web.SHARE) != "" {
switch msg := m.Cmd(web.SHARE, m.Option(web.SHARE)); msg.Append(kit.MDB_TYPE) { switch msg := m.Cmd(web.SHARE, m.Option(web.SHARE)); msg.Append(kit.MDB_TYPE) {
case web.LOGIN: // 扫码登录 case web.LOGIN: // 扫码登录
@ -35,20 +34,14 @@ func _header_share(m *ice.Message, arg ...string) {
share := m.Cmdx(web.SHARE, mdb.CREATE, kit.MDB_TYPE, web.LOGIN, arg) share := m.Cmdx(web.SHARE, mdb.CREATE, kit.MDB_TYPE, web.LOGIN, arg)
m.Option(kit.MDB_LINK, kit.MergeURL(m.Option(ice.MSG_USERWEB), web.SHARE, share)) m.Option(kit.MDB_LINK, kit.MergeURL(m.Option(ice.MSG_USERWEB), web.SHARE, share))
} }
link := tcp.ReplaceLocalhost(m, m.Option(kit.MDB_LINK))
link := m.Option(kit.MDB_LINK)
if strings.Contains(link, tcp.LOCALHOST) {
link = strings.Replace(link, tcp.LOCALHOST, m.Cmd(tcp.HOST, ice.OptionFields(tcp.IP)).Append(tcp.IP), 1)
}
m.Set(kit.MDB_NAME, kit.MDB_TEXT) m.Set(kit.MDB_NAME, kit.MDB_TEXT)
m.PushQRCode(kit.MDB_TEXT, link) m.PushQRCode(kit.MDB_TEXT, link)
m.Push(kit.MDB_NAME, link) m.Push(kit.MDB_NAME, link)
} }
func _header_grant(m *ice.Message, arg ...string) { func _header_grant(m *ice.Message, arg ...string) {
if pod := m.Option(kit.SSH_POD); pod != "" { if m.PodCmd(m.Prefix("/header"), ctx.ACTION, GRANT, arg) {
m.Option(kit.SSH_POD, "")
m.Cmd(web.SPACE, pod, m.Prefix(P_HEADER), kit.MDB_ACTION, GRANT, arg)
return // 下发命令 return // 下发命令
} }
@ -58,20 +51,16 @@ func _header_grant(m *ice.Message, arg ...string) {
} }
func _header_users(m *ice.Message, key string, arg ...string) { func _header_users(m *ice.Message, key string, arg ...string) {
m.Option(aaa.USERNAME, m.Option(ice.MSG_USERNAME)) m.Option(aaa.USERNAME, m.Option(ice.MSG_USERNAME))
m.Cmdy("aaa.user", kit.MDB_ACTION, mdb.MODIFY, key, m.Option(key, arg[0])) m.Cmdy("aaa.user", ctx.ACTION, mdb.MODIFY, key, m.Option(key, arg[0]))
} }
const ( const (
TITLE = "title" TITLE = "title"
CHECK = "check"
LOGIN = "login"
GRANT = "grant"
SHARE = "share"
AGENT = "agent" AGENT = "agent"
CHECK = "check"
LOGOUT = "logout" SHARE = "share"
GRANT = "grant"
) )
const P_HEADER = "/header"
const HEADER = "header" const HEADER = "header"
func init() { func init() {
@ -80,41 +69,41 @@ func init() {
HEADER: {Name: HEADER, Help: "标题栏", Value: kit.Data(TITLE, "github.com/shylinux/contexts")}, HEADER: {Name: HEADER, Help: "标题栏", Value: kit.Data(TITLE, "github.com/shylinux/contexts")},
}, },
Commands: map[string]*ice.Command{ Commands: map[string]*ice.Command{
P_HEADER: {Name: "/header", Help: "标题栏", Action: map[string]*ice.Action{ "/header": {Name: "/header", Help: "标题栏", Action: map[string]*ice.Action{
CHECK: {Name: "check", Help: "登录检查", Hand: func(m *ice.Message, arg ...string) { AGENT: {Name: "agent", Help: "应用宿主", Hand: func(m *ice.Message, arg ...string) {
_header_check(m) m.Cmdy("web.chat.wx.access", "config")
m.Echo(m.Option(ice.MSG_USERNAME))
}}, }},
LOGIN: {Name: "login", Help: "密码登录", Hand: func(m *ice.Message, arg ...string) { CHECK: {Name: "check", Help: "登录检查", Hand: func(m *ice.Message, arg ...string) {
_header_check(m, arg...)
}},
SHARE: {Name: "share type", Help: "扫码登录", Hand: func(m *ice.Message, arg ...string) {
_header_share(m, arg...)
}},
GRANT: {Name: "grant space", Help: "扫码授权", Hand: func(m *ice.Message, arg ...string) {
_header_grant(m, arg...)
}},
aaa.LOGIN: {Name: "login", Help: "密码登录", Hand: func(m *ice.Message, arg ...string) {
if aaa.UserLogin(m, arg[0], arg[1]) { if aaa.UserLogin(m, arg[0], arg[1]) {
web.RenderCookie(m, aaa.SessCreate(m, arg[0])) web.RenderCookie(m, aaa.SessCreate(m, arg[0]))
} }
m.Echo(m.Option(ice.MSG_USERNAME)) m.Echo(m.Option(ice.MSG_USERNAME))
}}, }},
GRANT: {Name: "grant space", Help: "扫码授权", Hand: func(m *ice.Message, arg ...string) { aaa.LOGOUT: {Name: "logout", Help: "退出登录", Hand: func(m *ice.Message, arg ...string) {
_header_grant(m, arg...)
}},
SHARE: {Name: "share type", Help: "扫码登录", Hand: func(m *ice.Message, arg ...string) {
_header_share(m, arg...)
}},
AGENT: {Name: "agent", Help: "应用宿主", Hand: func(m *ice.Message, arg ...string) {
m.Cmdy("web.chat.wx.access", "config")
}},
LOGOUT: {Name: "logout", Help: "退出登录", Hand: func(m *ice.Message, arg ...string) {
m.Cmd(aaa.SESS, mdb.REMOVE, ice.OptionHash(m.Option(ice.MSG_SESSID))) m.Cmd(aaa.SESS, mdb.REMOVE, ice.OptionHash(m.Option(ice.MSG_SESSID)))
}}, }},
code.WEBPACK: {Name: "webpack", Help: "网页打包", Hand: func(m *ice.Message, arg ...string) { aaa.AVATAR: {Name: "avatar", Help: "头像图片", Hand: func(m *ice.Message, arg ...string) {
m.Cmdy(code.WEBPACK, mdb.CREATE, kit.MDB_NAME, m.Option(kit.MDB_NAME)) _header_users(m, aaa.AVATAR, arg...)
}},
aaa.BACKGROUND: {Name: "background", Help: "背景图片", Hand: func(m *ice.Message, arg ...string) {
_header_users(m, aaa.BACKGROUND, arg...)
}}, }},
aaa.USERNICK: {Name: "usernick", Help: "用户昵称", Hand: func(m *ice.Message, arg ...string) { aaa.USERNICK: {Name: "usernick", Help: "用户昵称", Hand: func(m *ice.Message, arg ...string) {
_header_users(m, aaa.USERNICK, arg...) _header_users(m, aaa.USERNICK, arg...)
}}, }},
aaa.AVATAR: {Name: "avatar", Help: "头像图片", Hand: func(m *ice.Message, arg ...string) { aaa.BACKGROUND: {Name: "background", Help: "背景图片", Hand: func(m *ice.Message, arg ...string) {
_header_users(m, aaa.AVATAR, arg...) _header_users(m, aaa.BACKGROUND, arg...)
}},
code.WEBPACK: {Name: "webpack", Help: "网页打包", Hand: func(m *ice.Message, arg ...string) {
m.Cmdy(code.WEBPACK, mdb.CREATE, m.OptionSimple(kit.MDB_NAME))
}}, }},
}, Hand: func(m *ice.Message, c *ice.Context, cmd string, arg ...string) { }, Hand: func(m *ice.Message, c *ice.Context, cmd string, arg ...string) {
user := m.Cmd("aaa.user", m.Option(ice.MSG_USERNAME)) user := m.Cmd("aaa.user", m.Option(ice.MSG_USERNAME))

View File

@ -40,7 +40,7 @@ func init() {
)}, )},
}, },
Commands: map[string]*ice.Command{ Commands: map[string]*ice.Command{
LOCATION: {Name: "location hash auto getLocation", Help: "地理位置", Action: map[string]*ice.Action{ LOCATION: {Name: "location hash auto getLocation", Help: "地理位置", Action: ice.MergeAction(map[string]*ice.Action{
OPENLOCATION: {Name: "openLocation", Help: "地图", Hand: func(m *ice.Message, arg ...string) {}}, OPENLOCATION: {Name: "openLocation", Help: "地图", Hand: func(m *ice.Message, arg ...string) {}},
GETLOCATION: {Name: "getLocation", Help: "打卡", Hand: func(m *ice.Message, arg ...string) { GETLOCATION: {Name: "getLocation", Help: "打卡", Hand: func(m *ice.Message, arg ...string) {
m.Cmdy(mdb.INSERT, m.Prefix(LOCATION), "", mdb.HASH, arg) m.Cmdy(mdb.INSERT, m.Prefix(LOCATION), "", mdb.HASH, arg)
@ -48,22 +48,7 @@ func init() {
mdb.CREATE: {Name: "create type=text name text latitude longitude", Help: "添加", Hand: func(m *ice.Message, arg ...string) { mdb.CREATE: {Name: "create type=text name text latitude longitude", Help: "添加", Hand: func(m *ice.Message, arg ...string) {
m.Cmdy(mdb.INSERT, m.Prefix(LOCATION), "", mdb.HASH, arg) m.Cmdy(mdb.INSERT, m.Prefix(LOCATION), "", mdb.HASH, arg)
}}, }},
mdb.MODIFY: {Name: "modify", Help: "编辑", Hand: func(m *ice.Message, arg ...string) { }, mdb.HashAction(LOCATION)), Hand: func(m *ice.Message, c *ice.Context, cmd string, arg ...string) {
m.Cmdy(mdb.MODIFY, m.Prefix(LOCATION), "", mdb.HASH, m.OptionSimple(kit.MDB_HASH), arg)
}},
mdb.REMOVE: {Name: "remove", Help: "删除", Hand: func(m *ice.Message, arg ...string) {
m.Cmdy(mdb.DELETE, m.Prefix(LOCATION), "", mdb.HASH, m.OptionSimple(kit.MDB_TEXT))
}},
mdb.EXPORT: {Name: "export", Help: "导出", Hand: func(m *ice.Message, arg ...string) {
m.Cmdy(mdb.EXPORT, m.Prefix(LOCATION), "", mdb.HASH)
}},
mdb.IMPORT: {Name: "import", Help: "导入", Hand: func(m *ice.Message, arg ...string) {
m.Cmdy(mdb.IMPORT, m.Prefix(LOCATION), "", mdb.HASH)
}},
mdb.INPUTS: {Name: "inputs", Help: "补全", Hand: func(m *ice.Message, arg ...string) {
m.Cmdy(mdb.INPUTS, m.Prefix(LOCATION), "", mdb.HASH, arg)
}},
}, Hand: func(m *ice.Message, c *ice.Context, cmd string, arg ...string) {
m.Fields(len(arg), m.Conf(LOCATION, kit.META_FIELD)) m.Fields(len(arg), m.Conf(LOCATION, kit.META_FIELD))
m.Cmdy(mdb.SELECT, m.Prefix(LOCATION), "", mdb.HASH, kit.MDB_HASH, arg) m.Cmdy(mdb.SELECT, m.Prefix(LOCATION), "", mdb.HASH, kit.MDB_HASH, arg)
m.PushAction(OPENLOCATION, mdb.REMOVE) m.PushAction(OPENLOCATION, mdb.REMOVE)

View File

@ -22,23 +22,11 @@ func init() {
ice.CTX_INIT: {Hand: func(m *ice.Message, c *ice.Context, cmd string, arg ...string) { m.Load() }}, ice.CTX_INIT: {Hand: func(m *ice.Message, c *ice.Context, cmd string, arg ...string) { m.Load() }},
ice.CTX_EXIT: {Hand: func(m *ice.Message, c *ice.Context, cmd string, arg ...string) { m.Save() }}, ice.CTX_EXIT: {Hand: func(m *ice.Message, c *ice.Context, cmd string, arg ...string) { m.Save() }},
MISS: {Name: "miss name auto create", Help: "资料", Meta: kit.Dict("_trans", kit.Dict("name", "姓名")), Action: map[string]*ice.Action{ MISS: {Name: "miss name auto create", Help: "资料", Meta: kit.Dict("_trans", kit.Dict("name", "姓名")), Action: ice.MergeAction(map[string]*ice.Action{
mdb.CREATE: {Name: "create name 照片 性别 年龄 身高 体重 籍贯 户口 学历 学校 职业 公司 年薪 资产 家境", Help: "添加", Hand: func(m *ice.Message, arg ...string) { mdb.CREATE: {Name: "create name 照片 性别 年龄 身高 体重 籍贯 户口 学历 学校 职业 公司 年薪 资产 家境", Help: "添加", Hand: func(m *ice.Message, arg ...string) {
m.Cmdy(mdb.INSERT, m.Prefix(MISS), "", mdb.HASH, arg) m.Cmdy(mdb.INSERT, m.Prefix(MISS), "", mdb.HASH, arg)
}}, }},
mdb.MODIFY: {Name: "modify key value", Help: "编辑", Hand: func(m *ice.Message, arg ...string) { }, mdb.HashAction(MISS)), Hand: func(m *ice.Message, c *ice.Context, cmd string, arg ...string) {
m.Cmdy(mdb.MODIFY, m.Prefix(MISS), "", mdb.HASH, m.OptionSimple(kit.MDB_NAME), arg)
}},
mdb.REMOVE: {Name: "remove", Help: "删除", Hand: func(m *ice.Message, arg ...string) {
m.Cmdy(mdb.DELETE, m.Prefix(MISS), "", mdb.HASH, m.OptionSimple(kit.MDB_NAME))
}},
mdb.EXPORT: {Name: "export", Help: "导出", Hand: func(m *ice.Message, arg ...string) {
m.Cmdy(mdb.EXPORT, m.Prefix(MISS), "", mdb.HASH)
}},
mdb.IMPORT: {Name: "import", Help: "导入", Hand: func(m *ice.Message, arg ...string) {
m.Cmdy(mdb.IMPORT, m.Prefix(MISS), "", mdb.HASH)
}},
}, Hand: func(m *ice.Message, c *ice.Context, cmd string, arg ...string) {
m.Fields(len(arg), m.Conf(MISS, kit.META_FIELD)) m.Fields(len(arg), m.Conf(MISS, kit.META_FIELD))
m.Cmd(mdb.SELECT, m.Prefix(MISS), "", mdb.HASH, kit.MDB_NAME, arg).Table(func(index int, value map[string]string, head []string) { m.Cmd(mdb.SELECT, m.Prefix(MISS), "", mdb.HASH, kit.MDB_NAME, arg).Table(func(index int, value map[string]string, head []string) {
value["照片"] = kit.Format(`<img src="%s" height=%s>`, value["照片"], kit.Select("100", "400", m.Option(mdb.FIELDS) == mdb.DETAIL)) value["照片"] = kit.Format(`<img src="%s" height=%s>`, value["照片"], kit.Select("100", "400", m.Option(mdb.FIELDS) == mdb.DETAIL))

View File

@ -16,7 +16,7 @@ func init() {
)}, )},
}, },
Commands: map[string]*ice.Command{ Commands: map[string]*ice.Command{
PASTE: {Name: "paste hash auto getClipboardData", Help: "粘贴板", Action: map[string]*ice.Action{ PASTE: {Name: "paste hash auto getClipboardData", Help: "粘贴板", Action: ice.MergeAction(map[string]*ice.Action{
"getClipboardData": {Name: "getClipboardData", Help: "粘贴", Hand: func(m *ice.Message, arg ...string) { "getClipboardData": {Name: "getClipboardData", Help: "粘贴", Hand: func(m *ice.Message, arg ...string) {
_trans(arg, map[string]string{"data": "text"}) _trans(arg, map[string]string{"data": "text"})
m.Cmdy(mdb.INSERT, m.Prefix(PASTE), "", mdb.HASH, arg) m.Cmdy(mdb.INSERT, m.Prefix(PASTE), "", mdb.HASH, arg)
@ -25,22 +25,7 @@ func init() {
_trans(arg, map[string]string{"data": "text"}) _trans(arg, map[string]string{"data": "text"})
m.Cmdy(mdb.INSERT, m.Prefix(PASTE), "", mdb.HASH, arg) m.Cmdy(mdb.INSERT, m.Prefix(PASTE), "", mdb.HASH, arg)
}}, }},
mdb.MODIFY: {Name: "modify", Help: "编辑", Hand: func(m *ice.Message, arg ...string) { }, mdb.HashAction(PASTE)), Hand: func(m *ice.Message, c *ice.Context, cmd string, arg ...string) {
m.Cmdy(mdb.MODIFY, m.Prefix(PASTE), "", mdb.HASH, m.OptionSimple(kit.MDB_HASH), arg)
}},
mdb.REMOVE: {Name: "remove", Help: "删除", Hand: func(m *ice.Message, arg ...string) {
m.Cmdy(mdb.DELETE, m.Prefix(PASTE), "", mdb.HASH, m.OptionSimple(kit.MDB_HASH))
}},
mdb.EXPORT: {Name: "export", Help: "导出", Hand: func(m *ice.Message, arg ...string) {
m.Cmdy(mdb.EXPORT, m.Prefix(PASTE), "", mdb.HASH)
}},
mdb.IMPORT: {Name: "import", Help: "导入", Hand: func(m *ice.Message, arg ...string) {
m.Cmdy(mdb.IMPORT, m.Prefix(PASTE), "", mdb.HASH)
}},
mdb.INPUTS: {Name: "inputs", Help: "补全", Hand: func(m *ice.Message, arg ...string) {
m.Cmdy(mdb.INPUTS, m.Prefix(PASTE), "", mdb.HASH, arg)
}},
}, Hand: func(m *ice.Message, c *ice.Context, cmd string, arg ...string) {
m.Fields(len(arg), m.Conf(PASTE, kit.META_FIELD)) m.Fields(len(arg), m.Conf(PASTE, kit.META_FIELD))
if m.Cmdy(mdb.SELECT, cmd, "", mdb.HASH, kit.MDB_HASH, arg); len(arg) > 0 { if m.Cmdy(mdb.SELECT, cmd, "", mdb.HASH, kit.MDB_HASH, arg); len(arg) > 0 {
m.PushScript("script", m.Append(kit.MDB_TEXT)) m.PushScript("script", m.Append(kit.MDB_TEXT))

View File

@ -3,6 +3,7 @@ package chat
import ( import (
ice "github.com/shylinux/icebergs" ice "github.com/shylinux/icebergs"
"github.com/shylinux/icebergs/base/aaa" "github.com/shylinux/icebergs/base/aaa"
"github.com/shylinux/icebergs/base/cli"
"github.com/shylinux/icebergs/base/ctx" "github.com/shylinux/icebergs/base/ctx"
"github.com/shylinux/icebergs/base/mdb" "github.com/shylinux/icebergs/base/mdb"
"github.com/shylinux/icebergs/base/tcp" "github.com/shylinux/icebergs/base/tcp"
@ -48,19 +49,13 @@ func _river_list(m *ice.Message) {
}) })
} }
func _river_proxy(m *ice.Message, pod string) (proxy []string) { func _river_proxy(m *ice.Message, pod string) (proxy []string) {
if p := kit.Select(m.Option(POD), pod); p != "" { if p := kit.Select(m.Option(cli.POD), pod); p != "" {
proxy = append(proxy, web.SPACE, p) proxy = append(proxy, web.SPACE, p)
m.Option(POD, "") m.Option(cli.POD, "")
} }
return proxy return proxy
} }
const (
POD = "pod"
CTX = "ctx"
CMD = "cmd"
ARG = "arg"
)
const ( const (
INFO = "info" INFO = "info"
AUTH = "auth" AUTH = "auth"
@ -178,9 +173,9 @@ func init() {
m.Option(mdb.FIELDS, "time,id,pod,ctx,cmd,arg") m.Option(mdb.FIELDS, "time,id,pod,ctx,cmd,arg")
msg := m.Cmd(mdb.SELECT, 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)) msg := m.Cmd(mdb.SELECT, 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))
cmd := kit.Keys(msg.Append(CTX), msg.Append(CMD)) cmd := kit.Keys(msg.Append(cli.CTX), msg.Append(cli.CMD))
_action_domain(m, cmd, m.Option(kit.MDB_HASH)) _action_domain(m, cmd, m.Option(kit.MDB_HASH))
m.Cmdy(_river_proxy(msg, msg.Append(POD)), cmd, mdb.EXPORT) m.Cmdy(_river_proxy(msg, msg.Append(cli.POD)), cmd, mdb.EXPORT)
} }
}}, }},
mdb.IMPORT: {Name: "import", Help: "导入", Hand: func(m *ice.Message, arg ...string) { mdb.IMPORT: {Name: "import", Help: "导入", Hand: func(m *ice.Message, arg ...string) {
@ -188,9 +183,9 @@ func init() {
m.Option(mdb.FIELDS, "time,id,pod,ctx,cmd,arg") m.Option(mdb.FIELDS, "time,id,pod,ctx,cmd,arg")
msg := m.Cmd(mdb.SELECT, 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)) msg := m.Cmd(mdb.SELECT, 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))
cmd := kit.Keys(msg.Append(CTX), msg.Append(CMD)) cmd := kit.Keys(msg.Append(cli.CTX), msg.Append(cli.CMD))
_action_domain(m, cmd, m.Option(kit.MDB_HASH)) _action_domain(m, cmd, m.Option(kit.MDB_HASH))
m.Cmdy(_river_proxy(msg, msg.Append(POD)), cmd, mdb.IMPORT) m.Cmdy(_river_proxy(msg, msg.Append(cli.POD)), cmd, mdb.IMPORT)
} }
}}, }},
mdb.INPUTS: {Name: "inputs", Help: "补全", Hand: func(m *ice.Message, arg ...string) { mdb.INPUTS: {Name: "inputs", Help: "补全", Hand: func(m *ice.Message, arg ...string) {
@ -200,16 +195,16 @@ func init() {
m.Push(kit.MDB_HASH, value[kit.MDB_HASH]) m.Push(kit.MDB_HASH, value[kit.MDB_HASH])
m.Push(kit.MDB_NAME, value[kit.MDB_NAME]) m.Push(kit.MDB_NAME, value[kit.MDB_NAME])
}) })
case POD: case cli.POD:
m.Cmdy(web.ROUTE) m.Cmdy(web.ROUTE)
case CTX: case cli.CTX:
m.Cmd(ctx.CONTEXT, "web").Table(func(index int, value map[string]string, head []string) { m.Cmd(ctx.CONTEXT, "web").Table(func(index int, value map[string]string, head []string) {
m.Push(CTX, kit.Keys(kit.Select("", value["ups"], value["ups"] != "shy"), value[kit.MDB_NAME])) m.Push(cli.CTX, kit.Keys(kit.Select("", value["ups"], value["ups"] != "shy"), value[kit.MDB_NAME]))
m.Push(kit.MDB_HELP, value[kit.MDB_HELP]) m.Push(kit.MDB_HELP, value[kit.MDB_HELP])
}) })
case CMD, kit.MDB_HELP: case cli.CMD, kit.MDB_HELP:
m.Cmd(ctx.CONTEXT, m.Option(CTX), ctx.COMMAND).Table(func(index int, value map[string]string, head []string) { m.Cmd(ctx.CONTEXT, m.Option(cli.CTX), ctx.COMMAND).Table(func(index int, value map[string]string, head []string) {
m.Push(CMD, value[kit.MDB_KEY]) m.Push(cli.CMD, value[kit.MDB_KEY])
m.Push(kit.MDB_NAME, value[kit.MDB_NAME]) m.Push(kit.MDB_NAME, value[kit.MDB_NAME])
m.Push(kit.MDB_HELP, value[kit.MDB_HELP]) m.Push(kit.MDB_HELP, value[kit.MDB_HELP])
}) })
@ -226,12 +221,12 @@ func init() {
m.Option(mdb.FIELDS, "time,id,pod,ctx,cmd,arg,display,style") m.Option(mdb.FIELDS, "time,id,pod,ctx,cmd,arg,display,style")
msg := m.Cmd(mdb.SELECT, RIVER, kit.Keys(kit.MDB_HASH, m.Option(ice.MSG_RIVER), TOOL, kit.MDB_HASH, arg[0]), mdb.LIST, kit.MDB_ID, kit.Select("", arg, 1)) msg := m.Cmd(mdb.SELECT, RIVER, kit.Keys(kit.MDB_HASH, m.Option(ice.MSG_RIVER), TOOL, kit.MDB_HASH, arg[0]), mdb.LIST, kit.MDB_ID, kit.Select("", arg, 1))
if len(msg.Appendv(CMD)) == 0 && len(arg) > 1 { if len(msg.Appendv(cli.CMD)) == 0 && len(arg) > 1 {
msg.Push(CMD, arg[1]) msg.Push(cli.CMD, arg[1])
} }
if len(arg) > 2 && arg[2] == "run" { if len(arg) > 2 && arg[2] == "run" {
m.Cmdy(_river_proxy(m, msg.Append(POD)), kit.Keys(msg.Append(CTX), msg.Append(CMD)), arg[3:]) m.Cmdy(_river_proxy(m, msg.Append(cli.POD)), kit.Keys(msg.Append(cli.CTX), msg.Append(cli.CMD)), arg[3:])
return // 执行命令 return // 执行命令
} }
if m.Copy(msg); len(arg) < 2 { if m.Copy(msg); len(arg) < 2 {
@ -243,7 +238,7 @@ func init() {
// 命令插件 // 命令插件
m.ProcessField(arg[0], arg[1], "run") m.ProcessField(arg[0], arg[1], "run")
m.Table(func(index int, value map[string]string, head []string) { m.Table(func(index int, value map[string]string, head []string) {
m.Cmdy(web.SPACE, value[POD], ctx.CONTEXT, value[CTX], ctx.COMMAND, value[CMD]) m.Cmdy(web.SPACE, value[cli.POD], ctx.CONTEXT, value[cli.CTX], ctx.COMMAND, value[cli.CMD])
}) })
}}, }},
USER: {Name: "user username auto insert invite", Help: "用户", Action: map[string]*ice.Action{ USER: {Name: "user username auto insert invite", Help: "用户", Action: map[string]*ice.Action{
@ -290,7 +285,7 @@ func init() {
kit.Fetch(value, func(index int, value string) { kit.Fetch(value, func(index int, value string) {
m.Search(value, func(p *ice.Context, s *ice.Context, key string, cmd *ice.Command) { m.Search(value, func(p *ice.Context, s *ice.Context, key string, cmd *ice.Command) {
m.Cmd(TOOL, mdb.INSERT, kit.MDB_HASH, h, CTX, s.Cap(ice.CTX_FOLLOW), CMD, key, kit.MDB_HELP, cmd.Help) m.Cmd(TOOL, mdb.INSERT, kit.MDB_HASH, h, cli.CTX, s.Cap(ice.CTX_FOLLOW), cli.CMD, key, kit.MDB_HELP, cmd.Help)
}) })
}) })
}) })

View File

@ -16,7 +16,7 @@ func init() {
)}, )},
}, },
Commands: map[string]*ice.Command{ Commands: map[string]*ice.Command{
SCAN: {Name: "scan hash auto scanQRCode scanQRCode0", Help: "二维码", Action: map[string]*ice.Action{ SCAN: {Name: "scan hash auto scanQRCode scanQRCode0", Help: "二维码", Action: ice.MergeAction(map[string]*ice.Action{
"scanQRCode0": {Name: "create", Help: "本机扫码", Hand: func(m *ice.Message, arg ...string) {}}, "scanQRCode0": {Name: "create", Help: "本机扫码", Hand: func(m *ice.Message, arg ...string) {}},
"scanQRCode": {Name: "create", Help: "扫码", Hand: func(m *ice.Message, arg ...string) { "scanQRCode": {Name: "create", Help: "扫码", Hand: func(m *ice.Message, arg ...string) {
m.Cmdy(mdb.INSERT, m.Prefix(SCAN), "", mdb.HASH, arg) m.Cmdy(mdb.INSERT, m.Prefix(SCAN), "", mdb.HASH, arg)
@ -24,22 +24,7 @@ func init() {
mdb.CREATE: {Name: "create type=text name=hi text:textarea=hi", Help: "添加", Hand: func(m *ice.Message, arg ...string) { mdb.CREATE: {Name: "create type=text name=hi text:textarea=hi", Help: "添加", Hand: func(m *ice.Message, arg ...string) {
m.Cmdy(mdb.INSERT, m.Prefix(SCAN), "", mdb.HASH, arg) m.Cmdy(mdb.INSERT, m.Prefix(SCAN), "", mdb.HASH, arg)
}}, }},
mdb.MODIFY: {Name: "modify", Help: "编辑", Hand: func(m *ice.Message, arg ...string) { }, mdb.HashAction(SCAN)), Hand: func(m *ice.Message, c *ice.Context, cmd string, arg ...string) {
m.Cmdy(mdb.MODIFY, m.Prefix(SCAN), "", mdb.HASH, m.OptionSimple(kit.MDB_HASH), arg)
}},
mdb.REMOVE: {Name: "remove", Help: "删除", Hand: func(m *ice.Message, arg ...string) {
m.Cmdy(mdb.DELETE, m.Prefix(SCAN), "", mdb.HASH, m.OptionSimple(kit.MDB_HASH))
}},
mdb.EXPORT: {Name: "export", Help: "导出", Hand: func(m *ice.Message, arg ...string) {
m.Cmdy(mdb.EXPORT, m.Prefix(SCAN), "", mdb.HASH)
}},
mdb.IMPORT: {Name: "import", Help: "导入", Hand: func(m *ice.Message, arg ...string) {
m.Cmdy(mdb.IMPORT, m.Prefix(SCAN), "", mdb.HASH)
}},
mdb.INPUTS: {Name: "inputs", Help: "补全", Hand: func(m *ice.Message, arg ...string) {
m.Cmdy(mdb.INPUTS, m.Prefix(SCAN), "", mdb.HASH, arg)
}},
}, Hand: func(m *ice.Message, c *ice.Context, cmd string, arg ...string) {
m.Fields(len(arg), m.Conf(SCAN, kit.META_FIELD)) m.Fields(len(arg), m.Conf(SCAN, kit.META_FIELD))
if m.Cmdy(mdb.SELECT, m.Prefix(SCAN), "", mdb.HASH, kit.MDB_HASH, arg); len(arg) > 0 { if m.Cmdy(mdb.SELECT, m.Prefix(SCAN), "", mdb.HASH, kit.MDB_HASH, arg); len(arg) > 0 {
m.PushScript("script", m.Append(kit.MDB_TEXT)) m.PushScript("script", m.Append(kit.MDB_TEXT))

View File

@ -29,7 +29,7 @@ func init() {
}) })
}}, }},
mdb.RENDER: {Name: "render", Help: "渲染", Hand: func(m *ice.Message, arg ...string) { mdb.RENDER: {Name: "render", Help: "渲染", Hand: func(m *ice.Message, arg ...string) {
m.Cmdy(m.Space(m.Option(POD)), mdb.RENDER, arg[1:]) m.Cmdy(m.Space(m.Option(cli.POD)), mdb.RENDER, arg[1:])
}}, }},
ctx.COMMAND: {Name: "command", Help: "命令", Hand: func(m *ice.Message, arg ...string) { ctx.COMMAND: {Name: "command", Help: "命令", Hand: func(m *ice.Message, arg ...string) {
m.Cmdy(ctx.COMMAND, arg) m.Cmdy(ctx.COMMAND, arg)
@ -41,7 +41,7 @@ func init() {
if kit.Contains(arg[1], ";") { if kit.Contains(arg[1], ";") {
arg = kit.Split(arg[1], ";", ";", ";") arg = kit.Split(arg[1], ";", ";", ";")
} }
if m.Cmdy(m.Space(m.Option(POD)), mdb.SEARCH, arg); arg[1] == "" { if m.Cmdy(m.Space(m.Option(cli.POD)), mdb.SEARCH, arg); arg[1] == "" {
return return
} }
m.Cmd(mdb.INSERT, m.Prefix(P_SEARCH), "", mdb.HASH, m.Cmd(mdb.INSERT, m.Prefix(P_SEARCH), "", mdb.HASH,

View File

@ -7,7 +7,6 @@ import (
"github.com/shylinux/icebergs/base/cli" "github.com/shylinux/icebergs/base/cli"
"github.com/shylinux/icebergs/base/ctx" "github.com/shylinux/icebergs/base/ctx"
"github.com/shylinux/icebergs/base/mdb" "github.com/shylinux/icebergs/base/mdb"
"github.com/shylinux/icebergs/base/web"
kit "github.com/shylinux/toolkits" kit "github.com/shylinux/toolkits"
) )
@ -51,15 +50,11 @@ func _asset_insert(m *ice.Message, account string, arg ...string) {
m.Cmdy(mdb.MODIFY, m.Prefix(ASSET), "", mdb.HASH, ACCOUNT, account, AMOUNT, amount) m.Cmdy(mdb.MODIFY, m.Prefix(ASSET), "", mdb.HASH, ACCOUNT, account, AMOUNT, amount)
} }
func _asset_inputs(m *ice.Message, field, value string) { func _asset_inputs(m *ice.Message, field, value string) {
switch strings.TrimPrefix(field, "extra.") { if cli.Inputs(m, field, value) {
case "pod": return
m.Cmdy(web.ROUTE) }
case "ctx":
m.Cmdy(ctx.CONTEXT)
case "cmd":
m.Cmdy(ctx.CONTEXT, kit.Select(m.Option("ctx"), m.Option("extra.ctx")), ctx.COMMAND)
case "arg":
switch strings.TrimPrefix(field, "extra.") {
case ACCOUNT, FROM, TO: case ACCOUNT, FROM, TO:
m.Cmdy(mdb.INPUTS, m.Prefix(ASSET), "", mdb.HASH, ACCOUNT, value) m.Cmdy(mdb.INPUTS, m.Prefix(ASSET), "", mdb.HASH, ACCOUNT, value)
default: default:

View File

@ -5,9 +5,8 @@ import (
"time" "time"
ice "github.com/shylinux/icebergs" ice "github.com/shylinux/icebergs"
"github.com/shylinux/icebergs/base/ctx" "github.com/shylinux/icebergs/base/cli"
"github.com/shylinux/icebergs/base/mdb" "github.com/shylinux/icebergs/base/mdb"
"github.com/shylinux/icebergs/base/web"
kit "github.com/shylinux/toolkits" kit "github.com/shylinux/toolkits"
) )
@ -74,24 +73,11 @@ func _task_modify(m *ice.Message, field, value string, arg ...string) {
m.Cmdy(mdb.MODIFY, m.Prefix(TASK), "", mdb.ZONE, m.Option(kit.MDB_ZONE), m.Option(kit.MDB_ID), field, value, arg) m.Cmdy(mdb.MODIFY, m.Prefix(TASK), "", mdb.ZONE, m.Option(kit.MDB_ZONE), m.Option(kit.MDB_ID), field, value, arg)
} }
func _task_inputs(m *ice.Message, field, value string) { func _task_inputs(m *ice.Message, field, value string) {
switch strings.TrimPrefix(field, "extra.") { if cli.Inputs(m, field, value) {
case "pod": return
m.Cmd(web.SPACE).Table(func(index int, value map[string]string, head []string) { }
m.Push(field, value[kit.MDB_NAME])
m.Push("", value, []string{kit.MDB_TYPE})
})
case "ctx":
m.Cmd(m.Space(m.Option("extra.pod")), ctx.CONTEXT).Table(func(index int, value map[string]string, head []string) {
m.Push(field, value[kit.MDB_NAME])
m.Push("", value, []string{kit.MDB_HELP})
})
case "cmd":
m.Cmd(m.Space(m.Option("extra.pod")), ctx.CONTEXT, m.Option("extra.ctx"), ctx.COMMAND).Table(func(index int, value map[string]string, head []string) {
m.Push(field, value[kit.MDB_KEY])
m.Push("", value, []string{kit.MDB_HELP})
})
case "arg":
switch strings.TrimPrefix(field, "extra.") {
case kit.MDB_ZONE: case kit.MDB_ZONE:
m.Cmdy(mdb.INPUTS, m.Prefix(TASK), "", mdb.HASH, field, value) m.Cmdy(mdb.INPUTS, m.Prefix(TASK), "", mdb.HASH, field, value)
default: default:

22
misc.go
View File

@ -577,3 +577,25 @@ func (m *Message) OptionTemplate() string {
}) })
return strings.Join(res, " ") return strings.Join(res, " ")
} }
func (m *Message) PodCmd(arg ...interface{}) bool {
if pod := m.Option(kit.SSH_POD); pod != "" {
m.Option(kit.SSH_POD, "")
m.Cmd(append([]interface{}{"space", pod}, arg...))
return true
}
return false
}
func MergeAction(list ...map[string]*Action) map[string]*Action {
if len(list) == 0 {
return nil
}
for _, item := range list[1:] {
for k, v := range item {
if _, ok := list[0][k]; !ok {
list[0][k] = v
}
}
}
return list[0]
}