forked from x/icebergs
opt chat
This commit is contained in:
parent
ba1e1e1374
commit
931e61fd88
@ -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
|
||||
}
|
||||
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
|
||||
}
|
||||
// 普通用户
|
||||
|
@ -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 // 启动失败
|
||||
}
|
||||
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),
|
||||
)
|
||||
|
||||
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 {
|
||||
m.Cmd(mdb.MODIFY, DAEMON, "", mdb.HASH, kit.MDB_HASH, h, kit.MDB_STATUS, ERROR, ERROR, e)
|
||||
}
|
||||
|
@ -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)
|
||||
}
|
||||
|
||||
|
@ -56,7 +56,7 @@ func CmdAction(fields ...string) map[string]*ice.Action {
|
||||
}
|
||||
}},
|
||||
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)
|
||||
}
|
||||
}},
|
||||
@ -80,7 +80,9 @@ func init() {
|
||||
}
|
||||
}},
|
||||
}, 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)
|
||||
}
|
||||
}},
|
||||
}})
|
||||
}
|
||||
|
@ -8,4 +8,4 @@ const LEX = "lex"
|
||||
|
||||
var Index = &ice.Context{Name: LEX, Help: "词法模块"}
|
||||
|
||||
func init() { ice.Index.Register(Index, nil) }
|
||||
func init() { ice.Index.Register(Index, nil, SPLIT) }
|
||||
|
@ -36,12 +36,12 @@ func _cat_right(m *ice.Message, name string) bool {
|
||||
case ice.USR:
|
||||
switch kit.Select("", ls, 1) {
|
||||
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
|
||||
}
|
||||
}
|
||||
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
|
||||
}
|
||||
}
|
||||
@ -99,7 +99,7 @@ func _cat_list(m *ice.Message, name string) {
|
||||
default:
|
||||
buf := make([]byte, ice.MOD_BUFS)
|
||||
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)
|
||||
if begin += n; begin < len(buf) {
|
||||
buf = buf[:begin]
|
||||
|
@ -206,6 +206,7 @@ func init() {
|
||||
m.Cmdy(TRASH, m.Option(kit.MDB_PATH))
|
||||
}},
|
||||
}, 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),
|
||||
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)))))
|
||||
|
@ -49,10 +49,10 @@ func _copy_file(m *ice.Message, name string, from ...string) {
|
||||
defer f.Close()
|
||||
|
||||
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()
|
||||
|
||||
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_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.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)
|
||||
}
|
||||
|
||||
@ -95,7 +95,11 @@ func init() {
|
||||
_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_file(m, arg[0], arg[1:]...)
|
||||
for _, file := range arg[1:] {
|
||||
if _, e := os.Stat(file); e == nil {
|
||||
_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_file(m, arg[0], arg[1])
|
||||
|
@ -163,9 +163,12 @@ func (f *Frame) scan(m *ice.Message, h, line string) *Frame {
|
||||
ps = f.ps2
|
||||
continue // 多行
|
||||
}
|
||||
if line = kit.Split(line, "#", "#", "#")[0]; len(line) == 0 {
|
||||
continue // 注释
|
||||
if strings.HasPrefix(strings.TrimSpace(line), "#") {
|
||||
continue
|
||||
}
|
||||
// if line = strings.Split(line, " # ")[0]; len(line) == 0 {
|
||||
// continue // 注释
|
||||
// }
|
||||
if ps = f.ps1; f.stdout == os.Stdout {
|
||||
f.printf(m, "\033[0m") // 清空格式
|
||||
}
|
||||
|
@ -62,7 +62,7 @@ func Render(msg *ice.Message, cmd string, args ...interface{}) {
|
||||
msg.Echo(kit.Format(cmd, args...))
|
||||
}
|
||||
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) {
|
||||
|
@ -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) {
|
||||
// 环境变量
|
||||
msg.Option(ice.CACHE_LIMIT, "10")
|
||||
msg.Option(ice.MSG_OUTPUT, "")
|
||||
msg.Option(ice.MSG_SESSID, "")
|
||||
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) {
|
||||
case ContentJSON:
|
||||
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.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.Target().Cmd(msg, key, cmds...)
|
||||
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{})
|
||||
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_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 {
|
||||
// 权限检查
|
||||
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
|
||||
}
|
||||
|
||||
@ -219,7 +218,7 @@ func _serve_login(msg *ice.Message, cmds []string, w http.ResponseWriter, r *htt
|
||||
msg.Render(STATUS, http.StatusUnauthorized, ice.ErrNotLogin)
|
||||
return cmds, false // 未登录
|
||||
}
|
||||
if msg.Warn(!msg.Right(r.URL.Path)) {
|
||||
if !msg.Right(r.URL.Path) {
|
||||
msg.Render(STATUS, http.StatusForbidden, ice.ErrNotRight)
|
||||
return cmds, false // 未授权
|
||||
}
|
||||
|
@ -123,7 +123,7 @@ func init() {
|
||||
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) {
|
||||
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)
|
||||
m.Option(kit.MDB_LINK, _share_link(m, "/share/"+m.Result()))
|
||||
}},
|
||||
|
@ -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++ {
|
||||
msg := m.Spawn()
|
||||
msg.Option(kit.Keycb(tcp.DIAL), func(s net.Conn, e error) {
|
||||
if msg.Warn(e != nil, e) {
|
||||
if msg.Warn(e) {
|
||||
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.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
|
||||
msg.Cost("order", i, "sleep", sleep, "reconnect", u)
|
||||
msg.Cost("order", i, "sleep", sleep, "reconnect", dev)
|
||||
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 {
|
||||
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
|
||||
} else {
|
||||
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 // 转发报文
|
||||
}
|
||||
|
||||
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 { // 下发失败
|
||||
msg.Warn(true, ice.ErrNotFound)
|
||||
msg.Warn(true, ice.ErrNotFound, target)
|
||||
source, target = []string{}, kit.Revert(source)[1:]
|
||||
}
|
||||
}) != nil { // 转发成功
|
||||
|
||||
} 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 { // 下发失败
|
||||
msg.Warn(true, ice.ErrNotFound)
|
||||
msg.Warn(true, ice.ErrNotFound, target)
|
||||
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
|
||||
}
|
||||
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()
|
||||
}
|
||||
|
||||
@ -272,6 +272,7 @@ func init() {
|
||||
// 添加节点
|
||||
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))
|
||||
m.Log_CREATE(SPACE, name, "type", kind)
|
||||
|
||||
m.Go(func() {
|
||||
defer m.Confv(SPACE, kit.Keys(kit.MDB_HASH, h), "")
|
||||
|
@ -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)
|
||||
if m.Warn(e != nil, ice.ErrNotFound, e) {
|
||||
if m.Warn(e, ice.ErrNotFound, uri) {
|
||||
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]))
|
||||
if m.Warn(e != nil, ice.ErrNotFound, e) {
|
||||
if m.Warn(e, ice.ErrNotFound, uri) {
|
||||
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 {
|
||||
case http.StatusNotFound:
|
||||
m.Warn(true, ice.ErrNotFound, ice.OF, uri)
|
||||
m.Warn(true, ice.ErrNotFound, uri)
|
||||
return
|
||||
case http.StatusUnauthorized:
|
||||
m.Warn(true, ice.ErrNotRight, ice.OF, uri)
|
||||
m.Warn(true, ice.ErrNotRight, uri)
|
||||
return
|
||||
}
|
||||
}
|
||||
|
@ -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)
|
||||
|
||||
// 启动服务
|
||||
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),
|
||||
|
8
conf.go
8
conf.go
@ -22,6 +22,10 @@ const (
|
||||
SAVE = "save"
|
||||
EXIT = "exit"
|
||||
|
||||
BASE = "base"
|
||||
CORE = "core"
|
||||
MISC = "misc"
|
||||
|
||||
SHY = "shy"
|
||||
DEV = "dev"
|
||||
OPS = "ops"
|
||||
@ -107,6 +111,8 @@ const ( // DIR
|
||||
ETC_PATH = "etc/path"
|
||||
|
||||
SRC_HELP = "src/help"
|
||||
SRC_DEBUG = "src/debug"
|
||||
SRC_RELEASE = "src/release"
|
||||
SRC_MAIN_GO = "src/main.go"
|
||||
SRC_MAIN_SHY = "src/main.shy"
|
||||
SRC_VERSION_GO = "src/version.go"
|
||||
@ -204,9 +210,11 @@ const ( // Err
|
||||
ErrWarn = "warn: "
|
||||
ErrExists = "exists: "
|
||||
ErrExpire = "expire: "
|
||||
ErrTimeout = "timeout: "
|
||||
ErrNotLogin = "not login: "
|
||||
ErrNotFound = "not found: "
|
||||
ErrNotRight = "not right: "
|
||||
ErrNotStart = "not start: "
|
||||
ErrNotImplement = "not implement: "
|
||||
)
|
||||
const ( // LOG
|
||||
|
@ -12,21 +12,114 @@ import (
|
||||
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) {
|
||||
m.Option(ice.MSG_LOCAL, "")
|
||||
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 "" // 公有命令
|
||||
}
|
||||
|
||||
storm := kit.Select(m.Option(ice.MSG_STORM), arg, 0)
|
||||
river := kit.Select(m.Option(ice.MSG_RIVER), arg, 1)
|
||||
river := kit.Select(m.Option(ice.MSG_RIVER), arg, 0)
|
||||
storm := kit.Select(m.Option(ice.MSG_STORM), arg, 1)
|
||||
m.Richs(RIVER, "", river, func(key string, value map[string]interface{}) {
|
||||
switch kit.Value(kit.GetMeta(value), kit.MDB_TYPE) {
|
||||
case PUBLIC: // 公有群
|
||||
return
|
||||
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) {
|
||||
case PUBLIC: // 公有组
|
||||
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: // 私有群
|
||||
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)
|
||||
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) {
|
||||
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))
|
||||
}
|
||||
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 (
|
||||
DOMAIN = "domain"
|
||||
@ -149,32 +154,32 @@ const ACTION = "action"
|
||||
func init() {
|
||||
Index.Merge(&ice.Context{Configs: map[string]*ice.Config{
|
||||
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{
|
||||
ice.CTX_INIT: {Hand: func(m *ice.Message, c *ice.Context, cmd string, arg ...string) {
|
||||
for _, cmd := range []string{
|
||||
"web.chat.meet.miss",
|
||||
"web.chat.meet.mate",
|
||||
"web.chat.location",
|
||||
"web.chat.paste",
|
||||
"web.chat.scan",
|
||||
"web.wiki.feel",
|
||||
"web.wiki.draw",
|
||||
"web.wiki.data",
|
||||
"web.wiki.word",
|
||||
"web.team.task",
|
||||
"web.team.plan",
|
||||
"web.mall.asset",
|
||||
"web.mall.salary",
|
||||
} {
|
||||
m.Conf(ACTION, kit.Keym(DOMAIN, cmd), ice.TRUE)
|
||||
}
|
||||
}},
|
||||
"/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{
|
||||
"web.chat.meet.miss",
|
||||
"web.chat.meet.mate",
|
||||
"web.chat.location",
|
||||
"web.chat.paste",
|
||||
"web.chat.scan",
|
||||
"web.wiki.feel",
|
||||
"web.wiki.draw",
|
||||
"web.wiki.data",
|
||||
"web.wiki.word",
|
||||
"web.team.task",
|
||||
"web.team.plan",
|
||||
"web.mall.asset",
|
||||
"web.mall.salary",
|
||||
} {
|
||||
m.Config(kit.Keys(DOMAIN, cmd), ice.TRUE)
|
||||
}
|
||||
}},
|
||||
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.OptionSimple(kit.MDB_ID), arg)
|
||||
m.Cmdy(mdb.MODIFY, RIVER, _action_key(m), mdb.LIST, m.OptionSimple(kit.MDB_ID), arg)
|
||||
}},
|
||||
ctx.COMMAND: {Name: "command", Help: "命令", Hand: func(m *ice.Message, arg ...string) {
|
||||
for _, k := range arg {
|
||||
@ -188,21 +193,21 @@ func init() {
|
||||
_action_share(m, arg...)
|
||||
}},
|
||||
}, 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 // 没有登录
|
||||
}
|
||||
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 // 没有授权
|
||||
}
|
||||
|
||||
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])
|
||||
return //命令列表
|
||||
}
|
||||
|
||||
// 执行命令
|
||||
_action_show(m, arg[0], arg[1], arg[2], arg[3:]...)
|
||||
_action_exec(m, arg[0], arg[1], arg[2], arg[3:]...)
|
||||
}},
|
||||
}})
|
||||
}
|
||||
|
@ -4,14 +4,24 @@ chat.go
|
||||
chat.shy
|
||||
|
||||
header.go
|
||||
river.go
|
||||
action.go
|
||||
|
||||
search.go
|
||||
river.go
|
||||
storm.go
|
||||
ocean.go
|
||||
action.go
|
||||
footer.go
|
||||
|
||||
pod.go
|
||||
cmd.go
|
||||
div.go
|
||||
|
||||
scan.go
|
||||
scan.js
|
||||
paste.go
|
||||
files.go
|
||||
location.go
|
||||
meet.go
|
||||
|
||||
info.go
|
||||
node.go
|
||||
meet.go
|
||||
room.go
|
||||
|
152
core/chat/cmd.go
152
core/chat/cmd.go
@ -6,107 +6,75 @@ import (
|
||||
|
||||
ice "shylinux.com/x/icebergs"
|
||||
"shylinux.com/x/icebergs/base/ctx"
|
||||
"shylinux.com/x/icebergs/base/mdb"
|
||||
"shylinux.com/x/icebergs/base/nfs"
|
||||
"shylinux.com/x/icebergs/base/web"
|
||||
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"
|
||||
|
||||
func init() {
|
||||
Index.Merge(&ice.Context{
|
||||
Commands: map[string]*ice.Command{
|
||||
"/cmd/": {Name: "/cmd/", Help: "命令", Action: map[string]*ice.Action{
|
||||
ctx.COMMAND: {Name: "command", Help: "命令", Hand: func(m *ice.Message, arg ...string) {
|
||||
if len(arg) == 0 {
|
||||
m.Push("index", CMD)
|
||||
m.Push("args", "")
|
||||
return
|
||||
}
|
||||
m.Cmdy(ctx.COMMAND, arg[0])
|
||||
}},
|
||||
ice.RUN: {Name: "run", Help: "执行", Hand: func(m *ice.Message, arg ...string) {
|
||||
m.Cmdy(arg)
|
||||
}},
|
||||
}, 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 // 目录
|
||||
}
|
||||
Index.Merge(&ice.Context{Configs: map[string]*ice.Config{
|
||||
CMD: {Name: CMD, Help: "命令", Value: kit.Data(
|
||||
kit.MDB_SHORT, "type", kit.MDB_PATH, "./",
|
||||
)},
|
||||
}, Commands: map[string]*ice.Command{
|
||||
"/cmd/": {Name: "/cmd/", Help: "命令", Action: ice.MergeAction(map[string]*ice.Action{
|
||||
ice.CTX_INIT: {Name: "_init", Help: "初始化", Hand: func(m *ice.Message, arg ...string) {
|
||||
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(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")
|
||||
}},
|
||||
}, ctx.CmdAction()), Hand: func(m *ice.Message, c *ice.Context, cmd string, arg ...string) {
|
||||
if strings.HasSuffix(m.R.URL.Path, ice.PS) {
|
||||
m.RenderCmd(CMD)
|
||||
return // 目录
|
||||
}
|
||||
|
||||
switch p := path.Join(m.Conf(CMD, kit.META_PATH), path.Join(arg...)); kit.Ext(p) {
|
||||
case "svg":
|
||||
_cmd_render(m, "web.wiki.draw", p)
|
||||
case "csv":
|
||||
_cmd_render(m, "web.wiki.data", p)
|
||||
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 // 远程命令
|
||||
}
|
||||
} else {
|
||||
if msg := m.Cmd(ctx.COMMAND, arg[0]); msg.Append("meta") != "" {
|
||||
_cmd_render(m, arg[0], arg[1:])
|
||||
return // 本地命令
|
||||
}
|
||||
}
|
||||
m.RenderDownload(p)
|
||||
p := path.Join(m.Config(kit.MDB_PATH), path.Join(arg...))
|
||||
if mdb.HashSelect(m, kit.Ext(m.R.URL.Path)).Table(func(index int, value map[string]string, head []string) {
|
||||
m.RenderCmd(value[kit.MDB_NAME], p)
|
||||
}).Length() > 0 {
|
||||
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 {
|
||||
m.RenderDownload(p) // 文件
|
||||
}
|
||||
}},
|
||||
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) {
|
||||
m.Upload(path.Join(m.Config(kit.MDB_PATH), strings.TrimPrefix(path.Dir(m.R.URL.Path), "/cmd")))
|
||||
}},
|
||||
|
||||
"home": {Name: "home", Help: "根目录", Hand: func(m *ice.Message, arg ...string) {
|
||||
m.ProcessLocation("/chat/cmd/")
|
||||
}},
|
||||
"up": {Name: "up", Help: "上一级", Hand: func(m *ice.Message, arg ...string) {
|
||||
if strings.TrimPrefix(m.R.URL.Path, "/cmd") == ice.PS {
|
||||
m.Cmdy(CMD)
|
||||
} else if strings.HasSuffix(m.R.URL.Path, ice.PS) {
|
||||
m.ProcessLocation("../")
|
||||
} else {
|
||||
m.ProcessLocation("./")
|
||||
}
|
||||
}},
|
||||
CMD: {Name: "cmd path auto upload up home", Help: "命令", Action: map[string]*ice.Action{
|
||||
web.UPLOAD: {Name: "upload", Help: "上传", Hand: func(m *ice.Message, arg ...string) {
|
||||
_action_upload(m)
|
||||
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) {
|
||||
m.ProcessLocation("/chat/cmd/")
|
||||
}},
|
||||
"up": {Name: "up", Help: "上一级", Hand: func(m *ice.Message, arg ...string) {
|
||||
if strings.TrimPrefix(m.R.URL.Path, "/cmd") == "/" {
|
||||
m.Cmdy(CMD)
|
||||
return
|
||||
}
|
||||
if strings.HasSuffix(m.R.URL.Path, "/") {
|
||||
m.ProcessLocation("../")
|
||||
} else {
|
||||
m.ProcessLocation("./")
|
||||
}
|
||||
}},
|
||||
}, Hand: func(m *ice.Message, c *ice.Context, cmd string, arg ...string) {
|
||||
if len(arg) > 0 {
|
||||
m.ProcessLocation(arg[0])
|
||||
return
|
||||
}
|
||||
m.Option(nfs.DIR_ROOT, path.Join(m.Conf(CMD, kit.META_PATH), strings.TrimPrefix(path.Dir(m.R.URL.Path), "/cmd")))
|
||||
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>
|
||||
`,
|
||||
)},
|
||||
},
|
||||
})
|
||||
}, mdb.HashAction()), Hand: func(m *ice.Message, c *ice.Context, cmd string, arg ...string) {
|
||||
if len(arg) > 0 {
|
||||
m.ProcessLocation(arg[0])
|
||||
return
|
||||
}
|
||||
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)
|
||||
}},
|
||||
}})
|
||||
}
|
||||
|
@ -4,10 +4,10 @@ import (
|
||||
"path"
|
||||
|
||||
ice "shylinux.com/x/icebergs"
|
||||
"shylinux.com/x/icebergs/base/cli"
|
||||
"shylinux.com/x/icebergs/base/ctx"
|
||||
"shylinux.com/x/icebergs/base/lex"
|
||||
"shylinux.com/x/icebergs/base/mdb"
|
||||
"shylinux.com/x/icebergs/base/web"
|
||||
"shylinux.com/x/icebergs/base/nfs"
|
||||
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])
|
||||
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(
|
||||
"index", kit.Select("", ls, 0),
|
||||
"args", kit.Select("", ls, 1),
|
||||
"name", "hi",
|
||||
)
|
||||
for i := 2; i < len(ls); i += 2 {
|
||||
meta[ls[i]] = ls[i+1]
|
||||
@ -57,30 +58,31 @@ func init() {
|
||||
)},
|
||||
}, Commands: map[string]*ice.Command{
|
||||
DIV: {Name: "div hash auto", Help: "定制", Action: ice.MergeAction(map[string]*ice.Action{
|
||||
mdb.CREATE: {Name: "create type=page name=hi.html text", Help: "创建"},
|
||||
cli.MAKE: {Name: "make name=some line:textarea", Help: "生成", Hand: func(m *ice.Message, arg ...string) {
|
||||
lex.SPLIT: {Name: "split name=some text", Help: "生成", Hand: func(m *ice.Message, arg ...string) {
|
||||
m.Fields(0)
|
||||
node := kit.Dict("meta", kit.Dict("name", m.Option("name")), "list", []interface{}{})
|
||||
_div_parse(m, node, kit.Split(m.Option("line"), "\n", "\n", "\n"))
|
||||
node := kit.Data(m.OptionSimple(kit.MDB_NAME))
|
||||
_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.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) {
|
||||
m.Fields(len(arg), m.Conf(DIV, kit.META_FIELD))
|
||||
m.Cmdy(mdb.SELECT, m.PrefixKey(), "", mdb.HASH, kit.MDB_HASH, arg)
|
||||
if mdb.HashSelect(m, arg...); len(arg) > 0 {
|
||||
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.PushAnchor("/" + path.Join(ice.PUBLISH, value[kit.MDB_NAME]))
|
||||
})
|
||||
if m.PushAction(cli.MAKE, mdb.REMOVE); len(arg) > 0 {
|
||||
m.Option(ice.MSG_DISPLAY, "/plugin/local/chat/div.js")
|
||||
m.Action("添加", "保存", "预览")
|
||||
} else {
|
||||
m.Action(mdb.CREATE, cli.MAKE)
|
||||
}
|
||||
m.PushAction(mdb.REMOVE)
|
||||
}},
|
||||
"/div": {Name: "/div", Help: "定制", Hand: func(m *ice.Message, c *ice.Context, cmd string, arg ...string) {
|
||||
m.RenderIndex(web.SERVE, ice.VOLCANOS, "page/div.html")
|
||||
"/div/": {Name: "/div/", Help: "定制", Action: ice.MergeAction(ctx.CmdAction()), Hand: func(m *ice.Message, c *ice.Context, cmd string, arg ...string) {
|
||||
m.RenderCmd(m.Prefix(DIV), path.Join(arg...))
|
||||
}},
|
||||
}})
|
||||
|
||||
}
|
||||
|
@ -10,29 +10,29 @@ import (
|
||||
const FILES = "files"
|
||||
|
||||
func init() {
|
||||
Index.Merge(&ice.Context{
|
||||
Configs: map[string]*ice.Config{
|
||||
FILES: {Name: FILES, Help: "文件夹", Value: kit.Data(
|
||||
kit.MDB_SHORT, kit.MDB_DATA, kit.MDB_FIELD, "time,hash,type,name,size,data",
|
||||
)},
|
||||
},
|
||||
Commands: map[string]*ice.Command{
|
||||
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) {
|
||||
up := kit.Simple(m.Optionv(ice.MSG_UPLOAD))
|
||||
m.Cmdy(mdb.INSERT, m.Prefix(FILES), "", mdb.HASH, kit.MDB_TYPE, kit.Ext(up[1]), kit.MDB_NAME, up[1], kit.MDB_SIZE, up[2], kit.MDB_DATA, up[0])
|
||||
}},
|
||||
}, mdb.HashAction()), Hand: func(m *ice.Message, c *ice.Context, cmd string, arg ...string) {
|
||||
m.Fields(len(arg), m.Conf(FILES, kit.META_FIELD))
|
||||
m.Cmdy(mdb.SELECT, m.Prefix(FILES), "", mdb.HASH, kit.MDB_HASH, arg)
|
||||
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))
|
||||
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.PushAction(mdb.REMOVE)
|
||||
Index.Merge(&ice.Context{Configs: map[string]*ice.Config{
|
||||
FILES: {Name: FILES, Help: "文件夹", Value: kit.Data(
|
||||
kit.MDB_SHORT, kit.MDB_DATA, kit.MDB_FIELD, "time,hash,type,name,size,data",
|
||||
)},
|
||||
}, Commands: map[string]*ice.Command{
|
||||
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) {
|
||||
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])
|
||||
}},
|
||||
},
|
||||
})
|
||||
}, mdb.HashAction()), Hand: func(m *ice.Message, c *ice.Context, cmd string, arg ...string) {
|
||||
mdb.HashSelect(m, arg...)
|
||||
m.Table(func(index int, value map[string]string, head []string) {
|
||||
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]) {
|
||||
m.PushImages(kit.MDB_IMAGE, link)
|
||||
}
|
||||
})
|
||||
m.PushAction(mdb.REMOVE)
|
||||
}},
|
||||
}})
|
||||
}
|
||||
|
@ -2,6 +2,7 @@ package chat
|
||||
|
||||
import (
|
||||
ice "shylinux.com/x/icebergs"
|
||||
"shylinux.com/x/icebergs/base/cli"
|
||||
"shylinux.com/x/icebergs/base/ctx"
|
||||
kit "shylinux.com/x/toolkits"
|
||||
)
|
||||
@ -12,23 +13,22 @@ const (
|
||||
const FOOTER = "footer"
|
||||
|
||||
func init() {
|
||||
Index.Merge(&ice.Context{
|
||||
Configs: map[string]*ice.Config{
|
||||
FOOTER: {Name: FOOTER, Help: "状态栏", Value: kit.Dict(
|
||||
LEGAL, []interface{}{`<a href="mailto:shylinuxc@gmail.com">shylinuxc@gmail.com</a>`},
|
||||
)},
|
||||
},
|
||||
Commands: map[string]*ice.Command{
|
||||
"/footer": {Name: "/footer", Help: "状态栏", Action: map[string]*ice.Action{
|
||||
ctx.COMMAND: {Name: "command", Help: "命令", Hand: func(m *ice.Message, arg ...string) {
|
||||
m.Cmdy(ctx.COMMAND, arg)
|
||||
}},
|
||||
ice.RUN: {Name: "run", Help: "执行", Hand: func(m *ice.Message, arg ...string) {
|
||||
m.Cmdy(arg)
|
||||
}},
|
||||
}, 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) })
|
||||
Index.Merge(&ice.Context{Configs: map[string]*ice.Config{
|
||||
FOOTER: {Name: FOOTER, Help: "状态栏", Value: kit.Dict(
|
||||
LEGAL, kit.List(`<a href="mailto:shylinuxc@gmail.com">shylinuxc@gmail.com</a>`),
|
||||
)},
|
||||
}, Commands: map[string]*ice.Command{
|
||||
"/footer": {Name: "/footer", Help: "状态栏", Action: map[string]*ice.Action{
|
||||
ctx.COMMAND: {Name: "command", Help: "命令", Hand: func(m *ice.Message, arg ...string) {
|
||||
m.Cmdy(ctx.COMMAND, arg)
|
||||
}},
|
||||
},
|
||||
})
|
||||
ice.RUN: {Name: "run", Help: "执行", Hand: func(m *ice.Message, arg ...string) {
|
||||
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) {
|
||||
m.Confm(FOOTER, LEGAL, func(index int, value string) { m.Echo(value) })
|
||||
}},
|
||||
}})
|
||||
}
|
||||
|
@ -1,8 +1,8 @@
|
||||
package chat
|
||||
|
||||
import (
|
||||
"os"
|
||||
"path"
|
||||
"strings"
|
||||
|
||||
ice "shylinux.com/x/icebergs"
|
||||
"shylinux.com/x/icebergs/base/aaa"
|
||||
@ -15,12 +15,18 @@ import (
|
||||
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) {
|
||||
if m.Option(web.SHARE) != "" {
|
||||
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) {
|
||||
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:
|
||||
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) == "" { // 单点登录
|
||||
m.Option(web.SSO, m.Conf(web.SERVE, kit.Keym(web.SSO)))
|
||||
if m.Option(ice.MSG_USERNAME) == "" {
|
||||
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) {
|
||||
if m.PodCmd(m.PrefixKey(), ctx.ACTION, GRANT, arg) {
|
||||
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(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) {
|
||||
m.Option(aaa.USERNAME, m.Option(ice.MSG_USERNAME))
|
||||
m.Cmdy(aaa.USER, ctx.ACTION, mdb.MODIFY, key, m.Option(key, arg[0]))
|
||||
}
|
||||
|
||||
const (
|
||||
TOPIC = "topic"
|
||||
TITLE = "title"
|
||||
TOPIC = "topic"
|
||||
MENUS = "menus"
|
||||
TRANS = "trans"
|
||||
AGENT = "agent"
|
||||
CHECK = "check"
|
||||
SHARE = "share"
|
||||
GRANT = "grant"
|
||||
LOGIN = "login"
|
||||
SHARE = "share"
|
||||
)
|
||||
const HEADER = "header"
|
||||
|
||||
func init() {
|
||||
Index.Merge(&ice.Context{Configs: map[string]*ice.Config{
|
||||
HEADER: {Name: HEADER, Help: "标题栏", Value: kit.Data(
|
||||
TITLE, "shylinux.com/x/contexts", MENUS, `["header", ["setting", "black", "white", "print", "webpack", "unpack"]]`,
|
||||
LOGIN, kit.List("登录", "扫码"),
|
||||
TITLE, "shylinux.com/x/contexts", MENUS, kit.List("header", kit.List("setting", "black", "white", "print", "webpack", "devpack")),
|
||||
aaa.LOGIN, kit.List("登录", "扫码"),
|
||||
)},
|
||||
}, Commands: map[string]*ice.Command{
|
||||
ice.CTX_INIT: {Hand: func(m *ice.Message, c *ice.Context, cmd string, arg ...string) {
|
||||
m.Cmd(web.SERVE, aaa.WHITE, HEADER, RIVER, ACTION, FOOTER)
|
||||
web.WEB_LOGIN: {Hand: func(m *ice.Message, c *ice.Context, cmd string, arg ...string) {
|
||||
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{
|
||||
AGENT: {Name: "agent", Help: "应用宿主", Hand: func(m *ice.Message, arg ...string) {
|
||||
m.Cmdy("web.chat.wx.access", "config")
|
||||
AGENT: {Name: "agent", Help: "宿主应用", Hand: func(m *ice.Message, arg ...string) {
|
||||
_header_agent(m, arg...)
|
||||
}},
|
||||
CHECK: {Name: "check", Help: "登录检查", Hand: func(m *ice.Message, arg ...string) {
|
||||
_header_check(m, arg...)
|
||||
@ -102,7 +112,6 @@ func init() {
|
||||
if aaa.UserLogin(m, arg[0], arg[1]) {
|
||||
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) {
|
||||
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) {
|
||||
_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) {
|
||||
_header_users(m, aaa.BACKGROUND, arg...)
|
||||
}},
|
||||
@ -118,34 +130,29 @@ func init() {
|
||||
}},
|
||||
|
||||
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))
|
||||
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) {
|
||||
m.Cmdy(code.WEBPACK, "unpack")
|
||||
|
||||
p := path.Join("src/debug", ice.GO_MOD)
|
||||
if _, e := os.Stat(p); e == nil {
|
||||
m.Cmd(nfs.COPY, ice.GO_MOD, p)
|
||||
}
|
||||
code.DEVPACK: {Name: "devpack", Help: "开发模式", Hand: func(m *ice.Message, arg ...string) {
|
||||
m.Cmd(nfs.COPY, ice.GO_MOD, path.Join(ice.SRC_DEBUG, ice.GO_MOD))
|
||||
m.Cmdy(code.WEBPACK, mdb.REMOVE)
|
||||
}},
|
||||
}, 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))
|
||||
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.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{
|
||||
GRANT: {Name: "grant space", Help: "授权", Hand: func(m *ice.Message, arg ...string) {
|
||||
_header_grant(m, arg...)
|
||||
}},
|
||||
}, Hand: func(m *ice.Message, c *ice.Context, cmd string, arg ...string) {
|
||||
|
||||
}},
|
||||
}})
|
||||
}
|
||||
|
@ -22,7 +22,6 @@ func _trans(arg []string, tr map[string]string) {
|
||||
}
|
||||
|
||||
const (
|
||||
ADDRESS = "address"
|
||||
LATITUDE = "latitude"
|
||||
LONGITUDE = "longitude"
|
||||
)
|
||||
@ -33,26 +32,18 @@ const (
|
||||
const LOCATION = "location"
|
||||
|
||||
func init() {
|
||||
Index.Merge(&ice.Context{
|
||||
Configs: map[string]*ice.Config{
|
||||
LOCATION: {Name: LOCATION, Help: "地理位置", Value: kit.Data(
|
||||
kit.MDB_SHORT, kit.MDB_TEXT, kit.MDB_FIELD, "time,hash,type,name,text,longitude,latitude",
|
||||
)},
|
||||
},
|
||||
Commands: map[string]*ice.Command{
|
||||
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) {}},
|
||||
GETLOCATION: {Name: "getLocation", Help: "打卡", Hand: func(m *ice.Message, arg ...string) {
|
||||
m.Cmdy(mdb.INSERT, m.Prefix(LOCATION), "", mdb.HASH, arg)
|
||||
}},
|
||||
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) {
|
||||
m.Fields(len(arg), m.Conf(LOCATION, kit.META_FIELD))
|
||||
m.Cmdy(mdb.SELECT, m.Prefix(LOCATION), "", mdb.HASH, kit.MDB_HASH, arg)
|
||||
m.PushAction(OPENLOCATION, mdb.REMOVE)
|
||||
}},
|
||||
},
|
||||
})
|
||||
Index.Merge(&ice.Context{Configs: map[string]*ice.Config{
|
||||
LOCATION: {Name: LOCATION, Help: "地理位置", Value: kit.Data(
|
||||
kit.MDB_SHORT, kit.MDB_TEXT, kit.MDB_FIELD, "time,hash,type,name,text,longitude,latitude",
|
||||
)},
|
||||
}, Commands: map[string]*ice.Command{
|
||||
LOCATION: {Name: "location hash auto getLocation", Help: "地理位置", Action: ice.MergeAction(map[string]*ice.Action{
|
||||
OPENLOCATION: {Name: "location", Help: "地图"},
|
||||
GETLOCATION: {Name: "location create", Help: "打卡"},
|
||||
mdb.CREATE: {Name: "create type=text name text latitude longitude", Help: "添加"},
|
||||
}, mdb.HashAction()), Hand: func(m *ice.Message, c *ice.Context, cmd string, arg ...string) {
|
||||
mdb.HashSelect(m, arg...)
|
||||
m.PushAction(OPENLOCATION, mdb.REMOVE)
|
||||
}},
|
||||
}})
|
||||
}
|
||||
|
@ -7,31 +7,29 @@ import (
|
||||
kit "shylinux.com/x/toolkits"
|
||||
)
|
||||
|
||||
const USERS = "users"
|
||||
const OCEAN = "ocean"
|
||||
|
||||
func init() {
|
||||
Index.Merge(&ice.Context{Commands: map[string]*ice.Command{
|
||||
USERS: {Name: "users 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))
|
||||
}},
|
||||
OCEAN: {Name: "ocean username auto insert invite", Help: "用户", Action: map[string]*ice.Action{
|
||||
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) {
|
||||
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.Richs(USERS, nil, value[aaa.USERNAME], func(key string, val map[string]interface{}) {
|
||||
val = kit.GetMeta(val)
|
||||
m.Push(aaa.USERNICK, val[aaa.USERNICK])
|
||||
m.PushImages(aaa.AVATAR, kit.Format(val[aaa.AVATAR]), kit.Select("60", "240", m.Option(mdb.FIELDS) == mdb.DETAIL))
|
||||
})
|
||||
msg := m.Cmd(aaa.USER, value[aaa.USERNAME])
|
||||
m.Push(aaa.USERNICK, msg.Append(aaa.USERNICK))
|
||||
m.PushImages(aaa.AVATAR, msg.Append(aaa.AVATAR), kit.Select("60", "240", m.FieldsIsDetail()))
|
||||
})
|
||||
m.PushAction(mdb.REMOVE)
|
||||
m.PushAction(mdb.DELETE)
|
||||
}},
|
||||
}})
|
||||
}
|
@ -11,30 +11,22 @@ import (
|
||||
const PASTE = "paste"
|
||||
|
||||
func init() {
|
||||
Index.Merge(&ice.Context{
|
||||
Configs: map[string]*ice.Config{
|
||||
PASTE: {Name: PASTE, Help: "粘贴板", Value: kit.Data(
|
||||
kit.MDB_SHORT, kit.MDB_TEXT, kit.MDB_FIELD, "time,hash,type,name,text",
|
||||
)},
|
||||
},
|
||||
Commands: map[string]*ice.Command{
|
||||
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) {
|
||||
_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 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.HashAction()), Hand: func(m *ice.Message, c *ice.Context, cmd string, arg ...string) {
|
||||
m.Fields(len(arg), m.Conf(PASTE, kit.META_FIELD))
|
||||
if m.Cmdy(mdb.SELECT, cmd, "", mdb.HASH, kit.MDB_HASH, arg); len(arg) > 0 {
|
||||
m.PushScript(ssh.SCRIPT, m.Append(kit.MDB_TEXT))
|
||||
m.PushQRCode(cli.QRCODE, m.Append(kit.MDB_TEXT))
|
||||
}
|
||||
m.PushAction(mdb.REMOVE)
|
||||
Index.Merge(&ice.Context{Configs: map[string]*ice.Config{
|
||||
PASTE: {Name: PASTE, Help: "粘贴", Value: kit.Data(
|
||||
kit.MDB_SHORT, kit.MDB_TEXT, kit.MDB_FIELD, "time,hash,type,name,text",
|
||||
)},
|
||||
}, Commands: map[string]*ice.Command{
|
||||
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) {
|
||||
m.Cmdy(PASTE, mdb.CREATE, 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) {
|
||||
if mdb.HashSelect(m, arg...); len(arg) > 0 {
|
||||
m.PushScript(ssh.SCRIPT, m.Append(kit.MDB_TEXT))
|
||||
m.PushQRCode(cli.QRCODE, m.Append(kit.MDB_TEXT))
|
||||
}
|
||||
m.PushAction(mdb.REMOVE)
|
||||
}},
|
||||
}})
|
||||
}
|
||||
|
@ -12,38 +12,23 @@ import (
|
||||
const POD = "pod"
|
||||
|
||||
func init() {
|
||||
Index.Merge(&ice.Context{
|
||||
Commands: map[string]*ice.Command{
|
||||
"/pod/": {Name: "/pod/", Help: "节点", Action: map[string]*ice.Action{
|
||||
ctx.COMMAND: {Name: "command", Help: "命令", Hand: func(m *ice.Message, arg ...string) {
|
||||
if len(arg) == 0 {
|
||||
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) {
|
||||
if !m.PodCmd(arg) {
|
||||
m.Cmdy(arg)
|
||||
}
|
||||
}},
|
||||
}, Hand: func(m *ice.Message, c *ice.Context, cmd string, arg ...string) {
|
||||
if kit.Select("", arg, 0) == "" {
|
||||
_cmd_render(m, web.ROUTE)
|
||||
return
|
||||
}
|
||||
if len(arg) == 1 {
|
||||
m.RenderIndex(web.SERVE, ice.VOLCANOS)
|
||||
return
|
||||
}
|
||||
m.Cmdy(m.Prefix("/cmd/"), path.Join(arg[2:]...))
|
||||
Index.Merge(&ice.Context{Configs: map[string]*ice.Config{
|
||||
POD: {Name: POD, Help: "节点", Value: kit.Data()},
|
||||
}, Commands: map[string]*ice.Command{
|
||||
"/pod/": {Name: "/pod/", Help: "节点", Action: ice.MergeAction(map[string]*ice.Action{
|
||||
ice.CTX_INIT: {Name: "_init", Help: "初始化", Hand: func(m *ice.Message, arg ...string) {
|
||||
}},
|
||||
},
|
||||
Configs: map[string]*ice.Config{
|
||||
POD: {Name: POD, Help: "节点", Value: kit.Data()},
|
||||
},
|
||||
})
|
||||
}, ctx.CmdAction()), Hand: func(m *ice.Message, c *ice.Context, cmd string, arg ...string) {
|
||||
if kit.Select("", arg, 0) == "" {
|
||||
m.RenderCmd(web.ROUTE)
|
||||
return // 节点列表
|
||||
}
|
||||
if len(arg) == 1 {
|
||||
m.RenderIndex(web.SERVE, ice.VOLCANOS)
|
||||
return // 节点首页
|
||||
}
|
||||
// 节点命令
|
||||
m.Cmdy("/cmd/", path.Join(arg[2:]...))
|
||||
}},
|
||||
}})
|
||||
}
|
||||
|
@ -14,13 +14,7 @@ import (
|
||||
func _river_key(m *ice.Message, key ...interface{}) string {
|
||||
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) {
|
||||
m.Set(ice.MSG_OPTION, kit.MDB_HASH)
|
||||
m.Set(ice.MSG_OPTION, kit.MDB_NAME)
|
||||
|
||||
if m.Option(web.SHARE) != "" {
|
||||
switch msg := m.Cmd(web.SHARE, m.Option(web.SHARE)); msg.Append(kit.MDB_TYPE) {
|
||||
case web.RIVER: // 共享群组
|
||||
@ -28,11 +22,11 @@ func _river_list(m *ice.Message) {
|
||||
m.Option(ice.MSG_RIVER, msg.Append(RIVER))
|
||||
m.Option(ice.MSG_STORM, msg.Append(STORM))
|
||||
|
||||
if m.Conf(RIVER, kit.Keys(kit.MDB_HASH, m.Option(ice.MSG_RIVER))) == "" {
|
||||
break
|
||||
if m.Conf(RIVER, _river_key(m)) == "" {
|
||||
break // 虚拟群组
|
||||
}
|
||||
if msg.Cmd(USERS, m.Option(ice.MSG_USERNAME)).Append(aaa.USERNAME) == "" {
|
||||
msg.Cmd(USERS, mdb.INSERT, aaa.USERNAME, m.Option(ice.MSG_USERNAME)) // 加入群组
|
||||
if msg.Cmd(OCEAN, m.Option(ice.MSG_USERNAME)).Append(aaa.USERNAME) == "" {
|
||||
msg.Cmd(OCEAN, mdb.INSERT, aaa.USERNAME, m.Option(ice.MSG_USERNAME)) // 加入群组
|
||||
}
|
||||
|
||||
case web.STORM: // 共享应用
|
||||
@ -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, 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))
|
||||
})
|
||||
})
|
||||
@ -58,142 +52,128 @@ func _river_list(m *ice.Message) {
|
||||
const RIVER = "river"
|
||||
|
||||
func init() {
|
||||
Index.Merge(&ice.Context{
|
||||
Configs: map[string]*ice.Config{
|
||||
RIVER: {Name: RIVER, Help: "群组", Value: kit.Data(
|
||||
kit.MDB_PATH, ice.USR_LOCAL_RIVER,
|
||||
MENUS, `["river",
|
||||
["create", "创建群组", "添加应用", "添加工具", "添加设备", "创建空间"],
|
||||
["share", "共享群组", "共享应用", "共享工具", "共享主机", "访问空间"]
|
||||
]`,
|
||||
)},
|
||||
},
|
||||
Commands: map[string]*ice.Command{
|
||||
ice.CTX_INIT: {Hand: func(m *ice.Message, c *ice.Context, cmd string, arg ...string) {
|
||||
m.Conf(RIVER, kit.Keym(kit.MDB_TEMPLATE), kit.Dict(
|
||||
Index.Merge(&ice.Context{Configs: map[string]*ice.Config{
|
||||
RIVER: {Name: RIVER, Help: "群组", Value: kit.Data(
|
||||
MENUS, kit.List(RIVER, kit.List("create", "创建群组", "添加应用", "添加工具", "添加设备", "创建空间"), kit.List("share", "共享群组", "共享应用", "共享工具", "共享主机", "访问空间")),
|
||||
)},
|
||||
}, Commands: map[string]*ice.Command{
|
||||
"/river": {Name: "/river", Help: "小河流", Action: map[string]*ice.Action{
|
||||
ice.CTX_INIT: {Hand: func(m *ice.Message, arg ...string) {
|
||||
m.Config(kit.MDB_TEMPLATE, kit.Dict(
|
||||
"base", kit.Dict(
|
||||
"info", []interface{}{
|
||||
"info", kit.List(
|
||||
"web.chat.info",
|
||||
"web.chat.user",
|
||||
"web.chat.tool",
|
||||
"web.chat.node",
|
||||
},
|
||||
"scan", []interface{}{
|
||||
),
|
||||
"scan", kit.List(
|
||||
"web.chat.scan",
|
||||
"web.chat.paste",
|
||||
"web.chat.files",
|
||||
"web.chat.location",
|
||||
"web.chat.meet.miss",
|
||||
"web.wiki.feel",
|
||||
},
|
||||
"task", []interface{}{
|
||||
),
|
||||
"task", kit.List(
|
||||
"web.team.task",
|
||||
"web.team.plan",
|
||||
"web.mall.asset",
|
||||
"web.mall.salary",
|
||||
"web.wiki.word",
|
||||
},
|
||||
"draw", []interface{}{
|
||||
),
|
||||
"draw", kit.List(
|
||||
"web.wiki.draw",
|
||||
"web.wiki.data",
|
||||
"web.wiki.word",
|
||||
},
|
||||
),
|
||||
),
|
||||
))
|
||||
}},
|
||||
"/river": {Name: "/river", Help: "小河流", Hand: func(m *ice.Message, c *ice.Context, cmd string, arg ...string) {
|
||||
if m.Warn(m.Option(ice.MSG_USERNAME) == "", ice.ErrNotLogin) {
|
||||
m.Render(web.STATUS, 401)
|
||||
return // 没有登录
|
||||
}
|
||||
if len(arg) == 0 {
|
||||
m.Option(MENUS, m.Conf(RIVER, kit.Keym(MENUS)))
|
||||
_river_list(m)
|
||||
return // 群组列表
|
||||
}
|
||||
if len(arg) == 2 && arg[1] == TOOL {
|
||||
m.Option(ice.MSG_RIVER, arg[0])
|
||||
m.Cmdy(arg[1], arg[2:])
|
||||
return // 应用列表
|
||||
}
|
||||
if m.Warn(!m.Right(RIVER, arg), ice.ErrNotRight) {
|
||||
return // 没有授权
|
||||
}, Hand: func(m *ice.Message, c *ice.Context, cmd string, arg ...string) {
|
||||
if m.Warn(m.Option(ice.MSG_USERNAME) == "", ice.ErrNotLogin, RIVER) {
|
||||
m.Render(web.STATUS, 401)
|
||||
return // 没有登录
|
||||
}
|
||||
if len(arg) == 0 {
|
||||
m.Option(MENUS, m.Config(MENUS))
|
||||
_river_list(m)
|
||||
return // 群组列表
|
||||
}
|
||||
if len(arg) == 2 && arg[1] == STORM {
|
||||
m.Option(ice.MSG_RIVER, arg[0])
|
||||
m.Cmdy(arg[1], arg[2:])
|
||||
return // 应用列表
|
||||
}
|
||||
if !m.Right(RIVER, arg) {
|
||||
return // 没有授权
|
||||
}
|
||||
|
||||
switch kit.Select("", arg, 1) {
|
||||
case OCEAN, NODE:
|
||||
m.Option(ice.MSG_RIVER, arg[0])
|
||||
m.Cmdy(arg[1], arg[2:])
|
||||
|
||||
case ctx.ACTION, aaa.INVITE:
|
||||
m.Option(ice.MSG_RIVER, arg[0])
|
||||
m.Cmdy(RIVER, arg[1:])
|
||||
|
||||
default:
|
||||
m.Cmdy(RIVER, arg)
|
||||
}
|
||||
}},
|
||||
RIVER: {Name: "river hash auto create", Help: "群组", Action: ice.MergeAction(map[string]*ice.Action{
|
||||
mdb.INPUTS: {Name: "inputs", Help: "补全", Hand: func(m *ice.Message, arg ...string) {
|
||||
switch m.Option(ctx.ACTION) {
|
||||
case cli.START:
|
||||
m.Cmdy(web.DREAM, ctx.ACTION, mdb.INPUTS, arg)
|
||||
return
|
||||
}
|
||||
|
||||
switch kit.Select("", arg, 1) {
|
||||
case USERS, TOOL, NODE:
|
||||
m.Option(ice.MSG_RIVER, arg[0])
|
||||
m.Cmdy(arg[1], arg[2:])
|
||||
|
||||
case ctx.ACTION, aaa.INVITE:
|
||||
m.Option(ice.MSG_RIVER, arg[0])
|
||||
m.Cmdy(RIVER, arg[1:])
|
||||
|
||||
switch arg[0] {
|
||||
case kit.MDB_TEMPLATE:
|
||||
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:
|
||||
m.Cmdy(RIVER, arg)
|
||||
m.Cmdy(mdb.INPUTS, RIVER, "", mdb.HASH, arg)
|
||||
}
|
||||
}},
|
||||
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)
|
||||
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))
|
||||
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(TOOL, mdb.CREATE, kit.MDB_TYPE, PUBLIC, kit.MDB_NAME, storm, kit.MDB_TEXT, storm)
|
||||
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(TOOL, mdb.INSERT, kit.MDB_HASH, h, ice.CTX, s.Cap(ice.CTX_FOLLOW), ice.CMD, key, kit.MDB_HELP, cmd.Help)
|
||||
})
|
||||
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)
|
||||
})
|
||||
})
|
||||
}},
|
||||
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) {
|
||||
switch m.Option(ctx.ACTION) {
|
||||
case cli.START:
|
||||
m.Cmdy(web.DREAM, ctx.ACTION, mdb.INPUTS, arg)
|
||||
return
|
||||
}
|
||||
|
||||
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:
|
||||
m.Push(kit.MDB_TEMPLATE, "base")
|
||||
default:
|
||||
m.Cmdy(mdb.INPUTS, RIVER, "", mdb.HASH, arg)
|
||||
}
|
||||
}},
|
||||
|
||||
aaa.INVITE: {Name: "invite", Help: "脚本", Hand: func(m *ice.Message, arg ...string) {
|
||||
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_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) {
|
||||
_header_share(m, arg...)
|
||||
}},
|
||||
}, 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)
|
||||
m.PushAction(mdb.REMOVE)
|
||||
})
|
||||
}},
|
||||
},
|
||||
})
|
||||
|
||||
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) {
|
||||
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_BIN)
|
||||
}},
|
||||
SHARE: {Name: "share", Help: "共享", Hand: func(m *ice.Message, arg ...string) {
|
||||
_header_share(m, arg...)
|
||||
}},
|
||||
}, mdb.HashAction()), Hand: func(m *ice.Message, c *ice.Context, cmd string, arg ...string) {
|
||||
mdb.HashSelect(m, arg...)
|
||||
}},
|
||||
}})
|
||||
}
|
||||
|
@ -11,29 +11,23 @@ import (
|
||||
const SCAN = "scan"
|
||||
|
||||
func init() {
|
||||
Index.Merge(&ice.Context{
|
||||
Configs: map[string]*ice.Config{
|
||||
SCAN: {Name: SCAN, Help: "二维码", Value: kit.Data(
|
||||
kit.MDB_SHORT, kit.MDB_TEXT, kit.MDB_FIELD, "time,hash,type,name,text",
|
||||
)},
|
||||
},
|
||||
Commands: map[string]*ice.Command{
|
||||
SCAN: {Name: "scan hash auto scanQRCode scanQRCode0", Help: "二维码", Action: ice.MergeAction(map[string]*ice.Action{
|
||||
"scanQRCode0": {Name: "create", Help: "本机扫码", Hand: func(m *ice.Message, arg ...string) {}},
|
||||
"scanQRCode": {Name: "create", Help: "扫码", Hand: func(m *ice.Message, arg ...string) {
|
||||
m.Cmdy(mdb.INSERT, m.Prefix(SCAN), "", mdb.HASH, arg)
|
||||
}},
|
||||
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) {
|
||||
m.Fields(len(arg), m.Conf(SCAN, kit.META_FIELD))
|
||||
if m.Cmdy(mdb.SELECT, m.Prefix(SCAN), "", mdb.HASH, kit.MDB_HASH, arg); len(arg) > 0 {
|
||||
m.PushScript(ssh.SCRIPT, m.Append(kit.MDB_TEXT))
|
||||
m.PushQRCode(cli.QRCODE, m.Append(kit.MDB_TEXT))
|
||||
}
|
||||
m.PushAction(mdb.REMOVE)
|
||||
}},
|
||||
},
|
||||
})
|
||||
Index.Merge(&ice.Context{Configs: map[string]*ice.Config{
|
||||
SCAN: {Name: SCAN, Help: "扫码", Value: kit.Data(
|
||||
kit.MDB_SHORT, kit.MDB_TEXT, kit.MDB_FIELD, "time,hash,type,name,text",
|
||||
)},
|
||||
}, Commands: map[string]*ice.Command{
|
||||
SCAN: {Name: "scan hash auto scanQRCode scanQRCode0", Help: "扫码", Meta: kit.Dict(
|
||||
ice.Display("scan.js"),
|
||||
), Action: ice.MergeAction(map[string]*ice.Action{
|
||||
"scanQRCode0": {Name: "scan create", Help: "本机扫码"},
|
||||
"scanQRCode": {Name: "scan create", Help: "扫码"},
|
||||
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) {
|
||||
if mdb.HashSelect(m, arg...); len(arg) > 0 {
|
||||
m.PushScript(ssh.SCRIPT, m.Append(kit.MDB_TEXT))
|
||||
m.PushQRCode(cli.QRCODE, m.Append(kit.MDB_TEXT))
|
||||
}
|
||||
m.PushAction(mdb.REMOVE)
|
||||
}},
|
||||
}})
|
||||
}
|
||||
|
18
core/chat/scan.js
Normal file
18
core/chat/scan.js
Normal 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: []})
|
||||
|
@ -7,19 +7,17 @@ import (
|
||||
kit "shylinux.com/x/toolkits"
|
||||
)
|
||||
|
||||
const P_SEARCH = "/search"
|
||||
|
||||
func init() {
|
||||
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{
|
||||
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) {
|
||||
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]) {
|
||||
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) {
|
||||
@ -32,7 +30,8 @@ func init() {
|
||||
if m.Cmdy(m.Space(m.Option(ice.POD)), mdb.SEARCH, arg); arg[1] == "" {
|
||||
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))
|
||||
}},
|
||||
}})
|
||||
|
@ -8,79 +8,81 @@ import (
|
||||
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 TOOL = "tool"
|
||||
|
||||
func init() {
|
||||
Index.Merge(&ice.Context{Commands: map[string]*ice.Command{
|
||||
TOOL: {Name: "tool 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)
|
||||
}
|
||||
}},
|
||||
STORM: {Name: "storm hash id auto insert create", Help: "工具", Action: map[string]*ice.Action{
|
||||
mdb.INPUTS: {Name: "inputs", Help: "补全", Hand: func(m *ice.Message, arg ...string) {
|
||||
if cli.Inputs(m, arg[0]) {
|
||||
return
|
||||
}
|
||||
|
||||
switch arg[0] {
|
||||
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) {
|
||||
if len(arg) == 0 {
|
||||
if len(arg) == 0 { // 应用列表
|
||||
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.Sort(kit.MDB_NAME)
|
||||
return // 应用列表
|
||||
return
|
||||
}
|
||||
|
||||
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))
|
||||
if len(msg.Appendv(ice.CMD)) == 0 && len(arg) > 1 {
|
||||
msg := m.Cmd(mdb.SELECT, RIVER, _storm_key(m, arg[0]), mdb.LIST, kit.MDB_ID, kit.Select("", arg, 1))
|
||||
if msg.Length() == 0 && len(arg) > 1 { // 虚拟群组
|
||||
msg.Push(ice.CMD, arg[1])
|
||||
}
|
||||
|
||||
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:])
|
||||
return // 执行命令
|
||||
if len(arg) > 2 && arg[2] == ice.RUN { // 执行命令
|
||||
m.Cmdy(m.Space(kit.Select(m.Option(ice.POD), msg.Append(ice.POD))),
|
||||
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)
|
||||
return // 命令列表
|
||||
}
|
||||
|
||||
// 命令插件
|
@ -115,8 +115,8 @@ func init() {
|
||||
if strings.HasPrefix(key, "/") {
|
||||
key = ice.USR_VOLCANOS + key
|
||||
}
|
||||
m.Warn(os.MkdirAll(path.Dir(key), ice.MOD_DIR) != nil, "key: ", key)
|
||||
m.Warn(ioutil.WriteFile(key, value, ice.MOD_FILE) != nil, "key: ", key)
|
||||
m.Warn(os.MkdirAll(path.Dir(key), ice.MOD_DIR), "mkdir", key)
|
||||
m.Warn(ioutil.WriteFile(key, value, ice.MOD_FILE), "write", key)
|
||||
}
|
||||
}},
|
||||
}, Hand: func(m *ice.Message, c *ice.Context, cmd string, arg ...string) {
|
||||
|
@ -13,7 +13,7 @@ import (
|
||||
)
|
||||
|
||||
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 // 没有权限
|
||||
}
|
||||
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) {
|
||||
if m.Warn(!m.Right(dir, file), ice.ErrNotRight, path.Join(dir, file)) {
|
||||
if !m.Right(dir, file) {
|
||||
return // 没有权限
|
||||
}
|
||||
if m.Cmdy(mdb.ENGINE, ext, file, dir, arg); m.Result() != "" {
|
||||
@ -95,6 +95,12 @@ func init() {
|
||||
nfs.Dir(m, kit.MDB_PATH)
|
||||
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])
|
||||
}},
|
||||
}, Configs: map[string]*ice.Config{
|
||||
|
@ -24,7 +24,7 @@ func init() {
|
||||
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 {
|
||||
m.Cmdy(cli.SYSTEM, arg)
|
||||
}
|
||||
|
@ -18,6 +18,7 @@ func _publish(file ...string) string {
|
||||
return path.Join(ice.USR_PUBLISH, path.Join(file...))
|
||||
}
|
||||
|
||||
const DEVPACK = "devpack"
|
||||
const WEBPACK = "webpack"
|
||||
|
||||
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.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) {
|
||||
m.Cmd(nfs.SAVE, path.Join(ice.USR_VOLCANOS, "page/cache.css"), "")
|
||||
m.Cmd(nfs.SAVE, path.Join(ice.USR_VOLCANOS, "page/cache.js"), "")
|
||||
}},
|
||||
"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"))
|
||||
mdb.REMOVE: {Name: "remove", Help: "删除", Hand: func(m *ice.Message, arg ...string) {
|
||||
m.Cmd(nfs.SAVE, _volcanos("page/cache.js"))
|
||||
m.Cmd(nfs.SAVE, _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"))
|
||||
}},
|
||||
|
8
exec.go
8
exec.go
@ -81,7 +81,7 @@ func (m *Message) Call(sync bool, cb func(*Message) *Message) *Message {
|
||||
|
||||
p := kit.Select("10s", m.Option(kit.MDB_TIMEOUT))
|
||||
t := time.AfterFunc(kit.Duration(p), func() {
|
||||
m.Warn(true, "timeout", p, "of", m.Detailv())
|
||||
m.Warn(true, ErrTimeout, m.Detailv())
|
||||
m.Back(nil)
|
||||
wait <- false
|
||||
})
|
||||
@ -136,9 +136,9 @@ func (m *Message) Event(key string, arg ...string) *Message {
|
||||
return m
|
||||
}
|
||||
func (m *Message) Right(arg ...interface{}) bool {
|
||||
return m.Option(MSG_USERROLE) == "root" || !m.Warn(m.Cmdx("role", "right",
|
||||
m.Option(MSG_USERROLE), strings.ReplaceAll(kit.Keys(arg...), PS, PT)) != OK,
|
||||
ErrNotRight, m.Option(MSG_USERROLE), OF, kit.Join(kit.Simple(arg), PT), " at ", kit.FileLine(2, 3))
|
||||
key := strings.ReplaceAll(kit.Keys(arg...), PS, PT)
|
||||
return m.Option(MSG_USERROLE) == "root" || !m.Warn(m.Cmdx("role", "right", m.Option(MSG_USERROLE), key) != OK,
|
||||
ErrNotRight, kit.Join(kit.Simple(arg), PT), "userrole", m.Option(MSG_USERROLE), "fileline", kit.FileLine(2, 3))
|
||||
}
|
||||
func (m *Message) Space(arg interface{}) []string {
|
||||
if arg == nil || arg == "" || kit.Format(arg) == m.Conf("runtime", "node.name") {
|
||||
|
2
init.go
2
init.go
@ -106,7 +106,9 @@ func Run(arg ...string) string {
|
||||
}
|
||||
|
||||
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) {
|
||||
case "serve", "space":
|
||||
if log.LogDisable = false; Index.Start(Pulse, arg...) {
|
||||
|
36
logs.go
36
logs.go
@ -1,6 +1,7 @@
|
||||
package ice
|
||||
|
||||
import (
|
||||
"io"
|
||||
"runtime"
|
||||
"strings"
|
||||
"time"
|
||||
@ -52,12 +53,13 @@ func (m *Message) log(level string, str string, arg ...interface{}) *Message {
|
||||
return m
|
||||
}
|
||||
func (m *Message) join(arg ...interface{}) string {
|
||||
args := kit.Simple(arg...)
|
||||
list := []string{}
|
||||
for i := 0; i < len(arg); i += 2 {
|
||||
if i == len(arg)-1 {
|
||||
list = append(list, kit.Format(arg[i]))
|
||||
for i := 0; i < len(args); i += 2 {
|
||||
if i == len(args)-1 {
|
||||
list = append(list, args[i])
|
||||
} 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)
|
||||
@ -73,14 +75,23 @@ func (m *Message) Cost(arg ...interface{}) *Message {
|
||||
list := []string{m.FormatCost(), m.join(arg...)}
|
||||
return m.log(LOG_COST, kit.Join(list, SP))
|
||||
}
|
||||
func (m *Message) Warn(err bool, arg ...interface{}) bool {
|
||||
if !err || len(m.meta[MSG_RESULT]) > 0 && m.meta[MSG_RESULT][0] == ErrWarn {
|
||||
return err
|
||||
func (m *Message) Warn(err interface{}, arg ...interface{}) bool {
|
||||
switch err := err.(type) {
|
||||
case error:
|
||||
if err == io.EOF {
|
||||
return false
|
||||
}
|
||||
arg = append(arg, "err", err)
|
||||
case bool:
|
||||
if !err {
|
||||
return false
|
||||
}
|
||||
case nil:
|
||||
return false
|
||||
}
|
||||
|
||||
m.meta[MSG_RESULT] = kit.Simple(ErrWarn, arg)
|
||||
m.log(LOG_WARN, m.join(kit.Simple(arg)))
|
||||
return err
|
||||
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 {
|
||||
if err {
|
||||
@ -148,6 +159,9 @@ func (m *Message) FormatSize() string {
|
||||
func (m *Message) FormatMeta() string {
|
||||
return kit.Format(m.meta)
|
||||
}
|
||||
func (m *Message) FormatsMeta() string {
|
||||
return kit.Formats(m.meta)
|
||||
}
|
||||
func (m *Message) FormatStack() string {
|
||||
pc := make([]uintptr, 100)
|
||||
frames := runtime.CallersFrames(pc[:runtime.Callers(5, pc)])
|
||||
|
18
meta.go
18
meta.go
@ -55,12 +55,20 @@ func (m *Message) Add(key string, arg ...string) *Message {
|
||||
m.meta[key] = append(m.meta[key], arg...)
|
||||
|
||||
case MSG_OPTION, MSG_APPEND:
|
||||
if len(arg) > 0 {
|
||||
if kit.IndexOf(m.meta[key], arg[0]) == -1 {
|
||||
m.meta[key] = append(m.meta[key], arg[0])
|
||||
}
|
||||
m.meta[arg[0]] = append(m.meta[arg[0]], arg[1:]...)
|
||||
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 {
|
||||
m.meta[key] = append(m.meta[key], arg[0])
|
||||
}
|
||||
m.meta[arg[0]] = append(m.meta[arg[0]], arg[1:]...)
|
||||
}
|
||||
return m
|
||||
}
|
||||
|
4
misc.go
4
misc.go
@ -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
|
||||
}
|
||||
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
|
||||
}
|
||||
|
||||
if k == RUN && m.Warn(!m.Right(arg), ErrNotRight, arg) {
|
||||
if k == RUN && !m.Right(arg) {
|
||||
return m
|
||||
}
|
||||
|
||||
|
@ -41,7 +41,7 @@ func init() {
|
||||
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
|
||||
}
|
||||
|
||||
@ -49,7 +49,7 @@ func init() {
|
||||
ice.OptionFields(m.Conf(SESS, kit.META_FIELD)))
|
||||
m.Option(aaa.USERNAME, msg.Append(aaa.USERNAME))
|
||||
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) {
|
||||
m.Cmdy(cli.QRCODE, m.Option(kit.MDB_TEXT), m.Option(cli.FG), m.Option(cli.BG))
|
||||
|
@ -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{}
|
||||
if len(arg) == 0 {
|
||||
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]),
|
||||
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_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]))
|
||||
})
|
||||
}
|
||||
|
@ -36,8 +36,8 @@ func _ssh_config(m *ice.Message, h string) *ssh.ServerConfig {
|
||||
if !strings.HasPrefix(value[kit.MDB_NAME], conn.User()+"@") {
|
||||
return
|
||||
}
|
||||
if s, e := base64.StdEncoding.DecodeString(value[kit.MDB_TEXT]); !m.Warn(e != nil, e) {
|
||||
if pub, e := ssh.ParsePublicKey([]byte(s)); !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) {
|
||||
|
||||
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])
|
||||
@ -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) {
|
||||
conn, chans, reqs, err := ssh.NewServerConn(c, _ssh_config(m, h))
|
||||
if m.Warn(err != nil, err) {
|
||||
if m.Warn(err) {
|
||||
return
|
||||
}
|
||||
|
||||
@ -80,7 +80,7 @@ func _ssh_accept(m *ice.Message, h string, c net.Conn) {
|
||||
|
||||
for ch := range chans {
|
||||
channel, requests, err := ch.Accept()
|
||||
if m.Warn(err != nil, err) {
|
||||
if m.Warn(err) {
|
||||
continue
|
||||
}
|
||||
|
||||
|
@ -9,12 +9,12 @@ import (
|
||||
"unsafe"
|
||||
|
||||
"github.com/kr/pty"
|
||||
"golang.org/x/crypto/ssh"
|
||||
ice "shylinux.com/x/icebergs"
|
||||
"shylinux.com/x/icebergs/base/cli"
|
||||
"shylinux.com/x/icebergs/base/mdb"
|
||||
"shylinux.com/x/icebergs/base/tcp"
|
||||
kit "shylinux.com/x/toolkits"
|
||||
"golang.org/x/crypto/ssh"
|
||||
)
|
||||
|
||||
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)}
|
||||
|
||||
pty, tty, err := pty.Open()
|
||||
if m.Warn(err != nil, err) {
|
||||
if m.Warn(err) {
|
||||
return
|
||||
}
|
||||
defer tty.Close()
|
||||
|
@ -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{}) {
|
||||
switch pro {
|
||||
case kit.MDB_ZONE, kit.MDB_ID, kit.MDB_TIME:
|
||||
m.Warn(true, "deny modify %v", pro)
|
||||
m.Warn(true, ice.ErrNotRight, pro)
|
||||
return
|
||||
}
|
||||
|
||||
@ -363,7 +363,7 @@ func init() {
|
||||
"/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.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")
|
||||
return
|
||||
}
|
||||
|
@ -39,12 +39,12 @@ func init() {
|
||||
}
|
||||
}
|
||||
|
||||
switch m.RenderResult(); m.R.URL.String() {
|
||||
switch m.RenderResult(); arg[0] {
|
||||
case "/qrcode", "/input", "/sess": // 登录入口
|
||||
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
|
||||
}
|
||||
|
||||
@ -52,7 +52,7 @@ func init() {
|
||||
ice.OptionFields(m.Conf(SESS, kit.META_FIELD)))
|
||||
m.Option(aaa.USERNAME, msg.Append(aaa.USERNAME))
|
||||
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{
|
||||
aaa.LOGOUT: {Name: "logout", Help: "退出", Hand: func(m *ice.Message, arg ...string) {
|
||||
|
@ -26,13 +26,10 @@ func init() {
|
||||
msg := m.Cmd(BOT, arg[0])
|
||||
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, ""))))
|
||||
m.Debug("what %v", sig)
|
||||
m.Debug("what %v", check)
|
||||
if m.Warn(sig != m.Option("msg_signature"), ice.ErrNotRight) {
|
||||
if m.Warn(sig != m.Option("msg_signature"), ice.ErrNotRight, arg) {
|
||||
// return
|
||||
}
|
||||
|
||||
m.Debug("what %v", msg.Append("ekey"))
|
||||
aeskey, err := base64.RawURLEncoding.DecodeString(msg.Append("ekey"))
|
||||
m.Assert(err)
|
||||
|
||||
|
@ -45,7 +45,7 @@ const ACCESS = "access"
|
||||
func init() {
|
||||
Index.Merge(&ice.Context{Configs: map[string]*ice.Config{
|
||||
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",
|
||||
APPID, "", APPMM, "", "tokens", "",
|
||||
)},
|
||||
|
@ -13,7 +13,7 @@ import (
|
||||
|
||||
func _wx_check(m *ice.Message) bool {
|
||||
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 // 验证失败
|
||||
}
|
||||
if m.Option("echostr") != "" {
|
||||
@ -74,7 +74,7 @@ func init() {
|
||||
|
||||
case TEXT: // 文本
|
||||
cmds := kit.Split(m.Option("Content"))
|
||||
if m.Warn(!m.Right(cmds), ice.ErrNotRight) {
|
||||
if !m.Right(cmds) {
|
||||
cmds = []string{MENU, mdb.CREATE}
|
||||
}
|
||||
m.Cmdy(TEXT, cmds)
|
||||
|
17
render.go
17
render.go
@ -73,6 +73,23 @@ func (m *Message) RenderDownload(args ...interface{}) *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...))))
|
||||
}
|
||||
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 {
|
||||
if m.Option(MSG_USERUA) == "" || !strings.HasPrefix(m.Option(MSG_USERUA), "Mozilla/5.0") {
|
||||
|
48
type.go
48
type.go
@ -105,45 +105,65 @@ func (c *Context) Merge(s *Context) *Context {
|
||||
if c.Commands[CTX_EXIT] == nil {
|
||||
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 {
|
||||
switch last, next := p.Hand, v.Hand; k {
|
||||
|
||||
for key, cmd := range s.Commands {
|
||||
if p, ok := c.Commands[key]; ok && s != c {
|
||||
switch last, next := p.Hand, cmd.Hand; key {
|
||||
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...)
|
||||
next(m, c, key, arg...)
|
||||
}
|
||||
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...)
|
||||
last(m, c, key, arg...)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if v.Meta == nil {
|
||||
v.Meta = kit.Dict()
|
||||
if cmd.Meta == nil {
|
||||
cmd.Meta = kit.Dict()
|
||||
}
|
||||
if c.Commands[k] = v; v.List == nil {
|
||||
v.List = c.split(v.Name)
|
||||
if c.Commands[key] = cmd; cmd.List == nil {
|
||||
cmd.List = c.split(cmd.Name)
|
||||
}
|
||||
|
||||
for k, a := range v.Action {
|
||||
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...)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
help := strings.SplitN(a.Help, ":", 2)
|
||||
if len(help) == 1 || help[1] == "" {
|
||||
help = strings.SplitN(help[0], ":", 2)
|
||||
}
|
||||
if kit.Value(v.Meta, kit.Keys("_trans", k), help[0]); len(help) > 1 {
|
||||
kit.Value(v.Meta, kit.Keys(kit.MDB_TITLE, k), help[1])
|
||||
if kit.Value(cmd.Meta, kit.Keys("_trans", k), help[0]); len(help) > 1 {
|
||||
kit.Value(cmd.Meta, kit.Keys(kit.MDB_TITLE, k), help[1])
|
||||
}
|
||||
if a.Hand == nil {
|
||||
continue
|
||||
continue // alias cmd
|
||||
}
|
||||
if a.List == nil {
|
||||
a.List = c.split(a.Name)
|
||||
}
|
||||
if len(a.List) > 0 {
|
||||
v.Meta[k] = a.List
|
||||
cmd.Meta[k] = a.List
|
||||
}
|
||||
}
|
||||
}
|
||||
|
Loading…
x
Reference in New Issue
Block a user