1
0
mirror of https://shylinux.com/x/icebergs synced 2025-05-01 03:09:21 +08:00
This commit is contained in:
harveyshao 2021-10-28 18:49:35 +08:00
parent ba1e1e1374
commit 931e61fd88
52 changed files with 752 additions and 722 deletions

View File

@ -60,7 +60,7 @@ func _role_right(m *ice.Message, userrole string, keys ...string) (ok bool) {
} }
} }
if m.Warn(!ok, ice.ErrNotRight, userrole, ice.OF, keys) { if m.Warn(!ok, ice.ErrNotRight, keys, USERROLE, userrole) {
return return
} }
if userrole == TECH { if userrole == TECH {
@ -75,7 +75,7 @@ func _role_right(m *ice.Message, userrole string, keys ...string) (ok bool) {
} }
} }
if m.Warn(!ok, ice.ErrNotRight, userrole, ice.OF, keys) { if m.Warn(!ok, ice.ErrNotRight, keys, USERROLE, userrole) {
return return
} }
// 普通用户 // 普通用户

View File

@ -21,7 +21,7 @@ func _daemon_exec(m *ice.Message, cmd *exec.Cmd) {
} }
// 启动进程 // 启动进程
if e := cmd.Start(); m.Warn(e != nil, cmd.Args, ice.SP, e) { if e := cmd.Start(); m.Warn(e, ice.ErrNotStart, cmd.Args) {
return // 启动失败 return // 启动失败
} }
m.Echo("%d", cmd.Process.Pid) m.Echo("%d", cmd.Process.Pid)
@ -33,7 +33,7 @@ func _daemon_exec(m *ice.Message, cmd *exec.Cmd) {
m.OptionSimple(CMD_OUTPUT, CMD_ERRPUT, mdb.CACHE_CLEAR_ON_EXIT), m.OptionSimple(CMD_OUTPUT, CMD_ERRPUT, mdb.CACHE_CLEAR_ON_EXIT),
) )
if e := cmd.Wait(); m.Warn(e != nil, cmd.Args, ice.SP, e) { if e := cmd.Wait(); m.Warn(e, ice.ErrNotStart, cmd.Args) {
if m.Conf(DAEMON, kit.Keys(kit.MDB_HASH, h, kit.Keym(kit.MDB_STATUS))) == START { if m.Conf(DAEMON, kit.Keys(kit.MDB_HASH, h, kit.Keym(kit.MDB_STATUS))) == START {
m.Cmd(mdb.MODIFY, DAEMON, "", mdb.HASH, kit.MDB_HASH, h, kit.MDB_STATUS, ERROR, ERROR, e) m.Cmd(mdb.MODIFY, DAEMON, "", mdb.HASH, kit.MDB_HASH, h, kit.MDB_STATUS, ERROR, ERROR, e)
} }

View File

@ -68,7 +68,7 @@ func _system_exec(m *ice.Message, cmd *exec.Cmd) {
} }
// 执行命令 // 执行命令
if e := cmd.Run(); !m.Warn(e != nil, cmd.Args, ice.SP, e) { if e := cmd.Run(); !m.Warn(e, ice.ErrNotFound, cmd.Args) {
m.Cost(kit.MDB_CODE, cmd.ProcessState.ExitCode(), kit.MDB_ARGS, cmd.Args) m.Cost(kit.MDB_CODE, cmd.ProcessState.ExitCode(), kit.MDB_ARGS, cmd.Args)
} }

View File

@ -56,7 +56,7 @@ func CmdAction(fields ...string) map[string]*ice.Action {
} }
}}, }},
ice.RUN: {Name: "run", Help: "执行", Hand: func(m *ice.Message, arg ...string) { ice.RUN: {Name: "run", Help: "执行", Hand: func(m *ice.Message, arg ...string) {
if !m.PodCmd(arg) { if m.Right(arg) && !m.PodCmd(arg) {
m.Cmdy(arg) m.Cmdy(arg)
} }
}}, }},
@ -80,7 +80,9 @@ func init() {
} }
}}, }},
}, Hand: func(m *ice.Message, c *ice.Context, cmd string, arg ...string) { }, Hand: func(m *ice.Message, c *ice.Context, cmd string, arg ...string) {
_command_list(m, kit.Keys(arg)) for _, key := range arg {
_command_list(m, key)
}
}}, }},
}}) }})
} }

View File

@ -8,4 +8,4 @@ const LEX = "lex"
var Index = &ice.Context{Name: LEX, Help: "词法模块"} var Index = &ice.Context{Name: LEX, Help: "词法模块"}
func init() { ice.Index.Register(Index, nil) } func init() { ice.Index.Register(Index, nil, SPLIT) }

View File

