1
0
mirror of https://shylinux.com/x/icebergs synced 2025-06-26 18:37:29 +08:00

opt share

This commit is contained in:
shaoying 2021-05-01 18:54:35 +08:00
parent e52cd73a31
commit ef6ac8100e
12 changed files with 188 additions and 77 deletions

View File

@ -1,8 +1,6 @@
package aaa package aaa
import ( import (
"strings"
ice "github.com/shylinux/icebergs" ice "github.com/shylinux/icebergs"
"github.com/shylinux/icebergs/base/mdb" "github.com/shylinux/icebergs/base/mdb"
kit "github.com/shylinux/toolkits" kit "github.com/shylinux/toolkits"
@ -80,7 +78,6 @@ func UserLogin(m *ice.Message, username, password string) bool {
USERNICK, m.Option(ice.MSG_USERNICK, UserNick(m, username)), USERNICK, m.Option(ice.MSG_USERNICK, UserNick(m, username)),
USERROLE, m.Option(ice.MSG_USERROLE, UserRole(m, username)), USERROLE, m.Option(ice.MSG_USERROLE, UserRole(m, username)),
USERNAME, m.Option(ice.MSG_USERNAME, username), USERNAME, m.Option(ice.MSG_USERNAME, username),
PASSWORD, strings.Repeat("*", len(password)),
) )
return true return true
} }

View File

