forked from x/icebergs
opt chat
This commit is contained in:
parent
3efdc8b7dc
commit
3208f8bf8a
@ -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))
|
||||
}},
|
||||
|
@ -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(
|
||||
|
@ -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")
|
||||
}
|
||||
|
@ -38,31 +38,35 @@ 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
|
||||
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 {
|
||||
continue
|
||||
}
|
||||
for _, file := range []string{m.Conf(SHOW, kit.Keys(l.l, FILE)), BENCH} {
|
||||
if file == "" {
|
||||
continue
|
||||
}
|
||||
|
||||
bio.WriteString(l.p)
|
||||
bio.WriteString(ice.SP)
|
||||
if ice.Info.Colors == true {
|
||||
if p, ok := view[PREFIX].(string); ok {
|
||||
bio.WriteString(p)
|
||||
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 {
|
||||
continue
|
||||
}
|
||||
}
|
||||
bio.WriteString(l.l)
|
||||
bio.WriteString(ice.SP)
|
||||
bio.WriteString(l.s)
|
||||
if ice.Info.Colors == true {
|
||||
if p, ok := view[SUFFIX].(string); ok {
|
||||
bio.WriteString(p)
|
||||
|
||||
bio.WriteString(l.p)
|
||||
bio.WriteString(ice.SP)
|
||||
if ice.Info.Colors == true {
|
||||
if p, ok := view[PREFIX].(string); ok {
|
||||
bio.WriteString(p)
|
||||
}
|
||||
}
|
||||
bio.WriteString(l.l)
|
||||
bio.WriteString(ice.SP)
|
||||
bio.WriteString(l.s)
|
||||
if ice.Info.Colors == true {
|
||||
if p, ok := view[SUFFIX].(string); ok {
|
||||
bio.WriteString(p)
|
||||
}
|
||||
}
|
||||
bio.WriteString(ice.NL)
|
||||
bio.Flush()
|
||||
}
|
||||
bio.WriteString(ice.NL)
|
||||
bio.Flush()
|
||||
}
|
||||
}
|
||||
return true
|
||||
|
@ -158,8 +158,12 @@ func _hash_import(m *ice.Message, prefix, chain, file string) {
|
||||
count++
|
||||
}
|
||||
} else {
|
||||
for _, data := range list {
|
||||
Rich(m, prefix, chain, data)
|
||||
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 {
|
||||
m.Fields(len(kit.Slice(arg, 0, 1)), HashField(m))
|
||||
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()
|
||||
|
@ -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 ""
|
||||
}
|
||||
|
||||
|
@ -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) {
|
||||
|
@ -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) {
|
||||
|
@ -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 //命令列表
|
||||
}
|
||||
|
@ -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...)
|
||||
}
|
||||
|
@ -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
|
||||
|
||||
|
@ -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))
|
||||
}},
|
||||
})
|
||||
|
@ -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))
|
||||
}},
|
||||
})
|
||||
|
@ -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)
|
||||
}},
|
||||
})
|
||||
}
|
@ -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)
|
||||
}},
|
||||
})
|
||||
}
|
@ -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 // 应用操作
|
||||
}
|
||||
}},
|
||||
})
|
||||
|
@ -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)
|
||||
|
||||
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])
|
||||
}
|
||||
}
|
||||
} else if len(arg) == 0 || kit.Int(arg[0]) > 0 { // 工具列表
|
||||
m.OptionFields("time,id,space,index,args,style,display")
|
||||
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])
|
||||
}
|
||||
}},
|
||||
})
|
||||
|
@ -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",
|
||||
),
|
||||
),
|
||||
)
|
||||
|
@ -12,6 +12,8 @@ import (
|
||||
kit "shylinux.com/x/toolkits"
|
||||
)
|
||||
|
||||
const TRANS = "trans"
|
||||
|
||||
func init() {
|
||||
const (
|
||||
SEND = "send"
|
||||
|
@ -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(
|
||||
|
@ -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
|
||||
|
@ -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) {
|
||||
|
@ -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 {
|
||||
|
3
meta.go
3
meta.go
@ -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 {
|
||||
|
@ -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
|
||||
}
|
||||
|
@ -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]) == "" {
|
||||
|
@ -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
17
type.go
@ -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 {
|
||||
|
Loading…
x
Reference in New Issue
Block a user