1
0
mirror of https://shylinux.com/x/icebergs synced 2025-06-26 10:27:31 +08:00
This commit is contained in:
IT 老营长 @云轩领航-创始人 2022-09-29 10:34:35 +08:00
parent 3efdc8b7dc
commit 3208f8bf8a
28 changed files with 273 additions and 429 deletions

View File

@ -64,6 +64,14 @@ func init() {
mdb.CREATE: {Name: "create username", Help: "创建", Hand: func(m *ice.Message, arg ...string) {
_sess_create(m, m.Option(USERNAME))
}},
SESS_CREATE: {Name: "sess.create", Help: "检查", Hand: func(m *ice.Message, arg ...string) {
m.Cmd(mdb.EXPORT, m.Prefix(SESS), "", mdb.HASH)
m.Cmd(mdb.IMPORT, m.Prefix(SESS), "", mdb.HASH)
}},
USER_CREATE: {Name: "user.create", Help: "检查", Hand: func(m *ice.Message, arg ...string) {
m.Cmd(mdb.EXPORT, m.Prefix(USER), "", mdb.HASH)
m.Cmd(mdb.IMPORT, m.Prefix(USER), "", mdb.HASH)
}},
CHECK: {Name: "check sessid", Help: "检查", Hand: func(m *ice.Message, arg ...string) {
_sess_check(m, m.Option(SESSID))
}},

View File

@ -31,7 +31,7 @@ func _user_login(m *ice.Message, name, word string) {
_source := logs.FileLineMeta(logs.FileLine(-1, 3))
mdb.HashSelectDetail(m.Spawn(), name, func(value ice.Map) {
if m.Warn(word != "" && word != kit.Format(kit.Value(value, kit.Keys(mdb.EXTRA, PASSWORD))), ice.ErrNotRight) {
if m.Warn(word != "" && word != kit.Format(kit.Value(value, PASSWORD)), ice.ErrNotRight) {
return
}
m.Auth(

View File

@ -2,6 +2,7 @@ package cli
import (
"os"
"path"
ice "shylinux.com/x/icebergs"
"shylinux.com/x/icebergs/base/aaa"
@ -65,6 +66,14 @@ func init() {
logs.Println(ice.EXIT) // 正常退出
break
} else {
if m.Config("log.save") == ice.TRUE {
back := kit.Format("var/log.%s", logs.Now().Format("20060102_150405"))
m.Cmd(SYSTEM, "cp", "-r", "var/log", back, ice.Maps{CMD_OUTPUT: ""})
m.Cmd(SYSTEM, "cp", "bin/boot.log", path.Join(back, "boot.log"), ice.Maps{CMD_OUTPUT: ""})
// if IsSuccess(m.Cmd(SYSTEM, "grep", "fatal error: concurrent map read and map write", "bin/boot.log", ice.Maps{CMD_OUTPUT: ""})) {
// m.Cmd(SYSTEM, "cp", "bin/boot.log", path.Join(back, "boot.log"), ice.Maps{CMD_OUTPUT: ""})
// }
}
logs.Println()
m.Sleep("1s")
}

View File

@ -38,8 +38,11 @@ func (f *Frame) Start(m *ice.Message, arg ...string) bool {
return true
}
// file := kit.Select(BENCH, m.Conf(SHOW, kit.Keys(l.l, FILE)))
file := BENCH
for _, file := range []string{m.Conf(SHOW, kit.Keys(l.l, FILE)), BENCH} {
if file == "" {
continue
}
view := m.Confm(VIEW, m.Conf(SHOW, kit.Keys(l.l, VIEW)))
bio := m.Confv(FILE, kit.Keys(file, FILE)).(*bufio.Writer)
if bio == nil {
@ -65,6 +68,7 @@ func (f *Frame) Start(m *ice.Message, arg ...string) bool {
bio.Flush()
}
}
}
return true
}
func (f *Frame) Close(m *ice.Message, arg ...string) bool {

View File

@ -158,8 +158,12 @@ func _hash_import(m *ice.Message, prefix, chain, file string) {
count++
}
} else {
for _, data := range list {
for k, data := range list {
if m.Confv(prefix, kit.Keys(chain, HASH, k)) == nil {
m.Confv(prefix, kit.Keys(chain, HASH, k), data)
} else {
Rich(m, prefix, chain, data)
}
count++
}
}
@ -248,7 +252,11 @@ func HashModify(m *ice.Message, arg ...Any) *ice.Message {
return m.Cmd(MODIFY, m.PrefixKey(), "", HASH, args)
}
func HashSelect(m *ice.Message, arg ...string) *ice.Message {
if len(arg) > 0 && arg[0] == FOREACH {
m.Fields(0, HashField(m))
} else {
m.Fields(len(kit.Slice(arg, 0, 1)), HashField(m))
}
m.Cmdy(SELECT, m.PrefixKey(), "", HASH, HashShort(m), arg)
if m.PushAction(m.Config(ACTION), REMOVE); !m.FieldsIsDetail() {
return m.StatusTimeCount()

View File

@ -91,8 +91,14 @@ func (f *Frame) alias(m *ice.Message, ls []string) []string {
}
func (f *Frame) parse(m *ice.Message, h, line string) string {
msg := m.Spawn(f.target)
ls := f.change(msg, f.alias(msg, kit.Split(strings.TrimSpace(line))))
if len(ls) == 0 {
ls := kit.Split(strings.TrimSpace(line))
for i, v := range ls {
if v == "#" {
ls = ls[:i]
break
}
}
if ls = f.change(msg, f.alias(msg, ls)); len(ls) == 0 {
return ""
}

View File

@ -2,6 +2,7 @@ package web
import (
"net/url"
"path"
"strings"
"time"
@ -144,10 +145,17 @@ func MergePod(m Message, pod string, arg ...ice.Any) string {
return kit.MergePOD(kit.Select(ice.Info.Domain, m.Option(ice.MSG_USERWEB)), pod, arg...)
}
func MergePodCmd(m Message, pod, cmd string, arg ...ice.Any) string {
p := "/chat"
p += path.Join("/pod/", kit.Keys(m.Option(ice.MSG_USERPOD), pod))
p = kit.Select(p, "/chat", p == "/chat/pod")
p += path.Join("/cmd/", kit.Select(m.PrefixKey(), cmd))
return kit.MergeURL2(kit.Select(ice.Info.Domain, m.Option(ice.MSG_USERWEB)), p, arg...)
}
func MergePodWebSite(m Message, pod, web string, arg ...ice.Any) string {
p := "/chat"
p += "/pod/" + kit.Keys(m.Option(ice.MSG_USERPOD), pod)
p = kit.Select(p, "/chat/", p == "/chat/pod/")
p += "/cmd/" + kit.Select(m.PrefixKey(), cmd)
p += "/website/" + kit.Select("index.iml", web)
return kit.MergeURL2(kit.Select(ice.Info.Domain, m.Option(ice.MSG_USERWEB)), p, arg...)
}
func ProcessWebsite(m *ice.Message, pod, cmd string, arg ...ice.Any) {

View File

@ -139,8 +139,7 @@ func init() {
SHARE: {Name: "share hash auto prunes", Help: "共享链", Actions: ice.MergeActions(ice.Actions{
ice.CTX_INIT: {Hand: func(m *ice.Message, arg ...string) { _share_render(m) }},
mdb.CREATE: {Name: "create type name text", Help: "创建", Hand: func(m *ice.Message, arg ...string) {
mdb.HashCreate(m, aaa.USERROLE, m.Option(ice.MSG_USERROLE), aaa.USERNAME, m.Option(ice.MSG_USERNAME), aaa.USERNICK, m.Option(ice.MSG_USERNICK),
RIVER, m.Option(ice.MSG_RIVER), STORM, m.Option(ice.MSG_STORM), arg)
mdb.HashCreate(m, aaa.USERROLE, m.Option(ice.MSG_USERROLE), aaa.USERNAME, m.Option(ice.MSG_USERNAME), aaa.USERNICK, m.Option(ice.MSG_USERNICK), arg)
m.Option(mdb.LINK, _share_link(m, PP(SHARE)+m.Result()))
}},
LOGIN: {Name: "login userrole=void,tech username", Help: "登录", Hand: func(m *ice.Message, arg ...string) {

View File

@ -10,32 +10,25 @@ import (
kit "shylinux.com/x/toolkits"
)
func _action_right(m *ice.Message, river string, storm string) (ok bool) {
return m.Option(ice.MSG_USERROLE) != aaa.VOID || m.Cmd(OCEAN, m.Option(ice.MSG_USERNAME)).Length() > 0
}
func _action_key(m *ice.Message, arg ...string) string {
return kit.KeyHash(kit.Select(m.Option(RIVER), arg, 0), STORM, kit.KeyHash(kit.Select(m.Option(STORM), arg, 1)))
}
func _action_list(m *ice.Message, river, storm string) {
m.Cmdy(STORM, storm, kit.Dict(ice.MSG_RIVER, river))
m.Cmdy(STORM, kit.Dict(ice.MSG_RIVER, river, ice.MSG_STORM, storm))
}
func _action_exec(m *ice.Message, river, storm, index string, arg ...string) {
m.Option(ice.MSG_RIVER, river)
m.Option(ice.MSG_STORM, storm)
if m.Cmd(STORM, storm, index, func(value ice.Maps) {
if m.Warn(m.Cmd(STORM, index, func(value ice.Maps) {
if index = value[ctx.INDEX]; value[web.SPACE] != "" {
m.Option(ice.POD, value[web.SPACE])
}
}).Length() == 0 && m.Option(ice.MSG_USERPOD) == "" && !aaa.Right(m, index) {
return // 没有授权
}).Length() == 0, ice.ErrNotFound, index) {
return
}
if m.Option(ice.MSG_UPLOAD) != "" {
_action_upload(m) // 上传文件
}
if index == m.Prefix(NODES) || !ctx.PodCmd(m, index, arg) {
if !ctx.PodCmd(m, index, arg) {
m.Cmdy(index, arg) // 执行命令
}
}
@ -52,7 +45,7 @@ func _action_auth(m *ice.Message, share string) *ice.Message {
RIVER, m.Option(ice.MSG_RIVER, msg.Append(RIVER)),
STORM, m.Option(ice.MSG_STORM, msg.Append(STORM)),
)
if m.Warn(!_action_right(m, msg.Append(web.RIVER), msg.Append(web.STORM)), ice.ErrNotRight) {
if m.Warn(!_river_right(m, msg.Append(web.RIVER)), ice.ErrNotRight) {
msg.Append(mdb.TYPE, "")
return msg // 没有权限
}
@ -62,6 +55,8 @@ func _action_share(m *ice.Message, arg ...string) {
switch msg := _action_auth(m, arg[0]); msg.Append(mdb.TYPE) {
case web.STORM:
if len(arg) == 1 {
m.Push(TITLE, msg.Append(TITLE))
m.Push(TOPIC, msg.Append(TOPIC))
_action_list(m, msg.Append(web.RIVER), msg.Append(web.STORM))
break // 命令列表
}
@ -88,12 +83,6 @@ func _action_upload(m *ice.Message) {
m.Option(ice.MSG_UPLOAD, msg.Append(mdb.HASH), msg.Append(mdb.NAME), msg.Append(nfs.SIZE))
}
const (
PUBLIC = "public"
PROTECTED = "protected"
PRIVATE = "private"
)
const ACTION = "action"
func init() {
@ -101,9 +90,10 @@ func init() {
web.P(ACTION): {Name: "/action river storm action arg...", Help: "工作台", Actions: ice.MergeActions(ice.Actions{
ice.CTX_INIT: {Hand: func(m *ice.Message, arg ...string) {
m.Cmd(aaa.ROLE, aaa.WHITE, aaa.VOID, m.CommandKey())
m.Cmd(aaa.ROLE, aaa.BLACK, aaa.VOID, m.CommandKey(), ctx.ACTION)
}},
mdb.MODIFY: {Name: "modify", Help: "编辑", Hand: func(m *ice.Message, arg ...string) {
m.Cmdy(mdb.MODIFY, RIVER, _action_key(m), mdb.LIST, m.OptionSimple(mdb.ID), arg)
m.Cmdy(mdb.MODIFY, RIVER, _storm_key(m), mdb.LIST, m.OptionSimple(mdb.ID), arg)
}},
web.SHARE: {Name: "share", Help: "共享", Hand: func(m *ice.Message, arg ...string) {
_action_share(m, arg...)
@ -112,12 +102,12 @@ func init() {
if m.Warn(m.Option(ice.MSG_USERNAME) == "", ice.ErrNotLogin, arg) {
return // 没有登录
}
if m.Option(ice.MSG_USERPOD) == "" && m.Warn(!_action_right(m, arg[0], arg[1]), ice.ErrNotRight, arg) {
if m.Option(ice.MSG_USERPOD) == "" && m.Warn(!_river_right(m, arg[0]), ice.ErrNotRight, arg) {
return // 没有授权
}
if len(arg) == 2 {
m.Option(MENUS, m.Config(MENUS))
m.OptionFromConfig(MENUS)
_action_list(m, arg[0], arg[1])
return //命令列表
}

View File

@ -1,11 +1,8 @@
package chat
import (
"path"
ice "shylinux.com/x/icebergs"
"shylinux.com/x/icebergs/base/web"
kit "shylinux.com/x/toolkits"
)
const CHAT = "chat"
@ -13,25 +10,3 @@ const CHAT = "chat"
var Index = &ice.Context{Name: CHAT, Help: "聊天中心"}
func init() { web.Index.Register(Index, &web.Frame{}) }
func MergePod(m *ice.Message, pod string, arg ...ice.Any) string {
return kit.MergePOD(kit.Select(ice.Info.Domain, m.Option(ice.MSG_USERWEB)), pod, arg...)
}
func MergeCmd(m *ice.Message, cmd string, arg ...ice.Any) string {
return mergeurl(m, path.Join(ice.CMD, kit.Select(m.PrefixKey(), cmd)), arg...)
}
func MergeWebsite(m *ice.Message, web string, arg ...ice.Any) string {
if m.Option(ice.MSG_USERPOD) == "" {
return mergeurl(m, path.Join(ice.PS, "chat", WEBSITE, web), arg...)
} else {
return mergeurl(m, path.Join(WEBSITE, web), arg...)
}
}
func mergeurl(m *ice.Message, p string, arg ...ice.Any) string {
if m.Option(ice.MSG_USERPOD) == "" {
p = path.Join(ice.PS, p)
} else {
p = path.Join(ice.PS, "chat", ice.POD, m.Option(ice.MSG_USERPOD), p)
}
return kit.MergeURL2(kit.Select(ice.Info.Domain, m.Option(ice.MSG_USERWEB)), path.Join(p), arg...)
}

View File

@ -1,34 +1,36 @@
chapter "组织"
chat.go
chat.shy
section "框架"
header.go
footer.go
action.go
search.go
river.go
storm.go
ocean.go
nodes.go
action.go
search.go
footer.go
template.go
sso.go
section "集群"
pod.go
cmd.go
div.go
topic.go
website.go
scan.go
scan.js
paste.go
files.go
trans.go
location.go
location.shy
room.go
meet.go
grant.go
div.go
sso.go
oauth
section "应用"
keyboard.go
iframe.go
paste.go
media.go
files.go
trans.go
scan.go
scan.js
location.go
location.shy
topic.go
meet.go
room.go

View File

@ -26,7 +26,7 @@ func init() {
}
}
}},
}, ctx.CmdAction(EMAIL, `<a href="mailto:shylinuxc@gmail.com">shylinuxc@gmail.com</a>`), web.ApiAction("/footer")), Hand: func(m *ice.Message, arg ...string) {
}, ctx.CmdAction(EMAIL, `<a href="mailto:shylinuxc@gmail.com">shylinuxc@gmail.com</a>`), web.ApiAction(web.P(FOOTER))), Hand: func(m *ice.Message, arg ...string) {
m.Result(m.Configv(EMAIL))
}},
})

View File

@ -5,7 +5,6 @@ import (
ice "shylinux.com/x/icebergs"
"shylinux.com/x/icebergs/base/aaa"
"shylinux.com/x/icebergs/base/cli"
"shylinux.com/x/icebergs/base/ctx"
"shylinux.com/x/icebergs/base/gdb"
"shylinux.com/x/icebergs/base/mdb"
@ -14,32 +13,9 @@ import (
kit "shylinux.com/x/toolkits"
)
func _header_check(m *ice.Message, arg ...string) bool {
if m.Option(web.SHARE) != "" {
m.Cmd(web.SHARE, m.Option(web.SHARE), ice.OptionFields(""), func(value ice.Maps) {
switch value[mdb.TYPE] {
case web.LOGIN:
if value[aaa.USERNAME] != m.Option(ice.MSG_USERNAME) {
web.RenderCookie(m, aaa.SessCreate(m, value[aaa.USERNAME]))
}
fallthrough
case web.STORM, web.FIELD:
m.Option(ice.MSG_USERNAME, value[aaa.USERNAME])
m.Option(ice.MSG_USERROLE, value[aaa.USERROLE])
m.Auth(aaa.USERROLE, value[aaa.USERROLE], aaa.USERNAME, value[aaa.USERNAME])
}
})
}
if m.Option(ice.MSG_USERNAME) != "" {
return true
}
m.Option(web.SSO, m.Config(web.SSO))
m.Option(web.LOGIN, m.Config(web.LOGIN))
if m.Option("login.dev", m.CmdAppend(web.SPACE, ice.DEV, mdb.TEXT)) == "" {
m.Option("login.dev", m.CmdAppend(web.SPACE, ice.SHY, mdb.TEXT))
}
return false
func _header_users(m *ice.Message, key string, arg ...string) {
key = kit.Select(m.ActionKey(), key)
m.Cmdy(aaa.USER, mdb.MODIFY, aaa.USERNAME, m.Option(ice.MSG_USERNAME), key, m.Option(key, arg[0]))
}
func _header_share(m *ice.Message, arg ...string) {
if m.Option(mdb.LINK) == "" {
@ -47,19 +23,42 @@ func _header_share(m *ice.Message, arg ...string) {
} else {
m.Option(mdb.LINK, tcp.ReplaceLocalhost(m, m.Option(mdb.LINK)))
}
m.Option(mdb.LINK, kit.MergeURL(m.Option(mdb.LINK), RIVER, "", STORM, ""))
m.PushQRCode(mdb.TEXT, m.Option(mdb.LINK))
m.Push(mdb.NAME, m.Option(mdb.LINK))
m.Push(mdb.NAME, m.Option(mdb.LINK)).PushQRCode(mdb.TEXT, m.Option(mdb.LINK))
}
func _header_users(m *ice.Message, key string, arg ...string) {
m.Option(aaa.USERNAME, m.Option(ice.MSG_USERNAME))
m.Cmdy(aaa.USER, mdb.MODIFY, key, m.Option(key, arg[0]))
func _header_check(m *ice.Message, arg ...string) bool {
if m.Option(web.SHARE) != "" {
m.Cmd(web.SHARE, m.Option(web.SHARE), ice.OptionFields(""), func(value ice.Maps) {
if m.Warn(kit.Time(value[mdb.TIME]) < kit.Time(m.Time()), ice.ErrNotValid, m.Option(web.SHARE)) {
return
}
switch value[mdb.TYPE] {
case web.LOGIN:
if value[aaa.USERNAME] != m.Option(ice.MSG_USERNAME) {
web.RenderCookie(m, aaa.SessCreate(m, value[aaa.USERNAME]))
}
fallthrough
case web.STORM, web.FIELD:
m.Option(ice.MSG_USERROLE, value[aaa.USERROLE])
m.Option(ice.MSG_USERNAME, value[aaa.USERNAME])
m.Option(ice.MSG_USERNICK, value[aaa.USERNICK])
m.Auth(aaa.USERROLE, value[aaa.USERROLE], aaa.USERNAME, value[aaa.USERNAME], aaa.USERNICK, value[aaa.USERNICK])
}
})
}
if m.Option(ice.MSG_USERNAME) != "" {
return true
}
if m.OptionFromConfig(web.SSO) == "" && m.Option("login.dev", m.CmdAppend(web.SPACE, ice.DEV, mdb.TEXT)) == "" {
if m.Option("login.dev", m.CmdAppend(web.SPACE, ice.SHY, mdb.TEXT)) == "" {
m.OptionFromConfig(web.LOGIN)
}
}
return false
}
const (
TITLE = "title"
MENUS = "menus"
TRANS = "trans"
HEADER_AGENT = "header.agent"
)
@ -85,39 +84,19 @@ func init() {
ice.CTX_INIT: {Hand: func(m *ice.Message, arg ...string) {
m.Cmd(aaa.ROLE, aaa.WHITE, aaa.VOID, m.CommandKey())
}},
aaa.LOGIN: {Name: "login", Help: "密码登录", Hand: func(m *ice.Message, arg ...string) {
aaa.LOGIN: {Hand: func(m *ice.Message, arg ...string) {
if aaa.UserLogin(m, arg[0], arg[1]) {
web.RenderCookie(m, aaa.SessCreate(m, arg[0]))
}
}},
aaa.LOGOUT: {Name: "logout", Help: "退出登录", Hand: func(m *ice.Message, arg ...string) {
aaa.UserLogout(m)
}},
aaa.PASSWORD: {Name: "password", Help: "修改密码", Hand: func(m *ice.Message, arg ...string) {
_header_users(m, m.ActionKey(), arg...)
}},
aaa.USERNICK: {Name: "usernick", Help: "用户昵称", Hand: func(m *ice.Message, arg ...string) {
_header_users(m, m.ActionKey(), arg...)
}},
aaa.AVATAR: {Name: "avatar", Help: "用户头像", Hand: func(m *ice.Message, arg ...string) {
_header_users(m, m.ActionKey(), arg...)
}},
aaa.BACKGROUND: {Name: "background", Help: "用户壁纸", Hand: func(m *ice.Message, arg ...string) {
_header_users(m, m.ActionKey(), arg...)
}},
aaa.LANGUAGE: {Name: "language", Help: "语言地区", Hand: func(m *ice.Message, arg ...string) {
_header_users(m, m.ActionKey(), arg...)
}},
ctx.CONFIG: {Name: "config scope", Help: "拉取配置", Hand: func(m *ice.Message, arg ...string) {
m.Cmdy(web.SPACE, m.Option(ice.MSG_USERPOD), m.Prefix("oauth.oauth"), "check", arg)
}},
"webpack": {Name: "webpack", Help: "打包页面", Hand: func(m *ice.Message, arg ...string) {
m.Cmdy("webpack", cli.BUILD, m.OptionSimple(mdb.NAME))
}},
web.SHARE: {Name: "share type", Help: "共享", Hand: func(m *ice.Message, arg ...string) {
_header_share(m, arg...)
}},
}, ctx.ConfAction(aaa.LOGIN, kit.List("登录", "扫码")), web.ApiAction("/header")), Hand: func(m *ice.Message, arg ...string) {
aaa.LOGOUT: {Hand: func(m *ice.Message, arg ...string) { aaa.UserLogout(m) }},
aaa.PASSWORD: {Hand: func(m *ice.Message, arg ...string) { _header_users(m, "", arg...) }},
aaa.USERNICK: {Hand: func(m *ice.Message, arg ...string) { _header_users(m, "", arg...) }},
aaa.LANGUAGE: {Hand: func(m *ice.Message, arg ...string) { _header_users(m, "", arg...) }},
aaa.BACKGROUND: {Hand: func(m *ice.Message, arg ...string) { _header_users(m, "", arg...) }},
aaa.AVATAR: {Hand: func(m *ice.Message, arg ...string) { _header_users(m, "", arg...) }},
web.SHARE: {Hand: func(m *ice.Message, arg ...string) { _header_share(m, arg...) }},
}, ctx.ConfAction(aaa.LOGIN, kit.List("登录", "扫码")), web.ApiAction(web.P(HEADER))), Hand: func(m *ice.Message, arg ...string) {
if !_header_check(m, arg...) {
return
}
@ -126,18 +105,14 @@ func init() {
for _, k := range []string{aaa.USERNICK, aaa.LANGUAGE} {
m.Option(k, msg.Append(k))
}
for _, k := range []string{aaa.AVATAR, aaa.BACKGROUND} {
for _, k := range []string{aaa.BACKGROUND, aaa.AVATAR} {
if msg.Append(k) != "" && !strings.HasPrefix(msg.Append(k), ice.HTTP) && aaa.Right(m.Spawn(), msg.Append(k)) {
m.Option(k, web.SHARE_LOCAL+k)
}
}
if m.Option(aaa.AVATAR) == "" && m.R.Header.Get("Staffname") != "" {
m.Option(aaa.AVATAR, kit.Format("https://dayu.oa.com/avatars/%s/profile.jpg", m.R.Header.Get("Staffname")))
}
gdb.Event(m, HEADER_AGENT)
m.Option(TRANS, kit.Format(kit.Value(m.Target().Commands[web.P(m.CommandKey())].Meta, "_trans")))
m.Option(MENUS, m.Config(MENUS))
m.OptionFromConfig(MENUS)
m.Echo(m.Config(TITLE))
}},
})

View File

@ -1,62 +0,0 @@
package chat
import (
ice "shylinux.com/x/icebergs"
"shylinux.com/x/icebergs/base/aaa"
"shylinux.com/x/icebergs/base/gdb"
"shylinux.com/x/icebergs/base/mdb"
"shylinux.com/x/icebergs/base/web"
kit "shylinux.com/x/toolkits"
)
const NODES = "nodes"
func init() {
Index.MergeCommands(ice.Commands{
NODES: {Name: "nodes space index auto insert invite", Help: "设备", Actions: ice.Actions{
ice.CTX_INIT: {Hand: func(m *ice.Message, arg ...string) {
gdb.Watch(m, web.SPACE_START, m.PrefixKey())
gdb.Watch(m, web.DREAM_START, m.PrefixKey())
}},
web.SPACE_START: {Name: "start type name share river", Help: "启动", Hand: func(m *ice.Message, arg ...string) {
if m.Option(ice.MSG_RIVER, m.Option(RIVER)) == "" {
return
}
if msg := m.Cmd(web.SHARE, m.Option(web.SHARE)); msg.Append(mdb.TYPE) == RIVER {
m.Cmdy("", mdb.INSERT, arg)
}
}},
web.DREAM_START: {Name: "start type name share river", Help: "启动", Hand: func(m *ice.Message, arg ...string) {
if m.Option(ice.MSG_RIVER, m.Option(RIVER)) == "" {
return
}
m.Cmdy("", mdb.INSERT, arg)
}},
mdb.INPUTS: {Name: "inputs", Help: "补全", Hand: func(m *ice.Message, arg ...string) {
m.Cmdy(web.SPACE)
}},
mdb.INSERT: {Name: "insert type space share river", Help: "添加", Hand: func(m *ice.Message, arg ...string) {
m.Option(mdb.SHORT, web.SPACE)
m.Cmdy(mdb.INSERT, RIVER, _river_key(m, m.CommandKey()), mdb.HASH, arg)
}},
mdb.DELETE: {Name: "delete", Help: "删除", Hand: func(m *ice.Message, arg ...string) {
m.Cmdy(mdb.DELETE, RIVER, _river_key(m, m.CommandKey()), mdb.HASH, m.OptionSimple(web.SPACE))
}},
aaa.INVITE: {Name: "invite", Help: "邀请", Hand: func(m *ice.Message, arg ...string) {
m.Option(web.SHARE, m.Cmdx(web.SHARE, mdb.CREATE, mdb.TYPE, RIVER))
m.Cmdy("publish", ice.CONTEXTS, "tool")
}},
}, Hand: func(m *ice.Message, arg ...string) {
if len(arg) == 0 {
m.OptionFields("time,type,space,share")
m.Cmdy(mdb.SELECT, RIVER, _river_key(m, m.CommandKey()), mdb.HASH)
m.Tables(func(value ice.Maps) {
m.PushAnchor(value[mdb.NAME], web.MergePod(m, kit.Keys(m.Option(ice.POD), value[mdb.NAME])))
})
m.PushAction(mdb.REMOVE)
return
}
m.Cmdy(web.ROUTE, arg)
}},
})
}

View File

@ -1,43 +0,0 @@
package chat
import (
ice "shylinux.com/x/icebergs"
"shylinux.com/x/icebergs/base/aaa"
"shylinux.com/x/icebergs/base/gdb"
"shylinux.com/x/icebergs/base/mdb"
kit "shylinux.com/x/toolkits"
)
const OCEAN = "ocean"
func init() {
Index.MergeCommands(ice.Commands{
OCEAN: {Name: "ocean username auto insert invite", Help: "用户", Actions: ice.Actions{
ice.CTX_INIT: {Hand: func(m *ice.Message, arg ...string) {
gdb.Watch(m, RIVER_CREATE)
}},
RIVER_CREATE: {Name: "river.create river template", Help: "建群", Hand: func(m *ice.Message, arg ...string) {
m.Cmd(OCEAN, mdb.INSERT, aaa.USERNAME, m.Option(ice.MSG_USERNAME))
}},
mdb.INPUTS: {Name: "inputs", Help: "补全", Hand: func(m *ice.Message, arg ...string) {
m.Cmdy(aaa.USER, ice.OptionFields(aaa.USERNAME, aaa.USERNICK, aaa.USERZONE))
}},
mdb.INSERT: {Name: "insert username", Help: "添加", Hand: func(m *ice.Message, arg ...string) {
m.Option(mdb.SHORT, aaa.USERNAME)
m.Cmdy(mdb.INSERT, m.Prefix(RIVER), _river_key(m, OCEAN), mdb.HASH, arg)
}},
mdb.DELETE: {Name: "delete", Help: "删除", Hand: func(m *ice.Message, arg ...string) {
m.Cmdy(mdb.DELETE, m.Prefix(RIVER), _river_key(m, OCEAN), mdb.HASH, m.OptionSimple(aaa.USERNAME))
}},
}, Hand: func(m *ice.Message, arg ...string) {
m.Fields(len(arg), "time,username")
m.Cmdy(mdb.SELECT, RIVER, _river_key(m, OCEAN), mdb.HASH, aaa.USERNAME, arg)
m.Tables(func(value ice.Maps) {
msg := m.Cmd(aaa.USER, value[aaa.USERNAME])
m.Push(aaa.USERNICK, msg.Append(aaa.USERNICK))
m.PushImages(aaa.AVATAR, msg.Append(aaa.AVATAR), kit.Select("60", "240", m.FieldsIsDetail()))
})
m.PushAction(mdb.DELETE)
}},
})
}

View File

@ -3,7 +3,6 @@ package chat
import (
ice "shylinux.com/x/icebergs"
"shylinux.com/x/icebergs/base/aaa"
"shylinux.com/x/icebergs/base/cli"
"shylinux.com/x/icebergs/base/ctx"
"shylinux.com/x/icebergs/base/gdb"
"shylinux.com/x/icebergs/base/mdb"
@ -12,41 +11,24 @@ import (
kit "shylinux.com/x/toolkits"
)
func _river_right(m *ice.Message, hash string) bool {
return m.Option(ice.MSG_USERROLE) == aaa.ROOT || m.Cmdx(aaa.ROLE, aaa.RIGHT, m.Option(ice.MSG_USERROLE), RIVER, hash) == ice.OK
}
func _river_key(m *ice.Message, key ...ice.Any) string {
return kit.Keys(mdb.HASH, m.Option(ice.MSG_RIVER), kit.Simple(key))
}
func _river_list(m *ice.Message) {
if m.Option(web.SHARE) != "" {
switch msg := m.Cmd(web.SHARE, m.Option(web.SHARE)); msg.Append(mdb.TYPE) {
case web.RIVER: // 共享群组
m.Option(ice.MSG_TITLE, msg.Append(mdb.NAME))
m.Option(ice.MSG_RIVER, msg.Append(RIVER))
m.Option(ice.MSG_STORM, msg.Append(STORM))
if m.Conf(RIVER, _river_key(m)) == "" {
break // 虚拟群组
}
if msg.Cmd(OCEAN, m.Option(ice.MSG_USERNAME)).Append(aaa.USERNAME) == "" {
msg.Cmd(OCEAN, mdb.INSERT, aaa.USERNAME, m.Option(ice.MSG_USERNAME)) // 加入群组
}
case web.STORM: // 共享应用
m.Option(ice.MSG_TITLE, msg.Append(mdb.NAME))
m.Option(ice.MSG_STORM, msg.Append(STORM))
m.Option(ice.MSG_RIVER, "_share")
return
case web.FIELD: // 共享命令
m.Option(ice.MSG_TITLE, msg.Append(mdb.NAME))
case web.STORM, web.FIELD: // 共享应用
m.Option(ice.MSG_RIVER, "_share")
return
}
}
m.Cmd(mdb.SELECT, m.PrefixKey(), "", mdb.HASH, ice.OptionFields(mdb.HASH, mdb.NAME), func(value ice.Maps) {
m.Cmd(mdb.SELECT, m.PrefixKey(), kit.Keys(mdb.HASH, value[mdb.HASH], OCEAN), mdb.HASH, aaa.USERNAME, m.Option(ice.MSG_USERNAME), func(val ice.Maps) {
m.Push("", value, []string{mdb.HASH, mdb.NAME}, val)
})
if _river_right(m, value[mdb.HASH]) {
m.PushRecord(value, mdb.HASH, mdb.NAME)
}
})
}
@ -60,66 +42,48 @@ func init() {
RIVER: {Name: "river hash auto create", Help: "群组", Actions: ice.MergeActions(ice.Actions{
ice.CTX_INIT: {Hand: func(m *ice.Message, arg ...string) {
m.Cmd(aaa.ROLE, aaa.WHITE, aaa.VOID, m.CommandKey())
m.Cmd(aaa.ROLE, aaa.BLACK, aaa.VOID, m.CommandKey(), ctx.ACTION)
}},
mdb.INPUTS: {Name: "inputs", Help: "补全", Hand: func(m *ice.Message, arg ...string) {
switch m.Option(ctx.ACTION) {
case cli.START, "创建空间":
m.Cmdy(web.DREAM, mdb.INPUTS, arg)
return
}
switch arg[0] {
case nfs.TEMPLATE:
m.Push(nfs.TEMPLATE, ice.BASE)
case aaa.USERROLE:
m.Push(aaa.USERROLE, aaa.VOID, aaa.TECH, aaa.ROOT)
case aaa.USERNAME:
m.Cmdy(aaa.USER).Cut(aaa.USERNAME, aaa.USERNICK, aaa.USERZONE)
m.Cmdy(TEMPLATE).CutTo(RIVER, arg[0])
default:
mdb.HashInputs(m, arg)
}
}},
mdb.CREATE: {Name: "create type=public,protected,private name=hi text=hello template=base", Help: "添加", Hand: func(m *ice.Message, arg ...string) {
mdb.CREATE: {Name: "create type=void,tech name=hi text=hello template=base", Help: "添加", Hand: func(m *ice.Message, arg ...string) {
h := mdb.HashCreate(m, arg)
defer m.Result(h)
if m.Option(mdb.TYPE) == aaa.VOID {
m.Cmd(aaa.ROLE, aaa.WHITE, aaa.VOID, kit.Keys(RIVER, h))
}
gdb.Event(m, RIVER_CREATE, RIVER, m.Option(ice.MSG_RIVER, h), arg)
m.Result(h)
}},
cli.START: {Name: "start name=hi repos template", Help: "创建空间", Hand: func(m *ice.Message, arg ...string) {
m.Cmdy(web.Space(m, m.Option(ice.POD)), web.DREAM, cli.START, arg)
}},
aaa.INVITE: {Name: "invite", Help: "添加设备", Hand: func(m *ice.Message, arg ...string) {
m.Cmdy("publish", ice.CONTEXTS)
}},
}, mdb.HashAction(mdb.FIELD, "time,hash,type,name,text,template"), web.ApiAction("/river")), Hand: func(m *ice.Message, arg ...string) {
}, mdb.HashAction(mdb.FIELD, "time,hash,type,name,text,template"), web.ApiAction(web.P(RIVER))), Hand: func(m *ice.Message, arg ...string) {
if m.Warn(m.Option(ice.MSG_USERNAME) == "", ice.ErrNotLogin) {
m.RenderStatusUnauthorized()
return // 没有登录
}
if len(arg) == 0 {
m.Option(MENUS, m.Config(MENUS))
_river_list(m)
return // 群组列表
}
if len(arg) == 2 && arg[1] == STORM {
m.Option(ice.MSG_RIVER, arg[0])
m.Cmdy(arg[1], arg[2:])
return // 应用列表
}
if !aaa.Right(m, RIVER, arg) {
m.RenderStatusForbidden()
return // 没有授权
}
if command := m.Commands(kit.Select("", arg, 1)); command != nil {
if len(arg) == 0 {
_river_list(m)
return // 群组列表
}
if len(arg) > 1 && arg[1] == STORM {
m.Option(ice.MSG_RIVER, arg[0])
m.Cmdy(arg[1], arg[2:])
} else if action := m.Actions(kit.Select("", arg, 1)); action != nil {
return // 应用列表
}
if len(arg) > 2 && arg[2] == STORM {
m.Option(ice.MSG_RIVER, arg[0])
m.Cmdy("", arg[1:])
} else {
m.Cmdy(RIVER, arg)
m.Option(ice.MSG_STORM, arg[1])
m.Cmdy(arg[2], arg[3:])
return // 应用操作
}
}},
})

View File

@ -5,12 +5,11 @@ import (
"shylinux.com/x/icebergs/base/aaa"
"shylinux.com/x/icebergs/base/ctx"
"shylinux.com/x/icebergs/base/mdb"
"shylinux.com/x/icebergs/base/web"
kit "shylinux.com/x/toolkits"
)
func _storm_key(m *ice.Message, key ...ice.Any) string {
return _river_key(m, STORM, mdb.HASH, kit.Keys(key))
return _river_key(m, mdb.HASH, m.Option(ice.MSG_STORM), kit.Keys(key))
}
const STORM = "storm"
@ -18,59 +17,34 @@ const STORM = "storm"
func init() {
Index.MergeCommands(ice.Commands{
STORM: {Name: "storm hash id auto insert create", Help: "应用", Actions: ice.Actions{
mdb.INPUTS: {Name: "inputs", Help: "补全", Hand: func(m *ice.Message, arg ...string) {
if ctx.Inputs(m, arg[0]) {
return
}
switch arg[0] {
case mdb.HASH:
m.Cmdy("", ice.OptionFields("hash,name"))
}
}},
mdb.CREATE: {Name: "create type=public,protected,private name=hi text=hello", Help: "创建", Hand: func(m *ice.Message, arg ...string) {
m.Cmdy(mdb.INSERT, RIVER, _river_key(m, STORM), mdb.HASH, arg)
mdb.INPUTS: {Name: "inputs", Help: "补全", Hand: func(m *ice.Message, arg ...string) {}},
mdb.CREATE: {Name: "create name=hi text=hello", Help: "创建", Hand: func(m *ice.Message, arg ...string) {
m.Cmdy(mdb.INSERT, RIVER, _river_key(m), mdb.HASH, arg)
}},
mdb.REMOVE: {Name: "remove", Help: "删除", Hand: func(m *ice.Message, arg ...string) {
m.Cmdy(mdb.DELETE, RIVER, _river_key(m, STORM), mdb.HASH, m.OptionSimple(mdb.HASH))
m.Cmdy(mdb.DELETE, RIVER, _river_key(m), mdb.HASH, mdb.HASH, m.Option(ice.MSG_STORM))
}},
mdb.INSERT: {Name: "insert hash space index", Help: "添加", Hand: func(m *ice.Message, arg ...string) {
m.Cmdy(mdb.INSERT, RIVER, _storm_key(m, m.Option(mdb.HASH)), mdb.LIST, arg[2:])
mdb.INSERT: {Name: "insert hash space index args style display", Help: "添加", Hand: func(m *ice.Message, arg ...string) {
m.Cmdy(mdb.INSERT, RIVER, _storm_key(m), mdb.LIST, arg)
}},
mdb.MODIFY: {Name: "modify", Help: "编辑", Hand: func(m *ice.Message, arg ...string) {
if m.Option(mdb.ID) == "" {
m.Cmdy(mdb.MODIFY, RIVER, _river_key(m, STORM), mdb.HASH, m.OptionSimple(mdb.HASH), arg)
if len(arg) > 0 && arg[0] == mdb.ID {
m.Cmdy(mdb.MODIFY, RIVER, _storm_key(m), mdb.LIST, arg)
} else {
m.Cmdy(mdb.MODIFY, RIVER, _storm_key(m, m.Option(mdb.HASH)), mdb.LIST, m.OptionSimple(mdb.ID), arg)
m.Cmdy(mdb.MODIFY, RIVER, _river_key(m), mdb.HASH, mdb.HASH, m.Option(ice.MSG_STORM), arg)
}
}},
}, Hand: func(m *ice.Message, arg ...string) {
if len(arg) == 0 { // 应用列表
m.OptionFields("time,hash,type,name,count")
m.Cmdy(mdb.SELECT, RIVER, _river_key(m, STORM), mdb.HASH).Sort(mdb.NAME)
m.PushAction(mdb.REMOVE)
return
}
if m.Option(ice.MSG_STORM) == "" { // 应用列表
m.OptionFields("time,hash,name,text,count")
m.Cmdy(mdb.SELECT, RIVER, _river_key(m), mdb.HASH)
} else if len(arg) == 0 || kit.Int(arg[0]) > 0 { // 工具列表
m.OptionFields("time,id,space,index,args,style,display")
msg := m.Cmd(mdb.SELECT, RIVER, _storm_key(m, arg[0]), mdb.LIST, mdb.ID, kit.Select("", arg, 1))
if msg.Length() == 0 && len(arg) > 1 { // 虚拟群组
if aaa.Right(m, arg[1]) {
msg.Push(ctx.INDEX, arg[1])
}
}
m.Cmdy(mdb.SELECT, RIVER, _storm_key(m), mdb.LIST, mdb.ID, arg)
if len(arg) > 2 && arg[2] == ice.RUN { // 执行命令
if !m.Warn(aaa.Right(m, msg.Append(ctx.INDEX))) {
m.Cmdy(web.Space(m, kit.Select(m.Option(ice.POD), msg.Append(web.SPACE))), msg.Append(ctx.INDEX), arg[3:])
}
return
}
if m.Copy(msg); len(arg) > 1 { // 命令插件
m.Tables(func(value ice.Maps) { m.Cmdy(web.Space(m, value[web.SPACE]), ctx.COMMAND, value[ctx.INDEX]) })
if m.Length() > 0 {
m.ProcessField(arg[0], arg[1], ice.RUN)
}
} else if aaa.Right(m, arg[0]) { // 静态群组
m.Push(ctx.INDEX, arg[0])
}
}},
})

View File

@ -18,7 +18,7 @@ func init() {
kit.Fetch(_river_template, func(river string, value ice.Any) {
m.Cmd("", mdb.CREATE, RIVER, river)
kit.Fetch(value, func(storm string, value ice.Any) {
m.Cmd("", mdb.INSERT, RIVER, river, mdb.TYPE, "", STORM, storm, mdb.TEXT, "")
m.Cmd("", mdb.INSERT, RIVER, river, STORM, storm)
kit.Fetch(value, func(index int, value ice.Any) {
m.Cmd("", "add", RIVER, river, STORM, storm, ctx.INDEX, value)
})
@ -27,17 +27,17 @@ func init() {
}
}},
RIVER_CREATE: {Name: "river.create river template", Help: "建群", Hand: func(m *ice.Message, arg ...string) {
m.Cmd("", m.Option(TEMPLATE), func(value ice.Maps) {
h := m.Cmdx(STORM, mdb.CREATE, mdb.TYPE, "", mdb.NAME, value[STORM], mdb.TEXT, "")
m.Cmd("", m.Option(TEMPLATE), value[STORM], func(value ice.Maps) {
m.Cmd(STORM, mdb.INSERT, mdb.HASH, h, kit.SimpleKV("space,index", value))
m.Cmd("", m.Option(TEMPLATE), ice.OptionFields(STORM), func(value ice.Maps) {
m.Option(ice.MSG_STORM, m.Cmdx(STORM, mdb.CREATE, mdb.NAME, value[STORM]))
m.Cmd("", m.Option(TEMPLATE), value[STORM], ice.OptionFields(ctx.INDEX), func(value ice.Maps) {
m.Cmd(STORM, mdb.INSERT, ctx.INDEX, value[ctx.INDEX])
})
})
}},
mdb.CREATE: {Name: "create river", Help: "创建", Hand: func(m *ice.Message, arg ...string) {
m.Cmd(mdb.INSERT, m.PrefixKey(), "", mdb.HASH, m.OptionSimple(RIVER), kit.Dict(mdb.SHORT, RIVER))
}},
mdb.INSERT: {Name: "insert river type storm text", Help: "添加", Hand: func(m *ice.Message, arg ...string) {
mdb.INSERT: {Name: "insert river storm", Help: "添加", Hand: func(m *ice.Message, arg ...string) {
m.Cmd(mdb.INSERT, m.PrefixKey(), kit.KeyHash(m.Option(RIVER)), mdb.HASH, arg[2:], kit.Dict(mdb.SHORT, STORM))
}},
"add": {Name: "add river storm index", Help: "添加", Hand: func(m *ice.Message, arg ...string) {
@ -53,18 +53,13 @@ func init() {
}), Hand: func(m *ice.Message, arg ...string) {
switch len(arg) {
case 0:
m.OptionFields("time,river")
m.Cmdy(mdb.SELECT, m.PrefixKey(), "", mdb.HASH)
m.PushAction(mdb.REMOVE)
m.Action(mdb.CREATE)
m.Cmdy(mdb.SELECT, m.PrefixKey(), "", mdb.HASH, ice.OptionFields("time,river"))
m.PushAction(mdb.REMOVE).Action(mdb.CREATE)
case 1:
m.OptionFields("time,type,storm,text")
m.Cmdy(mdb.SELECT, m.PrefixKey(), kit.KeyHash(arg[0]), mdb.HASH)
m.PushAction(mdb.REMOVE)
m.Action(mdb.INSERT)
m.Cmdy(mdb.SELECT, m.PrefixKey(), kit.KeyHash(arg[0]), mdb.HASH, ice.OptionFields("time,storm"))
m.PushAction(mdb.REMOVE).Action(mdb.INSERT)
case 2:
m.OptionFields("time,index")
m.Cmdy(mdb.SELECT, m.PrefixKey(), kit.KeyHash(arg[0], kit.KeyHash(arg[1])), mdb.LIST)
m.Cmdy(mdb.SELECT, m.PrefixKey(), kit.KeyHash(arg[0], kit.KeyHash(arg[1])), mdb.LIST, ice.OptionFields("time,index"))
m.Action("add")
}
}},
@ -73,10 +68,22 @@ func init() {
var _river_template = kit.Dict(
"base", kit.Dict(
"info", kit.List(
"web.chat.storm",
"web.chat.ocean",
"web.chat.nodes",
"draw", kit.List(
"web.wiki.draw",
"web.wiki.data",
"web.wiki.word",
),
"term", kit.List(
"web.code.xterm",
"web.code.vimer",
"web.chat.iframe",
),
"task", kit.List(
"web.team.task",
"web.team.plan",
"web.mall.asset",
"web.mall.salary",
"web.wiki.word",
),
"scan", kit.List(
"web.chat.scan",
@ -86,21 +93,5 @@ var _river_template = kit.Dict(
"web.chat.meet.miss",
"web.wiki.feel",
),
"task", kit.List(
"web.team.task",
"web.team.plan",
"web.mall.asset",
"web.mall.salary",
"web.wiki.word",
),
"draw", kit.List(
"web.wiki.draw",
"web.wiki.data",
"web.wiki.word",
),
"term", kit.List(
"web.code.xterm",
"web.code.vimer",
),
),
)

View File

@ -12,6 +12,8 @@ import (
kit "shylinux.com/x/toolkits"
)
const TRANS = "trans"
func init() {
const (
SEND = "send"

View File

@ -17,7 +17,7 @@ import (
)
func _website_url(m *ice.Message, file string) string {
return strings.Split(MergeWebsite(m, file), "?")[0]
return strings.Split(web.MergePodWebSite(m, "", file), "?")[0]
}
func _website_parse(m *ice.Message, text string, args ...string) (ice.Map, bool) {
if text == "" {
@ -150,7 +150,7 @@ func _website_render(m *ice.Message, w http.ResponseWriter, r *http.Request, kin
}
func _website_search(m *ice.Message, kind, name, text string, arg ...string) {
m.Cmd(m.PrefixKey(), ice.OptionFields(""), func(value ice.Maps) {
m.PushSearch(value, mdb.TEXT, MergeWebsite(m, value[nfs.PATH]))
m.PushSearch(value, mdb.TEXT, web.MergePodWebSite(m, "", value[nfs.PATH]))
})
}
@ -243,7 +243,7 @@ func init() {
}
}},
}, mdb.HashAction(mdb.SHORT, nfs.PATH, mdb.FIELD, "time,path,type,name,text"), ctx.CmdAction(), web.ApiAction()), Hand: func(m *ice.Message, arg ...string) {
mdb.HashSelect(m, arg...).Tables(func(value ice.Maps) { m.PushAnchor(MergeWebsite(m, value[nfs.PATH])) })
mdb.HashSelect(m, arg...).Tables(func(value ice.Maps) { m.PushAnchor(web.MergePodWebSite(m, "", value[nfs.PATH])) })
if len(arg) == 0 { // 文件列表
m.Cmd(nfs.DIR, SRC_WEBSITE, func(f os.FileInfo, p string) {
m.Push("", kit.Dict(

View File

@ -9,12 +9,11 @@ import (
"shylinux.com/x/icebergs/base/mdb"
"shylinux.com/x/icebergs/base/nfs"
"shylinux.com/x/icebergs/base/web"
"shylinux.com/x/icebergs/core/chat"
kit "shylinux.com/x/toolkits"
)
func _website_url(m *ice.Message, file string) string {
return strings.Split(chat.MergeWebsite(m, file), "?")[0]
return strings.Split(web.MergePodWebSite(m, "", file), "?")[0]
}
const ZML = nfs.ZML

View File

@ -7,7 +7,6 @@ import (
"shylinux.com/x/icebergs/base/ctx"
"shylinux.com/x/icebergs/base/mdb"
"shylinux.com/x/icebergs/base/web"
"shylinux.com/x/icebergs/core/chat"
kit "shylinux.com/x/toolkits"
)
@ -80,7 +79,7 @@ func init() {
}},
mdb.SEARCH: {Name: "search", Help: "搜索", Hand: func(m *ice.Message, arg ...string) {
if arg[0] == mdb.FOREACH && arg[1] == "" {
m.PushSearch(mdb.TYPE, "plan", mdb.NAME, "", mdb.TEXT, chat.MergeCmd(m, ""))
m.PushSearch(mdb.TYPE, "plan", mdb.NAME, "", mdb.TEXT, web.MergePodCmd(m, "", ""))
}
}},
ice.RUN: {Name: "run", Help: "执行", Hand: func(m *ice.Message, arg ...string) {

View File

@ -10,7 +10,7 @@ import (
"shylinux.com/x/icebergs/base/lex"
"shylinux.com/x/icebergs/base/mdb"
"shylinux.com/x/icebergs/base/nfs"
"shylinux.com/x/icebergs/core/chat"
"shylinux.com/x/icebergs/base/web"
kit "shylinux.com/x/toolkits"
)
@ -47,9 +47,13 @@ func init() {
m.Cmd(aaa.ROLE, aaa.WHITE, aaa.VOID, ice.SRC_MAIN_SHY)
}},
mdb.SEARCH: {Name: "search", Help: "搜索", Hand: func(m *ice.Message, arg ...string) {
if arg[0] == mdb.FOREACH && arg[1] == "" {
m.PushSearch(mdb.TYPE, nfs.SHY, mdb.NAME, ice.SRC_MAIN_SHY, mdb.TEXT, chat.MergeCmd(m, ""))
if (arg[0] != mdb.FOREACH && arg[0] != m.CommandKey()) || arg[1] == "" {
return
}
if arg[1] == "" {
m.PushSearch(mdb.TYPE, nfs.SHY, mdb.NAME, ice.SRC_MAIN_SHY, mdb.TEXT, web.MergePodCmd(m, "", ""))
}
m.Cmd(mdb.SELECT, m.PrefixKey(), "", mdb.HASH, func(value ice.Maps) {
if arg[1] == "" {
if value[mdb.TYPE] == SPARK {

View File

@ -102,6 +102,9 @@ func (m *Message) Cut(fields ...string) *Message {
m.meta[MSG_APPEND] = kit.Split(kit.Join(fields))
return m
}
func (m *Message) CutTo(key, to string) *Message {
return m.Cut(key).RenameAppend(key, to)
}
func (m *Message) Push(key string, value Any, arg ...Any) *Message {
head := kit.Simple()
if len(head) == 0 && len(arg) > 0 {

View File

@ -14,7 +14,6 @@ import (
"shylinux.com/x/icebergs/base/web"
"shylinux.com/x/icebergs/core/code"
kit "shylinux.com/x/toolkits"
"shylinux.com/x/toolkits/task"
)
func _status_tag(m *ice.Message, tags string) string {
@ -127,14 +126,13 @@ func _status_stat(m *ice.Message, files, adds, dels int) (int, int, int) {
}
func _status_list(m *ice.Message) (files, adds, dels int, last time.Time) {
defer m.Sort("repos,type")
m.Cmd(REPOS, ice.OptionFields("name,path")).TableGo(func(value ice.Maps, lock *task.Lock) {
m.Cmd(REPOS, ice.OptionFields("name,path")).Tables(func(value ice.Maps) {
msg := m.Spawn(kit.Dict(cli.CMD_DIR, value[nfs.PATH]))
diff := _git_cmds(msg, STATUS, "-sb")
tags := _git_cmds(msg, "describe", "--tags")
_files, _adds, _dels := _status_stat(msg, 0, 0, 0)
now, _ := time.Parse("2006-01-02 15:04:05 -0700", strings.TrimSpace(_git_cmds(msg, "log", `--pretty=%cd`, "--date=iso", "-n1")))
defer lock.Lock()()
if files, adds, dels = files+_files, adds+_adds, dels+_dels; now.After(last) {
last = now
}

View File

@ -20,6 +20,12 @@ func (m *Message) OptionFields(arg ...string) string {
}
return kit.Join(kit.Simple(m.Optionv(MSG_FIELDS)))
}
func (m *Message) OptionFromConfig(arg ...string) string {
for _, key := range arg {
m.Option(key, m.Config(key))
}
return m.Option(arg[0])
}
func (m *Message) OptionDefault(arg ...string) string {
for i := 0; i < len(arg); i += 2 {
if m.Option(arg[i]) == "" {

View File

@ -105,6 +105,14 @@ func (m *Message) PushAction(list ...Any) *Message {
}
func (m *Message) PushSearch(args ...Any) {
data := kit.Dict(args...)
for i := 0; i < len(args); i += 2 {
switch k := args[i].(type) {
case string:
if i+1 < len(args) {
data[k] = args[i+1]
}
}
}
for _, k := range kit.Split(m.OptionFields()) {
switch k {
case POD:

17
type.go
View File

@ -321,6 +321,23 @@ type Message struct {
I io.Reader
}
// func (m *Message) getMeta(key string) []string {
// defer m.lock.RLock()()
// return m.meta[key]
// }
// func (m *Message) setMeta(key string, value []string) {
// defer m.lock.Lock()()
// if value == nil {
// delete(m.meta, key)
// } else {
// m.meta[key] = value
// }
// }
// func (m *Message) getData(key string) Any {
// defer m.lock.RLock()()
// return m._data[key]
// }
//
func (m *Message) Time(args ...Any) string { // [duration] [format [args...]]
t := m.time
if len(args) > 0 {