@ -4,6 +4,7 @@ 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/mdb" "github.com/shylinux/icebergs/base/mdb"
"github.com/shylinux/icebergs/base/tcp"
kit "github.com/shylinux/toolkits" kit "github.com/shylinux/toolkits"
"net/http" "net/http"
@ -13,6 +14,16 @@ import (
"time" "time"
) )
func _share_domain(m *ice.Message) string {
link := m.Conf(SHARE, kit.Keym(kit.MDB_DOMAIN))
if link == "" {
link = m.Cmd(SPACE, SPIDE_DEV, kit.SSH_PWD).Append(kit.MDB_LINK)
}
if link == "" {
link = kit.Format("http://%s:%s", m.Cmd(tcp.HOST).Append(tcp.IP), m.Cmd(SERVE).Append(tcp.PORT))
}
return link
}
func _share_cache(m *ice.Message, arg ...string) { func _share_cache(m *ice.Message, arg ...string) {
msg := m.Cmd(CACHE, arg[0]) msg := m.Cmd(CACHE, arg[0])
m.Render(ice.RENDER_DOWNLOAD, msg.Append(kit.MDB_FILE), msg.Append(kit.MDB_TYPE), msg.Append(kit.MDB_NAME)) m.Render(ice.RENDER_DOWNLOAD, msg.Append(kit.MDB_FILE), msg.Append(kit.MDB_TYPE), msg.Append(kit.MDB_NAME))
@ -78,7 +89,7 @@ const (
LOGIN = "login" LOGIN = "login"
RIVER = "river" RIVER = "river"
STORM = "storm" STORM = "storm"
APPLY = "apply" FIELD = "field"
) )
const SHARE = "share" const SHARE = "share"
@ -94,6 +105,9 @@ func init() {
aaa.USERROLE, m.Option(ice.MSG_USERROLE), aaa.USERNAME, m.Option(ice.MSG_USERNAME), aaa.USERROLE, m.Option(ice.MSG_USERROLE), aaa.USERNAME, m.Option(ice.MSG_USERNAME),
RIVER, m.Option(ice.MSG_RIVER), STORM, m.Option(ice.MSG_STORM), arg) RIVER, m.Option(ice.MSG_RIVER), STORM, m.Option(ice.MSG_STORM), arg)
}}, }},
mdb.MODIFY: {Name: "modify", Help: "编辑", Hand: func(m *ice.Message, arg ...string) {
m.Cmdy(mdb.MODIFY, SHARE, "", mdb.HASH, kit.MDB_HASH, m.Option(kit.MDB_HASH), arg)
}},
mdb.REMOVE: {Name: "remove", Help: "删除", Hand: func(m *ice.Message, arg ...string) { mdb.REMOVE: {Name: "remove", Help: "删除", Hand: func(m *ice.Message, arg ...string) {
m.Cmdy(mdb.DELETE, SHARE, "", mdb.HASH, kit.MDB_HASH, m.Option(kit.MDB_HASH)) m.Cmdy(mdb.DELETE, SHARE, "", mdb.HASH, kit.MDB_HASH, m.Option(kit.MDB_HASH))
}}, }},
@ -101,32 +115,29 @@ func init() {
m.Option(mdb.FIELDS, "time,userrole,username,river,storm,type,name,text") m.Option(mdb.FIELDS, "time,userrole,username,river,storm,type,name,text")
m.Cmdy(mdb.SELECT, SHARE, "", mdb.HASH, kit.MDB_HASH, m.Option(kit.MDB_HASH)) m.Cmdy(mdb.SELECT, SHARE, "", mdb.HASH, kit.MDB_HASH, m.Option(kit.MDB_HASH))
}}, }},
mdb.INPUTS: {Name: "inputs", Help: "补全", Hand: func(m *ice.Message, arg ...string) {}},
LOGIN: {Name: "login userrole=void,tech username", Help: "登录", Hand: func(m *ice.Message, arg ...string) { LOGIN: {Name: "login userrole=void,tech username", Help: "登录", Hand: func(m *ice.Message, arg ...string) {
m.EchoQRCode(kit.MergeURL(m.Conf(SHARE, kit.Keym(kit.MDB_DOMAIN)), m.EchoQRCode(kit.MergeURL(_share_domain(m),
SHARE, m.Cmdx(SHARE, mdb.CREATE, kit.MDB_TYPE, LOGIN, SHARE, m.Cmdx(SHARE, mdb.CREATE, kit.MDB_TYPE, LOGIN,
aaa.USERNAME, kit.Select(m.Option(ice.MSG_USERNAME), m.Option(aaa.USERNAME)), aaa.USERNAME, kit.Select(m.Option(ice.MSG_USERNAME), m.Option(aaa.USERNAME)),
aaa.USERROLE, m.Option(aaa.USERROLE), aaa.USERROLE, m.Option(aaa.USERROLE),
))) )))
}}, }},
APPLY: {Name: "apply", Help: "申请", Hand: func(m *ice.Message, arg ...string) {
m.EchoQRCode(kit.MergeURL(m.Conf(SHARE, kit.Keym(kit.MDB_DOMAIN)),
SHARE, m.Cmdx(SHARE, mdb.CREATE, kit.MDB_TYPE, APPLY)))
}},
"auth": {Name: "auth", Help: "授权", Hand: func(m *ice.Message, arg ...string) {
m.Cmdy(mdb.MODIFY, SHARE, "", mdb.HASH, kit.MDB_HASH, arg)
}},
mdb.INPUTS: {Name: "inputs", Help: "补全", Hand: func(m *ice.Message, arg ...string) {
}},
}, Hand: func(m *ice.Message, c *ice.Context, cmd string, arg ...string) { }, Hand: func(m *ice.Message, c *ice.Context, cmd string, arg ...string) {
m.Fields(len(arg) == 0, "time,hash,type,name,text,userrole,username,river,storm") m.Fields(len(arg) == 0, "time,hash,type,name,text,userrole,username,river,storm")
m.Cmdy(mdb.SELECT, SHARE, "", mdb.HASH, kit.MDB_HASH, arg) m.Cmdy(mdb.SELECT, SHARE, "", mdb.HASH, kit.MDB_HASH, arg)
m.PushAction(mdb.REMOVE) m.PushAction(mdb.REMOVE)
if len(arg) > 0 { if len(arg) > 0 {
m.PushAnchor(kit.MergeURL2(m.Option(ice.MSG_USERWEB), "/share/"+arg[0], SHARE, arg[0])) link := kit.MergeURL(m.Option(ice.MSG_USERWEB), SHARE, arg[0])
m.PushScript("shell", kit.MergeURL2(m.Option(ice.MSG_USERWEB), "/share/"+arg[0], SHARE, arg[0])) if strings.Contains(link, tcp.LOCALHOST) {
m.PushQRCode("share", kit.MergeURL2(m.Option(ice.MSG_USERWEB), "/share/"+arg[0], SHARE, arg[0])) link = strings.Replace(link, tcp.LOCALHOST, m.Cmd(tcp.HOST, ice.OptionFields(tcp.IP)).Append(tcp.IP), 1)
}
m.PushAnchor(link)
m.PushScript("shell", link)
m.PushQRCode("qrcode", link)
} else { } else {
m.Option("_action", "login") m.Option("_action", "login")
} }
@ -143,7 +154,7 @@ func init() {
} }
switch msg.Append(kit.MDB_TYPE) { switch msg.Append(kit.MDB_TYPE) {
case LOGIN, APPLY, RIVER: case LOGIN, RIVER:
switch kit.Select("", arg, 1) { switch kit.Select("", arg, 1) {
case SHARE: case SHARE:
m.Render(ice.RENDER_QRCODE, kit.MergeURL2(m.Option(ice.MSG_USERWEB), "/", list)) m.Render(ice.RENDER_QRCODE, kit.MergeURL2(m.Option(ice.MSG_USERWEB), "/", list))

View File

@ -140,8 +140,11 @@ func _space_handle(m *ice.Message, safe bool, send map[string]*ice.Message, c *w
if len(target) == 0 { // 本地执行 if len(target) == 0 { // 本地执行
msg.Log_AUTH(aaa.USERROLE, msg.Option(ice.MSG_USERROLE), aaa.USERNAME, msg.Option(ice.MSG_USERNAME)) msg.Log_AUTH(aaa.USERROLE, msg.Option(ice.MSG_USERROLE), aaa.USERNAME, msg.Option(ice.MSG_USERNAME))
if msg.Optionv(ice.MSG_HANDLE, "true"); !msg.Warn(!safe, ice.ErrNotRight) { if msg.Optionv(ice.MSG_HANDLE, "true"); safe {
msg.Go(func() { _space_exec(msg, source, target, c, name) }) msg.Go(func() { _space_exec(msg, source, target, c, name) })
} else {
msg.Push(kit.MDB_LINK, kit.MergePOD(_share_domain(msg), name))
_space_echo(msg, []string{}, kit.Revert(source)[1:], c, name)
} }
} else if msg.Richs(SPACE, nil, target[0], func(key string, value map[string]interface{}) { } else if msg.Richs(SPACE, nil, target[0], func(key string, value map[string]interface{}) {
@ -185,9 +188,10 @@ func _space_search(m *ice.Message, kind, name, text string, arg ...string) {
} }
}) })
port := m.Cmd(SERVE, ice.Option{mdb.FIELDS, tcp.PORT}).Append(tcp.PORT)
m.Cmd(tcp.HOST).Table(func(index int, value map[string]string, head []string) { m.Cmd(tcp.HOST).Table(func(index int, value map[string]string, head []string) {
m.PushSearch(kit.SSH_CMD, SPACE, kit.MDB_TYPE, "local", kit.MDB_NAME, value[kit.MDB_NAME], m.PushSearch(kit.SSH_CMD, SPACE, kit.MDB_TYPE, MYSELF, kit.MDB_NAME, value[kit.MDB_NAME],
kit.MDB_TEXT, "http://"+value[tcp.IP]+":9020", kit.SSH_POD, kit.Keys(m.Option(ice.MSG_USERPOD), value)) kit.MDB_TEXT, kit.Format("http://%s:%s", value[tcp.IP], port), kit.SSH_POD, kit.Keys(m.Option(ice.MSG_USERPOD), value))
}) })
} }
@ -231,7 +235,9 @@ func init() {
"/space/": {Name: "/space/ type name share river", Help: "空间站", Hand: func(m *ice.Message, c *ice.Context, cmd string, arg ...string) { "/space/": {Name: "/space/ type name share river", Help: "空间站", Hand: func(m *ice.Message, c *ice.Context, cmd string, arg ...string) {
if s, e := websocket.Upgrade(m.W, m.R, nil, kit.Int(m.Conf(SPACE, "meta.buffer.r")), kit.Int(m.Conf(SPACE, "meta.buffer.w"))); m.Assert(e) { if s, e := websocket.Upgrade(m.W, m.R, nil, kit.Int(m.Conf(SPACE, "meta.buffer.r")), kit.Int(m.Conf(SPACE, "meta.buffer.w"))); m.Assert(e) {
name := m.Option(kit.MDB_NAME, strings.Replace(kit.Select(s.RemoteAddr().String(), m.Option(kit.MDB_NAME)), ".", "_", -1)) name := kit.Select(s.RemoteAddr().String(), m.Option(kit.MDB_NAME))
name = m.Option(kit.MDB_NAME, strings.Replace(name, ".", "_", -1))
name = m.Option(kit.MDB_NAME, strings.Replace(name, ":", "-", -1))
kind := kit.Select(WORKER, m.Option(kit.MDB_TYPE)) kind := kit.Select(WORKER, m.Option(kit.MDB_TYPE))
share := m.Option("share") share := m.Option("share")
river := m.Option("river") river := m.Option("river")
@ -259,10 +265,11 @@ func init() {
if m.Option(ice.MSG_USERNAME) != "" { if m.Option(ice.MSG_USERNAME) != "" {
break break
} }
link := kit.MergeURL(m.Conf(SHARE, kit.Keym(kit.MDB_DOMAIN)), "grant", name)
go func() { m.Go(func(msg *ice.Message) {
m.Sleep("100ms").Cmd(SPACE, name, "pwd", name, link, m.Cmdx(cli.QRCODE, link)) link := kit.MergeURL(_share_domain(msg), "grant", name)
}() msg.Sleep("100ms").Cmd(SPACE, name, "pwd", name, link, msg.Cmdx(cli.QRCODE, link))
})
} }
frame := m.Target().Server().(*Frame) frame := m.Target().Server().(*Frame)

View File

@ -75,6 +75,7 @@ const ( // MSG
MSG_USERZONE = "user.zone" MSG_USERZONE = "user.zone"
MSG_USERROLE = "user.role" MSG_USERROLE = "user.role"
MSG_TITLE = "sess.title"
MSG_RIVER = "sess.river" MSG_RIVER = "sess.river"
MSG_STORM = "sess.storm" MSG_STORM = "sess.storm"
MSG_LOCAL = "sess.local" MSG_LOCAL = "sess.local"

View File

@ -1,13 +1,14 @@
package chat package chat
import ( import (
"path"
"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/ctx"
"github.com/shylinux/icebergs/base/web" "github.com/shylinux/icebergs/base/web"
kit "github.com/shylinux/toolkits" kit "github.com/shylinux/toolkits"
"path"
) )
func _action_domain(m *ice.Message, cmd string, arg ...string) (domain string) { func _action_domain(m *ice.Message, cmd string, arg ...string) (domain string) {
@ -52,6 +53,29 @@ func _action_right(m *ice.Message, river string, storm string) (ok bool) {
} }
return ok return ok
} }
func _action_share(m *ice.Message, cmd string, arg ...string) {
switch msg := m.Cmd(web.SHARE, arg[1]); msg.Append(kit.MDB_TYPE) {
case web.FIELD:
if cmd := kit.Keys(msg.Append(web.RIVER), msg.Append(web.STORM)); len(arg) == 2 {
m.Push("index", cmd)
m.Push("args", msg.Append(kit.MDB_TEXT))
} else {
if m.Warn(kit.Time() > kit.Time(msg.Append(kit.MDB_TIME)), ice.ErrExpire) {
return // 分享超时
}
m.Log_AUTH(
aaa.USERROLE, m.Option(ice.MSG_USERROLE, msg.Append(aaa.USERROLE)),
aaa.USERNAME, m.Option(ice.MSG_USERNAME, msg.Append(aaa.USERNAME)),
)
if m.Warn(!m.Right(arg[3:]), ice.ErrNotRight) {
return // 没有授权
}
m.Cmdy(cmd, arg[3:])
}
}
}
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) {
@ -106,27 +130,24 @@ func init() {
P_ACTION: {Name: "/action river storm action arg...", Help: "工作台", Action: map[string]*ice.Action{ P_ACTION: {Name: "/action river storm action arg...", Help: "工作台", Action: map[string]*ice.Action{
ctx.COMMAND: {Name: "command", Help: "命令", Hand: func(m *ice.Message, arg ...string) { ctx.COMMAND: {Name: "command", Help: "命令", Hand: func(m *ice.Message, arg ...string) {
for _, k := range arg { for _, k := range arg {
m.Cmdy(ctx.COMMAND, k) m.Cmdy(ctx.COMMAND, strings.TrimPrefix(k, "."))
} }
}}, }},
SHARE: {Name: "share", Help: "共享", Hand: func(m *ice.Message, arg ...string) {
_header_share(m, arg...)
}},
}, Hand: func(m *ice.Message, c *ice.Context, cmd string, arg ...string) { }, Hand: func(m *ice.Message, c *ice.Context, cmd string, arg ...string) {
if arg[0] == "_share" { if arg[0] == "_share" {
switch msg := m.Cmd(web.SHARE, arg[1]); msg.Append(kit.MDB_TYPE) { _action_share(m, cmd, arg...)
case STORM:
m.Option(kit.MDB_TITLE, msg.Append(kit.MDB_NAME))
arg[0] = msg.Append(RIVER)
arg[1] = msg.Append(STORM)
default:
return return
} }
} else {
if m.Warn(m.Option(ice.MSG_USERNAME) == "", ice.ErrNotLogin) { if m.Warn(m.Option(ice.MSG_USERNAME) == "", ice.ErrNotLogin) {
return // 没有登录 return // 没有登录
} }
if m.Warn(!_action_right(m, arg[0], arg[1]), ice.ErrNotRight) { if m.Warn(!_action_right(m, arg[0], arg[1]), ice.ErrNotRight) {
return // 没有授权 return // 没有授权
} }
}
m.Option(ice.MSG_RIVER, arg[0]) m.Option(ice.MSG_RIVER, arg[0])
m.Option(ice.MSG_STORM, arg[1]) m.Option(ice.MSG_STORM, arg[1])

View File

@ -1,9 +1,12 @@
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/mdb" "github.com/shylinux/icebergs/base/mdb"
"github.com/shylinux/icebergs/base/tcp"
"github.com/shylinux/icebergs/base/web" "github.com/shylinux/icebergs/base/web"
"github.com/shylinux/icebergs/core/code" "github.com/shylinux/icebergs/core/code"
kit "github.com/shylinux/toolkits" kit "github.com/shylinux/toolkits"
@ -16,6 +19,8 @@ func _header_check(m *ice.Message) {
if m.Option(ice.MSG_USERNAME) != msg.Append(aaa.USERNAME) { if m.Option(ice.MSG_USERNAME) != msg.Append(aaa.USERNAME) {
web.RenderCookie(m, aaa.SessCreate(m, m.Option(ice.MSG_USERNAME, msg.Append(aaa.USERNAME)))) web.RenderCookie(m, aaa.SessCreate(m, m.Option(ice.MSG_USERNAME, msg.Append(aaa.USERNAME))))
} }
case web.FIELD:
m.Option(ice.MSG_USERNAME, msg.Append(aaa.USERNAME))
} }
} }
@ -23,6 +28,17 @@ func _header_check(m *ice.Message) {
m.Option(web.SSO, m.Conf(web.SERVE, kit.Keym(web.SSO))) m.Option(web.SSO, m.Conf(web.SERVE, kit.Keym(web.SSO)))
} }
} }
func _header_share(m *ice.Message, arg ...string) {
share := m.Cmdx(web.SHARE, mdb.CREATE, kit.MDB_TYPE, web.LOGIN, arg)
link := kit.MergeURL(m.Option(ice.MSG_USERWEB), web.SHARE, share)
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.Push(kit.MDB_NAME, link)
m.PushQRCode(kit.MDB_TEXT, 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 pod := m.Option(kit.SSH_POD); pod != "" {
m.Option(kit.SSH_POD, "") m.Option(kit.SSH_POD, "")
@ -46,6 +62,8 @@ const (
GRANT = "grant" GRANT = "grant"
SHARE = "share" SHARE = "share"
AGENT = "agent" AGENT = "agent"
LOGOUT = "logout"
) )
const P_HEADER = "/header" const P_HEADER = "/header"
const HEADER = "header" const HEADER = "header"
@ -71,11 +89,14 @@ func init() {
_header_grant(m, arg...) _header_grant(m, arg...)
}}, }},
SHARE: {Name: "share type", Help: "扫码登录", Hand: func(m *ice.Message, arg ...string) { SHARE: {Name: "share type", Help: "扫码登录", Hand: func(m *ice.Message, arg ...string) {
m.Cmdy(web.SHARE, mdb.CREATE, kit.MDB_TYPE, web.LOGIN, arg) _header_share(m, arg...)
}}, }},
AGENT: {Name: "agent", Help: "应用宿主", Hand: func(m *ice.Message, arg ...string) { AGENT: {Name: "agent", Help: "应用宿主", Hand: func(m *ice.Message, arg ...string) {
m.Cmdy("web.chat.wx.access", "config") 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)))
}},
code.WEBPACK: {Name: "webpack", Help: "网页打包", Hand: func(m *ice.Message, arg ...string) { code.WEBPACK: {Name: "webpack", Help: "网页打包", Hand: func(m *ice.Message, arg ...string) {
m.Cmdy(code.WEBPACK, mdb.CREATE) m.Cmdy(code.WEBPACK, mdb.CREATE)

View File

@ -15,6 +15,24 @@ func _river_list(m *ice.Message) {
m.Set(ice.MSG_OPTION, kit.MDB_HASH) m.Set(ice.MSG_OPTION, kit.MDB_HASH)
m.Set(ice.MSG_OPTION, kit.MDB_NAME) m.Set(ice.MSG_OPTION, kit.MDB_NAME)
if m.Option(web.SHARE) != "" {
switch msg := m.Cmd(web.SHARE, m.Option(web.SHARE)); msg.Append(kit.MDB_TYPE) {
case web.RIVER, web.STORM: // 应用入口
m.Option(ice.MSG_TITLE, msg.Append(kit.MDB_NAME))
m.Option(ice.MSG_RIVER, msg.Append(RIVER))
m.Option(ice.MSG_STORM, msg.Append(STORM))
if msg.Cmd(m.Prefix(USER), m.Option(ice.MSG_USERNAME)).Append(aaa.USERNAME) == "" {
// msg.Cmd(m.Prefix(USER), mdb.INSERT, aaa.USERNAME, m.Option(ice.MSG_USERNAME))
// 加入群组
}
case web.FIELD: // 应用入口
m.Option(ice.MSG_TITLE, msg.Append(kit.MDB_NAME))
m.Option(ice.MSG_RIVER, "_share")
return
}
}
m.Richs(RIVER, nil, kit.MDB_FOREACH, func(key string, value map[string]interface{}) { m.Richs(RIVER, nil, kit.MDB_FOREACH, func(key string, value map[string]interface{}) {
m.Richs(RIVER, kit.Keys(kit.MDB_HASH, key, USER), m.Option(ice.MSG_USERNAME), func(k string, val map[string]interface{}) { m.Richs(RIVER, kit.Keys(kit.MDB_HASH, key, USER), m.Option(ice.MSG_USERNAME), func(k string, val map[string]interface{}) {
m.Push(key, kit.GetMeta(value), []string{kit.MDB_HASH, kit.MDB_NAME}, kit.GetMeta(val)) m.Push(key, kit.GetMeta(value), []string{kit.MDB_HASH, kit.MDB_NAME}, kit.GetMeta(val))
@ -22,12 +40,8 @@ func _river_list(m *ice.Message) {
}) })
} }
func _river_share(m *ice.Message) { func _river_share(m *ice.Message) {
if m.Option(web.SHARE) == "" || m.Option(RIVER) == "" {
return return
}
msg := m.Spawn() msg := m.Spawn()
msg.Option(mdb.FIELDS, "type,name,text,river,storm")
if res := msg.Cmd(web.SHARE, m.Option(web.SHARE)); res.Append(kit.MDB_TYPE) == RIVER { if res := msg.Cmd(web.SHARE, m.Option(web.SHARE)); res.Append(kit.MDB_TYPE) == RIVER {
msg.Option(ice.MSG_RIVER, res.Append(RIVER)) msg.Option(ice.MSG_RIVER, res.Append(RIVER))
} else { } else {
@ -330,12 +344,13 @@ func init() {
m.Cmdy(mdb.INPUTS, RIVER, "", mdb.HASH, arg) m.Cmdy(mdb.INPUTS, RIVER, "", mdb.HASH, arg)
} }
}}, }},
web.SHARE: {Name: "share type name", Help: "共享", Hand: func(m *ice.Message, arg ...string) {
m.Cmdy(web.SHARE, mdb.CREATE, kit.MDB_TYPE, LOGIN, arg)
}},
tcp.START: {Name: "start name repos template", Help: "启动", Hand: func(m *ice.Message, arg ...string) { tcp.START: {Name: "start name repos template", Help: "启动", Hand: func(m *ice.Message, arg ...string) {
m.Cmdy(m.Space(m.Option(kit.SSH_POD)), web.DREAM, tcp.START, arg) m.Cmdy(m.Space(m.Option(kit.SSH_POD)), web.DREAM, tcp.START, arg)
}}, }},
SHARE: {Name: "share", Help: "共享", Hand: func(m *ice.Message, arg ...string) {
_header_share(m, arg...)
}},
}, Hand: func(m *ice.Message, c *ice.Context, cmd string, arg ...string) { }, Hand: func(m *ice.Message, c *ice.Context, cmd string, arg ...string) {
m.Cmdy(mdb.SELECT, RIVER, "", mdb.HASH, kit.MDB_HASH, arg) m.Cmdy(mdb.SELECT, RIVER, "", mdb.HASH, kit.MDB_HASH, arg)
m.PushAction(mdb.REMOVE) m.PushAction(mdb.REMOVE)

View File

@ -4,6 +4,7 @@ import (
ice "github.com/shylinux/icebergs" ice "github.com/shylinux/icebergs"
"github.com/shylinux/icebergs/base/mdb" "github.com/shylinux/icebergs/base/mdb"
"github.com/shylinux/icebergs/base/nfs" "github.com/shylinux/icebergs/base/nfs"
"github.com/shylinux/icebergs/base/web"
kit "github.com/shylinux/toolkits" kit "github.com/shylinux/toolkits"
"fmt" "fmt"
@ -57,15 +58,18 @@ func _pack_volcanos(m *ice.Message, pack *os.File, dir string) {
m.Option(nfs.DIR_TYPE, nfs.CAT) m.Option(nfs.DIR_TYPE, nfs.CAT)
for _, k := range []string{"favicon.ico", "proto.js", "frame.js"} { for _, k := range []string{"favicon.ico", "proto.js", "frame.js"} {
pack.WriteString(fmt.Sprintf(" \"/%s\": %s,\n", pack.WriteString(fmt.Sprintf(" \"/%s\": %s,\n", k, _pack_file(m, path.Join(dir, k))))
kit.Select("", k, k != "index.html"),
_pack_file(m, path.Join(dir, k))))
} }
for _, k := range []string{"lib", "page", "panel", "plugin"} { for _, k := range []string{"lib", "page", "panel", "plugin"} {
m.Cmd(nfs.DIR, k).Table(func(index int, value map[string]string, head []string) { m.Cmd(nfs.DIR, k).Table(func(index int, value map[string]string, head []string) {
pack.WriteString(fmt.Sprintf(" \"/%s\": %s,\n", if value[kit.MDB_PATH] == "page/index.html" {
kit.Select("", value[kit.MDB_PATH], value[kit.MDB_PATH] != "page/index.html"), pack.WriteString(fmt.Sprintf(" \"%s/%s\": %s,\n",
m.Conf(web.SERVE, kit.Keym(ice.VOLCANOS, kit.MDB_PATH)), value[kit.MDB_PATH],
_pack_file(m, path.Join(dir, value[kit.MDB_PATH])))) _pack_file(m, path.Join(dir, value[kit.MDB_PATH]))))
return
}
pack.WriteString(fmt.Sprintf(" \"/%s\": %s,\n",
value[kit.MDB_PATH], _pack_file(m, path.Join(dir, value[kit.MDB_PATH]))))
}) })
} }
pack.WriteString("\n") pack.WriteString("\n")

View File

@ -51,6 +51,7 @@ func init() {
main = k main = k
} }
} }
_autogen_version(m)
// 编译目标 // 编译目标
file := path.Join(kit.Select("", m.Conf(cmd, kit.META_PATH), m.Option(cli.CMD_DIR) == ""), kit.Keys(kit.Select("ice", path.Base(strings.TrimSuffix(main, ".go")), main != "src/main.go"), goos, arch)) file := path.Join(kit.Select("", m.Conf(cmd, kit.META_PATH), m.Option(cli.CMD_DIR) == ""), kit.Keys(kit.Select("ice", path.Base(strings.TrimSuffix(main, ".go")), main != "src/main.go"), goos, arch))

View File

@ -10,6 +10,7 @@ import (
var OK = "ok" var OK = "ok"
var ErrWarn = "warn: " var ErrWarn = "warn: "
var ErrExpire = "expire: "
var ErrNotLogin = "not login: " var ErrNotLogin = "not login: "
var ErrNotRight = "not right: " var ErrNotRight = "not right: "
var ErrNotFound = "not found: " var ErrNotFound = "not found: "

10
misc.go
View File

@ -143,7 +143,7 @@ func Render(m *Message, cmd string, args ...interface{}) string {
list := []string{} list := []string{}
for _, k := range kit.Split(strings.Join(arg, ",")) { for _, k := range kit.Split(strings.Join(arg, ",")) {
list = append(list, fmt.Sprintf(`<input type="button" name="%s" value="%s">`, list = append(list, fmt.Sprintf(`<input type="button" name="%s" value="%s">`,
k, kit.Select(k, kit.Value(m.cmd.Meta, kit.Keys("trans", k))))) k, kit.Select(k, kit.Value(m._cmd.Meta, kit.Keys("trans", k)))))
} }
return strings.Join(list, "") return strings.Join(list, "")
@ -255,3 +255,11 @@ func (m *Message) RenameAppend(from, to string) {
func (m *Message) Fields(condition bool, fields string) string { func (m *Message) Fields(condition bool, fields string) string {
return m.Option("fields", kit.Select(kit.Select("detail", fields, condition), m.Option("fields"))) return m.Option("fields", kit.Select(kit.Select("detail", fields, condition), m.Option("fields")))
} }
type Option struct {
Name string
Value interface{}
}
func OptionFields(str string) Option { return Option{"fields", str} }
func OptionHash(str string) Option { return Option{kit.MDB_HASH, str} }

60
type.go
View File

@ -111,7 +111,7 @@ func (c *Context) _hand(m *Message, cmd *Command, key string, k string, h *Actio
return m return m
} }
func (c *Context) cmd(m *Message, cmd *Command, key string, arg ...string) *Message { func (c *Context) cmd(m *Message, cmd *Command, key string, arg ...string) *Message {
if m.cmd = cmd; cmd == nil { if m._cmd = cmd; cmd == nil {
return m return m
} }
@ -324,7 +324,7 @@ type Message struct {
source *Context source *Context
target *Context target *Context
cmd *Command _cmd *Command
cb func(*Message) *Message cb func(*Message) *Message
W http.ResponseWriter W http.ResponseWriter
@ -628,10 +628,36 @@ func (m *Message) Search(key string, cb interface{}) *Message {
return m return m
} }
func (m *Message) _hand(arg ...interface{}) *Message { func (m *Message) Cmdy(arg ...interface{}) *Message {
list := kit.Simple(arg...) return m.Copy(m.cmd(arg...))
if len(arg) > 0 { }
switch cb := arg[len(arg)-1]; cbs := cb.(type) { func (m *Message) Cmdx(arg ...interface{}) string {
return kit.Select("", m.cmd(arg...).meta[MSG_RESULT], 0)
}
func (m *Message) Cmds(arg ...interface{}) *Message {
return m.Go(func() { m.cmd(arg...) })
}
func (m *Message) Cmd(arg ...interface{}) *Message {
return m.cmd(arg...)
}
func (m *Message) cmd(arg ...interface{}) *Message {
opts := map[string]interface{}{}
args := []interface{}{}
for _, v := range arg {
switch val := v.(type) {
case Option:
opts[val.Name] = val.Value
case *Option:
opts[val.Name] = val.Value
default:
args = append(args, v)
}
}
list := kit.Simple(args...)
if len(args) > 0 {
switch cb := args[len(args)-1]; cbs := cb.(type) {
case string: case string:
default: default:
if reflect.Func == reflect.TypeOf(cbs).Kind() { if reflect.Func == reflect.TypeOf(cbs).Kind() {
@ -650,15 +676,24 @@ func (m *Message) _hand(arg ...interface{}) *Message {
if cmd, ok := m.target.Commands[list[0]]; ok { if cmd, ok := m.target.Commands[list[0]]; ok {
m.TryCatch(m.Spawn(), true, func(msg *Message) { m.TryCatch(m.Spawn(), true, func(msg *Message) {
for k, v := range opts {
msg.Option(k, v)
}
m = m.target.cmd(msg, cmd, list[0], list[1:]...) m = m.target.cmd(msg, cmd, list[0], list[1:]...)
}) })
} else if cmd, ok := m.source.Commands[list[0]]; ok { } else if cmd, ok := m.source.Commands[list[0]]; ok {
m.TryCatch(m.Spawn(m.source), true, func(msg *Message) { m.TryCatch(m.Spawn(m.source), true, func(msg *Message) {
for k, v := range opts {
msg.Option(k, v)
}
m = m.source.cmd(msg, cmd, list[0], list[1:]...) m = m.source.cmd(msg, cmd, list[0], list[1:]...)
}) })
} else { } else {
m.Search(list[0], func(p *Context, s *Context, key string, cmd *Command) { m.Search(list[0], func(p *Context, s *Context, key string, cmd *Command) {
m.TryCatch(m.Spawn(s), true, func(msg *Message) { m.TryCatch(m.Spawn(s), true, func(msg *Message) {
for k, v := range opts {
msg.Option(k, v)
}
m = s.cmd(msg, cmd, key, list[1:]...) m = s.cmd(msg, cmd, key, list[1:]...)
}) })
}) })
@ -669,18 +704,7 @@ func (m *Message) _hand(arg ...interface{}) *Message {
} }
return m return m
} }
func (m *Message) Cmdy(arg ...interface{}) *Message {
return m.Copy(m._hand(arg...))
}
func (m *Message) Cmdx(arg ...interface{}) string {
return kit.Select("", m._hand(arg...).meta[MSG_RESULT], 0)
}
func (m *Message) Cmds(arg ...interface{}) *Message {
return m.Go(func() { m._hand(arg...) })
}
func (m *Message) Cmd(arg ...interface{}) *Message {
return m._hand(arg...)
}
func (m *Message) Confv(arg ...interface{}) (val interface{}) { func (m *Message) Confv(arg ...interface{}) (val interface{}) {
m.Search(kit.Format(arg[0]), func(p *Context, s *Context, key string, conf *Config) { m.Search(kit.Format(arg[0]), func(p *Context, s *Context, key string, conf *Config) {
if len(arg) == 1 { if len(arg) == 1 {