@ -36,12 +36,12 @@ func _cat_right(m *ice.Message, name string) bool {
case ice.USR: case ice.USR:
switch kit.Select("", ls, 1) { switch kit.Select("", ls, 1) {
case "local": case "local":
if m.Warn(m.Option(ice.MSG_USERROLE) == aaa.VOID, ice.ErrNotRight, ice.OF, name) { if m.Warn(m.Option(ice.MSG_USERROLE) == aaa.VOID, ice.ErrNotRight, name) {
return false return false
} }
} }
case ice.ETC, ice.VAR: case ice.ETC, ice.VAR:
if m.Warn(m.Option(ice.MSG_USERROLE) == aaa.VOID, ice.ErrNotRight, ice.OF, name) { if m.Warn(m.Option(ice.MSG_USERROLE) == aaa.VOID, ice.ErrNotRight, name) {
return false return false
} }
} }
@ -99,7 +99,7 @@ func _cat_list(m *ice.Message, name string) {
default: default:
buf := make([]byte, ice.MOD_BUFS) buf := make([]byte, ice.MOD_BUFS)
for begin := 0; true; { for begin := 0; true; {
if n, e := f.Read(buf[begin:]); !m.Warn(e != nil && e != io.EOF, e) { if n, e := f.Read(buf[begin:]); !m.Warn(e, ice.ErrNotFound, name) {
m.Log_IMPORT(kit.MDB_FILE, name, kit.MDB_SIZE, n) m.Log_IMPORT(kit.MDB_FILE, name, kit.MDB_SIZE, n)
if begin += n; begin < len(buf) { if begin += n; begin < len(buf) {
buf = buf[:begin] buf = buf[:begin]

View File

@ -206,6 +206,7 @@ func init() {
m.Cmdy(TRASH, m.Option(kit.MDB_PATH)) m.Cmdy(TRASH, m.Option(kit.MDB_PATH))
}}, }},
}, 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.Info("dir_root: %v", m.Option(DIR_ROOT))
_dir_list(m, kit.Select("./", m.Option(DIR_ROOT)), kit.Select("", arg, 0), _dir_list(m, kit.Select("./", m.Option(DIR_ROOT)), kit.Select("", arg, 0),
0, m.Option(DIR_DEEP) == ice.TRUE, kit.Select(TYPE_BOTH, m.Option(DIR_TYPE)), kit.Regexp(m.Option(DIR_REG)), 0, m.Option(DIR_DEEP) == ice.TRUE, kit.Select(TYPE_BOTH, m.Option(DIR_TYPE)), kit.Regexp(m.Option(DIR_REG)),
kit.Split(kit.Select(kit.Select("time,path,size,action", m.OptionFields()), kit.Join(kit.Slice(arg, 1))))) kit.Split(kit.Select(kit.Select("time,path,size,action", m.OptionFields()), kit.Join(kit.Slice(arg, 1)))))

View File

@ -49,10 +49,10 @@ func _copy_file(m *ice.Message, name string, from ...string) {
defer f.Close() defer f.Close()
for _, v := range from { for _, v := range from {
if s, e := os.Open(v); !m.Warn(e != nil, e) { if s, e := os.Open(v); !m.Warn(e, ice.ErrNotFound, name) {
defer s.Close() defer s.Close()
if n, e := io.Copy(f, s); !m.Warn(e != nil, e) { if n, e := io.Copy(f, s); !m.Warn(e, ice.ErrNotFound, name) {
m.Log_IMPORT(kit.MDB_FILE, v, kit.MDB_SIZE, n) m.Log_IMPORT(kit.MDB_FILE, v, kit.MDB_SIZE, n)
m.Log_EXPORT(kit.MDB_FILE, p, kit.MDB_SIZE, n) m.Log_EXPORT(kit.MDB_FILE, p, kit.MDB_SIZE, n)
} }
@ -67,7 +67,7 @@ func _link_file(m *ice.Message, name string, from string) {
} }
os.Remove(name) os.Remove(name)
os.MkdirAll(path.Dir(name), ice.MOD_DIR) os.MkdirAll(path.Dir(name), ice.MOD_DIR)
m.Warn(os.Link(from, name) != nil, "link err of", from) m.Warn(os.Link(from, name), ice.ErrNotFound, from)
m.Echo(name) m.Echo(name)
} }
@ -95,7 +95,11 @@ func init() {
_push_file(m, arg[0], arg[1:]...) _push_file(m, arg[0], arg[1:]...)
}}, }},
COPY: {Name: "copy file from...", Help: "复制", Hand: func(m *ice.Message, c *ice.Context, cmd string, arg ...string) { COPY: {Name: "copy file from...", Help: "复制", Hand: func(m *ice.Message, c *ice.Context, cmd string, arg ...string) {
for _, file := range arg[1:] {
if _, e := os.Stat(file); e == nil {
_copy_file(m, arg[0], arg[1:]...) _copy_file(m, arg[0], arg[1:]...)
}
}
}}, }},
LINK: {Name: "link file from", Help: "链接", Hand: func(m *ice.Message, c *ice.Context, cmd string, arg ...string) { LINK: {Name: "link file from", Help: "链接", Hand: func(m *ice.Message, c *ice.Context, cmd string, arg ...string) {
_link_file(m, arg[0], arg[1]) _link_file(m, arg[0], arg[1])

View File

@ -163,9 +163,12 @@ func (f *Frame) scan(m *ice.Message, h, line string) *Frame {
ps = f.ps2 ps = f.ps2
continue // 多行 continue // 多行
} }
if line = kit.Split(line, "#", "#", "#")[0]; len(line) == 0 { if strings.HasPrefix(strings.TrimSpace(line), "#") {
continue // 注释 continue
} }
// if line = strings.Split(line, " # ")[0]; len(line) == 0 {
// continue // 注释
// }
if ps = f.ps1; f.stdout == os.Stdout { if ps = f.ps1; f.stdout == os.Stdout {
f.printf(m, "\033[0m") // 清空格式 f.printf(m, "\033[0m") // 清空格式
} }

View File

@ -62,7 +62,7 @@ func Render(msg *ice.Message, cmd string, args ...interface{}) {
msg.Echo(kit.Format(cmd, args...)) msg.Echo(kit.Format(cmd, args...))
} }
msg.W.Header().Set(ContentType, ContentJSON) msg.W.Header().Set(ContentType, ContentJSON)
fmt.Fprint(msg.W, msg.FormatMeta()) fmt.Fprint(msg.W, msg.FormatsMeta())
} }
} }
func RenderHeader(msg *ice.Message, key, value string) { func RenderHeader(msg *ice.Message, key, value string) {

View File

@ -99,7 +99,6 @@ func _serve_params(msg *ice.Message, path string) {
} }
func _serve_handle(key string, cmd *ice.Command, msg *ice.Message, w http.ResponseWriter, r *http.Request) { func _serve_handle(key string, cmd *ice.Command, msg *ice.Message, w http.ResponseWriter, r *http.Request) {
// 环境变量 // 环境变量
msg.Option(ice.CACHE_LIMIT, "10")
msg.Option(ice.MSG_OUTPUT, "") msg.Option(ice.MSG_OUTPUT, "")
msg.Option(ice.MSG_SESSID, "") msg.Option(ice.MSG_SESSID, "")
for _, v := range r.Cookies() { for _, v := range r.Cookies() {
@ -130,7 +129,7 @@ func _serve_handle(key string, cmd *ice.Command, msg *ice.Message, w http.Respon
switch r.Header.Get(ContentType) { switch r.Header.Get(ContentType) {
case ContentJSON: case ContentJSON:
var data interface{} var data interface{}
if e := json.NewDecoder(r.Body).Decode(&data); !msg.Warn(e != nil, e) { if e := json.NewDecoder(r.Body).Decode(&data); !msg.Warn(e, ice.ErrNotFound, data) {
msg.Log_IMPORT(kit.MDB_VALUE, kit.Format(data)) msg.Log_IMPORT(kit.MDB_VALUE, kit.Format(data))
msg.Optionv(ice.MSG_USERDATA, data) msg.Optionv(ice.MSG_USERDATA, data)
} }
@ -170,7 +169,7 @@ func _serve_handle(key string, cmd *ice.Command, msg *ice.Message, w http.Respon
} }
// 执行命令 // 执行命令
if cmds, ok := _serve_login(msg, kit.Simple(msg.Optionv(ice.MSG_CMDS)), w, r); ok { if cmds, ok := _serve_login(msg, key, kit.Simple(msg.Optionv(ice.MSG_CMDS)), w, r); ok {
msg.Option(ice.MSG_OPTS, msg.Optionv(ice.MSG_OPTION)) msg.Option(ice.MSG_OPTS, msg.Optionv(ice.MSG_OPTION))
msg.Target().Cmd(msg, key, cmds...) msg.Target().Cmd(msg, key, cmds...)
msg.Cost(kit.Format("%s %v %v", r.URL.Path, cmds, msg.FormatSize())) msg.Cost(kit.Format("%s %v %v", r.URL.Path, cmds, msg.FormatSize()))
@ -180,7 +179,7 @@ func _serve_handle(key string, cmd *ice.Command, msg *ice.Message, w http.Respon
_args, _ := msg.Optionv(ice.MSG_ARGS).([]interface{}) _args, _ := msg.Optionv(ice.MSG_ARGS).([]interface{})
Render(msg, msg.Option(ice.MSG_OUTPUT), _args...) Render(msg, msg.Option(ice.MSG_OUTPUT), _args...)
} }
func _serve_login(msg *ice.Message, cmds []string, w http.ResponseWriter, r *http.Request) ([]string, bool) { func _serve_login(msg *ice.Message, key string, cmds []string, w http.ResponseWriter, r *http.Request) ([]string, bool) {
msg.Option(ice.MSG_USERROLE, aaa.VOID) msg.Option(ice.MSG_USERROLE, aaa.VOID)
msg.Option(ice.MSG_USERNAME, "") msg.Option(ice.MSG_USERNAME, "")
@ -196,7 +195,7 @@ func _serve_login(msg *ice.Message, cmds []string, w http.ResponseWriter, r *htt
if _, ok := msg.Target().Commands[WEB_LOGIN]; ok { if _, ok := msg.Target().Commands[WEB_LOGIN]; ok {
// 权限检查 // 权限检查
msg.Target().Cmd(msg, WEB_LOGIN, cmds...) msg.Target().Cmd(msg, WEB_LOGIN, kit.Simple(key, cmds)...)
return cmds, msg.Result(0) != ice.ErrWarn && msg.Result(0) != ice.FALSE return cmds, msg.Result(0) != ice.ErrWarn && msg.Result(0) != ice.FALSE
} }
@ -219,7 +218,7 @@ func _serve_login(msg *ice.Message, cmds []string, w http.ResponseWriter, r *htt
msg.Render(STATUS, http.StatusUnauthorized, ice.ErrNotLogin) msg.Render(STATUS, http.StatusUnauthorized, ice.ErrNotLogin)
return cmds, false // 未登录 return cmds, false // 未登录
} }
if msg.Warn(!msg.Right(r.URL.Path)) { if !msg.Right(r.URL.Path) {
msg.Render(STATUS, http.StatusForbidden, ice.ErrNotRight) msg.Render(STATUS, http.StatusForbidden, ice.ErrNotRight)
return cmds, false // 未授权 return cmds, false // 未授权
} }

View File

@ -123,7 +123,7 @@ func init() {
SHARE: {Name: "share hash auto prunes", Help: "共享链", Action: ice.MergeAction(map[string]*ice.Action{ SHARE: {Name: "share hash auto prunes", Help: "共享链", Action: ice.MergeAction(map[string]*ice.Action{
mdb.CREATE: {Name: "create type name text", Help: "创建", Hand: func(m *ice.Message, arg ...string) { mdb.CREATE: {Name: "create type name text", Help: "创建", Hand: func(m *ice.Message, arg ...string) {
m.Cmdy(mdb.INSERT, m.PrefixKey(), "", mdb.HASH, kit.MDB_TIME, m.Time(m.Config(kit.MDB_EXPIRE)), m.Cmdy(mdb.INSERT, m.PrefixKey(), "", mdb.HASH, kit.MDB_TIME, m.Time(m.Config(kit.MDB_EXPIRE)),
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), aaa.USERNICK, m.Option(ice.MSG_USERNICK),
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)
m.Option(kit.MDB_LINK, _share_link(m, "/share/"+m.Result())) m.Option(kit.MDB_LINK, _share_link(m, "/share/"+m.Result()))
}}, }},

View File

@ -50,11 +50,11 @@ func _space_dial(m *ice.Message, dev, name string, arg ...string) {
for i := 0; i >= 0 && i < kit.Int(redial["c"]); i++ { for i := 0; i >= 0 && i < kit.Int(redial["c"]); i++ {
msg := m.Spawn() msg := m.Spawn()
msg.Option(kit.Keycb(tcp.DIAL), func(s net.Conn, e error) { msg.Option(kit.Keycb(tcp.DIAL), func(s net.Conn, e error) {
if msg.Warn(e != nil, e) { if msg.Warn(e) {
return return
} }
if s, _, e := websocket.NewClient(s, u, nil, kit.Int(redial["r"]), kit.Int(redial["w"])); !msg.Warn(e != nil, e) { if s, _, e := websocket.NewClient(s, u, nil, kit.Int(redial["r"]), kit.Int(redial["w"])); !msg.Warn(e) {
msg.Rich(SPACE, nil, kit.Dict(SOCKET, s, kit.MDB_TYPE, MASTER, kit.MDB_NAME, dev, kit.MDB_TEXT, host)) msg.Rich(SPACE, nil, kit.Dict(SOCKET, s, kit.MDB_TYPE, MASTER, kit.MDB_NAME, dev, kit.MDB_TEXT, host))
msg.Log_CREATE(SPACE, dev, "retry", i, "uri", uri) msg.Log_CREATE(SPACE, dev, "retry", i, "uri", uri)
@ -69,7 +69,7 @@ func _space_dial(m *ice.Message, dev, name string, arg ...string) {
// 断线重连 // 断线重连
sleep := time.Duration(rand.Intn(kit.Int(redial["a"])*i+2)+kit.Int(redial["b"])) * time.Millisecond sleep := time.Duration(rand.Intn(kit.Int(redial["a"])*i+2)+kit.Int(redial["b"])) * time.Millisecond
msg.Cost("order", i, "sleep", sleep, "reconnect", u) msg.Cost("order", i, "sleep", sleep, "reconnect", dev)
time.Sleep(sleep) time.Sleep(sleep)
} }
}) })
@ -77,7 +77,7 @@ func _space_dial(m *ice.Message, dev, name string, arg ...string) {
} }
func _space_handle(m *ice.Message, safe bool, send map[string]*ice.Message, c *websocket.Conn, name string) bool { func _space_handle(m *ice.Message, safe bool, send map[string]*ice.Message, c *websocket.Conn, name string) bool {
for running := true; running; { for running := true; running; {
if _, b, e := c.ReadMessage(); m.Warn(e != nil, e) { if _, b, e := c.ReadMessage(); m.Warn(e, "space", name) {
break break
} else { } else {
socket, msg := c, m.Spawn(b) socket, msg := c, m.Spawn(b)
@ -101,21 +101,21 @@ func _space_handle(m *ice.Message, safe bool, send map[string]*ice.Message, c *w
return // 转发报文 return // 转发报文
} }
if msg.Warn(msg.Option(ice.MSG_HANDLE) == ice.TRUE, ice.ErrNotFound) { if msg.Warn(msg.Option(ice.MSG_HANDLE) == ice.TRUE, ice.ErrNotFound, "already handled") {
// 回复失败 // 回复失败
} else { // 下发失败 } else { // 下发失败
msg.Warn(true, ice.ErrNotFound) msg.Warn(true, ice.ErrNotFound, target)
source, target = []string{}, kit.Revert(source)[1:] source, target = []string{}, kit.Revert(source)[1:]
} }
}) != nil { // 转发成功 }) != nil { // 转发成功
} else if res, ok := send[msg.Option(ice.MSG_TARGET)]; len(target) != 1 || !ok { } else if res, ok := send[msg.Option(ice.MSG_TARGET)]; len(target) != 1 || !ok {
if msg.Warn(msg.Option(ice.MSG_HANDLE) == ice.TRUE, ice.ErrNotFound) { if msg.Warn(msg.Option(ice.MSG_HANDLE) == ice.TRUE, ice.ErrNotFound, target) {
// 回复失败 // 回复失败
} else { // 下发失败 } else { // 下发失败
msg.Warn(true, ice.ErrNotFound) msg.Warn(true, ice.ErrNotFound, target)
source, target = []string{}, kit.Revert(source)[1:] source, target = []string{}, kit.Revert(source)[1:]
} }
@ -128,7 +128,7 @@ func _space_handle(m *ice.Message, safe bool, send map[string]*ice.Message, c *w
return false return false
} }
func _space_exec(msg *ice.Message, source, target []string, c *websocket.Conn, name string) { func _space_exec(msg *ice.Message, source, target []string, c *websocket.Conn, name string) {
if !msg.Warn(!msg.Right(msg.Detailv()), ice.ErrNotRight) { if msg.Right(msg.Detailv()) {
msg = msg.Cmd() msg = msg.Cmd()
} }
@ -272,6 +272,7 @@ func init() {
// 添加节点 // 添加节点
args := append([]string{kit.MDB_TYPE, kind, kit.MDB_NAME, name}, m.OptionSimple(SHARE, RIVER)...) args := append([]string{kit.MDB_TYPE, kind, kit.MDB_NAME, name}, m.OptionSimple(SHARE, RIVER)...)
h := m.Rich(SPACE, nil, kit.Dict(SOCKET, s, kit.MDB_TEXT, s.RemoteAddr().String(), args)) h := m.Rich(SPACE, nil, kit.Dict(SOCKET, s, kit.MDB_TEXT, s.RemoteAddr().String(), args))
m.Log_CREATE(SPACE, name, "type", kind)
m.Go(func() { m.Go(func() {
defer m.Confv(SPACE, kit.Keys(kit.MDB_HASH, h), "") defer m.Confv(SPACE, kit.Keys(kit.MDB_HASH, h), "")

View File

@ -76,7 +76,7 @@ func _spide_list(m *ice.Message, arg ...string) {
// 构造请求 // 构造请求
req, e := http.NewRequest(method, kit.MergeURL2(kit.Format(client["url"]), uri, arg), body) req, e := http.NewRequest(method, kit.MergeURL2(kit.Format(client["url"]), uri, arg), body)
if m.Warn(e != nil, ice.ErrNotFound, e) { if m.Warn(e, ice.ErrNotFound, uri) {
return return
} }
@ -85,7 +85,7 @@ func _spide_list(m *ice.Message, arg ...string) {
// 发送请求 // 发送请求
res, e := _spide_send(m, req, kit.Format(client[kit.MDB_TIMEOUT])) res, e := _spide_send(m, req, kit.Format(client[kit.MDB_TIMEOUT]))
if m.Warn(e != nil, ice.ErrNotFound, e) { if m.Warn(e, ice.ErrNotFound, uri) {
return return
} }
@ -106,13 +106,13 @@ func _spide_list(m *ice.Message, arg ...string) {
} }
// 错误信息 // 错误信息
if m.Warn(res.StatusCode != http.StatusOK, res.Status) { if m.Warn(res.StatusCode != http.StatusOK, ice.ErrNotFound, uri, "status", res.Status) {
switch m.Set(ice.MSG_RESULT); res.StatusCode { switch m.Set(ice.MSG_RESULT); res.StatusCode {
case http.StatusNotFound: case http.StatusNotFound:
m.Warn(true, ice.ErrNotFound, ice.OF, uri) m.Warn(true, ice.ErrNotFound, uri)
return return
case http.StatusUnauthorized: case http.StatusUnauthorized:
m.Warn(true, ice.ErrNotRight, ice.OF, uri) m.Warn(true, ice.ErrNotRight, uri)
return return
} }
} }

View File

@ -80,7 +80,7 @@ func (web *Frame) Start(m *ice.Message, arg ...string) bool {
defer m.Cmd(mdb.MODIFY, SERVE, "", mdb.HASH, kit.MDB_NAME, m.Option(kit.MDB_NAME), kit.MDB_STATUS, tcp.STOP) defer m.Cmd(mdb.MODIFY, SERVE, "", mdb.HASH, kit.MDB_NAME, m.Option(kit.MDB_NAME), kit.MDB_STATUS, tcp.STOP)
// 启动服务 // 启动服务
m.Warn(true, SERVE, ": ", web.Server.Serve(l)) m.Warn(web.Server.Serve(l))
}) })
m.Cmd(tcp.SERVER, tcp.LISTEN, kit.MDB_TYPE, WEB, kit.MDB_NAME, m.Option(kit.MDB_NAME), m.Cmd(tcp.SERVER, tcp.LISTEN, kit.MDB_TYPE, WEB, kit.MDB_NAME, m.Option(kit.MDB_NAME),

View File

@ -22,6 +22,10 @@ const (
SAVE = "save" SAVE = "save"
EXIT = "exit" EXIT = "exit"
BASE = "base"
CORE = "core"
MISC = "misc"
SHY = "shy" SHY = "shy"
DEV = "dev" DEV = "dev"
OPS = "ops" OPS = "ops"
@ -107,6 +111,8 @@ const ( // DIR
ETC_PATH = "etc/path" ETC_PATH = "etc/path"
SRC_HELP = "src/help" SRC_HELP = "src/help"
SRC_DEBUG = "src/debug"
SRC_RELEASE = "src/release"
SRC_MAIN_GO = "src/main.go" SRC_MAIN_GO = "src/main.go"
SRC_MAIN_SHY = "src/main.shy" SRC_MAIN_SHY = "src/main.shy"
SRC_VERSION_GO = "src/version.go" SRC_VERSION_GO = "src/version.go"
@ -204,9 +210,11 @@ const ( // Err
ErrWarn = "warn: " ErrWarn = "warn: "
ErrExists = "exists: " ErrExists = "exists: "
ErrExpire = "expire: " ErrExpire = "expire: "
ErrTimeout = "timeout: "
ErrNotLogin = "not login: " ErrNotLogin = "not login: "
ErrNotFound = "not found: " ErrNotFound = "not found: "
ErrNotRight = "not right: " ErrNotRight = "not right: "
ErrNotStart = "not start: "
ErrNotImplement = "not implement: " ErrNotImplement = "not implement: "
) )
const ( // LOG const ( // LOG

View File

@ -12,21 +12,114 @@ import (
kit "shylinux.com/x/toolkits" kit "shylinux.com/x/toolkits"
) )
func _action_right(m *ice.Message, river string, storm string) (ok bool) {
if ok = true; m.Option(ice.MSG_USERROLE) == aaa.VOID {
m.Richs(RIVER, "", river, func(key string, value map[string]interface{}) {
if ok = m.Richs(RIVER, kit.Keys(kit.MDB_HASH, key, OCEAN), m.Option(ice.MSG_USERNAME), nil) != nil; ok {
m.Log_AUTH(RIVER, river, STORM, storm)
}
})
}
return ok
}
func _action_key(m *ice.Message, arg ...string) string {
return kit.Keys(kit.MDB_HASH, kit.Select(m.Option(RIVER), arg, 0), STORM, kit.MDB_HASH, kit.Select(m.Option(STORM), arg, 1))
}
func _action_list(m *ice.Message, river, storm string) {
m.Cmdy(STORM, storm, ice.Option{ice.MSG_RIVER, river}).Table(func(index int, value map[string]string, head []string) {
m.Cmdy(m.Space(kit.Select(m.Option(ice.POD), value[ice.POD])), ctx.COMMAND, kit.Keys(value[ice.CTX], value[ice.CMD]))
})
}
func _action_exec(m *ice.Message, river, storm, index string, arg ...string) {
m.Option(ice.MSG_RIVER, river)
m.Option(ice.MSG_STORM, storm)
cmds := []string{index}
if m.Grows(RIVER, _action_key(m, river, storm), kit.MDB_ID, index, func(index int, value map[string]interface{}) {
if cmds = kit.Simple(kit.Keys(value[ice.CTX], value[ice.CMD])); kit.Format(value[ice.POD]) != "" {
m.Option(ice.POD, value[ice.POD]) // 远程节点
}
}) == nil && !m.Right(cmds) {
return // 没有授权
}
if _action_domain(m, cmds[0]); m.Option(ice.MSG_UPLOAD) != "" {
_action_upload(m) // 上传文件
}
if !m.PodCmd(cmds, arg) {
m.Cmdy(cmds, arg) // 执行命令
}
}
func _action_share(m *ice.Message, arg ...string) {
switch msg := m.Cmd(web.SHARE, arg[0]); msg.Append(kit.MDB_TYPE) {
case web.STORM:
if m.Warn(kit.Time() > kit.Time(msg.Append(kit.MDB_TIME)), ice.ErrExpire, arg) {
break // 分享超时
}
if len(arg) == 1 {
_action_list(m, msg.Append(web.RIVER), msg.Append(web.STORM))
break // 命令列表
}
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)),
aaa.USERNICK, m.Option(ice.MSG_USERNICK, msg.Append(aaa.USERNICK)),
RIVER, m.Option(ice.MSG_RIVER, msg.Append(RIVER)),
STORM, m.Option(ice.MSG_STORM, msg.Append(STORM)),
)
if !_action_right(m, msg.Append(web.RIVER), msg.Append(web.STORM)) {
break // 没有授权
}
// 执行命令
_action_exec(m, msg.Append(web.RIVER), msg.Append(web.STORM), arg[1], arg[2:]...)
case web.FIELD:
if m.Warn(kit.Time() > kit.Time(msg.Append(kit.MDB_TIME)), ice.ErrExpire, arg) {
break // 分享超时
}
if arg[0] = msg.Append(kit.MDB_NAME); len(arg) == 1 {
m.Push("title", msg.Append(kit.MDB_TITLE))
m.Push("index", msg.Append(kit.MDB_NAME))
m.Push("args", msg.Append(kit.MDB_TEXT))
break // 命令列表
}
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)),
aaa.USERNICK, m.Option(ice.MSG_USERNICK, msg.Append(aaa.USERNICK)),
RIVER, m.Option(ice.MSG_RIVER, msg.Append(RIVER)),
STORM, m.Option(ice.MSG_STORM, msg.Append(STORM)),
)
if !_action_right(m, msg.Append(web.RIVER), msg.Append(web.STORM)) {
break // 没有授权
}
if _action_domain(m, arg[1]); m.Option(ice.MSG_UPLOAD) != "" {
_action_upload(m) // 上传文件
}
m.Cmdy(arg[1:]) // 执行命令
}
}
func _action_domain(m *ice.Message, cmd string, arg ...string) (domain string) { func _action_domain(m *ice.Message, cmd string, arg ...string) (domain string) {
m.Option(ice.MSG_LOCAL, "") m.Option(ice.MSG_LOCAL, "")
m.Option(ice.MSG_DOMAIN, "") m.Option(ice.MSG_DOMAIN, "")
if m.Conf(ACTION, kit.Keym(DOMAIN, cmd)) != ice.TRUE { if m.Config(kit.Keys(DOMAIN, cmd)) != ice.TRUE {
return "" // 公有命令 return "" // 公有命令
} }
storm := kit.Select(m.Option(ice.MSG_STORM), arg, 0) river := kit.Select(m.Option(ice.MSG_RIVER), arg, 0)
river := kit.Select(m.Option(ice.MSG_RIVER), arg, 1) storm := kit.Select(m.Option(ice.MSG_STORM), arg, 1)
m.Richs(RIVER, "", river, func(key string, value map[string]interface{}) { m.Richs(RIVER, "", river, func(key string, value map[string]interface{}) {
switch kit.Value(kit.GetMeta(value), kit.MDB_TYPE) { switch kit.Value(kit.GetMeta(value), kit.MDB_TYPE) {
case PUBLIC: // 公有群 case PUBLIC: // 公有群
return return
case PROTECTED: // 共有群 case PROTECTED: // 共有群
m.Richs(RIVER, kit.Keys(kit.MDB_HASH, river, TOOL), storm, func(key string, value map[string]interface{}) { m.Richs(RIVER, kit.Keys(kit.MDB_HASH, river, STORM), storm, func(key string, value map[string]interface{}) {
switch r := "R" + river; kit.Value(kit.GetMeta(value), kit.MDB_TYPE) { switch r := "R" + river; kit.Value(kit.GetMeta(value), kit.MDB_TYPE) {
case PUBLIC: // 公有组 case PUBLIC: // 公有组
domain = m.Option(ice.MSG_DOMAIN, kit.Keys(r)) domain = m.Option(ice.MSG_DOMAIN, kit.Keys(r))
@ -39,103 +132,15 @@ func _action_domain(m *ice.Message, cmd string, arg ...string) (domain string) {
case PRIVATE: // 私有群 case PRIVATE: // 私有群
domain = m.Option(ice.MSG_DOMAIN, kit.Keys("U"+m.Option(ice.MSG_USERNAME))) domain = m.Option(ice.MSG_DOMAIN, kit.Keys("U"+m.Option(ice.MSG_USERNAME)))
} }
m.Option(ice.MSG_LOCAL, path.Join(m.Conf(RIVER, kit.META_PATH), domain)) m.Option(ice.MSG_LOCAL, path.Join(m.Config(kit.MDB_PATH), domain))
}) })
m.Log_AUTH(RIVER, river, STORM, storm, DOMAIN, domain) m.Log_AUTH(RIVER, river, STORM, storm, DOMAIN, domain)
return return
} }
func _action_right(m *ice.Message, river string, storm string) (ok bool) {
if ok = true; m.Option(ice.MSG_USERROLE) == aaa.VOID {
m.Richs(RIVER, "", river, func(key string, value map[string]interface{}) {
if ok = m.Richs(RIVER, kit.Keys(kit.MDB_HASH, key, USERS), m.Option(ice.MSG_USERNAME), nil) != nil; ok {
m.Log_AUTH(RIVER, river, STORM, storm)
}
})
}
return ok
}
func _action_list(m *ice.Message, river, storm string) {
m.Option(ice.MSG_RIVER, river)
m.Cmdy(TOOL, storm).Table(func(index int, value map[string]string, head []string) {
m.Cmdy(m.Space(kit.Select(m.Option(ice.POD), value[ice.POD])), ctx.COMMAND, kit.Keys(value[ice.CTX], value[ice.CMD]))
})
m.SortInt(kit.MDB_ID)
}
func _action_show(m *ice.Message, river, storm, index string, arg ...string) {
m.Option(ice.MSG_RIVER, river)
m.Option(ice.MSG_STORM, storm)
cmds := []string{index}
prefix := kit.Keys(kit.MDB_HASH, river, TOOL, kit.MDB_HASH, storm)
if m.Grows(RIVER, prefix, kit.MDB_ID, index, func(index int, value map[string]interface{}) {
if cmds = kit.Simple(kit.Keys(value[ice.CTX], value[ice.CMD])); kit.Format(value[ice.POD]) != "" {
m.Option(ice.POD, value[ice.POD]) // 远程节点
}
}) == nil && m.Warn(!m.Right(cmds), ice.ErrNotRight) {
return // 没有授权
}
if _action_domain(m, cmds[0]); m.Option(ice.MSG_UPLOAD) != "" {
_action_upload(m) // 上传文件
}
if !m.PodCmd(cmds, arg) {
m.Cmdy(cmds, arg) // 执行命令
}
}
func _action_upload(m *ice.Message) { func _action_upload(m *ice.Message) {
msg := m.Cmd(web.CACHE, web.UPLOAD) msg := m.Cmd(web.CACHE, web.UPLOAD)
m.Option(ice.MSG_UPLOAD, msg.Append(kit.MDB_HASH), msg.Append(kit.MDB_NAME), msg.Append(kit.MDB_SIZE)) m.Option(ice.MSG_UPLOAD, msg.Append(kit.MDB_HASH), msg.Append(kit.MDB_NAME), msg.Append(kit.MDB_SIZE))
} }
func _action_share(m *ice.Message, arg ...string) {
switch msg := m.Cmd(web.SHARE, arg[0]); msg.Append(kit.MDB_TYPE) {
case web.STORM:
if len(arg) == 1 {
_action_list(m, msg.Append(web.RIVER), msg.Append(web.STORM))
break // 命令列表
}
if m.Warn(kit.Time() > kit.Time(msg.Append(kit.MDB_TIME)), ice.ErrExpire) {
break // 分享超时
}
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 !_action_right(m, msg.Append(web.RIVER), msg.Append(web.STORM)) {
break // 没有授权
}
// 执行命令
_action_show(m, msg.Append(web.RIVER), msg.Append(web.STORM), arg[1], arg[2:]...)
case web.FIELD:
if arg[0] = msg.Append(kit.MDB_NAME); len(arg) == 1 {
m.Push("title", msg.Append(kit.MDB_TITLE))
m.Push("index", msg.Append(kit.MDB_NAME))
m.Push("args", msg.Append(kit.MDB_TEXT))
break // 命令列表
}
if m.Warn(kit.Time() > kit.Time(msg.Append(kit.MDB_TIME)), ice.ErrExpire) {
break // 分享超时
}
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[1:]), ice.ErrNotRight) {
break // 没有授权
}
if m.Option(ice.MSG_UPLOAD) != "" {
_action_upload(m) // 上传文件
}
m.Cmdy(arg[1:]) // 执行命令
}
}
const ( const (
DOMAIN = "domain" DOMAIN = "domain"
@ -149,10 +154,12 @@ const ACTION = "action"
func init() { func init() {
Index.Merge(&ice.Context{Configs: map[string]*ice.Config{ Index.Merge(&ice.Context{Configs: map[string]*ice.Config{
ACTION: {Name: ACTION, Help: "应用", Value: kit.Data( ACTION: {Name: ACTION, Help: "应用", Value: kit.Data(
MENUS, `[["help", "tutor", "manual", "service", "devops", "refer"]]`, MENUS, kit.List(kit.List("help", "tutor", "manual", "service", "devops", "refer")),
kit.MDB_PATH, ice.USR_LOCAL_RIVER,
)}, )},
}, Commands: map[string]*ice.Command{ }, Commands: map[string]*ice.Command{
ice.CTX_INIT: {Hand: func(m *ice.Message, c *ice.Context, cmd string, arg ...string) { "/action": {Name: "/action river storm action arg...", Help: "工作台", Action: map[string]*ice.Action{
ice.CTX_INIT: {Hand: func(m *ice.Message, arg ...string) {
for _, cmd := range []string{ for _, cmd := range []string{
"web.chat.meet.miss", "web.chat.meet.miss",
"web.chat.meet.mate", "web.chat.meet.mate",
@ -168,13 +175,11 @@ func init() {
"web.mall.asset", "web.mall.asset",
"web.mall.salary", "web.mall.salary",
} { } {
m.Conf(ACTION, kit.Keym(DOMAIN, cmd), ice.TRUE) m.Config(kit.Keys(DOMAIN, cmd), ice.TRUE)
} }
}}, }},
"/action": {Name: "/action river storm action arg...", Help: "工作台", Action: map[string]*ice.Action{
mdb.MODIFY: {Name: "modify", Help: "编辑", Hand: func(m *ice.Message, arg ...string) { mdb.MODIFY: {Name: "modify", Help: "编辑", Hand: func(m *ice.Message, arg ...string) {
m.Cmdy(mdb.MODIFY, RIVER, kit.Keys(kit.MDB_HASH, m.Option(RIVER), TOOL, kit.MDB_HASH, m.Option(STORM)), mdb.LIST, m.Cmdy(mdb.MODIFY, RIVER, _action_key(m), mdb.LIST, m.OptionSimple(kit.MDB_ID), arg)
m.OptionSimple(kit.MDB_ID), arg)
}}, }},
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 {
@ -188,21 +193,21 @@ func init() {
_action_share(m, arg...) _action_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 m.Warn(m.Option(ice.MSG_USERNAME) == "", ice.ErrNotLogin) { if m.Warn(m.Option(ice.MSG_USERNAME) == "", ice.ErrNotLogin, arg) {
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, arg) {
return // 没有授权 return // 没有授权
} }
if len(arg) == 2 { if len(arg) == 2 {
m.Option(MENUS, m.Conf(ACTION, kit.Keym(MENUS))) m.Option(MENUS, m.Config(MENUS))
_action_list(m, arg[0], arg[1]) _action_list(m, arg[0], arg[1])
return //命令列表 return //命令列表
} }
// 执行命令 // 执行命令
_action_show(m, arg[0], arg[1], arg[2], arg[3:]...) _action_exec(m, arg[0], arg[1], arg[2], arg[3:]...)
}}, }},
}}) }})
} }

View File

@ -4,14 +4,24 @@ chat.go
chat.shy chat.shy
header.go header.go
river.go
action.go
search.go search.go
river.go
storm.go
ocean.go
action.go
footer.go footer.go
pod.go
cmd.go
div.go
scan.go scan.go
scan.js
paste.go paste.go
files.go files.go
location.go location.go
meet.go
info.go
node.go
meet.go
room.go

View File

@ -6,107 +6,75 @@ import (
ice "shylinux.com/x/icebergs" ice "shylinux.com/x/icebergs"
"shylinux.com/x/icebergs/base/ctx" "shylinux.com/x/icebergs/base/ctx"
"shylinux.com/x/icebergs/base/mdb"
"shylinux.com/x/icebergs/base/nfs" "shylinux.com/x/icebergs/base/nfs"
"shylinux.com/x/icebergs/base/web" "shylinux.com/x/icebergs/base/web"
kit "shylinux.com/x/toolkits" kit "shylinux.com/x/toolkits"
) )
func _cmd_render(m *ice.Message, cmd string, args ...interface{}) {
list := []interface{}{kit.Dict("index", cmd, "args", kit.Simple(args))}
m.RenderResult(kit.Format(m.Conf(CMD, kit.Keym(kit.MDB_TEMPLATE)), kit.Format(list)))
}
const CMD = "cmd" const CMD = "cmd"
func init() { func init() {
Index.Merge(&ice.Context{ Index.Merge(&ice.Context{Configs: map[string]*ice.Config{
Commands: map[string]*ice.Command{ CMD: {Name: CMD, Help: "命令", Value: kit.Data(
"/cmd/": {Name: "/cmd/", Help: "命令", Action: map[string]*ice.Action{ kit.MDB_SHORT, "type", kit.MDB_PATH, "./",
ctx.COMMAND: {Name: "command", Help: "命令", Hand: func(m *ice.Message, arg ...string) { )},
if len(arg) == 0 { }, Commands: map[string]*ice.Command{
m.Push("index", CMD) "/cmd/": {Name: "/cmd/", Help: "命令", Action: ice.MergeAction(map[string]*ice.Action{
m.Push("args", "") ice.CTX_INIT: {Name: "_init", Help: "初始化", Hand: func(m *ice.Message, arg ...string) {
return m.Cmdy(CMD, mdb.CREATE, kit.MDB_TYPE, "go", kit.MDB_NAME, "web.code.inner")
} m.Cmdy(CMD, mdb.CREATE, kit.MDB_TYPE, "mod", kit.MDB_NAME, "web.code.inner")
m.Cmdy(ctx.COMMAND, arg[0]) m.Cmdy(CMD, mdb.CREATE, kit.MDB_TYPE, "sum", kit.MDB_NAME, "web.code.inner")
m.Cmdy(CMD, mdb.CREATE, kit.MDB_TYPE, "shy", kit.MDB_NAME, "web.wiki.word")
m.Cmdy(CMD, mdb.CREATE, kit.MDB_TYPE, "svg", kit.MDB_NAME, "web.wiki.draw")
m.Cmdy(CMD, mdb.CREATE, kit.MDB_TYPE, "csv", kit.MDB_NAME, "web.wiki.data")
m.Cmdy(CMD, mdb.CREATE, kit.MDB_TYPE, "json", kit.MDB_NAME, "web.wiki.json")
}}, }},
ice.RUN: {Name: "run", Help: "执行", Hand: func(m *ice.Message, arg ...string) { }, ctx.CmdAction()), Hand: func(m *ice.Message, c *ice.Context, cmd string, arg ...string) {
m.Cmdy(arg) if strings.HasSuffix(m.R.URL.Path, ice.PS) {
}}, m.RenderCmd(CMD)
}, Hand: func(m *ice.Message, c *ice.Context, cmd string, arg ...string) {
if strings.HasSuffix(m.R.URL.Path, "/") {
m.RenderIndex(web.SERVE, ice.VOLCANOS, "page/cmd.html")
return // 目录 return // 目录
} }
switch p := path.Join(m.Conf(CMD, kit.META_PATH), path.Join(arg...)); kit.Ext(p) { p := path.Join(m.Config(kit.MDB_PATH), path.Join(arg...))
case "svg": if mdb.HashSelect(m, kit.Ext(m.R.URL.Path)).Table(func(index int, value map[string]string, head []string) {
_cmd_render(m, "web.wiki.draw", p) m.RenderCmd(value[kit.MDB_NAME], p)
case "csv": }).Length() > 0 {
_cmd_render(m, "web.wiki.data", p) return // 插件
case "json":
_cmd_render(m, "web.wiki.json", p)
case "shy":
_cmd_render(m, "web.wiki.word", p)
case "go", "mod", "sum":
_cmd_render(m, "web.code.inner", path.Dir(p)+"/", path.Base(p))
default:
if m.Option(ice.POD) != "" {
if m.PodCmd(ctx.COMMAND, arg[0]); m.Append("meta") != "" {
_cmd_render(m, arg[0], arg[1:])
return // 远程命令
} }
if m.PodCmd(ctx.COMMAND, arg[0]) && m.Length() > 0 {
m.RenderCmd(arg[0], arg[1:]) // 远程命令
} else if m.Cmdy(ctx.COMMAND, arg[0]); m.Length() > 0 {
m.RenderCmd(arg[0], arg[1:]) // 本地命令
} else { } else {
if msg := m.Cmd(ctx.COMMAND, arg[0]); msg.Append("meta") != "" { m.RenderDownload(p) // 文件
_cmd_render(m, arg[0], arg[1:])
return // 本地命令
}
}
m.RenderDownload(p)
} }
}}, }},
CMD: {Name: "cmd path auto upload up home", Help: "命令", Action: map[string]*ice.Action{ CMD: {Name: "cmd path auto upload up home", Help: "命令", Action: ice.MergeAction(map[string]*ice.Action{
web.UPLOAD: {Name: "upload", Help: "上传", Hand: func(m *ice.Message, arg ...string) { web.UPLOAD: {Name: "upload", Help: "上传", Hand: func(m *ice.Message, arg ...string) {
_action_upload(m) m.Upload(path.Join(m.Config(kit.MDB_PATH), strings.TrimPrefix(path.Dir(m.R.URL.Path), "/cmd")))
m.Upload(path.Join(m.Conf(CMD, kit.META_PATH), strings.TrimPrefix(path.Dir(m.R.URL.Path), "/cmd")))
}}, }},
"home": {Name: "home", Help: "根目录", Hand: func(m *ice.Message, arg ...string) { "home": {Name: "home", Help: "根目录", Hand: func(m *ice.Message, arg ...string) {
m.ProcessLocation("/chat/cmd/") m.ProcessLocation("/chat/cmd/")
}}, }},
"up": {Name: "up", Help: "上一级", Hand: func(m *ice.Message, arg ...string) { "up": {Name: "up", Help: "上一级", Hand: func(m *ice.Message, arg ...string) {
if strings.TrimPrefix(m.R.URL.Path, "/cmd") == "/" { if strings.TrimPrefix(m.R.URL.Path, "/cmd") == ice.PS {
m.Cmdy(CMD) m.Cmdy(CMD)
return } else if strings.HasSuffix(m.R.URL.Path, ice.PS) {
}
if strings.HasSuffix(m.R.URL.Path, "/") {
m.ProcessLocation("../") m.ProcessLocation("../")
} else { } else {
m.ProcessLocation("./") m.ProcessLocation("./")
} }
}}, }},
}, Hand: func(m *ice.Message, c *ice.Context, cmd string, arg ...string) { }, mdb.HashAction()), Hand: func(m *ice.Message, c *ice.Context, cmd string, arg ...string) {
if len(arg) > 0 { if len(arg) > 0 {
m.ProcessLocation(arg[0]) m.ProcessLocation(arg[0])
return return
} }
m.Option(nfs.DIR_ROOT, path.Join(m.Conf(CMD, kit.META_PATH), strings.TrimPrefix(path.Dir(m.R.URL.Path), "/cmd"))) m.Option(nfs.DIR_ROOT, path.Join(m.Config(kit.MDB_PATH), strings.TrimPrefix(path.Dir(m.R.URL.Path), "/cmd")))
m.Cmdy(nfs.DIR, arg) m.Cmdy(nfs.DIR, arg)
}}, }},
}, }})
Configs: map[string]*ice.Config{
CMD: {Name: CMD, Help: "命令", Value: kit.Data(
kit.MDB_PATH, "./", kit.MDB_INDEX, "page/cmd.html", kit.MDB_TEMPLATE, `<!DOCTYPE html>
<head>
<meta name="viewport" content="width=device-width,initial-scale=0.8,user-scalable=no">
<meta charset="utf-8">
<link rel="stylesheet" type="text/css" href="/page/cmd.css">
</head>
<body>
<script src="/page/cmd.js"></script>
<script>cmd(%s)</script>
</body>
`,
)},
},
})
} }

View File

@ -4,10 +4,10 @@ import (
"path" "path"
ice "shylinux.com/x/icebergs" ice "shylinux.com/x/icebergs"
"shylinux.com/x/icebergs/base/cli"
"shylinux.com/x/icebergs/base/ctx" "shylinux.com/x/icebergs/base/ctx"
"shylinux.com/x/icebergs/base/lex"
"shylinux.com/x/icebergs/base/mdb" "shylinux.com/x/icebergs/base/mdb"
"shylinux.com/x/icebergs/base/web" "shylinux.com/x/icebergs/base/nfs"
kit "shylinux.com/x/toolkits" kit "shylinux.com/x/toolkits"
) )
@ -32,11 +32,12 @@ func _div_parse(m *ice.Message, root map[string]interface{}, list []string) int
ls := kit.Split(list[i]) ls := kit.Split(list[i])
if ls[0] == "_span" { if ls[0] == "_span" {
ls = append([]string{"", "", "style", "span"}, ls[1:]...) ls = append([]string{"", "", "style", kit.Select("span", ls, 1)}, kit.Slice(ls, 2)...)
} }
meta := kit.Dict( meta := kit.Dict(
"index", kit.Select("", ls, 0), "index", kit.Select("", ls, 0),
"args", kit.Select("", ls, 1), "args", kit.Select("", ls, 1),
"name", "hi",
) )
for i := 2; i < len(ls); i += 2 { for i := 2; i < len(ls); i += 2 {
meta[ls[i]] = ls[i+1] meta[ls[i]] = ls[i+1]
@ -57,30 +58,31 @@ func init() {
)}, )},
}, Commands: map[string]*ice.Command{ }, Commands: map[string]*ice.Command{
DIV: {Name: "div hash auto", Help: "定制", Action: ice.MergeAction(map[string]*ice.Action{ DIV: {Name: "div hash auto", Help: "定制", Action: ice.MergeAction(map[string]*ice.Action{
mdb.CREATE: {Name: "create type=page name=hi.html text", Help: "创建"}, lex.SPLIT: {Name: "split name=some text", Help: "生成", Hand: func(m *ice.Message, arg ...string) {
cli.MAKE: {Name: "make name=some line:textarea", Help: "生成", Hand: func(m *ice.Message, arg ...string) {
m.Fields(0) m.Fields(0)
node := kit.Dict("meta", kit.Dict("name", m.Option("name")), "list", []interface{}{}) node := kit.Data(m.OptionSimple(kit.MDB_NAME))
_div_parse(m, node, kit.Split(m.Option("line"), "\n", "\n", "\n")) _div_parse(m, node, kit.Split(m.Option(kit.MDB_TEXT), ice.NL, ice.NL, ice.NL))
m.ProcessDisplay("/plugin/local/chat/div.js") m.ProcessDisplay("/plugin/local/chat/div.js")
m.Push("text", kit.Formats(node)) m.Push(kit.MDB_TEXT, kit.Formats(node))
}}, }},
mdb.CREATE: {Name: "create type=page name=hi.html text", Help: "创建"},
}, mdb.HashAction(), ctx.CmdAction()), Hand: func(m *ice.Message, c *ice.Context, cmd string, arg ...string) { }, mdb.HashAction(), ctx.CmdAction()), Hand: func(m *ice.Message, c *ice.Context, cmd string, arg ...string) {
m.Fields(len(arg), m.Conf(DIV, kit.META_FIELD)) if mdb.HashSelect(m, arg...); len(arg) > 0 {
m.Cmdy(mdb.SELECT, m.PrefixKey(), "", mdb.HASH, kit.MDB_HASH, arg) if m.Option(ice.MSG_DISPLAY, "/plugin/local/chat/div.js"); m.Length() == 0 {
m.Cmdy(DIV, lex.SPLIT, ice.Option{kit.MDB_TEXT, m.Cmdx(nfs.CAT, arg[0])})
return
}
m.Action("添加", "保存", "预览")
} else {
m.Action(lex.SPLIT, mdb.CREATE)
}
m.Table(func(index int, value map[string]string, head []string) { m.Table(func(index int, value map[string]string, head []string) {
m.PushAnchor("/" + path.Join(ice.PUBLISH, value[kit.MDB_NAME])) m.PushAnchor("/" + path.Join(ice.PUBLISH, value[kit.MDB_NAME]))
}) })
if m.PushAction(cli.MAKE, mdb.REMOVE); len(arg) > 0 { m.PushAction(mdb.REMOVE)
m.Option(ice.MSG_DISPLAY, "/plugin/local/chat/div.js")
m.Action("添加", "保存", "预览")
} else {
m.Action(mdb.CREATE, cli.MAKE)
}
}}, }},
"/div": {Name: "/div", Help: "定制", Hand: func(m *ice.Message, c *ice.Context, cmd string, arg ...string) { "/div/": {Name: "/div/", Help: "定制", Action: ice.MergeAction(ctx.CmdAction()), Hand: func(m *ice.Message, c *ice.Context, cmd string, arg ...string) {
m.RenderIndex(web.SERVE, ice.VOLCANOS, "page/div.html") m.RenderCmd(m.Prefix(DIV), path.Join(arg...))
}}, }},
}}) }})
} }

View File

@ -10,29 +10,29 @@ import (
const FILES = "files" const FILES = "files"
func init() { func init() {
Index.Merge(&ice.Context{ Index.Merge(&ice.Context{Configs: map[string]*ice.Config{
Configs: map[string]*ice.Config{
FILES: {Name: FILES, Help: "文件夹", Value: kit.Data( FILES: {Name: FILES, Help: "文件夹", Value: kit.Data(
kit.MDB_SHORT, kit.MDB_DATA, kit.MDB_FIELD, "time,hash,type,name,size,data", kit.MDB_SHORT, kit.MDB_DATA, kit.MDB_FIELD, "time,hash,type,name,size,data",
)}, )},
}, }, Commands: map[string]*ice.Command{
Commands: map[string]*ice.Command{
FILES: {Name: "files hash auto upload", Help: "文件夹", Action: ice.MergeAction(map[string]*ice.Action{ FILES: {Name: "files hash auto upload", Help: "文件夹", Action: ice.MergeAction(map[string]*ice.Action{
web.UPLOAD: {Name: "upload", Help: "上传", Hand: func(m *ice.Message, arg ...string) { web.UPLOAD: {Name: "upload", Help: "上传", Hand: func(m *ice.Message, arg ...string) {
up := kit.Simple(m.Optionv(ice.MSG_UPLOAD)) up := kit.Simple(m.Optionv(ice.MSG_UPLOAD))
if len(up) < 2 {
msg := m.Cmd(web.CACHE, web.UPLOAD)
up = kit.Simple(msg.Append(kit.MDB_HASH), msg.Append(kit.MDB_NAME), msg.Append(kit.MDB_SIZE))
}
m.Cmdy(mdb.INSERT, m.Prefix(FILES), "", mdb.HASH, kit.MDB_TYPE, kit.Ext(up[1]), kit.MDB_NAME, up[1], kit.MDB_SIZE, up[2], kit.MDB_DATA, up[0]) m.Cmdy(mdb.INSERT, m.Prefix(FILES), "", mdb.HASH, kit.MDB_TYPE, kit.Ext(up[1]), kit.MDB_NAME, up[1], kit.MDB_SIZE, up[2], kit.MDB_DATA, up[0])
}}, }},
}, mdb.HashAction()), Hand: func(m *ice.Message, c *ice.Context, cmd string, arg ...string) { }, mdb.HashAction()), Hand: func(m *ice.Message, c *ice.Context, cmd string, arg ...string) {
m.Fields(len(arg), m.Conf(FILES, kit.META_FIELD)) mdb.HashSelect(m, arg...)
m.Cmdy(mdb.SELECT, m.Prefix(FILES), "", mdb.HASH, kit.MDB_HASH, arg)
m.Table(func(index int, value map[string]string, head []string) { m.Table(func(index int, value map[string]string, head []string) {
link := kit.MergeURL("/share/cache/"+value[kit.MDB_DATA], ice.POD, m.Option(ice.MSG_USERPOD)) link := "/share/cache/" + value[kit.MDB_DATA]
if m.PushDownload(kit.MDB_LINK, value[kit.MDB_NAME], link); len(arg) > 0 && kit.ExtIsImage(value[kit.MDB_NAME]) { if m.PushDownload(kit.MDB_LINK, value[kit.MDB_NAME], link); len(arg) > 0 && kit.ExtIsImage(value[kit.MDB_NAME]) {
m.PushImages(kit.MDB_IMAGE, link) m.PushImages(kit.MDB_IMAGE, link)
} }
}) })
m.PushAction(mdb.REMOVE) m.PushAction(mdb.REMOVE)
}}, }},
}, }})
})
} }

View File

@ -2,6 +2,7 @@ package chat
import ( import (
ice "shylinux.com/x/icebergs" ice "shylinux.com/x/icebergs"
"shylinux.com/x/icebergs/base/cli"
"shylinux.com/x/icebergs/base/ctx" "shylinux.com/x/icebergs/base/ctx"
kit "shylinux.com/x/toolkits" kit "shylinux.com/x/toolkits"
) )
@ -12,23 +13,22 @@ const (
const FOOTER = "footer" const FOOTER = "footer"
func init() { func init() {
Index.Merge(&ice.Context{ Index.Merge(&ice.Context{Configs: map[string]*ice.Config{
Configs: map[string]*ice.Config{
FOOTER: {Name: FOOTER, Help: "状态栏", Value: kit.Dict( FOOTER: {Name: FOOTER, Help: "状态栏", Value: kit.Dict(
LEGAL, []interface{}{`<a href="mailto:shylinuxc@gmail.com">shylinuxc@gmail.com</a>`}, LEGAL, kit.List(`<a href="mailto:shylinuxc@gmail.com">shylinuxc@gmail.com</a>`),
)}, )},
}, }, Commands: map[string]*ice.Command{
Commands: map[string]*ice.Command{
"/footer": {Name: "/footer", Help: "状态栏", Action: map[string]*ice.Action{ "/footer": {Name: "/footer", 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) {
m.Cmdy(ctx.COMMAND, arg) m.Cmdy(ctx.COMMAND, arg)
}}, }},
ice.RUN: {Name: "run", Help: "执行", Hand: func(m *ice.Message, arg ...string) { ice.RUN: {Name: "run", Help: "执行", Hand: func(m *ice.Message, arg ...string) {
m.Cmdy(arg) if m.Cmdy(arg); m.Result(1) == ice.ErrNotFound {
m.Set(ice.MSG_RESULT).Cmdy(cli.SYSTEM, 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) {
kit.Fetch(m.Confv(FOOTER, LEGAL), func(index int, value string) { m.Echo(value) }) m.Confm(FOOTER, LEGAL, func(index int, value string) { m.Echo(value) })
}}, }},
}, }})
})
} }

View File

@ -1,8 +1,8 @@
package chat package chat
import ( import (
"os"
"path" "path"
"strings"
ice "shylinux.com/x/icebergs" ice "shylinux.com/x/icebergs"
"shylinux.com/x/icebergs/base/aaa" "shylinux.com/x/icebergs/base/aaa"
@ -15,12 +15,18 @@ import (
kit "shylinux.com/x/toolkits" kit "shylinux.com/x/toolkits"
) )
func _header_agent(m *ice.Message, arg ...string) {
if strings.Index(m.Option(ice.MSG_USERUA), "MicroMessenger") > -1 {
m.Cmdy("web.chat.wx.access", "config")
}
}
func _header_check(m *ice.Message, arg ...string) { func _header_check(m *ice.Message, arg ...string) {
if m.Option(web.SHARE) != "" { if m.Option(web.SHARE) != "" {
switch msg := m.Cmd(web.SHARE, m.Option(web.SHARE)); msg.Append(kit.MDB_TYPE) { switch msg := m.Cmd(web.SHARE, m.Option(web.SHARE)); msg.Append(kit.MDB_TYPE) {
case web.LOGIN: // 扫码登录 case web.LOGIN:
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))))
m.Option(ice.MSG_USERNICK, aaa.UserNick(m, msg.Append(aaa.USERNAME)))
} }
case web.STORM: case web.STORM:
m.Option(ice.MSG_USERNAME, msg.Append(aaa.USERNAME)) m.Option(ice.MSG_USERNAME, msg.Append(aaa.USERNAME))
@ -29,24 +35,11 @@ func _header_check(m *ice.Message, arg ...string) {
} }
} }
if m.Option(ice.MSG_USERNAME) == "" { // 单点登录 if m.Option(ice.MSG_USERNAME) == "" {
m.Option(web.SSO, m.Conf(web.SERVE, kit.Keym(web.SSO)))
m.Option(web.LOGIN, m.Config(web.LOGIN)) m.Option(web.LOGIN, m.Config(web.LOGIN))
m.Option(web.SSO, m.Conf(web.SERVE, kit.Keym(web.SSO)))
} }
} }
func _header_share(m *ice.Message, arg ...string) {
if m.Option(kit.MDB_LINK) == "" {
m.Cmdy(web.SHARE, mdb.CREATE, kit.MDB_TYPE, web.LOGIN, arg)
} else {
m.Option(kit.MDB_LINK, tcp.ReplaceLocalhost(m, m.Option(kit.MDB_LINK)))
}
m.Option(kit.MDB_LINK, kit.MergeURL(m.Option(kit.MDB_LINK), RIVER, "", STORM, ""))
m.Set("name,text")
m.Push(kit.MDB_NAME, m.Option(kit.MDB_LINK))
m.PushQRCode(kit.MDB_TEXT, m.Option(kit.MDB_LINK))
}
func _header_grant(m *ice.Message, arg ...string) { func _header_grant(m *ice.Message, arg ...string) {
if m.PodCmd(m.PrefixKey(), ctx.ACTION, GRANT, arg) { if m.PodCmd(m.PrefixKey(), ctx.ACTION, GRANT, arg) {
return // 下发命令 return // 下发命令
@ -56,37 +49,54 @@ func _header_grant(m *ice.Message, arg ...string) {
m.Cmd(aaa.ROLE, kit.Select(aaa.TECH, aaa.VOID, m.Option(ice.MSG_USERROLE) == aaa.VOID), m.Option(ice.MSG_USERNAME)) m.Cmd(aaa.ROLE, kit.Select(aaa.TECH, aaa.VOID, m.Option(ice.MSG_USERROLE) == aaa.VOID), m.Option(ice.MSG_USERNAME))
m.Cmd(web.SPACE, m.Option(web.SPACE), ice.MSG_SESSID, aaa.SessCreate(m, m.Option(ice.MSG_USERNAME))) m.Cmd(web.SPACE, m.Option(web.SPACE), ice.MSG_SESSID, aaa.SessCreate(m, m.Option(ice.MSG_USERNAME)))
} }
func _header_share(m *ice.Message, arg ...string) {
if m.Option(kit.MDB_LINK) == "" {
m.Cmdy(web.SHARE, mdb.CREATE, kit.MDB_TYPE, web.LOGIN, arg)
} else {
m.Option(kit.MDB_LINK, tcp.ReplaceLocalhost(m, m.Option(kit.MDB_LINK)))
}
m.Option(kit.MDB_LINK, kit.MergeURL(m.Option(kit.MDB_LINK), RIVER, "", STORM, ""))
m.PushQRCode(kit.MDB_TEXT, m.Option(kit.MDB_LINK))
m.Push(kit.MDB_NAME, m.Option(kit.MDB_LINK))
}
func _header_users(m *ice.Message, key string, arg ...string) { func _header_users(m *ice.Message, key string, arg ...string) {
m.Option(aaa.USERNAME, m.Option(ice.MSG_USERNAME)) m.Option(aaa.USERNAME, m.Option(ice.MSG_USERNAME))
m.Cmdy(aaa.USER, ctx.ACTION, mdb.MODIFY, key, m.Option(key, arg[0])) m.Cmdy(aaa.USER, ctx.ACTION, mdb.MODIFY, key, m.Option(key, arg[0]))
} }
const ( const (
TOPIC = "topic"
TITLE = "title" TITLE = "title"
TOPIC = "topic"
MENUS = "menus" MENUS = "menus"
TRANS = "trans" TRANS = "trans"
AGENT = "agent" AGENT = "agent"
CHECK = "check" CHECK = "check"
SHARE = "share"
GRANT = "grant" GRANT = "grant"
LOGIN = "login" SHARE = "share"
) )
const HEADER = "header" const HEADER = "header"
func init() { func init() {
Index.Merge(&ice.Context{Configs: map[string]*ice.Config{ Index.Merge(&ice.Context{Configs: map[string]*ice.Config{
HEADER: {Name: HEADER, Help: "标题栏", Value: kit.Data( HEADER: {Name: HEADER, Help: "标题栏", Value: kit.Data(
TITLE, "shylinux.com/x/contexts", MENUS, `["header", ["setting", "black", "white", "print", "webpack", "unpack"]]`, TITLE, "shylinux.com/x/contexts", MENUS, kit.List("header", kit.List("setting", "black", "white", "print", "webpack", "devpack")),
LOGIN, kit.List("登录", "扫码"), aaa.LOGIN, kit.List("登录", "扫码"),
)}, )},
}, Commands: map[string]*ice.Command{ }, Commands: map[string]*ice.Command{
ice.CTX_INIT: {Hand: func(m *ice.Message, c *ice.Context, cmd string, arg ...string) { web.WEB_LOGIN: {Hand: func(m *ice.Message, c *ice.Context, cmd string, arg ...string) {
m.Cmd(web.SERVE, aaa.WHITE, HEADER, RIVER, ACTION, FOOTER) switch arg[0] {
case "/header":
switch kit.Select("", arg, 1) {
case AGENT, CHECK:
return // 非登录态
}
}
m.Warn(m.Option(ice.MSG_USERNAME) == "", ice.ErrNotLogin, arg)
}}, }},
"/header": {Name: "/header", Help: "标题栏", Action: map[string]*ice.Action{ "/header": {Name: "/header", Help: "标题栏", Action: map[string]*ice.Action{
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") _header_agent(m, arg...)
}}, }},
CHECK: {Name: "check", Help: "登录检查", Hand: func(m *ice.Message, arg ...string) { CHECK: {Name: "check", Help: "登录检查", Hand: func(m *ice.Message, arg ...string) {
_header_check(m, arg...) _header_check(m, arg...)
@ -102,7 +112,6 @@ func init() {
if aaa.UserLogin(m, arg[0], arg[1]) { if aaa.UserLogin(m, arg[0], arg[1]) {
web.RenderCookie(m, aaa.SessCreate(m, arg[0])) web.RenderCookie(m, aaa.SessCreate(m, arg[0]))
} }
m.Echo(m.Option(ice.MSG_USERNAME))
}}, }},
aaa.LOGOUT: {Name: "logout", Help: "退出登录", Hand: func(m *ice.Message, arg ...string) { aaa.LOGOUT: {Name: "logout", Help: "退出登录", Hand: func(m *ice.Message, arg ...string) {
m.Cmd(aaa.SESS, mdb.REMOVE, ice.OptionHash(m.Option(ice.MSG_SESSID))) m.Cmd(aaa.SESS, mdb.REMOVE, ice.OptionHash(m.Option(ice.MSG_SESSID)))
@ -110,6 +119,9 @@ func init() {
aaa.USERNICK: {Name: "usernick", Help: "用户昵称", Hand: func(m *ice.Message, arg ...string) { aaa.USERNICK: {Name: "usernick", Help: "用户昵称", Hand: func(m *ice.Message, arg ...string) {
_header_users(m, aaa.USERNICK, arg...) _header_users(m, aaa.USERNICK, arg...)
}}, }},
aaa.LANGUAGE: {Name: "language", Help: "语言地区", Hand: func(m *ice.Message, arg ...string) {
_header_users(m, aaa.LANGUAGE, arg...)
}},
aaa.BACKGROUND: {Name: "background", Help: "用户壁纸", Hand: func(m *ice.Message, arg ...string) { aaa.BACKGROUND: {Name: "background", Help: "用户壁纸", Hand: func(m *ice.Message, arg ...string) {
_header_users(m, aaa.BACKGROUND, arg...) _header_users(m, aaa.BACKGROUND, arg...)
}}, }},
@ -118,34 +130,29 @@ func init() {
}}, }},
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.Cmd(nfs.COPY, ice.GO_MOD, path.Join(ice.SRC_RELEASE, ice.GO_MOD))
m.Cmdy(code.WEBPACK, mdb.CREATE, m.OptionSimple(kit.MDB_NAME)) m.Cmdy(code.WEBPACK, mdb.CREATE, m.OptionSimple(kit.MDB_NAME))
p := path.Join("src/release", ice.GO_MOD)
if _, e := os.Stat(p); e == nil {
m.Cmd(nfs.COPY, ice.GO_MOD, p)
}
}}, }},
"unpack": {Name: "unpack", Help: "开发模式", Hand: func(m *ice.Message, arg ...string) { code.DEVPACK: {Name: "devpack", Help: "开发模式", Hand: func(m *ice.Message, arg ...string) {
m.Cmdy(code.WEBPACK, "unpack") m.Cmd(nfs.COPY, ice.GO_MOD, path.Join(ice.SRC_DEBUG, ice.GO_MOD))
m.Cmdy(code.WEBPACK, mdb.REMOVE)
p := path.Join("src/debug", ice.GO_MOD)
if _, e := os.Stat(p); e == nil {
m.Cmd(nfs.COPY, ice.GO_MOD, p)
}
}}, }},
}, 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.Option(TRANS, kit.Format(kit.Value(c.Commands[cmd].Meta, "_trans")))
m.Option(MENUS, m.Conf(HEADER, kit.Keym(MENUS)))
msg := m.Cmd(aaa.USER, m.Option(ice.MSG_USERNAME)) msg := m.Cmd(aaa.USER, m.Option(ice.MSG_USERNAME))
for _, k := range []string{aaa.USERNICK, aaa.BACKGROUND, aaa.AVATAR} { for _, k := range []string{aaa.USERNICK, aaa.LANGUAGE, aaa.BACKGROUND, aaa.AVATAR} {
m.Option(k, msg.Append(k)) m.Option(k, msg.Append(k))
} }
m.Echo(m.Conf(HEADER, kit.Keym(TITLE)))
m.Option(TRANS, kit.Format(kit.Value(c.Commands[cmd].Meta, "_trans")))
m.Option(MENUS, m.Config(MENUS))
m.Echo(m.Config(TITLE))
}}, }},
HEADER: {Name: "header", Help: "标题栏", Action: map[string]*ice.Action{ HEADER: {Name: "header", Help: "标题栏", Action: map[string]*ice.Action{
GRANT: {Name: "grant space", Help: "授权", Hand: func(m *ice.Message, arg ...string) { GRANT: {Name: "grant space", Help: "授权", Hand: func(m *ice.Message, arg ...string) {
_header_grant(m, arg...) _header_grant(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) {
}}, }},
}}) }})
} }

View File

@ -22,7 +22,6 @@ func _trans(arg []string, tr map[string]string) {
} }
const ( const (
ADDRESS = "address"
LATITUDE = "latitude" LATITUDE = "latitude"
LONGITUDE = "longitude" LONGITUDE = "longitude"
) )
@ -33,26 +32,18 @@ const (
const LOCATION = "location" const LOCATION = "location"
func init() { func init() {
Index.Merge(&ice.Context{ Index.Merge(&ice.Context{Configs: map[string]*ice.Config{
Configs: map[string]*ice.Config{
LOCATION: {Name: LOCATION, Help: "地理位置", Value: kit.Data( LOCATION: {Name: LOCATION, Help: "地理位置", Value: kit.Data(
kit.MDB_SHORT, kit.MDB_TEXT, kit.MDB_FIELD, "time,hash,type,name,text,longitude,latitude", kit.MDB_SHORT, kit.MDB_TEXT, kit.MDB_FIELD, "time,hash,type,name,text,longitude,latitude",
)}, )},
}, }, Commands: map[string]*ice.Command{
Commands: map[string]*ice.Command{
LOCATION: {Name: "location hash auto getLocation", Help: "地理位置", Action: ice.MergeAction(map[string]*ice.Action{ LOCATION: {Name: "location hash auto getLocation", Help: "地理位置", Action: ice.MergeAction(map[string]*ice.Action{
OPENLOCATION: {Name: "openLocation", Help: "地图", Hand: func(m *ice.Message, arg ...string) {}}, OPENLOCATION: {Name: "location", Help: "地图"},
GETLOCATION: {Name: "getLocation", Help: "打卡", Hand: func(m *ice.Message, arg ...string) { GETLOCATION: {Name: "location create", Help: "打卡"},
m.Cmdy(mdb.INSERT, m.Prefix(LOCATION), "", mdb.HASH, arg) mdb.CREATE: {Name: "create type=text name text latitude longitude", Help: "添加"},
}},
mdb.CREATE: {Name: "create type=text name text latitude longitude", Help: "添加", Hand: func(m *ice.Message, arg ...string) {
m.Cmdy(mdb.INSERT, m.Prefix(LOCATION), "", mdb.HASH, arg)
}},
}, mdb.HashAction()), Hand: func(m *ice.Message, c *ice.Context, cmd string, arg ...string) { }, mdb.HashAction()), Hand: func(m *ice.Message, c *ice.Context, cmd string, arg ...string) {
m.Fields(len(arg), m.Conf(LOCATION, kit.META_FIELD)) mdb.HashSelect(m, arg...)
m.Cmdy(mdb.SELECT, m.Prefix(LOCATION), "", mdb.HASH, kit.MDB_HASH, arg)
m.PushAction(OPENLOCATION, mdb.REMOVE) m.PushAction(OPENLOCATION, mdb.REMOVE)
}}, }},
}, }})
})
} }

View File

@ -7,31 +7,29 @@ import (
kit "shylinux.com/x/toolkits" kit "shylinux.com/x/toolkits"
) )
const USERS = "users" const OCEAN = "ocean"
func init() { func init() {
Index.Merge(&ice.Context{Commands: map[string]*ice.Command{ Index.Merge(&ice.Context{Commands: map[string]*ice.Command{
USERS: {Name: "users username auto insert invite", Help: "用户", Action: map[string]*ice.Action{ OCEAN: {Name: "ocean username auto insert invite", Help: "用户", Action: map[string]*ice.Action{
mdb.INSERT: {Name: "insert username", Help: "添加", Hand: func(m *ice.Message, arg ...string) {
m.Cmdy(mdb.INSERT, RIVER, _river_key(m, USERS), mdb.HASH, arg)
}},
mdb.REMOVE: {Name: "remove", Help: "删除", Hand: func(m *ice.Message, arg ...string) {
m.Cmdy(mdb.DELETE, RIVER, _river_key(m, USERS), mdb.HASH, m.OptionSimple(aaa.USERNAME))
}},
mdb.INPUTS: {Name: "inputs", Help: "补全", Hand: func(m *ice.Message, arg ...string) { mdb.INPUTS: {Name: "inputs", Help: "补全", Hand: func(m *ice.Message, arg ...string) {
m.Cmdy(aaa.USER, ice.OptionFields(aaa.USERNAME, aaa.USERZONE, aaa.USERNICK)) 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.Cmdy(mdb.INSERT, RIVER, _river_key(m, OCEAN), mdb.HASH, arg)
}},
mdb.DELETE: {Name: "delete", Help: "删除", Hand: func(m *ice.Message, arg ...string) {
m.Cmdy(mdb.DELETE, RIVER, _river_key(m, OCEAN), mdb.HASH, m.OptionSimple(aaa.USERNAME))
}}, }},
}, 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), "time,username") m.Fields(len(arg), "time,username")
m.Cmdy(mdb.SELECT, RIVER, _river_key(m, USERS), mdb.HASH, aaa.USERNAME, arg) m.Cmdy(mdb.SELECT, RIVER, _river_key(m, OCEAN), mdb.HASH, aaa.USERNAME, arg)
m.Table(func(index int, value map[string]string, head []string) { m.Table(func(index int, value map[string]string, head []string) {
m.Richs(USERS, nil, value[aaa.USERNAME], func(key string, val map[string]interface{}) { msg := m.Cmd(aaa.USER, value[aaa.USERNAME])
val = kit.GetMeta(val) m.Push(aaa.USERNICK, msg.Append(aaa.USERNICK))
m.Push(aaa.USERNICK, val[aaa.USERNICK]) m.PushImages(aaa.AVATAR, msg.Append(aaa.AVATAR), kit.Select("60", "240", m.FieldsIsDetail()))
m.PushImages(aaa.AVATAR, kit.Format(val[aaa.AVATAR]), kit.Select("60", "240", m.Option(mdb.FIELDS) == mdb.DETAIL))
}) })
}) m.PushAction(mdb.DELETE)
m.PushAction(mdb.REMOVE)
}}, }},
}}) }})
} }

View File

@ -11,30 +11,22 @@ import (
const PASTE = "paste" const PASTE = "paste"
func init() { func init() {
Index.Merge(&ice.Context{ Index.Merge(&ice.Context{Configs: map[string]*ice.Config{
Configs: map[string]*ice.Config{ PASTE: {Name: PASTE, Help: "粘贴", Value: kit.Data(
PASTE: {Name: PASTE, Help: "粘贴板", Value: kit.Data(
kit.MDB_SHORT, kit.MDB_TEXT, kit.MDB_FIELD, "time,hash,type,name,text", kit.MDB_SHORT, kit.MDB_TEXT, kit.MDB_FIELD, "time,hash,type,name,text",
)}, )},
}, }, Commands: map[string]*ice.Command{
Commands: map[string]*ice.Command{ PASTE: {Name: "paste hash auto getClipboardData", Help: "粘贴", Action: ice.MergeAction(map[string]*ice.Action{
PASTE: {Name: "paste hash auto getClipboardData", Help: "粘贴板", Action: ice.MergeAction(map[string]*ice.Action{
"getClipboardData": {Name: "getClipboardData", Help: "粘贴", Hand: func(m *ice.Message, arg ...string) { "getClipboardData": {Name: "getClipboardData", Help: "粘贴", Hand: func(m *ice.Message, arg ...string) {
_trans(arg, map[string]string{"data": "text"}) m.Cmdy(PASTE, mdb.CREATE, arg)
m.Cmdy(mdb.INSERT, m.Prefix(PASTE), "", mdb.HASH, arg)
}},
mdb.CREATE: {Name: "create type=text name=hi data:textarea=hi", Help: "添加", Hand: func(m *ice.Message, arg ...string) {
_trans(arg, map[string]string{"data": "text"})
m.Cmdy(mdb.INSERT, m.Prefix(PASTE), "", mdb.HASH, arg)
}}, }},
mdb.CREATE: {Name: "create type=text name=hi text:textarea=hi", Help: "添加"},
}, mdb.HashAction()), Hand: func(m *ice.Message, c *ice.Context, cmd string, arg ...string) { }, mdb.HashAction()), Hand: func(m *ice.Message, c *ice.Context, cmd string, arg ...string) {
m.Fields(len(arg), m.Conf(PASTE, kit.META_FIELD)) if mdb.HashSelect(m, arg...); len(arg) > 0 {
if m.Cmdy(mdb.SELECT, cmd, "", mdb.HASH, kit.MDB_HASH, arg); len(arg) > 0 {
m.PushScript(ssh.SCRIPT, m.Append(kit.MDB_TEXT)) m.PushScript(ssh.SCRIPT, m.Append(kit.MDB_TEXT))
m.PushQRCode(cli.QRCODE, m.Append(kit.MDB_TEXT)) m.PushQRCode(cli.QRCODE, m.Append(kit.MDB_TEXT))
} }
m.PushAction(mdb.REMOVE) m.PushAction(mdb.REMOVE)
}}, }},
}, }})
})
} }

View File

@ -12,38 +12,23 @@ import (
const POD = "pod" const POD = "pod"
func init() { func init() {
Index.Merge(&ice.Context{ Index.Merge(&ice.Context{Configs: map[string]*ice.Config{
Commands: map[string]*ice.Command{ POD: {Name: POD, Help: "节点", Value: kit.Data()},
"/pod/": {Name: "/pod/", Help: "节点", Action: map[string]*ice.Action{ }, Commands: map[string]*ice.Command{
ctx.COMMAND: {Name: "command", Help: "命令", Hand: func(m *ice.Message, arg ...string) { "/pod/": {Name: "/pod/", Help: "节点", Action: ice.MergeAction(map[string]*ice.Action{
if len(arg) == 0 { ice.CTX_INIT: {Name: "_init", Help: "初始化", Hand: func(m *ice.Message, arg ...string) {
m.Push("index", CMD)
m.Push("args", "")
return
}
if !m.PodCmd(ctx.COMMAND, arg[0]) {
m.Cmdy(ctx.COMMAND, arg[0])
}
}}, }},
ice.RUN: {Name: "run", Help: "执行", Hand: func(m *ice.Message, arg ...string) { }, ctx.CmdAction()), Hand: func(m *ice.Message, c *ice.Context, cmd string, arg ...string) {
if !m.PodCmd(arg) {
m.Cmdy(arg)
}
}},
}, Hand: func(m *ice.Message, c *ice.Context, cmd string, arg ...string) {
if kit.Select("", arg, 0) == "" { if kit.Select("", arg, 0) == "" {
_cmd_render(m, web.ROUTE) m.RenderCmd(web.ROUTE)
return return // 节点列表
} }
if len(arg) == 1 { if len(arg) == 1 {
m.RenderIndex(web.SERVE, ice.VOLCANOS) m.RenderIndex(web.SERVE, ice.VOLCANOS)
return return // 节点首页
} }
m.Cmdy(m.Prefix("/cmd/"), path.Join(arg[2:]...)) // 节点命令
m.Cmdy("/cmd/", path.Join(arg[2:]...))
}}, }},
}, }})
Configs: map[string]*ice.Config{
POD: {Name: POD, Help: "节点", Value: kit.Data()},
},
})
} }

View File

@ -14,13 +14,7 @@ import (
func _river_key(m *ice.Message, key ...interface{}) string { func _river_key(m *ice.Message, key ...interface{}) string {
return kit.Keys(kit.MDB_HASH, m.Option(ice.MSG_RIVER), kit.Simple(key)) return kit.Keys(kit.MDB_HASH, m.Option(ice.MSG_RIVER), kit.Simple(key))
} }
func _river_url(m *ice.Message, arg ...string) string {
return kit.MergeURL(m.Option(ice.MSG_USERWEB), RIVER, m.Option(ice.MSG_RIVER), arg)
}
func _river_list(m *ice.Message) { func _river_list(m *ice.Message) {
m.Set(ice.MSG_OPTION, kit.MDB_HASH)
m.Set(ice.MSG_OPTION, kit.MDB_NAME)
if m.Option(web.SHARE) != "" { if m.Option(web.SHARE) != "" {
switch msg := m.Cmd(web.SHARE, m.Option(web.SHARE)); msg.Append(kit.MDB_TYPE) { switch msg := m.Cmd(web.SHARE, m.Option(web.SHARE)); msg.Append(kit.MDB_TYPE) {
case web.RIVER: // 共享群组 case web.RIVER: // 共享群组
@ -28,11 +22,11 @@ func _river_list(m *ice.Message) {
m.Option(ice.MSG_RIVER, msg.Append(RIVER)) m.Option(ice.MSG_RIVER, msg.Append(RIVER))
m.Option(ice.MSG_STORM, msg.Append(STORM)) m.Option(ice.MSG_STORM, msg.Append(STORM))
if m.Conf(RIVER, kit.Keys(kit.MDB_HASH, m.Option(ice.MSG_RIVER))) == "" { if m.Conf(RIVER, _river_key(m)) == "" {
break break // 虚拟群组
} }
if msg.Cmd(USERS, m.Option(ice.MSG_USERNAME)).Append(aaa.USERNAME) == "" { if msg.Cmd(OCEAN, m.Option(ice.MSG_USERNAME)).Append(aaa.USERNAME) == "" {
msg.Cmd(USERS, mdb.INSERT, aaa.USERNAME, m.Option(ice.MSG_USERNAME)) // 加入群组 msg.Cmd(OCEAN, mdb.INSERT, aaa.USERNAME, m.Option(ice.MSG_USERNAME)) // 加入群组
} }
case web.STORM: // 共享应用 case web.STORM: // 共享应用
@ -49,7 +43,7 @@ func _river_list(m *ice.Message) {
} }
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, USERS), m.Option(ice.MSG_USERNAME), func(k string, val map[string]interface{}) { m.Richs(RIVER, kit.Keys(kit.MDB_HASH, key, OCEAN), 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))
}) })
}) })
@ -58,70 +52,65 @@ func _river_list(m *ice.Message) {
const RIVER = "river" const RIVER = "river"
func init() { func init() {
Index.Merge(&ice.Context{ Index.Merge(&ice.Context{Configs: map[string]*ice.Config{
Configs: map[string]*ice.Config{
RIVER: {Name: RIVER, Help: "群组", Value: kit.Data( RIVER: {Name: RIVER, Help: "群组", Value: kit.Data(
kit.MDB_PATH, ice.USR_LOCAL_RIVER, MENUS, kit.List(RIVER, kit.List("create", "创建群组", "添加应用", "添加工具", "添加设备", "创建空间"), kit.List("share", "共享群组", "共享应用", "共享工具", "共享主机", "访问空间")),
MENUS, `["river",
["create", "创建群组", "添加应用", "添加工具", "添加设备", "创建空间"],
["share", "共享群组", "共享应用", "共享工具", "共享主机", "访问空间"]
]`,
)}, )},
}, }, Commands: map[string]*ice.Command{
Commands: map[string]*ice.Command{ "/river": {Name: "/river", Help: "小河流", Action: map[string]*ice.Action{
ice.CTX_INIT: {Hand: func(m *ice.Message, c *ice.Context, cmd string, arg ...string) { ice.CTX_INIT: {Hand: func(m *ice.Message, arg ...string) {
m.Conf(RIVER, kit.Keym(kit.MDB_TEMPLATE), kit.Dict( m.Config(kit.MDB_TEMPLATE, kit.Dict(
"base", kit.Dict( "base", kit.Dict(
"info", []interface{}{ "info", kit.List(
"web.chat.info", "web.chat.info",
"web.chat.user", "web.chat.user",
"web.chat.tool", "web.chat.tool",
"web.chat.node", "web.chat.node",
}, ),
"scan", []interface{}{ "scan", kit.List(
"web.chat.scan", "web.chat.scan",
"web.chat.paste", "web.chat.paste",
"web.chat.files", "web.chat.files",
"web.chat.location", "web.chat.location",
"web.chat.meet.miss", "web.chat.meet.miss",
"web.wiki.feel", "web.wiki.feel",
}, ),
"task", []interface{}{ "task", kit.List(
"web.team.task", "web.team.task",
"web.team.plan", "web.team.plan",
"web.mall.asset", "web.mall.asset",
"web.mall.salary", "web.mall.salary",
"web.wiki.word", "web.wiki.word",
}, ),
"draw", []interface{}{ "draw", kit.List(
"web.wiki.draw", "web.wiki.draw",
"web.wiki.data", "web.wiki.data",
"web.wiki.word", "web.wiki.word",
}, ),
), ),
)) ))
}}, }},
"/river": {Name: "/river", Help: "小河流", 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 m.Warn(m.Option(ice.MSG_USERNAME) == "", ice.ErrNotLogin) { if m.Warn(m.Option(ice.MSG_USERNAME) == "", ice.ErrNotLogin, RIVER) {
m.Render(web.STATUS, 401) m.Render(web.STATUS, 401)
return // 没有登录 return // 没有登录
} }
if len(arg) == 0 { if len(arg) == 0 {
m.Option(MENUS, m.Conf(RIVER, kit.Keym(MENUS))) m.Option(MENUS, m.Config(MENUS))
_river_list(m) _river_list(m)
return // 群组列表 return // 群组列表
} }
if len(arg) == 2 && arg[1] == TOOL { if len(arg) == 2 && arg[1] == STORM {
m.Option(ice.MSG_RIVER, arg[0]) m.Option(ice.MSG_RIVER, arg[0])
m.Cmdy(arg[1], arg[2:]) m.Cmdy(arg[1], arg[2:])
return // 应用列表 return // 应用列表
} }
if m.Warn(!m.Right(RIVER, arg), ice.ErrNotRight) { if !m.Right(RIVER, arg) {
return // 没有授权 return // 没有授权
} }
switch kit.Select("", arg, 1) { switch kit.Select("", arg, 1) {
case USERS, TOOL, NODE: case OCEAN, NODE:
m.Option(ice.MSG_RIVER, arg[0]) m.Option(ice.MSG_RIVER, arg[0])
m.Cmdy(arg[1], arg[2:]) m.Cmdy(arg[1], arg[2:])
@ -134,28 +123,6 @@ func init() {
} }
}}, }},
RIVER: {Name: "river hash auto create", Help: "群组", Action: ice.MergeAction(map[string]*ice.Action{ RIVER: {Name: "river hash auto create", Help: "群组", Action: ice.MergeAction(map[string]*ice.Action{
mdb.CREATE: {Name: "create type=public,protected,private name=hi text=hello template=base", Help: "添加", Hand: func(m *ice.Message, arg ...string) {
h := m.Cmdx(mdb.INSERT, RIVER, "", mdb.HASH, arg)
m.Option(ice.MSG_RIVER, h)
m.Echo(h)
m.Conf(RIVER, kit.Keys(kit.MDB_HASH, h, NODE, kit.MDB_META, kit.MDB_SHORT), kit.MDB_NAME)
m.Conf(RIVER, kit.Keys(kit.MDB_HASH, h, USERS, kit.MDB_META, kit.MDB_SHORT), aaa.USERNAME)
m.Cmd(USERS, mdb.INSERT, aaa.USERNAME, m.Option(ice.MSG_USERNAME))
kit.Fetch(m.Confv(RIVER, kit.Keym(kit.MDB_TEMPLATE, kit.Select("base", m.Option(kit.MDB_TEMPLATE)))), func(storm string, value interface{}) {
h := m.Cmdx(TOOL, mdb.CREATE, kit.MDB_TYPE, PUBLIC, kit.MDB_NAME, storm, kit.MDB_TEXT, storm)
kit.Fetch(value, func(index int, value string) {
m.Search(value, func(p *ice.Context, s *ice.Context, key string, cmd *ice.Command) {
m.Cmd(TOOL, mdb.INSERT, kit.MDB_HASH, h, ice.CTX, s.Cap(ice.CTX_FOLLOW), ice.CMD, key, kit.MDB_HELP, cmd.Help)
})
})
})
}},
mdb.REMOVE: {Name: "remove", Help: "添加", Hand: func(m *ice.Message, arg ...string) {
m.Cmdy(mdb.DELETE, m.PrefixKey(), "", mdb.HASH, m.OptionSimple(kit.MDB_HASH))
}},
mdb.INPUTS: {Name: "inputs", Help: "补全", Hand: func(m *ice.Message, arg ...string) { mdb.INPUTS: {Name: "inputs", Help: "补全", Hand: func(m *ice.Message, arg ...string) {
switch m.Option(ctx.ACTION) { switch m.Option(ctx.ACTION) {
case cli.START: case cli.START:
@ -164,36 +131,49 @@ func init() {
} }
switch arg[0] { switch arg[0] {
case aaa.USERNAME:
m.Cmdy(aaa.USER)
m.Appendv(ice.MSG_APPEND, aaa.USERNAME, aaa.USERNICK, aaa.USERZONE)
case aaa.USERROLE:
m.Push(aaa.USERROLE, aaa.VOID)
m.Push(aaa.USERROLE, aaa.TECH)
m.Push(aaa.USERROLE, aaa.ROOT)
case kit.MDB_TEMPLATE: case kit.MDB_TEMPLATE:
m.Push(kit.MDB_TEMPLATE, "base") m.Push(kit.MDB_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)
default: default:
m.Cmdy(mdb.INPUTS, RIVER, "", mdb.HASH, arg) m.Cmdy(mdb.INPUTS, RIVER, "", mdb.HASH, arg)
} }
}}, }},
mdb.CREATE: {Name: "create type=public,protected,private name=hi text=hello template=base", Help: "添加", Hand: func(m *ice.Message, arg ...string) {
h := m.Cmdx(mdb.INSERT, RIVER, "", mdb.HASH, arg)
m.Option(ice.MSG_RIVER, h)
m.Echo(h)
m.Conf(RIVER, kit.Keys(kit.MDB_HASH, h, NODE, kit.Keym(kit.MDB_SHORT)), kit.MDB_NAME)
m.Conf(RIVER, kit.Keys(kit.MDB_HASH, h, OCEAN, kit.Keym(kit.MDB_SHORT)), aaa.USERNAME)
m.Cmd(OCEAN, mdb.INSERT, aaa.USERNAME, m.Option(ice.MSG_USERNAME))
kit.Fetch(m.Confv(RIVER, kit.Keym(kit.MDB_TEMPLATE, kit.Select("base", m.Option(kit.MDB_TEMPLATE)))), func(storm string, value interface{}) {
h := m.Cmdx(STORM, mdb.CREATE, kit.MDB_TYPE, PUBLIC, kit.MDB_NAME, storm, kit.MDB_TEXT, storm)
kit.Fetch(value, func(index int, value string) {
m.Search(value, func(p *ice.Context, s *ice.Context, key string, cmd *ice.Command) {
m.Cmd(STORM, mdb.INSERT, kit.MDB_HASH, h, ice.CTX, s.Cap(ice.CTX_FOLLOW), ice.CMD, key, kit.MDB_HELP, cmd.Help)
})
})
})
}},
cli.START: {Name: "start name=hi repos template", Help: "启动", Hand: func(m *ice.Message, arg ...string) {
m.Cmdy(m.Space(m.Option(ice.POD)), web.DREAM, cli.START, arg)
}},
aaa.INVITE: {Name: "invite", Help: "脚本", Hand: func(m *ice.Message, arg ...string) { aaa.INVITE: {Name: "invite", Help: "脚本", Hand: func(m *ice.Message, arg ...string) {
m.Cmdy(code.PUBLISH, ice.CONTEXTS) m.Cmdy(code.PUBLISH, ice.CONTEXTS)
m.Cmd(code.PUBLISH, mdb.CREATE, kit.MDB_FILE, ice.BIN_ICE_SH) m.Cmd(code.PUBLISH, mdb.CREATE, kit.MDB_FILE, ice.BIN_ICE_SH)
m.Cmd(code.PUBLISH, mdb.CREATE, kit.MDB_FILE, ice.BIN_ICE_BIN) m.Cmd(code.PUBLISH, mdb.CREATE, kit.MDB_FILE, ice.BIN_ICE_BIN)
}}, }},
cli.START: {Name: "start name=hi repos template", Help: "启动", Hand: func(m *ice.Message, arg ...string) {
m.Cmdy(m.Space(m.Option(ice.POD)), web.DREAM, cli.START, arg)
}},
SHARE: {Name: "share", Help: "共享", Hand: func(m *ice.Message, arg ...string) { SHARE: {Name: "share", Help: "共享", Hand: func(m *ice.Message, arg ...string) {
_header_share(m, arg...) _header_share(m, arg...)
}}, }},
}, mdb.HashAction()), Hand: func(m *ice.Message, c *ice.Context, cmd string, arg ...string) { }, mdb.HashAction()), Hand: func(m *ice.Message, c *ice.Context, cmd string, arg ...string) {
m.Cmdy(mdb.SELECT, RIVER, "", mdb.HASH, kit.MDB_HASH, arg) mdb.HashSelect(m, arg...)
m.PushAction(mdb.REMOVE)
}}, }},
}, }})
})
} }

View File

@ -11,29 +11,23 @@ import (
const SCAN = "scan" const SCAN = "scan"
func init() { func init() {
Index.Merge(&ice.Context{ Index.Merge(&ice.Context{Configs: map[string]*ice.Config{
Configs: map[string]*ice.Config{ SCAN: {Name: SCAN, Help: "扫码", Value: kit.Data(
SCAN: {Name: SCAN, Help: "二维码", Value: kit.Data(
kit.MDB_SHORT, kit.MDB_TEXT, kit.MDB_FIELD, "time,hash,type,name,text", kit.MDB_SHORT, kit.MDB_TEXT, kit.MDB_FIELD, "time,hash,type,name,text",
)}, )},
}, }, Commands: map[string]*ice.Command{
Commands: map[string]*ice.Command{ SCAN: {Name: "scan hash auto scanQRCode scanQRCode0", Help: "扫码", Meta: kit.Dict(
SCAN: {Name: "scan hash auto scanQRCode scanQRCode0", Help: "二维码", Action: ice.MergeAction(map[string]*ice.Action{ ice.Display("scan.js"),
"scanQRCode0": {Name: "create", Help: "本机扫码", Hand: func(m *ice.Message, arg ...string) {}}, ), Action: ice.MergeAction(map[string]*ice.Action{
"scanQRCode": {Name: "create", Help: "扫码", Hand: func(m *ice.Message, arg ...string) { "scanQRCode0": {Name: "scan create", Help: "本机扫码"},
m.Cmdy(mdb.INSERT, m.Prefix(SCAN), "", mdb.HASH, arg) "scanQRCode": {Name: "scan create", Help: "扫码"},
}}, mdb.CREATE: {Name: "create type=text name=hi text:textarea=hi", Help: "添加"},
mdb.CREATE: {Name: "create type=text name=hi text:textarea=hi", Help: "添加", Hand: func(m *ice.Message, arg ...string) {
m.Cmdy(mdb.INSERT, m.Prefix(SCAN), "", mdb.HASH, arg)
}},
}, mdb.HashAction()), Hand: func(m *ice.Message, c *ice.Context, cmd string, arg ...string) { }, mdb.HashAction()), Hand: func(m *ice.Message, c *ice.Context, cmd string, arg ...string) {
m.Fields(len(arg), m.Conf(SCAN, kit.META_FIELD)) if mdb.HashSelect(m, arg...); len(arg) > 0 {
if m.Cmdy(mdb.SELECT, m.Prefix(SCAN), "", mdb.HASH, kit.MDB_HASH, arg); len(arg) > 0 {
m.PushScript(ssh.SCRIPT, m.Append(kit.MDB_TEXT)) m.PushScript(ssh.SCRIPT, m.Append(kit.MDB_TEXT))
m.PushQRCode(cli.QRCODE, m.Append(kit.MDB_TEXT)) m.PushQRCode(cli.QRCODE, m.Append(kit.MDB_TEXT))
} }
m.PushAction(mdb.REMOVE) m.PushAction(mdb.REMOVE)
}}, }},
}, }})
})
} }

18
core/chat/scan.js Normal file
View File

@ -0,0 +1,18 @@
Volcanos("onimport", {help: "导入数据", list: [], _init: function(can, msg, list, cb, target) {
can.onmotion.clear(can)
can.onappend.table(can, msg)
can.onappend.board(can, msg)
can.base.isFunc(cb) && cb(msg)
},
})
Volcanos("onaction", {help: "控件交互", list: [],
scanQRCode: function(event, can, button) { can.user.agent.scanQRCode(function(text, data) {
var msg = can.request(event, data)
can.run(event, can.base.Simple(ctx.ACTION, data.action||button, data), function(msg) {
can.user.toast(can, text, "添加成功"), can.Update()
}, true)
}, can) },
scanQRCode0: function(event, can) { can.user.agent.scanQRCode() },
})
Volcanos("onexport", {help: "导出数据", list: []})

View File

@ -7,19 +7,17 @@ import (
kit "shylinux.com/x/toolkits" kit "shylinux.com/x/toolkits"
) )
const P_SEARCH = "/search"
func init() { func init() {
Index.Merge(&ice.Context{Configs: map[string]*ice.Config{ Index.Merge(&ice.Context{Configs: map[string]*ice.Config{
P_SEARCH: {Name: P_SEARCH, Help: "搜索", Value: kit.Data(kit.MDB_SHORT, kit.MDB_NAME)}, "search": {Name: "search", Help: "搜索", Value: kit.Data(kit.MDB_SHORT, kit.MDB_NAME)},
}, Commands: map[string]*ice.Command{ }, Commands: map[string]*ice.Command{
P_SEARCH: {Name: P_SEARCH, Help: "搜索引擎", Action: ice.MergeAction(map[string]*ice.Action{ "/search": {Name: "/search", Help: "搜索引擎", Action: ice.MergeAction(map[string]*ice.Action{
mdb.SEARCH: {Name: "search type name text", Help: "搜索", Hand: func(m *ice.Message, arg ...string) { mdb.SEARCH: {Name: "search type name text", Help: "搜索", Hand: func(m *ice.Message, arg ...string) {
m.Richs(P_SEARCH, "", kit.MDB_FOREACH, func(key string, value map[string]interface{}) { m.Richs("/search", "", kit.MDB_FOREACH, func(key string, value map[string]interface{}) {
if value = kit.GetMeta(value); arg[1] != "" && !kit.Contains(value[kit.MDB_NAME], arg[1]) { if value = kit.GetMeta(value); arg[1] != "" && !kit.Contains(value[kit.MDB_NAME], arg[1]) {
return return
} }
m.PushSearch(ice.CMD, P_SEARCH, value) m.PushSearch(ice.CMD, "/search", value)
}) })
}}, }},
mdb.RENDER: {Name: "render", Help: "渲染", Hand: func(m *ice.Message, arg ...string) { mdb.RENDER: {Name: "render", Help: "渲染", Hand: func(m *ice.Message, arg ...string) {
@ -32,7 +30,8 @@ func init() {
if m.Cmdy(m.Space(m.Option(ice.POD)), mdb.SEARCH, arg); arg[1] == "" { if m.Cmdy(m.Space(m.Option(ice.POD)), mdb.SEARCH, arg); arg[1] == "" {
return return
} }
m.Cmd(mdb.INSERT, m.Prefix(P_SEARCH), "", mdb.HASH, m.StatusTimeCount()
m.Cmd(mdb.INSERT, m.PrefixKey(), "", mdb.HASH,
kit.MDB_NAME, arg[1], kit.MDB_TYPE, arg[0], kit.MDB_TEXT, kit.Select("", arg, 2)) kit.MDB_NAME, arg[1], kit.MDB_TYPE, arg[0], kit.MDB_TEXT, kit.Select("", arg, 2))
}}, }},
}}) }})

View File

@ -8,79 +8,81 @@ import (
kit "shylinux.com/x/toolkits" kit "shylinux.com/x/toolkits"
) )
func _storm_key(m *ice.Message, key ...interface{}) string {
return _river_key(m, STORM, kit.MDB_HASH, kit.Keys(key))
}
const STORM = "storm" const STORM = "storm"
const TOOL = "tool"
func init() { func init() {
Index.Merge(&ice.Context{Commands: map[string]*ice.Command{ Index.Merge(&ice.Context{Commands: map[string]*ice.Command{
TOOL: {Name: "tool hash id auto insert create", Help: "工具", Action: map[string]*ice.Action{ STORM: {Name: "storm hash id auto insert create", Help: "工具", Action: map[string]*ice.Action{
mdb.CREATE: {Name: "create type=public,protected,private name=hi text=hello", Help: "创建", Hand: func(m *ice.Message, arg ...string) {
m.Cmdy(mdb.INSERT, RIVER, _river_key(m, TOOL), mdb.HASH, arg)
}},
mdb.INSERT: {Name: "insert hash pod ctx cmd help", Help: "添加", Hand: func(m *ice.Message, arg ...string) {
m.Cmdy(mdb.INSERT, RIVER, _river_key(m, TOOL, m.OptionSimple(kit.MDB_HASH)), mdb.LIST, arg[2:])
}},
mdb.MODIFY: {Name: "modify", Help: "编辑", Hand: func(m *ice.Message, arg ...string) {
if m.Option(kit.MDB_ID) == "" {
m.Cmdy(mdb.MODIFY, RIVER, _river_key(m, TOOL), mdb.HASH, m.OptionSimple(kit.MDB_HASH), arg)
} else {
m.Cmdy(mdb.MODIFY, RIVER, _river_key(m, TOOL, m.OptionSimple(kit.MDB_HASH)), mdb.LIST, m.OptionSimple(kit.MDB_ID), arg)
}
}},
mdb.REMOVE: {Name: "remove", Help: "删除", Hand: func(m *ice.Message, arg ...string) {
m.Cmdy(mdb.DELETE, RIVER, _river_key(m, TOOL), mdb.HASH, m.OptionSimple(kit.MDB_HASH))
}},
mdb.EXPORT: {Name: "export", Help: "导出", Hand: func(m *ice.Message, arg ...string) {
if m.Option(kit.MDB_ID) != "" {
msg := m.Cmd(TOOL, m.Option(kit.MDB_HASH), m.Option(kit.MDB_ID))
cmd := kit.Keys(msg.Append(ice.CTX), msg.Append(ice.CMD))
_action_domain(m, cmd, m.Option(kit.MDB_HASH))
m.Cmdy(m.Space(msg.Append(ice.POD)), cmd, mdb.EXPORT)
}
}},
mdb.IMPORT: {Name: "import", Help: "导入", Hand: func(m *ice.Message, arg ...string) {
if m.Option(kit.MDB_ID) != "" {
msg := m.Cmd(TOOL, m.Option(kit.MDB_HASH), m.Option(kit.MDB_ID))
cmd := kit.Keys(msg.Append(ice.CTX), msg.Append(ice.CMD))
_action_domain(m, cmd, m.Option(kit.MDB_HASH))
m.Cmdy(m.Space(msg.Append(ice.POD)), cmd, mdb.IMPORT)
}
}},
mdb.INPUTS: {Name: "inputs", Help: "补全", Hand: func(m *ice.Message, arg ...string) { mdb.INPUTS: {Name: "inputs", Help: "补全", Hand: func(m *ice.Message, arg ...string) {
if cli.Inputs(m, arg[0]) { if cli.Inputs(m, arg[0]) {
return return
} }
switch arg[0] { switch arg[0] {
case kit.MDB_HASH: case kit.MDB_HASH:
m.Cmdy(TOOL, ice.OptionFields("hash,name")) m.Cmdy(STORM, 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.REMOVE: {Name: "remove", Help: "删除", Hand: func(m *ice.Message, arg ...string) {
m.Cmdy(mdb.DELETE, RIVER, _river_key(m, STORM), mdb.HASH, m.OptionSimple(kit.MDB_HASH))
}},
mdb.INSERT: {Name: "insert hash pod ctx cmd help", Help: "添加", Hand: func(m *ice.Message, arg ...string) {
m.Cmdy(mdb.INSERT, RIVER, _storm_key(m, m.Option(kit.MDB_HASH)), mdb.LIST, arg[2:])
}},
mdb.MODIFY: {Name: "modify", Help: "编辑", Hand: func(m *ice.Message, arg ...string) {
if m.Option(kit.MDB_ID) == "" {
m.Cmdy(mdb.MODIFY, RIVER, _river_key(m, STORM), mdb.HASH, m.OptionSimple(kit.MDB_HASH), arg)
} else {
m.Cmdy(mdb.MODIFY, RIVER, _storm_key(m, m.Option(kit.MDB_HASH)), mdb.LIST, m.OptionSimple(kit.MDB_ID), arg)
}
}},
mdb.EXPORT: {Name: "export", Help: "导出", Hand: func(m *ice.Message, arg ...string) {
if m.Option(kit.MDB_ID) == "" {
return
}
msg := m.Cmd(STORM, m.Option(kit.MDB_HASH), m.Option(kit.MDB_ID))
cmd := kit.Keys(msg.Append(ice.CTX), msg.Append(ice.CMD))
_action_domain(m, cmd, m.Option(kit.MDB_HASH))
m.Cmdy(cmd, mdb.EXPORT)
}},
mdb.IMPORT: {Name: "import", Help: "导入", Hand: func(m *ice.Message, arg ...string) {
if m.Option(kit.MDB_ID) == "" {
return
}
msg := m.Cmd(STORM, m.Option(kit.MDB_HASH), m.Option(kit.MDB_ID))
cmd := kit.Keys(msg.Append(ice.CTX), msg.Append(ice.CMD))
_action_domain(m, cmd, m.Option(kit.MDB_HASH))
m.Cmdy(cmd, mdb.IMPORT)
}},
}, 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 len(arg) == 0 { if len(arg) == 0 { // 应用列表
m.OptionFields("time,hash,type,name,count") m.OptionFields("time,hash,type,name,count")
m.Cmdy(mdb.SELECT, RIVER, _river_key(m, TOOL), mdb.HASH) m.Cmdy(mdb.SELECT, RIVER, _river_key(m, STORM), mdb.HASH)
m.PushAction(mdb.REMOVE) m.PushAction(mdb.REMOVE)
m.Sort(kit.MDB_NAME) m.Sort(kit.MDB_NAME)
return // 应用列表 return
} }
m.OptionFields("time,id,pod,ctx,cmd,arg,display,style") m.OptionFields("time,id,pod,ctx,cmd,arg,display,style")
msg := m.Cmd(mdb.SELECT, RIVER, _river_key(m, TOOL, kit.MDB_HASH, arg[0]), mdb.LIST, kit.MDB_ID, kit.Select("", arg, 1)) msg := m.Cmd(mdb.SELECT, RIVER, _storm_key(m, arg[0]), mdb.LIST, kit.MDB_ID, kit.Select("", arg, 1))
if len(msg.Appendv(ice.CMD)) == 0 && len(arg) > 1 { if msg.Length() == 0 && len(arg) > 1 { // 虚拟群组
msg.Push(ice.CMD, arg[1]) msg.Push(ice.CMD, arg[1])
} }
if len(arg) > 2 && arg[2] == ice.RUN { if len(arg) > 2 && arg[2] == ice.RUN { // 执行命令
m.Cmdy(m.Space(msg.Append(ice.POD)), kit.Keys(msg.Append(ice.CTX), msg.Append(ice.CMD)), arg[3:]) m.Cmdy(m.Space(kit.Select(m.Option(ice.POD), msg.Append(ice.POD))),
return // 执行命令 kit.Keys(msg.Append(ice.CTX), msg.Append(ice.CMD)), arg[3:])
return
} }
if m.Copy(msg); len(arg) < 2 { if m.Copy(msg); len(arg) == 1 { // 命令列表
m.PushAction(mdb.EXPORT, mdb.IMPORT) m.PushAction(mdb.EXPORT, mdb.IMPORT)
return // 命令列表
} }
// 命令插件 // 命令插件

View File

@ -115,8 +115,8 @@ func init() {
if strings.HasPrefix(key, "/") { if strings.HasPrefix(key, "/") {
key = ice.USR_VOLCANOS + key key = ice.USR_VOLCANOS + key
} }
m.Warn(os.MkdirAll(path.Dir(key), ice.MOD_DIR) != nil, "key: ", key) m.Warn(os.MkdirAll(path.Dir(key), ice.MOD_DIR), "mkdir", key)
m.Warn(ioutil.WriteFile(key, value, ice.MOD_FILE) != nil, "key: ", key) m.Warn(ioutil.WriteFile(key, value, ice.MOD_FILE), "write", key)
} }
}}, }},
}, Hand: func(m *ice.Message, c *ice.Context, cmd string, arg ...string) { }, Hand: func(m *ice.Message, c *ice.Context, cmd string, arg ...string) {

View File

@ -13,7 +13,7 @@ import (
) )
func _inner_list(m *ice.Message, ext, file, dir string, arg ...string) { func _inner_list(m *ice.Message, ext, file, dir string, arg ...string) {
if m.Warn(!m.Right(dir, file), ice.ErrNotRight, path.Join(dir, file)) { if !m.Right(dir, file) {
return // 没有权限 return // 没有权限
} }
if m.Cmdy(mdb.RENDER, ext, file, dir, arg); m.Result() != "" { if m.Cmdy(mdb.RENDER, ext, file, dir, arg); m.Result() != "" {
@ -25,7 +25,7 @@ func _inner_list(m *ice.Message, ext, file, dir string, arg ...string) {
} }
} }
func _inner_show(m *ice.Message, ext, file, dir string, arg ...string) { func _inner_show(m *ice.Message, ext, file, dir string, arg ...string) {
if m.Warn(!m.Right(dir, file), ice.ErrNotRight, path.Join(dir, file)) { if !m.Right(dir, file) {
return // 没有权限 return // 没有权限
} }
if m.Cmdy(mdb.ENGINE, ext, file, dir, arg); m.Result() != "" { if m.Cmdy(mdb.ENGINE, ext, file, dir, arg); m.Result() != "" {
@ -95,6 +95,12 @@ func init() {
nfs.Dir(m, kit.MDB_PATH) nfs.Dir(m, kit.MDB_PATH)
return return
} }
if !strings.HasSuffix(arg[0], ice.PS) {
arg[1] = kit.Slice(strings.Split(arg[0], ice.PS), -1)[0]
arg[0] = strings.TrimSuffix(arg[0], arg[1])
m.ProcessRewrite("path", arg[0], "file", arg[1])
return
}
_inner_list(m, kit.Ext(arg[1]), arg[1], arg[0]) _inner_list(m, kit.Ext(arg[1]), arg[1], arg[0])
}}, }},
}, Configs: map[string]*ice.Config{ }, Configs: map[string]*ice.Config{

View File

@ -24,7 +24,7 @@ func init() {
return return
} }
if arg = kit.Split(strings.Join(arg, " ")); !m.Warn(!m.Right(arg)) { if arg = kit.Split(strings.Join(arg, " ")); m.Right(arg) {
if m.Cmdy(arg); len(m.Appendv(ice.MSG_APPEND)) == 0 && len(m.Resultv()) == 0 { if m.Cmdy(arg); len(m.Appendv(ice.MSG_APPEND)) == 0 && len(m.Resultv()) == 0 {
m.Cmdy(cli.SYSTEM, arg) m.Cmdy(cli.SYSTEM, arg)
} }

View File

@ -18,6 +18,7 @@ func _publish(file ...string) string {
return path.Join(ice.USR_PUBLISH, path.Join(file...)) return path.Join(ice.USR_PUBLISH, path.Join(file...))
} }
const DEVPACK = "devpack"
const WEBPACK = "webpack" const WEBPACK = "webpack"
func init() { func init() {
@ -85,15 +86,11 @@ func init() {
} }
m.Cmd(nfs.COPY, _volcanos("page/cmd.css"), _volcanos("page/index.css"), _volcanos("page/cache.css")) m.Cmd(nfs.COPY, _volcanos("page/cmd.css"), _volcanos("page/index.css"), _volcanos("page/cache.css"))
m.Cmd(nfs.COPY, _volcanos("page/cmd.js"), _volcanos("proto.js"), _volcanos("page/cache.js")) m.Cmd(nfs.COPY, _volcanos("page/cmd.js"), _volcanos("proto.js"), _volcanos("frame.js"), _volcanos("page/cache.js"))
}}, }},
mdb.PRUNES: {Name: "prunes", Help: "清理", Hand: func(m *ice.Message, arg ...string) { mdb.REMOVE: {Name: "remove", Help: "删除", Hand: func(m *ice.Message, arg ...string) {
m.Cmd(nfs.SAVE, path.Join(ice.USR_VOLCANOS, "page/cache.css"), "") m.Cmd(nfs.SAVE, _volcanos("page/cache.js"))
m.Cmd(nfs.SAVE, path.Join(ice.USR_VOLCANOS, "page/cache.js"), "") m.Cmd(nfs.SAVE, _volcanos("page/cache.css"))
}},
"unpack": {Name: "unpack", Help: "开发模式", Hand: func(m *ice.Message, arg ...string) {
m.Cmd(nfs.SAVE, path.Join(ice.USR_VOLCANOS, "page/cache.js"))
m.Cmd(nfs.SAVE, path.Join(ice.USR_VOLCANOS, "page/cache.css"))
m.Cmd(nfs.COPY, _volcanos("page/cmd.css"), _volcanos("page/index.css"), _volcanos("page/cache.css")) m.Cmd(nfs.COPY, _volcanos("page/cmd.css"), _volcanos("page/index.css"), _volcanos("page/cache.css"))
m.Cmd(nfs.COPY, _volcanos("page/cmd.js"), _volcanos("proto.js"), _volcanos("page/cache.js")) m.Cmd(nfs.COPY, _volcanos("page/cmd.js"), _volcanos("proto.js"), _volcanos("page/cache.js"))
}}, }},

View File

@ -81,7 +81,7 @@ func (m *Message) Call(sync bool, cb func(*Message) *Message) *Message {
p := kit.Select("10s", m.Option(kit.MDB_TIMEOUT)) p := kit.Select("10s", m.Option(kit.MDB_TIMEOUT))
t := time.AfterFunc(kit.Duration(p), func() { t := time.AfterFunc(kit.Duration(p), func() {
m.Warn(true, "timeout", p, "of", m.Detailv()) m.Warn(true, ErrTimeout, m.Detailv())
m.Back(nil) m.Back(nil)
wait <- false wait <- false
}) })
@ -136,9 +136,9 @@ func (m *Message) Event(key string, arg ...string) *Message {
return m return m
} }
func (m *Message) Right(arg ...interface{}) bool { func (m *Message) Right(arg ...interface{}) bool {
return m.Option(MSG_USERROLE) == "root" || !m.Warn(m.Cmdx("role", "right", key := strings.ReplaceAll(kit.Keys(arg...), PS, PT)
m.Option(MSG_USERROLE), strings.ReplaceAll(kit.Keys(arg...), PS, PT)) != OK, return m.Option(MSG_USERROLE) == "root" || !m.Warn(m.Cmdx("role", "right", m.Option(MSG_USERROLE), key) != OK,
ErrNotRight, m.Option(MSG_USERROLE), OF, kit.Join(kit.Simple(arg), PT), " at ", kit.FileLine(2, 3)) ErrNotRight, kit.Join(kit.Simple(arg), PT), "userrole", m.Option(MSG_USERROLE), "fileline", kit.FileLine(2, 3))
} }
func (m *Message) Space(arg interface{}) []string { func (m *Message) Space(arg interface{}) []string {
if arg == nil || arg == "" || kit.Format(arg) == m.Conf("runtime", "node.name") { if arg == nil || arg == "" || kit.Format(arg) == m.Conf("runtime", "node.name") {

View File

@ -106,7 +106,9 @@ func Run(arg ...string) string {
} }
Index.root, Pulse.root = Index, Pulse Index.root, Pulse.root = Index, Pulse
Pulse.Option(CACHE_LIMIT, "10")
log.LogDisable = false
switch Index.Merge(Index).Begin(Pulse.Spawn(), arg...); kit.Select("", arg, 0) { switch Index.Merge(Index).Begin(Pulse.Spawn(), arg...); kit.Select("", arg, 0) {
case "serve", "space": case "serve", "space":
if log.LogDisable = false; Index.Start(Pulse, arg...) { if log.LogDisable = false; Index.Start(Pulse, arg...) {

36
logs.go
View File

@ -1,6 +1,7 @@
package ice package ice
import ( import (
"io"
"runtime" "runtime"
"strings" "strings"
"time" "time"
@ -52,12 +53,13 @@ func (m *Message) log(level string, str string, arg ...interface{}) *Message {
return m return m
} }
func (m *Message) join(arg ...interface{}) string { func (m *Message) join(arg ...interface{}) string {
args := kit.Simple(arg...)
list := []string{} list := []string{}
for i := 0; i < len(arg); i += 2 { for i := 0; i < len(args); i += 2 {
if i == len(arg)-1 { if i == len(args)-1 {
list = append(list, kit.Format(arg[i])) list = append(list, args[i])
} else { } else {
list = append(list, kit.Format(arg[i])+":", kit.Format(arg[i+1])) list = append(list, args[i]+kit.Select("", ":", !strings.HasSuffix(strings.TrimSpace(args[i]), ":")), args[i+1])
} }
} }
return kit.Join(list, SP) return kit.Join(list, SP)
@ -73,14 +75,23 @@ func (m *Message) Cost(arg ...interface{}) *Message {
list := []string{m.FormatCost(), m.join(arg...)} list := []string{m.FormatCost(), m.join(arg...)}
return m.log(LOG_COST, kit.Join(list, SP)) return m.log(LOG_COST, kit.Join(list, SP))
} }
func (m *Message) Warn(err bool, arg ...interface{}) bool { func (m *Message) Warn(err interface{}, arg ...interface{}) bool {
if !err || len(m.meta[MSG_RESULT]) > 0 && m.meta[MSG_RESULT][0] == ErrWarn { switch err := err.(type) {
return err case error:
if err == io.EOF {
return false
} }
arg = append(arg, "err", err)
m.meta[MSG_RESULT] = kit.Simple(ErrWarn, arg) case bool:
m.log(LOG_WARN, m.join(kit.Simple(arg))) if !err {
return err return false
}
case nil:
return false
}
m.meta[MSG_RESULT] = kit.Simple(ErrWarn, kit.Simple(arg...))
m.log(LOG_WARN, m.join(kit.Simple(arg...)))
return true
} }
func (m *Message) Error(err bool, str string, arg ...interface{}) bool { func (m *Message) Error(err bool, str string, arg ...interface{}) bool {
if err { if err {
@ -148,6 +159,9 @@ func (m *Message) FormatSize() string {
func (m *Message) FormatMeta() string { func (m *Message) FormatMeta() string {
return kit.Format(m.meta) return kit.Format(m.meta)
} }
func (m *Message) FormatsMeta() string {
return kit.Formats(m.meta)
}
func (m *Message) FormatStack() string { func (m *Message) FormatStack() string {
pc := make([]uintptr, 100) pc := make([]uintptr, 100)
frames := runtime.CallersFrames(pc[:runtime.Callers(5, pc)]) frames := runtime.CallersFrames(pc[:runtime.Callers(5, pc)])

12
meta.go
View File

@ -55,13 +55,21 @@ func (m *Message) Add(key string, arg ...string) *Message {
m.meta[key] = append(m.meta[key], arg...) m.meta[key] = append(m.meta[key], arg...)
case MSG_OPTION, MSG_APPEND: case MSG_OPTION, MSG_APPEND:
if len(arg) > 0 { if len(arg) == 0 {
break
}
if key == MSG_APPEND {
if i := kit.IndexOf(m.meta[MSG_OPTION], arg[0]); i > -1 {
m.meta[MSG_OPTION][i] = ""
delete(m.meta, arg[0])
}
}
if kit.IndexOf(m.meta[key], arg[0]) == -1 { if kit.IndexOf(m.meta[key], arg[0]) == -1 {
m.meta[key] = append(m.meta[key], arg[0]) m.meta[key] = append(m.meta[key], arg[0])
} }
m.meta[arg[0]] = append(m.meta[arg[0]], arg[1:]...) m.meta[arg[0]] = append(m.meta[arg[0]], arg[1:]...)
} }
}
return m return m
} }
func (m *Message) Cut(fields ...string) *Message { func (m *Message) Cut(fields ...string) *Message {

View File

@ -185,7 +185,7 @@ func (m *Message) cmd(arg ...interface{}) *Message {
}) })
} }
m.Warn(!ok, ErrNotFound, list) m.Warn(!ok, ErrNotFound, kit.Format(list))
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 {
@ -219,7 +219,7 @@ func (c *Context) _cmd(m *Message, cmd *Command, key string, k string, h *Action
return m return m
} }
if k == RUN && m.Warn(!m.Right(arg), ErrNotRight, arg) { if k == RUN && !m.Right(arg) {
return m return m
} }

View File

@ -41,7 +41,7 @@ func init() {
return return
} }
if m.Warn(m.Option(SID, strings.TrimSpace(m.Option(SID))) == "", ice.ErrNotLogin) { if m.Warn(m.Option(SID, strings.TrimSpace(m.Option(SID))) == "", ice.ErrNotLogin, arg) {
return return
} }
@ -49,7 +49,7 @@ func init() {
ice.OptionFields(m.Conf(SESS, kit.META_FIELD))) ice.OptionFields(m.Conf(SESS, kit.META_FIELD)))
m.Option(aaa.USERNAME, msg.Append(aaa.USERNAME)) m.Option(aaa.USERNAME, msg.Append(aaa.USERNAME))
m.Option(tcp.HOSTNAME, msg.Append(tcp.HOSTNAME)) m.Option(tcp.HOSTNAME, msg.Append(tcp.HOSTNAME))
m.Warn(m.Option(aaa.USERNAME) == "", ice.ErrNotLogin) m.Warn(m.Option(aaa.USERNAME) == "", ice.ErrNotLogin, arg)
}}, }},
"/qrcode": {Name: "/qrcode", Help: "二维码", Hand: func(m *ice.Message, c *ice.Context, cmd string, arg ...string) { "/qrcode": {Name: "/qrcode", Help: "二维码", Hand: func(m *ice.Message, c *ice.Context, cmd string, arg ...string) {
m.Cmdy(cli.QRCODE, m.Option(kit.MDB_TEXT), m.Option(cli.FG), m.Option(cli.BG)) m.Cmdy(cli.QRCODE, m.Option(kit.MDB_TEXT), m.Option(cli.FG), m.Option(cli.BG))

View File

@ -21,7 +21,7 @@ func init() {
text, link, list := kit.Select("", arg, 3), kit.MergeURL2(m.Conf(web.SHARE, kit.Keym(kit.MDB_DOMAIN)), "/chat/lark/sso"), []string{} text, link, list := kit.Select("", arg, 3), kit.MergeURL2(m.Conf(web.SHARE, kit.Keym(kit.MDB_DOMAIN)), "/chat/lark/sso"), []string{}
if len(arg) == 0 { if len(arg) == 0 {
m.Cmd("web.chat./river").Table(func(index int, val map[string]string, head []string) { m.Cmd("web.chat./river").Table(func(index int, val map[string]string, head []string) {
m.Cmd("web.chat./river", val[kit.MDB_HASH], chat.TOOL).Table(func(index int, value map[string]string, head []string) { m.Cmd("web.chat./river", val[kit.MDB_HASH], chat.STORM).Table(func(index int, value map[string]string, head []string) {
list = append(list, kit.Keys(val[kit.MDB_NAME], value[kit.MDB_NAME]), list = append(list, kit.Keys(val[kit.MDB_NAME], value[kit.MDB_NAME]),
ice.CMD, kit.Format([]string{HOME, val[kit.MDB_HASH], value[kit.MDB_HASH], val[kit.MDB_NAME] + "." + value[kit.MDB_NAME]})) ice.CMD, kit.Format([]string{HOME, val[kit.MDB_HASH], value[kit.MDB_HASH], val[kit.MDB_NAME] + "." + value[kit.MDB_NAME]}))
}) })
@ -30,7 +30,7 @@ func init() {
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])
link = kit.MergeURL(link, chat.RIVER, arg[0], chat.STORM, arg[1]) link = kit.MergeURL(link, chat.RIVER, arg[0], chat.STORM, arg[1])
m.Cmd("web.chat./river", arg[0], chat.TOOL, arg[1]).Table(func(index int, value map[string]string, head []string) { m.Cmd("web.chat./river", arg[0], chat.STORM, arg[1]).Table(func(index int, value map[string]string, head []string) {
list = append(list, value[ice.CMD], ice.CMD, kit.Keys(value[ice.CTX], value[ice.CMD])) list = append(list, value[ice.CMD], ice.CMD, kit.Keys(value[ice.CTX], value[ice.CMD]))
}) })
} }

View File

@ -36,8 +36,8 @@ func _ssh_config(m *ice.Message, h string) *ssh.ServerConfig {
if !strings.HasPrefix(value[kit.MDB_NAME], conn.User()+"@") { if !strings.HasPrefix(value[kit.MDB_NAME], conn.User()+"@") {
return return
} }
if s, e := base64.StdEncoding.DecodeString(value[kit.MDB_TEXT]); !m.Warn(e != nil, e) { if s, e := base64.StdEncoding.DecodeString(value[kit.MDB_TEXT]); !m.Warn(e) {
if pub, e := ssh.ParsePublicKey([]byte(s)); !m.Warn(e != nil, e) { if pub, e := ssh.ParsePublicKey([]byte(s)); !m.Warn(e) {
if bytes.Compare(pub.Marshal(), key.Marshal()) == 0 { if bytes.Compare(pub.Marshal(), key.Marshal()) == 0 {
m.Log_AUTH(tcp.HOSTPORT, conn.RemoteAddr(), aaa.USERNAME, conn.User(), tcp.HOSTNAME, value[kit.MDB_NAME]) m.Log_AUTH(tcp.HOSTPORT, conn.RemoteAddr(), aaa.USERNAME, conn.User(), tcp.HOSTNAME, value[kit.MDB_NAME])
@ -72,7 +72,7 @@ func _ssh_config(m *ice.Message, h string) *ssh.ServerConfig {
} }
func _ssh_accept(m *ice.Message, h string, c net.Conn) { func _ssh_accept(m *ice.Message, h string, c net.Conn) {
conn, chans, reqs, err := ssh.NewServerConn(c, _ssh_config(m, h)) conn, chans, reqs, err := ssh.NewServerConn(c, _ssh_config(m, h))
if m.Warn(err != nil, err) { if m.Warn(err) {
return return
} }
@ -80,7 +80,7 @@ func _ssh_accept(m *ice.Message, h string, c net.Conn) {
for ch := range chans { for ch := range chans {
channel, requests, err := ch.Accept() channel, requests, err := ch.Accept()
if m.Warn(err != nil, err) { if m.Warn(err) {
continue continue
} }

View File

@ -9,12 +9,12 @@ import (
"unsafe" "unsafe"
"github.com/kr/pty" "github.com/kr/pty"
"golang.org/x/crypto/ssh"
ice "shylinux.com/x/icebergs" ice "shylinux.com/x/icebergs"
"shylinux.com/x/icebergs/base/cli" "shylinux.com/x/icebergs/base/cli"
"shylinux.com/x/icebergs/base/mdb" "shylinux.com/x/icebergs/base/mdb"
"shylinux.com/x/icebergs/base/tcp" "shylinux.com/x/icebergs/base/tcp"
kit "shylinux.com/x/toolkits" kit "shylinux.com/x/toolkits"
"golang.org/x/crypto/ssh"
) )
type Winsize struct{ Height, Width, x, y uint16 } type Winsize struct{ Height, Width, x, y uint16 }
@ -38,7 +38,7 @@ func _ssh_handle(m *ice.Message, meta map[string]string, c net.Conn, channel ssh
list := []string{cli.PATH + "=" + os.Getenv(cli.PATH)} list := []string{cli.PATH + "=" + os.Getenv(cli.PATH)}
pty, tty, err := pty.Open() pty, tty, err := pty.Open()
if m.Warn(err != nil, err) { if m.Warn(err) {
return return
} }
defer tty.Close() defer tty.Close()

View File

@ -145,7 +145,7 @@ func _favor_modify(m *ice.Message, zone, id, pro, set, old string) {
m.Richs(FAVOR, nil, zone, func(key string, val map[string]interface{}) { m.Richs(FAVOR, nil, zone, func(key string, val map[string]interface{}) {
switch pro { switch pro {
case kit.MDB_ZONE, kit.MDB_ID, kit.MDB_TIME: case kit.MDB_ZONE, kit.MDB_ID, kit.MDB_TIME:
m.Warn(true, "deny modify %v", pro) m.Warn(true, ice.ErrNotRight, pro)
return return
} }
@ -363,7 +363,7 @@ func init() {
"/share/": {Name: "/share/", Help: "共享链", Hand: func(m *ice.Message, c *ice.Context, cmd string, arg ...string) { "/share/": {Name: "/share/", Help: "共享链", Hand: func(m *ice.Message, c *ice.Context, cmd string, arg ...string) {
m.Richs(SHARE, nil, kit.Select(m.Option(kit.SSH_SHARE), arg, 0), func(key string, value map[string]interface{}) { m.Richs(SHARE, nil, kit.Select(m.Option(kit.SSH_SHARE), arg, 0), func(key string, value map[string]interface{}) {
m.Log_SELECT(kit.MDB_META, SHARE, "arg", arg, "value", kit.Format(value)) m.Log_SELECT(kit.MDB_META, SHARE, "arg", arg, "value", kit.Format(value))
if m.Warn(m.Option(ice.MSG_USERROLE) != aaa.ROOT && kit.Time(kit.Format(value[kit.MDB_TIME])) < kit.Time(m.Time()), "expired") { if m.Warn(m.Option(ice.MSG_USERROLE) != aaa.ROOT && kit.Time(kit.Format(value[kit.MDB_TIME])) < kit.Time(m.Time()), ice.ErrExpire, arg) {
m.Echo("expired") m.Echo("expired")
return return
} }

View File

@ -39,12 +39,12 @@ func init() {
} }
} }
switch m.RenderResult(); m.R.URL.String() { switch m.RenderResult(); arg[0] {
case "/qrcode", "/input", "/sess": // 登录入口 case "/qrcode", "/input", "/sess": // 登录入口
return return
} }
if m.Warn(m.Option(SID, strings.TrimSpace(m.Option(SID))) == "", ice.ErrNotLogin) { if m.Warn(m.Option(SID, strings.TrimSpace(m.Option(SID))) == "", ice.ErrNotLogin, arg[0]) {
return return
} }
@ -52,7 +52,7 @@ func init() {
ice.OptionFields(m.Conf(SESS, kit.META_FIELD))) ice.OptionFields(m.Conf(SESS, kit.META_FIELD)))
m.Option(aaa.USERNAME, msg.Append(aaa.USERNAME)) m.Option(aaa.USERNAME, msg.Append(aaa.USERNAME))
m.Option(tcp.HOSTNAME, msg.Append(tcp.HOSTNAME)) m.Option(tcp.HOSTNAME, msg.Append(tcp.HOSTNAME))
m.Warn(m.Option(aaa.USERNAME) == "", ice.ErrNotLogin) m.Warn(m.Option(aaa.USERNAME) == "", ice.ErrNotLogin, arg[0])
}}, }},
"/sess": {Name: "/sess", Help: "会话", Action: map[string]*ice.Action{ "/sess": {Name: "/sess", Help: "会话", Action: map[string]*ice.Action{
aaa.LOGOUT: {Name: "logout", Help: "退出", Hand: func(m *ice.Message, arg ...string) { aaa.LOGOUT: {Name: "logout", Help: "退出", Hand: func(m *ice.Message, arg ...string) {

View File

@ -26,13 +26,10 @@ func init() {
msg := m.Cmd(BOT, arg[0]) msg := m.Cmd(BOT, arg[0])
check := kit.Sort([]string{msg.Append("token"), m.Option("nonce"), m.Option("timestamp"), m.Option("echostr")}) check := kit.Sort([]string{msg.Append("token"), m.Option("nonce"), m.Option("timestamp"), m.Option("echostr")})
sig := kit.Format(sha1.Sum([]byte(strings.Join(check, "")))) sig := kit.Format(sha1.Sum([]byte(strings.Join(check, ""))))
m.Debug("what %v", sig) if m.Warn(sig != m.Option("msg_signature"), ice.ErrNotRight, arg) {
m.Debug("what %v", check)
if m.Warn(sig != m.Option("msg_signature"), ice.ErrNotRight) {
// return // return
} }
m.Debug("what %v", msg.Append("ekey"))
aeskey, err := base64.RawURLEncoding.DecodeString(msg.Append("ekey")) aeskey, err := base64.RawURLEncoding.DecodeString(msg.Append("ekey"))
m.Assert(err) m.Assert(err)

View File

@ -45,7 +45,7 @@ const ACCESS = "access"
func init() { func init() {
Index.Merge(&ice.Context{Configs: map[string]*ice.Config{ Index.Merge(&ice.Context{Configs: map[string]*ice.Config{
ACCESS: {Name: ACCESS, Help: "认证", Value: kit.Data( ACCESS: {Name: ACCESS, Help: "认证", Value: kit.Data(
ssh.SCRIPT, "https://res.wx.qq.com/open/js/jweixin-1.6.0.js", ssh.SCRIPT, "/plugin/local/chat/wx.js",
tcp.SERVER, "https://api.weixin.qq.com", tcp.SERVER, "https://api.weixin.qq.com",
APPID, "", APPMM, "", "tokens", "", APPID, "", APPMM, "", "tokens", "",
)}, )},

View File

@ -13,7 +13,7 @@ import (
func _wx_check(m *ice.Message) bool { func _wx_check(m *ice.Message) bool {
check := kit.Sort([]string{m.Conf(ACCESS, "meta.tokens"), m.Option("timestamp"), m.Option("nonce")}) check := kit.Sort([]string{m.Conf(ACCESS, "meta.tokens"), m.Option("timestamp"), m.Option("nonce")})
if sig := kit.Format(sha1.Sum([]byte(strings.Join(check, "")))); m.Warn(sig != m.Option("signature"), ice.ErrNotRight) { if sig := kit.Format(sha1.Sum([]byte(strings.Join(check, "")))); m.Warn(sig != m.Option("signature"), ice.ErrNotRight, check) {
return false // 验证失败 return false // 验证失败
} }
if m.Option("echostr") != "" { if m.Option("echostr") != "" {
@ -74,7 +74,7 @@ func init() {
case TEXT: // 文本 case TEXT: // 文本
cmds := kit.Split(m.Option("Content")) cmds := kit.Split(m.Option("Content"))
if m.Warn(!m.Right(cmds), ice.ErrNotRight) { if !m.Right(cmds) {
cmds = []string{MENU, mdb.CREATE} cmds = []string{MENU, mdb.CREATE}
} }
m.Cmdy(TEXT, cmds) m.Cmdy(TEXT, cmds)

View File

@ -73,6 +73,23 @@ func (m *Message) RenderDownload(args ...interface{}) *Message {
func (m *Message) RenderIndex(serve, repos string, file ...string) *Message { func (m *Message) RenderIndex(serve, repos string, file ...string) *Message {
return m.RenderDownload(path.Join(m.Conf(serve, kit.Keym(repos, kit.MDB_PATH)), kit.Select(m.Conf(serve, kit.Keym(repos, kit.MDB_INDEX)), path.Join(file...)))) return m.RenderDownload(path.Join(m.Conf(serve, kit.Keym(repos, kit.MDB_PATH)), kit.Select(m.Conf(serve, kit.Keym(repos, kit.MDB_INDEX)), path.Join(file...))))
} }
func (m *Message) RenderCmd(index string, args ...interface{}) {
list := index
if index != "" {
list = kit.Format(kit.List(kit.Dict("index", index, "args", kit.Simple(args))))
}
m.RenderResult(kit.Format(`<!DOCTYPE html>
<head>
<meta name="viewport" content="width=device-width,initial-scale=0.8,user-scalable=no">
<meta charset="utf-8">
<link rel="stylesheet" type="text/css" href="/page/cmd.css">
</head>
<body>
<script src="/page/cmd.js"></script>
<script>cmd(%s)</script>
</body>
`, list))
}
func (m *Message) IsCliUA() bool { func (m *Message) IsCliUA() bool {
if m.Option(MSG_USERUA) == "" || !strings.HasPrefix(m.Option(MSG_USERUA), "Mozilla/5.0") { if m.Option(MSG_USERUA) == "" || !strings.HasPrefix(m.Option(MSG_USERUA), "Mozilla/5.0") {

48
type.go
View File

@ -105,45 +105,65 @@ func (c *Context) Merge(s *Context) *Context {
if c.Commands[CTX_EXIT] == nil { if c.Commands[CTX_EXIT] == nil {
c.Commands[CTX_EXIT] = &Command{Hand: func(m *Message, c *Context, cmd string, arg ...string) { m.Save() }} c.Commands[CTX_EXIT] = &Command{Hand: func(m *Message, c *Context, cmd string, arg ...string) { m.Save() }}
} }
for k, v := range s.Commands {
if p, ok := c.Commands[k]; ok && s != c { for key, cmd := range s.Commands {
switch last, next := p.Hand, v.Hand; k { if p, ok := c.Commands[key]; ok && s != c {
switch last, next := p.Hand, cmd.Hand; key {
case CTX_INIT: case CTX_INIT:
v.Hand = func(m *Message, c *Context, key string, arg ...string) { cmd.Hand = func(m *Message, c *Context, key string, arg ...string) {
last(m, c, key, arg...) last(m, c, key, arg...)
next(m, c, key, arg...) next(m, c, key, arg...)
} }
case CTX_EXIT: case CTX_EXIT:
v.Hand = func(m *Message, c *Context, key string, arg ...string) { cmd.Hand = func(m *Message, c *Context, key string, arg ...string) {
next(m, c, key, arg...) next(m, c, key, arg...)
last(m, c, key, arg...) last(m, c, key, arg...)
} }
} }
} }
if v.Meta == nil { if cmd.Meta == nil {
v.Meta = kit.Dict() cmd.Meta = kit.Dict()
}
if c.Commands[key] = cmd; cmd.List == nil {
cmd.List = c.split(cmd.Name)
}
for k, a := range cmd.Action {
if p, ok := c.Commands[k]; ok {
switch last, next := p.Hand, a.Hand; k {
case CTX_INIT:
p.Hand = func(m *Message, c *Context, _key string, arg ...string) {
last(m, c, _key, arg...)
m._key, m._cmd = key, cmd
next(m, arg...)
m._key, m._cmd = _key, p
}
case CTX_EXIT:
p.Hand = func(m *Message, c *Context, _key string, arg ...string) {
m._key, m._cmd = key, cmd
next(m, arg...)
m._key, m._cmd = _key, p
last(m, c, _key, arg...)
}
} }
if c.Commands[k] = v; v.List == nil {
v.List = c.split(v.Name)
} }
for k, a := range v.Action {
help := strings.SplitN(a.Help, "", 2) help := strings.SplitN(a.Help, "", 2)
if len(help) == 1 || help[1] == "" { if len(help) == 1 || help[1] == "" {
help = strings.SplitN(help[0], ":", 2) help = strings.SplitN(help[0], ":", 2)
} }
if kit.Value(v.Meta, kit.Keys("_trans", k), help[0]); len(help) > 1 { if kit.Value(cmd.Meta, kit.Keys("_trans", k), help[0]); len(help) > 1 {
kit.Value(v.Meta, kit.Keys(kit.MDB_TITLE, k), help[1]) kit.Value(cmd.Meta, kit.Keys(kit.MDB_TITLE, k), help[1])
} }
if a.Hand == nil { if a.Hand == nil {
continue continue // alias cmd
} }
if a.List == nil { if a.List == nil {
a.List = c.split(a.Name) a.List = c.split(a.Name)
} }
if len(a.List) > 0 { if len(a.List) > 0 {
v.Meta[k] = a.List cmd.Meta[k] = a.List
} }
} }
} }