1
0
forked from x/icebergs
This commit is contained in:
harveyshao 2022-08-05 17:27:55 +08:00
parent e516bf6ec8
commit 55c606516a
141 changed files with 761 additions and 963 deletions

View File

@ -93,7 +93,7 @@ const ROLE = "role"
func init() {
Index.MergeCommands(ice.Commands{
ROLE: {Name: "role role auto insert", Help: "角色", Actions: ice.MergeAction(ice.Actions{
ROLE: {Name: "role role auto insert", Help: "角色", Actions: ice.MergeActions(ice.Actions{
ice.CTX_INIT: {Hand: func(m *ice.Message, arg ...string) {
mdb.Rich(m, ROLE, nil, kit.Dict(mdb.NAME, TECH, BLACK, kit.Dict(), WHITE, kit.Dict()))
mdb.Rich(m, ROLE, nil, kit.Dict(mdb.NAME, VOID, WHITE, kit.Dict(), BLACK, kit.Dict()))

View File

@ -12,7 +12,7 @@ func _sess_check(m *ice.Message, sessid string) {
m.Option(ice.MSG_USERROLE, VOID)
m.Option(ice.MSG_USERNAME, "")
m.Option(ice.MSG_USERNICK, "")
if m.Warn(sessid == "", ice.ErrNotValid, sessid) {
if sessid == "" {
return
}
@ -34,9 +34,9 @@ func _sess_create(m *ice.Message, username string) (h string) {
return
}
if msg := m.Cmd(USER, username); msg.Length() > 0 {
h = mdb.HashCreate(m, msg.AppendSimple(USERROLE, USERNAME, USERNICK), IP, m.Option(ice.MSG_USERIP), UA, m.Option(ice.MSG_USERUA)).Result()
h = mdb.HashCreate(m, msg.AppendSimple(USERROLE, USERNAME, USERNICK), IP, m.Option(ice.MSG_USERIP), UA, m.Option(ice.MSG_USERUA))
} else {
h = mdb.HashCreate(m, m.OptionSimple(USERROLE, USERNAME, USERNICK), IP, m.Option(ice.MSG_USERIP), UA, m.Option(ice.MSG_USERUA)).Result()
h = mdb.HashCreate(m, m.OptionSimple(USERROLE, USERNAME, USERNICK), IP, m.Option(ice.MSG_USERIP), UA, m.Option(ice.MSG_USERUA))
}
gdb.Event(m, SESS_CREATE, SESS, h, USERNAME, username)
return h
@ -60,7 +60,7 @@ const SESS = "sess"
func init() {
Index.MergeCommands(ice.Commands{
SESS: {Name: "sess hash auto prunes", Help: "会话", Actions: ice.MergeAction(ice.Actions{
SESS: {Name: "sess hash auto prunes", Help: "会话", Actions: ice.MergeActions(ice.Actions{
mdb.CREATE: {Name: "create username", Help: "创建", Hand: func(m *ice.Message, arg ...string) {
_sess_create(m, m.Option(USERNAME))
}},
@ -77,3 +77,6 @@ func SessCreate(m *ice.Message, username string) string {
func SessCheck(m *ice.Message, sessid string) bool {
return m.Cmdy(SESS, CHECK, sessid).Option(ice.MSG_USERNAME) != ""
}
func UserLogout(m *ice.Message) {
m.Cmd(SESS, mdb.REMOVE, kit.Dict(mdb.HASH, m.Option(ice.MSG_SESSID)))
}

View File

@ -54,7 +54,7 @@ const TOTP = "totp"
func init() {
Index.MergeCommands(ice.Commands{
TOTP: {Name: "totp name auto create", Help: "令牌", Actions: ice.MergeAction(ice.Actions{
TOTP: {Name: "totp name auto create", Help: "令牌", Actions: ice.MergeActions(ice.Actions{
mdb.CREATE: {Name: "create name=hi secret period=30 number=6", Help: "添加", Hand: func(m *ice.Message, arg ...string) {
if m.Option(SECRET) == "" { // 创建密钥
m.Option(SECRET, _totp_gen(kit.Int64(m.Option(PERIOD))))

View File

@ -71,7 +71,7 @@ const USER = "user"
func init() {
Index.MergeCommands(ice.Commands{
USER: {Name: "user username auto create", Help: "用户", Actions: ice.MergeAction(ice.Actions{
USER: {Name: "user username auto create", Help: "用户", Actions: ice.MergeActions(ice.Actions{
mdb.CREATE: {Name: "create username password userrole=void,tech", Help: "创建", Hand: func(m *ice.Message, arg ...string) {
_user_create(m, m.Option(USERNAME), m.Option(PASSWORD), m.OptionSimple(USERROLE)...)
}},

View File

@ -26,7 +26,7 @@ func _daemon_exec(m *ice.Message, cmd *exec.Cmd) {
h := mdb.HashCreate(m, ice.CMD, kit.Join(cmd.Args, ice.SP),
STATUS, START, DIR, cmd.Dir, ENV, kit.Select("", cmd.Env),
m.OptionSimple(CMD_INPUT, CMD_OUTPUT, CMD_ERRPUT, mdb.CACHE_CLEAR_ON_EXIT),
).Result()
)
// 启动服务
if e := cmd.Start(); m.Warn(e, ice.ErrNotStart, cmd.Args) {
@ -108,7 +108,7 @@ const DAEMON = "daemon"
func init() {
Index.MergeCommands(ice.Commands{
DAEMON: {Name: "daemon hash auto start prunes", Help: "守护进程", Actions: ice.MergeAction(ice.Actions{
DAEMON: {Name: "daemon hash auto start prunes", Help: "守护进程", Actions: ice.MergeActions(ice.Actions{
ice.CTX_EXIT: {Hand: func(m *ice.Message, arg ...string) {
mdb.HashPrunesValue(m, mdb.CACHE_CLEAR_ON_EXIT, ice.TRUE)
}},

View File

@ -21,7 +21,7 @@ const MIRRORS = "mirrors"
func init() {
Index.MergeCommands(ice.Commands{
MIRRORS: {Name: "mirrors cli auto", Help: "软件镜像", Actions: ice.MergeAction(ice.Actions{
MIRRORS: {Name: "mirrors cli auto", Help: "软件镜像", Actions: ice.MergeActions(ice.Actions{
ice.CTX_INIT: {Hand: func(m *ice.Message, arg ...string) {
m.Go(func() {
m.Sleep300ms() // after runtime init

View File

@ -79,6 +79,7 @@ const (
STYLE = "style"
DISPLAY = "display"
ACTION = "action"
TRANS = "trans"
CAN_PLUGIN = "can.plugin"
)
@ -119,6 +120,10 @@ func CmdAction(args ...ice.Any) ice.Actions {
m.Cmd(CONFIG, "reset", arg[0])
return
}
if len(arg) > 3 && arg[1] == ACTION && arg[2] == CONFIG && arg[3] == "select" {
m.Cmdy(CONFIG, arg[0])
return
}
if aaa.Right(m, arg) && !PodCmd(m, arg) {
m.Cmdy(arg)
}

View File

@ -152,3 +152,6 @@ func Load(m *ice.Message, arg ...string) *ice.Message {
}
return m.Cmd(CONFIG, ice.LOAD, m.Prefix(nfs.JSON), arg)
}
func ConfAction(args ...ice.Any) ice.Actions {
return ice.Actions{ice.CTX_INIT: mdb.AutoConfig(args...)}
}

View File

@ -26,7 +26,7 @@ const CONTEXT = "context"
func init() {
Index.MergeCommands(ice.Commands{
CONTEXT: {Name: "context name=web action=context,command,config key auto spide", Help: "模块", Actions: ice.MergeAction(ice.Actions{
CONTEXT: {Name: "context name=web action=context,command,config key auto spide", Help: "模块", Actions: ice.MergeActions(ice.Actions{
"spide": {Name: "spide", Help: "架构图", Hand: func(m *ice.Message, arg ...string) {
if len(arg) == 0 || arg[1] == CONTEXT { // 模块列表
m.Cmdy(CONTEXT, kit.Select(ice.ICE, arg, 0), CONTEXT)

View File

@ -10,13 +10,13 @@ const EVENT = "event"
func init() {
Index.MergeCommands(ice.Commands{
EVENT: {Name: "event event id auto listen happen", Help: "事件流", Actions: ice.MergeAction(ice.Actions{
EVENT: {Name: "event event id auto listen happen", Help: "事件流", Actions: ice.MergeActions(ice.Actions{
LISTEN: {Name: "listen event cmd", Help: "监听", Hand: func(m *ice.Message, arg ...string) {
mdb.ZoneInsert(m, m.OptionSimple(EVENT, ice.CMD))
}},
HAPPEN: {Name: "happen event arg", Help: "触发", Hand: func(m *ice.Message, arg ...string) {
mdb.ZoneSelect(m, m.Option(EVENT)).Tables(func(value ice.Maps) {
m.Cmd(kit.Split(value[ice.CMD]), m.Option(EVENT), arg[2:]).Cost()
mdb.ZoneSelect(m.Spawn(), m.Option(EVENT)).Tables(func(value ice.Maps) {
m.Cmdy(kit.Split(value[ice.CMD]), m.Option(EVENT), arg[2:], ice.OptionFields("")).Cost()
})
}},
}, mdb.ZoneAction(mdb.SHORT, EVENT, mdb.FIELD, "time,id,cmd"))},
@ -24,10 +24,10 @@ func init() {
}
func Watch(m *ice.Message, key string, arg ...string) *ice.Message {
if len(arg) == 0 {
arg = append(arg, m.Prefix(ice.AUTO))
arg = append(arg, m.PrefixKey())
}
return m.Cmd(EVENT, LISTEN, EVENT, key, ice.CMD, kit.Join(arg, ice.SP))
}
func Event(m *ice.Message, key string, arg ...string) *ice.Message {
return m.Cmd(EVENT, HAPPEN, EVENT, key, arg)
func Event(m *ice.Message, key string, arg ...ice.Any) *ice.Message {
return m.Cmdy(EVENT, HAPPEN, EVENT, key, arg)
}

View File

@ -11,11 +11,11 @@ const ROUTINE = "routine"
func init() {
Index.MergeCommands(ice.Commands{
ROUTINE: {Name: "routine hash auto prunes", Help: "协程池", Actions: ice.MergeAction(ice.Actions{
ROUTINE: {Name: "routine hash auto prunes", Help: "协程池", Actions: ice.MergeActions(ice.Actions{
mdb.CREATE: {Name: "create name", Help: "创建", Hand: func(m *ice.Message, arg ...string) {
m.Go(func() {
cb := m.OptionCB("")
h := mdb.HashCreate(m, m.OptionSimple(mdb.NAME), mdb.STATUS, START, ice.CMD, logs.FileLine(cb, 100)).Result()
h := mdb.HashCreate(m, m.OptionSimple(mdb.NAME), mdb.STATUS, START, ice.CMD, logs.FileLine(cb, 100))
defer func() {
if e := recover(); e == nil {
mdb.HashModify(m, mdb.HASH, h, mdb.STATUS, STOP)

View File

@ -9,6 +9,7 @@ import (
ice "shylinux.com/x/icebergs"
"shylinux.com/x/icebergs/base/mdb"
kit "shylinux.com/x/toolkits"
"shylinux.com/x/toolkits/file"
"shylinux.com/x/toolkits/logs"
)
@ -25,7 +26,8 @@ func _signal_action(m *ice.Message, arg ...string) {
}
func _signal_process(m *ice.Message, p string, s os.Signal) {
if p == "" {
p = logs.ReadFile(ice.Info.PidPath)
b, _ := file.ReadFile(ice.Info.PidPath)
p = string(b)
}
if p == "" {
p = kit.Format(os.Getpid())
@ -52,7 +54,7 @@ const SIGNAL = "signal"
func init() {
Index.MergeCommands(ice.Commands{
SIGNAL: {Name: "signal signal auto listen", Help: "信号器", Actions: ice.MergeAction(ice.Actions{
SIGNAL: {Name: "signal signal auto listen", Help: "信号器", Actions: ice.MergeActions(ice.Actions{
ice.CTX_INIT: {Hand: func(m *ice.Message, arg ...string) {
_signal_listen(m, 2, mdb.NAME, "重启", ice.CMD, "exit 1")
_signal_listen(m, 3, mdb.NAME, "退出", ice.CMD, "exit 0")

View File

@ -30,7 +30,7 @@ const TIMER = "timer"
func init() {
Index.MergeCommands(ice.Commands{
TIMER: {Name: "timer hash auto create prunes", Help: "定时器", Actions: ice.MergeAction(ice.Actions{
TIMER: {Name: "timer hash auto create prunes", Help: "定时器", Actions: ice.MergeActions(ice.Actions{
mdb.CREATE: {Name: "create name=hi delay=10ms interval=10s count=3 cmd=runtime", Help: "创建"},
mdb.PRUNES: {Name: "prunes", Help: "清理", Hand: func(m *ice.Message, arg ...string) {
mdb.HashPrunesValue(m, mdb.COUNT, "0")

View File

@ -42,7 +42,7 @@ func _hash_insert(m *ice.Message, prefix, chain string, arg ...string) string {
if expire := m.Conf(prefix, kit.Keys(chain, kit.Keym(EXPIRE))); expire != "" {
arg = kit.Simple(TIME, m.Time(expire), arg)
}
if m.Optionv(TARGET) != nil {
if m.Optionv(TARGET) != nil && m.Option(TARGET) != "" {
m.Echo(Rich(m, prefix, chain, kit.Data(arg, TARGET, m.Optionv(TARGET))))
} else {
m.Echo(Rich(m, prefix, chain, kit.Data(arg)))
@ -170,7 +170,7 @@ func HashAction(args ...Any) ice.Actions {
}
}
func HashCloseAction(args ...Any) ice.Actions {
return ice.MergeAction(HashAction(args...), ice.Actions{
return ice.MergeActions(HashAction(args...), ice.Actions{
ice.CTX_EXIT: {Hand: func(m *ice.Message, arg ...string) { HashSelectClose(m) }},
})
}
@ -186,7 +186,7 @@ func HashStatusAction(args ...Any) ice.Actions {
return list
}
func HashStatusCloseAction(args ...Any) ice.Actions {
return ice.MergeAction(HashStatusAction(args...), ice.Actions{
return ice.MergeActions(HashStatusAction(args...), ice.Actions{
ice.CTX_EXIT: {Hand: func(m *ice.Message, arg ...string) { HashSelectClose(m) }},
})
}
@ -201,8 +201,9 @@ func HashArgs(m *ice.Message, arg ...Any) []string {
func HashInputs(m *ice.Message, arg ...Any) *ice.Message {
return m.Cmdy(INPUTS, m.PrefixKey(), "", HASH, HashArgs(m, arg))
}
func HashCreate(m *ice.Message, arg ...Any) *ice.Message {
return m.Cmdy(INSERT, m.PrefixKey(), "", HASH, HashArgs(m, arg...))
func HashCreate(m *ice.Message, arg ...Any) string {
msg := m.Spawn()
return m.Echo(msg.Cmdx(INSERT, m.PrefixKey(), "", HASH, HashArgs(msg, arg...))).Result()
}
func HashRemove(m *ice.Message, arg ...Any) *ice.Message {
return m.Cmdy(DELETE, m.PrefixKey(), "", HASH, m.OptionSimple(HashShort(m)), arg)
@ -291,6 +292,7 @@ func HashSelectValue(m *ice.Message, cb Any) *ice.Message {
func HashSelectClose(m *ice.Message) *ice.Message {
HashSelectValue(m, func(target ice.Any) {
if c, ok := target.(io.Closer); ok {
m.Logs(DELETE, TARGET, m.PrefixKey())
c.Close()
}
})
@ -315,5 +317,8 @@ func Rich(m *ice.Message, prefix string, chain Any, data Any) string {
cache = kit.Data()
m.Confv(prefix, chain, cache)
}
if m.Option(SHORT) != "" {
kit.Value(cache, kit.Keym(SHORT), m.Option(SHORT))
}
return miss.Rich(path.Join(prefix, kit.Keys(chain)), cache, data)
}

View File

@ -274,7 +274,7 @@ func init() {
}
func AutoConfig(args ...ice.Any) *ice.Action {
return &ice.Action{Hand: func(m *ice.Message, arg ...string) {
if cs := m.Target().Configs; cs[m.CommandKey()] == nil && len(args) > 0 {
if cs := m.Target().Configs; len(args) > 0 {
cs[m.CommandKey()] = &ice.Config{Value: kit.Data(args...)}
ice.Info.Load(m, m.CommandKey())
}

View File

@ -12,10 +12,18 @@ func init() {
}
func RenderAction(args ...ice.Any) ice.Actions {
return ice.MergeAction(ice.Actions{
return ice.MergeActions(ice.Actions{
ice.CTX_INIT: {Hand: func(m *ice.Message, arg ...string) {
if len(args) == 0 {
args = append(args, SHORT, TYPE, FIELD, "time,type,name,text")
}
if cs := m.Target().Configs; cs[m.CommandKey()] == nil {
cs[m.CommandKey()] = &ice.Config{Value: kit.Data(SHORT, TYPE)}
cs[m.CommandKey()] = &ice.Config{Value: kit.Data(args...)}
} else {
ls := kit.Simple(args)
for i := 0; i < len(ls); i += 2 {
m.Config(ls[i], ls[i+1])
}
}
}},
CREATE: {Name: "create type name text", Help: "创建", Hand: func(m *ice.Message, arg ...string) {

View File

@ -16,7 +16,7 @@ func SearchAction() ice.Actions {
}
}
func HashSearchAction(arg ...Any) ice.Actions {
return ice.MergeAction(HashAction(arg...), SearchAction())
return ice.MergeActions(HashAction(arg...), SearchAction())
}
func HashSelectSearch(m *ice.Message, args []string, keys ...string) *ice.Message {
if len(keys) == 0 {

View File

@ -215,6 +215,10 @@ func ZoneSelectPage(m *ice.Message, arg ...string) *ice.Message {
OptionPages(m, kit.Slice(arg, 2)...)
return ZoneSelect(m, arg...)
}
func ZoneSelects(m *ice.Message, arg ...string) *ice.Message {
m.OptionFields(m.Config(FIELD))
return ZoneSelect(m, arg...)
}
func ZoneSelectAll(m *ice.Message, arg ...string) *ice.Message {
m.Option(CACHE_LIMIT, "-1")
return ZoneSelect(m, arg...)

View File

@ -34,14 +34,14 @@ func _dir_list(m *ice.Message, root string, name string, level int, deep bool, d
}
list, e := ReadDir(m, path.Join(root, name))
if e != nil { // 单个文件
if e != nil || len(list) == 0 { // 单个文件
ls, _ := ReadDir(m, path.Dir(path.Join(root, name)))
for _, s := range ls {
if s.Name() == path.Base(name) {
list = append(list, s)
}
}
name = path.Dir(name)
name, deep = path.Dir(name), false
}
for _, f := range list {
@ -178,7 +178,7 @@ func init() {
m.Cmdy("web.cache", "upload_watch", m.Option(PATH))
}},
TRASH: {Name: "trash", Help: "删除", Hand: func(m *ice.Message, arg ...string) {
m.Cmdy(TRASH, m.Option(PATH))
m.Cmdy(TRASH, mdb.CREATE, m.Option(PATH))
}},
}, Hand: func(m *ice.Message, arg ...string) {
if m.Option(DIR_ROOT) != "" {

View File

@ -165,3 +165,6 @@ func NewWriteCloser(w func([]byte) (int, error), c func() error) io.WriteCloser
func NewReadCloser(r io.Reader) io.ReadCloser {
return file.NewReadCloser(r)
}
func NewCloser(c func() error) io.WriteCloser {
return file.NewWriteCloser(func(buf []byte) (int, error) { return 0, nil }, c)
}

View File

@ -37,7 +37,7 @@ const TAIL = "tail"
func init() {
Index.MergeCommands(ice.Commands{
TAIL: {Name: "tail name id auto page filter:text create", Help: "日志流", Actions: ice.MergeAction(ice.Actions{
TAIL: {Name: "tail name id auto page filter:text create", Help: "日志流", Actions: ice.MergeActions(ice.Actions{
ice.CTX_INIT: {Hand: func(m *ice.Message, arg ...string) {
mdb.Richs(m, TAIL, "", mdb.FOREACH, func(key string, value ice.Map) {
value, _ = kit.GetMeta(value), m.Option(mdb.HASH, key)

View File

@ -34,7 +34,7 @@ const TRASH = "trash"
func init() {
Index.MergeCommands(ice.Commands{
TRASH: {Name: "trash hash auto prunes", Help: "回收站", Actions: ice.MergeAction(ice.Actions{
TRASH: {Name: "trash hash auto prunes", Help: "回收站", Actions: ice.MergeActions(ice.Actions{
mdb.REVERT: {Name: "revert", Help: "恢复", Hand: func(m *ice.Message, arg ...string) {
Rename(m, m.Option(FILE), m.Option(FROM))
mdb.HashRemove(m, m.OptionSimple(mdb.HASH))

View File

@ -66,7 +66,7 @@ const CLIENT = "client"
func init() {
Index.MergeCommands(ice.Commands{
CLIENT: {Name: "client hash auto prunes", Help: "客户端", Actions: ice.MergeAction(ice.Actions{
CLIENT: {Name: "client hash auto prunes", Help: "客户端", Actions: ice.MergeActions(ice.Actions{
ice.CTX_INIT: {Hand: func(m *ice.Message, arg ...string) { m.Conf("", mdb.HASH, "") }},
ice.CTX_EXIT: {Hand: func(m *ice.Message, arg ...string) {}},
DIAL: {Name: "dial type name port=9010 host=", Help: "连接", Hand: func(m *ice.Message, arg ...string) {

View File

@ -67,7 +67,7 @@ const HOST = "host"
func init() {
Index.MergeCommands(ice.Commands{
HOST: {Name: "host name auto", Help: "主机", Actions: ice.MergeAction(ice.Actions{
HOST: {Name: "host name auto", Help: "主机", Actions: ice.MergeActions(ice.Actions{
ice.CTX_INIT: {Hand: func(m *ice.Message, arg ...string) {
m.Cmd(HOST).Tables(func(value ice.Maps) { m.Cmd(HOST, aaa.WHITE, value[aaa.IP]) })
}},

View File

@ -46,7 +46,7 @@ const PORT = "port"
func init() {
Index.MergeCommands(ice.Commands{
PORT: {Name: "port port path auto", Help: "端口", Actions: ice.MergeAction(ice.Actions{
PORT: {Name: "port port path auto", Help: "端口", Actions: ice.MergeActions(ice.Actions{
aaa.RIGHT: {Name: "right", Help: "分配", Hand: func(m *ice.Message, arg ...string) {
m.Echo(_port_right(m, arg...))
}},

View File

@ -28,7 +28,7 @@ func (l Listener) Close() error {
func _server_listen(m *ice.Message, arg ...string) {
l, e := net.Listen(TCP, m.Option(HOST)+":"+m.Option(PORT))
l = &Listener{m: m, h: mdb.HashCreate(m, arg, kit.Dict(mdb.TARGET, l), STATUS, kit.Select(ERROR, OPEN, e == nil), ERROR, kit.Format(e)).Result(), s: &Stat{}, Listener: l}
l = &Listener{m: m, h: mdb.HashCreate(m, arg, kit.Dict(mdb.TARGET, l), STATUS, kit.Select(ERROR, OPEN, e == nil), ERROR, kit.Format(e)), s: &Stat{}, Listener: l}
if e == nil {
defer l.Close()
}
@ -62,7 +62,7 @@ const SERVER = "server"
func init() {
Index.MergeCommands(ice.Commands{
SERVER: {Name: "server hash auto prunes", Help: "服务器", Actions: ice.MergeAction(ice.Actions{
SERVER: {Name: "server hash auto prunes", Help: "服务器", Actions: ice.MergeActions(ice.Actions{
ice.CTX_INIT: {Hand: func(m *ice.Message, arg ...string) { m.Conf("", mdb.HASH, "") }},
ice.CTX_EXIT: {Hand: func(m *ice.Message, arg ...string) { mdb.HashSelectClose(m) }},
LISTEN: {Name: "listen type name port=9030 host=", Help: "监听", Hand: func(m *ice.Message, arg ...string) {

View File

@ -66,7 +66,7 @@ const BROAD = "broad"
func init() {
Index.MergeCommands(ice.Commands{
BROAD: {Name: "broad hash auto serve", Help: "广播", Actions: ice.MergeAction(ice.Actions{
BROAD: {Name: "broad hash auto serve", Help: "广播", Actions: ice.MergeActions(ice.Actions{
mdb.SEARCH: {Name: "search type name text", Help: "搜索", Hand: func(m *ice.Message, arg ...string) {
_broad_search(m, arg[0], arg[1], kit.Select("", arg, 2))
}},

View File

@ -29,7 +29,7 @@ func _cache_save(m *ice.Message, kind, name, text string, arg ...string) { // fi
size := kit.Int(kit.Select(kit.Format(len(text)), arg, 1))
file := kit.Select("", arg, 0)
text = kit.Select(file, text)
h := mdb.HashCreate(m, kit.SimpleKV("", kind, name, text), nfs.FILE, file, nfs.SIZE, size).Result()
h := mdb.HashCreate(m, kit.SimpleKV("", kind, name, text), nfs.FILE, file, nfs.SIZE, size)
// 返回结果
m.Push(mdb.TIME, m.Time())
@ -61,7 +61,7 @@ func _cache_catch(m *ice.Message, name string) (file, size string) {
return "", "0"
}
func _cache_upload(m *ice.Message, r *http.Request) (kind, name, file, size string) {
if b, h, e := r.FormFile(UPLOAD); e == nil {
if b, h, e := r.FormFile(UPLOAD); m.Assert(e) {
defer b.Close()
// 创建文件
@ -126,7 +126,7 @@ const CACHE = "cache"
func init() {
Index.MergeCommands(ice.Commands{
CACHE: {Name: "cache hash auto", Help: "缓存池", Actions: ice.MergeAction(ice.Actions{
CACHE: {Name: "cache hash auto", Help: "缓存池", Actions: ice.MergeActions(ice.Actions{
WATCH: {Name: "watch key file", Help: "释放", Hand: func(m *ice.Message, arg ...string) {
_cache_watch(m, arg[0], arg[1])
}},

View File

@ -102,7 +102,7 @@ func _dream_show(m *ice.Message, name string) {
bin := kit.Select(os.Args[0], cli.SystemFind(m, ice.ICE_BIN, kit.Path(path.Join(p, ice.BIN)), kit.Path(ice.BIN)))
m.Cmd(cli.DAEMON, bin, SPACE, tcp.DIAL, ice.DEV, ice.OPS, m.OptionSimple(mdb.NAME, RIVER))
defer gdb.Event(m, DREAM_CREATE, m.OptionSimple(mdb.TYPE, mdb.NAME)...)
defer gdb.Event(m, DREAM_CREATE, m.OptionSimple(mdb.TYPE, mdb.NAME))
m.Option(cli.CMD_OUTPUT, "")
m.Option(cli.CMD_ENV, "")
m.Sleep3s()
@ -117,7 +117,7 @@ const DREAM = "dream"
func init() {
Index.MergeCommands(ice.Commands{
DREAM: {Name: "dream name path auto start", Help: "梦想家", Actions: ice.MergeAction(ice.Actions{
DREAM: {Name: "dream name path auto start", Help: "梦想家", Actions: ice.MergeActions(ice.Actions{
ice.CTX_INIT: {Hand: func(m *ice.Message, arg ...string) { m.Config(nfs.SCRIPT, _dream_script) }},
mdb.INPUTS: {Name: "inputs", Help: "补全", Hand: func(m *ice.Message, arg ...string) {
switch arg[0] {

View File

@ -2,7 +2,6 @@ package web
import (
"net/url"
"path"
"strings"
"time"
@ -10,10 +9,19 @@ import (
"shylinux.com/x/icebergs/base/cli"
"shylinux.com/x/icebergs/base/gdb"
"shylinux.com/x/icebergs/base/mdb"
"shylinux.com/x/icebergs/base/nfs"
kit "shylinux.com/x/toolkits"
"shylinux.com/x/toolkits/file"
)
func Upload(m *ice.Message) []string { // hash name size
up := kit.Simple(m.Optionv(ice.MSG_UPLOAD))
if len(up) < 2 {
msg := m.Cmdy(CACHE, UPLOAD)
up = kit.Simple(msg.Append(mdb.HASH), msg.Append(mdb.NAME), msg.Append(nfs.SIZE))
}
return up
}
func PushNotice(m *ice.Message, arg ...ice.Any) {
m.Optionv(ice.MSG_OPTS, m.Optionv(ice.MSG_OPTION))
if m.Option(ice.MSG_USERPOD) == "" {
@ -104,6 +112,14 @@ func PushPodCmd(m *ice.Message, cmd string, arg ...string) {
})
}
func OptionAgentIs(m *ice.Message, arg ...string) bool {
for _, k := range arg {
if strings.HasPrefix(m.Option(ice.MSG_USERUA), k) {
return true
}
}
return false
}
func OptionUserWeb(m *ice.Message) *url.URL {
return kit.ParseURL(m.Option(ice.MSG_USERWEB))
}
@ -116,17 +132,3 @@ func MergeLink(m *ice.Message, url string, arg ...ice.Any) string {
func MergePod(m *ice.Message, pod string, arg ...ice.Any) string {
return kit.MergePOD(kit.Select(ice.Info.Domain, m.Option(ice.MSG_USERWEB)), pod, arg...)
}
func MergeCmd(m *ice.Message, cmd string, arg ...ice.Any) string {
return mergeurl(m, path.Join(ice.CMD, kit.Select(m.PrefixKey(), cmd)), arg...)
}
func MergeWebsite(m *ice.Message, web string, arg ...ice.Any) string {
return mergeurl(m, path.Join(WEBSITE, web), arg...)
}
func mergeurl(m *ice.Message, p string, arg ...ice.Any) string {
if m.Option(ice.MSG_USERPOD) == "" {
p = path.Join("/", p)
} else {
p = path.Join("/chat", ice.POD, m.Option(ice.MSG_USERPOD), p)
}
return kit.MergeURL2(kit.Select(ice.Info.Domain, m.Option(ice.MSG_USERWEB)), path.Join(p), arg...)
}

View File

@ -70,7 +70,7 @@ func Render(msg *ice.Message, cmd string, args ...ice.Any) {
default:
for _, k := range []string{
"_option", "_handle", "_output",
"cmds", "fields", "sessid", "river", "storm",
"cmds", "fields", "sessid",
} {
msg.Set(k)
}
@ -86,7 +86,7 @@ func Render(msg *ice.Message, cmd string, args ...ice.Any) {
func RenderType(w http.ResponseWriter, name, mime string) {
if mime == "" {
switch kit.Ext(name) {
case nfs.HTML:
case "", nfs.HTML:
mime = "text/html"
case nfs.CSS:
mime = "text/css; charset=utf-8"
@ -139,16 +139,14 @@ func CookieName(url string) string {
return ice.MSG_SESSID + "_" + kit.ParseURLMap(url)[tcp.PORT]
}
func RenderIndex(m *ice.Message, serve, repos string, file ...string) *ice.Message {
return m.RenderDownload(path.Join(m.Conf(serve, kit.Keym(repos, nfs.PATH)), kit.Select(m.Conf(serve, kit.Keym(repos, INDEX)), path.Join(file...))))
func RenderIndex(m *ice.Message, repos string, file ...string) *ice.Message {
if repos == "" {
repos = kit.Select(ice.VOLCANOS, ice.INTSHELL, m.IsCliUA())
}
return m.RenderDownload(path.Join(m.Conf(SERVE, kit.Keym(repos, nfs.PATH)), kit.Select(m.Conf(SERVE, kit.Keym(repos, INDEX)), path.Join(file...))))
}
func RenderWebsite(m *ice.Message, pod string, dir string, arg ...string) *ice.Message {
args := []string{}
if pod != "" {
args = append(args, SPACE, pod)
}
m.Echo(m.Cmdx(args, "web.chat.website", lex.PARSE, dir, arg))
return m.RenderResult()
return m.Echo(m.Cmdx(Space(m, pod), "web.chat.website", lex.PARSE, dir, arg)).RenderResult()
}
func RenderCmd(m *ice.Message, index string, args ...ice.Any) {
list := index

View File

@ -63,7 +63,7 @@ const ROUTE = "route"
func init() {
Index.MergeCommands(ice.Commands{
ROUTE: {Name: "route route ctx cmd auto invite spide", Help: "路由器", Actions: ice.Actions{
ROUTE: {Name: "route route index auto invite spide", Help: "路由器", Actions: ice.Actions{
aaa.INVITE: {Name: "invite", Help: "添加", Hand: func(m *ice.Message, arg ...string) {
m.Cmdy(SPACE, m.Option(ROUTE), SPACE, aaa.INVITE, arg).ProcessInner()
}},
@ -71,7 +71,7 @@ func init() {
m.Cmdy(SPACE, m.Option(ROUTE), DREAM, tcp.START, arg).ProcessInner()
}},
ctx.COMMAND: {Name: "command", Help: "命令", Hand: func(m *ice.Message, arg ...string) {
m.Cmdy(SPACE, m.Option(ROUTE), kit.Keys(m.Option(ice.CTX), m.Option(ice.CMD)), arg)
m.Cmdy(SPACE, m.Option(ROUTE), m.Option(ctx.INDEX), arg)
}},
ice.RUN: {Name: "run", Help: "执行", Hand: func(m *ice.Message, arg ...string) {
m.Cmdy(SPACE, m.Option(ROUTE), arg)
@ -99,19 +99,12 @@ func init() {
}
} else if len(arg) == 1 || arg[1] == "" { // 模块列表
m.Cmd(SPACE, arg[0], ctx.CONTEXT, ice.ICE).Tables(func(value ice.Maps) {
m.Push(ice.CTX, kit.Keys(value["ups"], value[mdb.NAME]))
m.Push("", value, kit.List(ice.CTX_STATUS, ice.CTX_STREAM, mdb.HELP))
})
} else if len(arg) == 2 || arg[2] == "" { // 命令列表
m.Cmd(SPACE, arg[0], ctx.CONTEXT, arg[1], ctx.COMMAND).Tables(func(value ice.Maps) {
m.Push(ice.CMD, value[mdb.KEY])
m.Push("", value, kit.List(mdb.NAME, mdb.HELP))
m.Cmd(SPACE, arg[0], ctx.COMMAND, mdb.SEARCH, ctx.COMMAND, ice.OptionFields(ctx.INDEX, mdb.NAME, mdb.HELP)).Table(func(index int, value ice.Maps, head []string) {
m.Push("", value, head)
})
} else { // 命令详情
m.Cmdy(SPACE, arg[0], ctx.CONTEXT, arg[1], ctx.COMMAND, arg[2])
m.Cmdy(SPACE, arg[0], ctx.COMMAND, arg[1])
m.ProcessField(ctx.ACTION, ctx.COMMAND)
}
}},

View File

@ -300,7 +300,7 @@ func _serve_login(msg *ice.Message, key string, cmds []string, w http.ResponseWr
if _, ok := msg.Target().Commands[WEB_LOGIN]; ok { // 单点认证
msg.Target().Cmd(msg, WEB_LOGIN, kit.Simple(key, cmds)...)
return cmds, msg.Result(0) != ice.ErrWarn && msg.Result(0) != ice.FALSE
return cmds, !msg.IsErr() && msg.Result(0) != ice.FALSE
}
if aaa.Right(msg, key, cmds) {
@ -329,7 +329,7 @@ const SERVE = "serve"
func init() {
Index.Merge(&ice.Context{Configs: ice.Configs{
SERVE: {Name: SERVE, Help: "服务器", Value: kit.Data(
mdb.SHORT, mdb.NAME, mdb.FIELD, "time,status,name,port,dev",
mdb.SHORT, mdb.NAME, mdb.FIELD, "time,status,name,proto,host,port,dev",
DOMAIN, "", tcp.LOCALHOST, ice.TRUE, LOGHEADERS, ice.FALSE,
nfs.PATH, kit.Dict(ice.PS, ice.USR_VOLCANOS),
ice.VOLCANOS, kit.Dict(nfs.PATH, ice.USR_VOLCANOS, INDEX, "page/index.html",
@ -340,7 +340,7 @@ func init() {
),
)},
}, Commands: ice.Commands{
SERVE: {Name: "serve name auto start spide", Help: "服务器", Actions: ice.MergeAction(ice.Actions{
SERVE: {Name: "serve name auto start spide", Help: "服务器", Actions: ice.MergeActions(ice.Actions{
ice.CTX_INIT: {Hand: func(m *ice.Message, arg ...string) {
cli.NodeInfo(m, WORKER, ice.Info.PathName)
for _, p := range []string{LOGIN, SHARE, SPACE, ice.VOLCANOS, ice.INTSHELL, ice.PUBLISH, ice.REQUIRE, ice.HELP, ice.CMD} {
@ -360,13 +360,13 @@ func init() {
cli.START: {Name: "start dev proto=http host port=9020 nodename password username userrole staffname", Help: "启动", Hand: func(m *ice.Message, arg ...string) {
_serve_start(m)
}},
}, mdb.HashAction(mdb.SHORT, mdb.NAME, mdb.FIELD, "time,status,name,proto,host,port,dev"))},
}, mdb.HashAction())},
PP(ice.INTSHELL): {Name: "/intshell/", Help: "命令行", Hand: func(m *ice.Message, arg ...string) {
RenderIndex(m, SERVE, ice.INTSHELL, arg...)
RenderIndex(m, ice.INTSHELL, arg...)
}},
PP(ice.VOLCANOS): {Name: "/volcanos/", Help: "浏览器", Hand: func(m *ice.Message, arg ...string) {
RenderIndex(m, SERVE, ice.VOLCANOS, arg...)
RenderIndex(m, ice.VOLCANOS, arg...)
}},
PP(ice.PUBLISH): {Name: "/publish/", Help: "定制化", Hand: func(m *ice.Message, arg ...string) {
_share_local(aaa.UserRoot(m), ice.USR_PUBLISH, path.Join(arg...))
@ -374,10 +374,10 @@ func init() {
PP(ice.REQUIRE): {Name: "/require/shylinux.com/x/volcanos/proto.js", Help: "代码库", Hand: func(m *ice.Message, arg ...string) {
_share_repos(m, path.Join(arg[0], arg[1], arg[2]), arg[3:]...)
}},
PP(ice.REQUIRE, ice.NODE_MODULES): {Name: "/require/node_modules/", Help: "依赖库", Hand: func(m *ice.Message, arg ...string) {
p := path.Join(ice.USR_VOLCANOS, ice.NODE_MODULES, path.Join(arg...))
PP(ice.REQUIRE, ice.LIB, ice.NODE_MODULES): {Name: "/require/lib/node_modules/", Help: "依赖库", Hand: func(m *ice.Message, arg ...string) {
p := path.Join(ice.USR_VOLCANOS, ice.LIB, ice.NODE_MODULES, path.Join(arg...))
if !nfs.ExistsFile(m, p) {
m.Cmd(cli.SYSTEM, "npm", "install", arg[0], kit.Dict(cli.CMD_DIR, ice.USR_VOLCANOS))
m.Cmd(cli.SYSTEM, "npm", "install", arg[0], kit.Dict(cli.CMD_DIR, path.Join(ice.USR_VOLCANOS, ice.LIB)))
}
m.RenderDownload(p)
}},

View File

@ -78,7 +78,7 @@ func _share_local(m *ice.Message, arg ...string) {
}
// 上传文件
if p == "bin/ice.bin" {
if p == ice.BIN_ICE_BIN {
aaa.UserRoot(m).Cmd(SPACE, m.Option(ice.POD), SPIDE, "submit", MergeURL2(m, SHARE_PROXY, nfs.PATH, ""), m.Option(ice.POD), p, size, cache.Format(ice.MOD_TIME))
} else {
m.Cmd(SPACE, m.Option(ice.POD), SPIDE, ice.DEV, SPIDE_RAW, MergeURL2(m, SHARE_PROXY, nfs.PATH, ""),
@ -88,6 +88,10 @@ func _share_local(m *ice.Message, arg ...string) {
p = pp
}
if m.Warn(!file.ExistsFile(p)) {
m.RenderStatusNotFound()
return
}
m.RenderDownload(p)
}
func _share_proxy(m *ice.Message) {
@ -132,7 +136,7 @@ const SHARE = "share"
func init() {
Index.MergeCommands(ice.Commands{
SHARE: {Name: "share hash auto prunes", Help: "共享链", Actions: ice.MergeAction(ice.Actions{
SHARE: {Name: "share hash auto prunes", Help: "共享链", Actions: ice.MergeActions(ice.Actions{
ice.CTX_INIT: {Hand: func(m *ice.Message, arg ...string) { _share_render(m) }},
mdb.CREATE: {Name: "create type name text", Help: "创建", Hand: func(m *ice.Message, arg ...string) {
mdb.HashCreate(m, aaa.USERROLE, m.Option(ice.MSG_USERROLE), aaa.USERNAME, m.Option(ice.MSG_USERNAME), aaa.USERNICK, m.Option(ice.MSG_USERNICK),
@ -167,7 +171,7 @@ func init() {
case LOGIN:
m.RenderRedirect(ice.PS, ice.MSG_SESSID, aaa.SessCreate(m, msg.Append(aaa.USERNAME)))
default:
RenderIndex(m, SERVE, ice.VOLCANOS)
RenderIndex(m, ice.VOLCANOS)
}
}},

View File

@ -216,8 +216,8 @@ func _space_fork(m *ice.Message) {
switch kind {
case CHROME: // 交互节点
gdb.Event(m, SPACE_OPEN, args...)
defer gdb.Event(m, SPACE_CLOSE, args...)
gdb.Event(m, SPACE_OPEN, args)
defer gdb.Event(m, SPACE_CLOSE, args)
defer mdb.HashRemove(m, mdb.NAME, name)
m.Go(func(msg *ice.Message) {
switch m.Option(ice.CMD) {
@ -234,12 +234,12 @@ func _space_fork(m *ice.Message) {
}
})
case WORKER: // 工作节点
gdb.Event(m, DREAM_START, args...)
defer gdb.Event(m, DREAM_STOP, args...)
gdb.Event(m, DREAM_START, args)
defer gdb.Event(m, DREAM_STOP, args)
defer m.Cmd(DREAM, DREAM_STOP, args)
default: // 服务节点
gdb.Event(m, SPACE_START, args...)
defer gdb.Event(m, SPACE_STOP, args...)
gdb.Event(m, SPACE_START, args)
defer gdb.Event(m, SPACE_STOP, args)
defer mdb.HashRemove(m, mdb.NAME, name)
}
_space_handle(m, false, m.Target().Server().(*Frame), s, name)
@ -297,8 +297,12 @@ func init() {
REDIAL, kit.Dict("a", 3000, "b", 1000, "c", 1000), TIMEOUT, kit.Dict("c", "180s"),
)},
}, Commands: ice.Commands{
SPACE: {Name: "space name cmd auto invite", Help: "空间站", Actions: ice.MergeAction(ice.Actions{
SPACE: {Name: "space name cmd auto invite", Help: "空间站", Actions: ice.MergeActions(ice.Actions{
ice.CTX_INIT: {Hand: func(m *ice.Message, arg ...string) { m.Conf("", mdb.HASH, "") }},
ice.CTX_EXIT: {Hand: func(m *ice.Message, arg ...string) {
mdb.HashSelectClose(m)
m.Conf("", mdb.HASH, "")
}},
mdb.REMOVE: {Name: "remove", Help: "删除", Hand: func(m *ice.Message, arg ...string) {
mdb.HashModify(m, m.OptionSimple(mdb.NAME), mdb.STATUS, cli.STOP)
defer mdb.HashRemove(m, m.OptionSimple(mdb.NAME))

View File

@ -38,6 +38,7 @@ func _spide_create(m *ice.Message, name, address string) {
}
}
func _spide_list(m *ice.Message, arg ...string) {
msg := mdb.HashSelects(m.Spawn(), arg[0])
cache, save := "", ""
switch arg[1] { // 缓存方法
case SPIDE_RAW:
@ -50,7 +51,6 @@ func _spide_list(m *ice.Message, arg ...string) {
cache, arg = arg[1], arg[1:]
}
msg := mdb.HashSelect(m.Spawn(), arg[0])
method := kit.Select(SPIDE_POST, msg.Append(CLIENT_METHOD))
switch arg = arg[1:]; arg[0] { // 请求方法
case SPIDE_GET:
@ -77,6 +77,8 @@ func _spide_list(m *ice.Message, arg ...string) {
})
// 发送请求
m.Debug("what %v", msg.Append(CLIENT_NAME))
m.Debug("what %v", msg.FormatsMeta())
res, e := _spide_send(m, msg.Append(CLIENT_NAME), req, kit.Format(msg.Append(CLIENT_TIMEOUT)))
if m.Warn(e, ice.ErrNotFound, uri) {
return
@ -349,7 +351,7 @@ const SPIDE = "spide"
func init() {
Index.MergeCommands(ice.Commands{
SPIDE: {Name: "spide client.name action=raw,msg,save,cache method=GET,PUT,POST,DELETE url format=form,part,json,data,file arg run create", Help: "蜘蛛侠", Actions: ice.MergeAction(ice.Actions{
SPIDE: {Name: "spide client.name action=raw,msg,save,cache method=GET,PUT,POST,DELETE url format=form,part,json,data,file arg run create", Help: "蜘蛛侠", Actions: ice.MergeActions(ice.Actions{
ice.CTX_INIT: {Hand: func(m *ice.Message, arg ...string) {
conf := m.Confm(cli.RUNTIME, cli.CONF)
m.Cmd(SPIDE, mdb.CREATE, ice.OPS, kit.Select("http://127.0.0.1:9020", conf[cli.CTX_OPS]))
@ -387,3 +389,16 @@ func init() {
}},
})
}
func SpideGet(m *ice.Message, arg ...ice.Any) ice.Any {
return kit.UnMarshal(m.Cmdx(SPIDE_GET, arg))
}
func SpidePut(m *ice.Message, arg ...ice.Any) ice.Any {
return kit.UnMarshal(m.Cmdx(SPIDE_PUT, arg))
}
func SpidePost(m *ice.Message, arg ...ice.Any) ice.Any {
return kit.UnMarshal(m.Cmdx(SPIDE_POST, arg))
}
func SpideDelete(m *ice.Message, arg ...ice.Any) ice.Any {
return kit.UnMarshal(m.Cmdx(SPIDE_DELETE, arg))
}

View File

@ -131,5 +131,8 @@ func init() {
)
}
func ApiAction(arg ...string) ice.Actions {
return ice.Actions{kit.Select(ice.PS, path.Join(arg...)+ice.PS): {}}
}
func P(arg ...string) string { return path.Join(ice.PS, path.Join(arg...)) }
func PP(arg ...string) string { return P(arg...) + ice.PS }

View File

@ -89,6 +89,11 @@ const ( // DIR
CSV = "csv"
JSON = "json"
LIB = "lib"
PAGE = "page"
PANEL = "panel"
PLUGIN = "plugin"
FAVICON = "favicon.ico"
PROTO_JS = "proto.js"
FRAME_JS = "frame.js"

View File

@ -11,33 +11,23 @@ import (
)
func _action_right(m *ice.Message, river string, storm string) (ok bool) {
if ok = true; m.Option(ice.MSG_USERROLE) == aaa.VOID {
mdb.Richs(m, RIVER, "", river, func(key string, value ice.Map) {
if ok = mdb.Richs(m, RIVER, kit.Keys(mdb.HASH, key, OCEAN), m.Option(ice.MSG_USERNAME), nil) != nil; ok {
m.Logs(ice.LOG_AUTH, RIVER, river, STORM, storm)
}
})
}
return ok
return m.Option(ice.MSG_USERROLE) != aaa.VOID || m.Cmd(OCEAN, m.Option(ice.MSG_USERNAME)).Length() > 0
}
func _action_key(m *ice.Message, arg ...string) string {
return kit.Keys(mdb.HASH, kit.Select(m.Option(RIVER), arg, 0), STORM, mdb.HASH, kit.Select(m.Option(STORM), arg, 1))
return kit.KeyHash(kit.Select(m.Option(RIVER), arg, 0), STORM, kit.KeyHash(kit.Select(m.Option(STORM), arg, 1)))
}
func _action_list(m *ice.Message, river, storm string) {
m.Cmdy(STORM, storm, ice.Option{ice.MSG_RIVER, river}).Tables(func(value ice.Maps) {
m.Cmdy(web.Space(m, kit.Select(m.Option(ice.POD), value[ice.POD])), ctx.COMMAND, kit.Keys(value[ice.CTX], value[ice.CMD]))
})
m.Cmdy(STORM, storm, kit.Dict(ice.MSG_RIVER, river))
}
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 mdb.Grows(m, RIVER, _action_key(m, river, storm), mdb.ID, index, func(index int, value ice.Map) {
if cmds = kit.Simple(kit.Keys(value[ice.CTX], value[ice.CMD])); kit.Format(value[ice.POD]) != "" {
m.Option(ice.POD, value[ice.POD]) // 远程节点
if m.Cmd(STORM, storm, index, func(value ice.Maps) {
if index = value[ctx.INDEX]; value[web.SPACE] != "" {
m.Option(ice.POD, value[web.SPACE])
}
}) == nil && m.Option(ice.MSG_USERPOD) == "" && !aaa.Right(m, cmds) {
}).Length() == 0 && m.Option(ice.MSG_USERPOD) == "" && !aaa.Right(m, index) {
return // 没有授权
}
@ -45,13 +35,15 @@ func _action_exec(m *ice.Message, river, storm, index string, arg ...string) {
_action_upload(m) // 上传文件
}
if cmds[0] == "web.chat.node" || !ctx.PodCmd(m, cmds, arg) {
m.Cmdy(cmds, arg) // 执行命令
if index == m.Prefix(NODES) || !ctx.PodCmd(m, index, arg) {
m.Cmdy(index, arg) // 执行命令
}
}
func _action_auth(m, msg *ice.Message) bool {
if m.Warn(kit.Time() > kit.Time(msg.Append(mdb.TIME)), ice.ErrNotValid) {
return false
func _action_auth(m *ice.Message, share string) *ice.Message {
msg := m.Cmd(web.SHARE, share)
if m.Warn(kit.Time(msg.Append(mdb.TIME)) < kit.Time(m.Time()), ice.ErrNotValid) {
msg.Append(mdb.TYPE, "")
return msg // 共享过期
}
m.Logs(ice.LOG_AUTH,
aaa.USERROLE, m.Option(ice.MSG_USERROLE, msg.Append(aaa.USERROLE)),
@ -60,15 +52,15 @@ func _action_auth(m, msg *ice.Message) bool {
RIVER, m.Option(ice.MSG_RIVER, msg.Append(RIVER)),
STORM, m.Option(ice.MSG_STORM, msg.Append(STORM)),
)
return _action_right(m, msg.Append(web.RIVER), msg.Append(web.STORM))
if m.Warn(!_action_right(m, msg.Append(web.RIVER), msg.Append(web.STORM)), ice.ErrNotRight) {
msg.Append(mdb.TYPE, "")
return msg // 没有权限
}
return msg
}
func _action_share(m *ice.Message, arg ...string) {
switch msg := m.Cmd(web.SHARE, arg[0]); msg.Append(mdb.TYPE) {
switch msg := _action_auth(m, arg[0]); msg.Append(mdb.TYPE) {
case web.STORM:
if !_action_auth(m, msg) {
break // 没有授权
}
if len(arg) == 1 {
_action_list(m, msg.Append(web.RIVER), msg.Append(web.STORM))
break // 命令列表
@ -78,22 +70,16 @@ func _action_share(m *ice.Message, arg ...string) {
_action_exec(m, msg.Append(web.RIVER), msg.Append(web.STORM), arg[1], arg[2:]...)
case web.FIELD:
if !_action_auth(m, msg) {
break // 没有授权
}
if arg[0] = msg.Append(mdb.NAME); len(arg) == 1 {
if len(arg) == 1 {
m.Push(TITLE, msg.Append(TITLE))
m.Push(TOPIC, msg.Append(TOPIC))
m.Push(ctx.INDEX, msg.Append(mdb.NAME))
m.Push(ctx.ARGS, msg.Append(mdb.TEXT))
break // 命令列表
}
if m.Option(ice.MSG_UPLOAD) != "" {
if arg[1] = msg.Append(mdb.NAME); m.Option(ice.MSG_UPLOAD) != "" {
_action_upload(m) // 上传文件
}
m.Cmdy(arg[1:]) // 执行命令
}
}
@ -103,7 +89,6 @@ func _action_upload(m *ice.Message) {
}
const (
DOMAIN = "domain"
PUBLIC = "public"
PROTECTED = "protected"
PRIVATE = "private"
@ -113,33 +98,11 @@ const ACTION = "action"
func init() {
Index.MergeCommands(ice.Commands{
web.P(ACTION): {Name: "/action river storm action arg...", Help: "工作台", Actions: ice.MergeAction(ice.Actions{
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)
}
}},
web.P(ACTION): {Name: "/action river storm action arg...", Help: "工作台", Actions: ice.MergeActions(ice.Actions{
mdb.MODIFY: {Name: "modify", Help: "编辑", Hand: func(m *ice.Message, arg ...string) {
m.Cmdy(mdb.MODIFY, RIVER, _action_key(m), mdb.LIST, m.OptionSimple(mdb.ID), arg)
}},
SHARE: {Name: "share", Help: "共享", Hand: func(m *ice.Message, arg ...string) {
_header_share(m, arg...)
}},
"_share": {Name: "_share", Help: "共享", Hand: func(m *ice.Message, arg ...string) {
web.SHARE: {Name: "share", Help: "共享", Hand: func(m *ice.Message, arg ...string) {
_action_share(m, arg...)
}},
}, ctx.CmdAction(nfs.PATH, ice.USR_LOCAL_RIVER)), Hand: func(m *ice.Message, arg ...string) {

View File

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

View File

@ -1,31 +1,34 @@
chapter "组织"
header.go
footer.go
river.go
storm.go
ocean.go
action.go
search.go
info.go
node.go
chat.go
chat.shy
header.go
footer.go
action.go
search.go
river.go
storm.go
ocean.go
nodes.go
sso.go
pod.go
cmd.go
div.go
sso.go
grant.go
topic.go
website.go
room.go
meet.go
scan.go
scan.js
paste.go
files.go
trans.go
location.go
location.shy
room.go
meet.go
grant.go
oauth

View File

@ -5,6 +5,7 @@ import (
"strings"
ice "shylinux.com/x/icebergs"
"shylinux.com/x/icebergs/base/aaa"
"shylinux.com/x/icebergs/base/ctx"
"shylinux.com/x/icebergs/base/mdb"
"shylinux.com/x/icebergs/base/nfs"
@ -52,67 +53,25 @@ const CMD = "cmd"
func init() {
Index.MergeCommands(ice.Commands{
CMD: {Name: "cmd path auto upload up home", Help: "命令", Actions: ice.MergeAction(ice.Actions{
web.UPLOAD: {Name: "upload", Help: "上传", Hand: func(m *ice.Message, arg ...string) {
m.Cmdy(web.CACHE, web.UPLOAD_WATCH, path.Join(m.Config(nfs.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(nfs.PWD)
}
}},
}, mdb.HashAction(mdb.SHORT, "type", nfs.PATH, nfs.PWD)), Hand: func(m *ice.Message, arg ...string) {
if _cmd_file(m, arg...) {
return
}
if msg := m.Cmd(ctx.COMMAND, arg[0]); msg.Length() > 0 {
web.RenderCmd(m, arg[0])
return
}
if len(arg) > 0 {
m.ProcessLocation(arg[0])
return
}
m.Option(nfs.DIR_ROOT, path.Join(m.Config(nfs.PATH), strings.TrimPrefix(path.Dir(m.R.URL.Path), "/cmd")))
m.Cmdy(nfs.DIR, arg)
}},
"/cmd/": {Name: "/cmd/", Help: "命令", Actions: ice.MergeAction(ice.Actions{
ice.CTX_INIT: {Name: "_init", Help: "初始化", Hand: func(m *ice.Message, arg ...string) {
m.Cmdy(CMD, mdb.CREATE, mdb.TYPE, "shy", mdb.NAME, "web.wiki.word")
m.Cmdy(CMD, mdb.CREATE, mdb.TYPE, "svg", mdb.NAME, "web.wiki.draw")
m.Cmdy(CMD, mdb.CREATE, mdb.TYPE, "csv", mdb.NAME, "web.wiki.data")
m.Cmdy(CMD, mdb.CREATE, mdb.TYPE, "json", mdb.NAME, "web.wiki.json")
CMD: {Name: "cmd path auto upload up home", Help: "命令", Actions: ice.MergeActions(ice.Actions{
ice.CTX_INIT: {Hand: func(m *ice.Message, arg ...string) {
m.Cmd(aaa.ROLE, aaa.WHITE, CMD)
m.Cmdy(CMD, mdb.CREATE, mdb.TYPE, nfs.SHY, mdb.NAME, "web.wiki.word")
m.Cmdy(CMD, mdb.CREATE, mdb.TYPE, nfs.SVG, mdb.NAME, "web.wiki.draw")
m.Cmdy(CMD, mdb.CREATE, mdb.TYPE, nfs.CSV, mdb.NAME, "web.wiki.data")
m.Cmdy(CMD, mdb.CREATE, mdb.TYPE, nfs.JSON, mdb.NAME, "web.wiki.json")
for _, k := range []string{"mod", "sum"} {
m.Cmdy(CMD, mdb.CREATE, mdb.TYPE, k, mdb.NAME, "web.code.inner")
}
}},
}, ctx.CmdAction()), Hand: func(m *ice.Message, arg ...string) {
if strings.HasSuffix(m.R.URL.Path, ice.PS) {
web.RenderCmd(m, CMD)
return // 目录
}
}, mdb.HashAction(mdb.SHORT, "type", nfs.PATH, nfs.PWD), ctx.CmdAction(), web.ApiAction("/cmd/")), Hand: func(m *ice.Message, arg ...string) {
if _cmd_file(m, arg...) {
return
}
if ctx.PodCmd(m, ctx.COMMAND, arg[0]) {
if !m.IsErr() {
if ctx.PodCmd(m, ctx.COMMAND, arg[0]) && !m.IsErr() {
web.RenderCmd(m, arg[0], arg[1:]) // 远程命令
}
} else if m.Cmdy(ctx.COMMAND, arg[0]); m.Length() > 0 {
web.RenderCmd(m, arg[0], arg[1:]) // 本地命令
} else {
m.RenderDownload(path.Join(m.Config(nfs.PATH), path.Join(arg...))) // 文件
}
}},
})

View File

@ -31,7 +31,7 @@ func init() {
nfs.TEMPLATE, _div_template,
)},
}, Commands: ice.Commands{
"/div/": {Name: "/div/", Help: "定制", Actions: ice.MergeAction(ctx.CmdAction()), Hand: func(m *ice.Message, arg ...string) {
"/div/": {Name: "/div/", Help: "定制", Actions: ice.MergeActions(ctx.CmdAction()), Hand: func(m *ice.Message, arg ...string) {
switch p := path.Join(arg...); kit.Ext(kit.Select("", p)) {
case nfs.HTML:
m.RenderDownload(p)
@ -45,7 +45,7 @@ func init() {
web.RenderCmd(m, m.PrefixKey(), p)
}
}},
DIV: {Name: "div hash auto import", Help: "定制", Actions: ice.MergeAction(ice.Actions{
DIV: {Name: "div hash auto import", Help: "定制", Actions: ice.MergeActions(ice.Actions{
lex.SPLIT: {Name: "split name=hi text", Help: "生成", Hand: func(m *ice.Message, arg ...string) {
m.ProcessRewrite(mdb.HASH, m.Cmdx(DIV, mdb.CREATE, m.OptionSimple(mdb.NAME), mdb.TEXT, _div_parse(m, m.Option(mdb.TEXT))))
}},

View File

@ -12,18 +12,13 @@ const FILES = "files"
func init() {
Index.MergeCommands(ice.Commands{
FILES: {Name: "files hash auto upload", Help: "文件夹", Actions: ice.MergeAction(ice.Actions{
FILES: {Name: "files hash auto upload", Help: "文件夹", Actions: ice.MergeActions(ice.Actions{
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.Cmdy(web.CACHE, web.UPLOAD)
up = kit.Simple(msg.Append(mdb.HASH), msg.Append(mdb.NAME), msg.Append(nfs.SIZE))
}
m.Cmdy(mdb.INSERT, m.PrefixKey(), "", mdb.HASH, mdb.TYPE, kit.Ext(up[1]), mdb.NAME, up[1], nfs.SIZE, up[2], mdb.DATA, up[0])
up := web.Upload(m)
mdb.HashCreate(m, mdb.TYPE, kit.Ext(up[1]), mdb.NAME, up[1], nfs.SIZE, up[2], mdb.DATA, up[0])
}},
}, mdb.HashAction(mdb.SHORT, mdb.DATA, mdb.FIELD, "time,hash,type,name,size,data")), Hand: func(m *ice.Message, arg ...string) {
mdb.HashSelect(m, arg...)
m.Tables(func(value ice.Maps) {
mdb.HashSelect(m, arg...).Tables(func(value ice.Maps) {
link := web.SHARE_CACHE + value[mdb.DATA]
if m.PushDownload(mdb.LINK, value[mdb.NAME], link); len(arg) > 0 && kit.ExtIsImage(value[mdb.NAME]) {
m.PushImages("image", link)

View File

@ -2,29 +2,29 @@ package chat
import (
ice "shylinux.com/x/icebergs"
"shylinux.com/x/icebergs/base/aaa"
"shylinux.com/x/icebergs/base/cli"
"shylinux.com/x/icebergs/base/ctx"
"shylinux.com/x/icebergs/base/web"
kit "shylinux.com/x/toolkits"
)
const (
LEGAL = "legal"
EMAIL = "email"
)
const FOOTER = "footer"
func init() {
Index.Merge(&ice.Context{Configs: ice.Configs{
FOOTER: {Name: FOOTER, Help: "状态栏", Value: kit.Dict(LEGAL, kit.List(`<a href="mailto:shylinuxc@gmail.com">shylinuxc@gmail.com</a>`))},
}, Commands: ice.Commands{
web.P(FOOTER): {Name: "/footer", Help: "状态栏", Actions: ice.MergeAction(ice.Actions{
Index.MergeCommands(ice.Commands{
FOOTER: {Name: "footer", Help: "状态栏", Actions: ice.MergeActions(ice.Actions{
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)
if aaa.Right(m, arg) {
if m.Cmdy(arg); m.IsErrNotFound() {
m.SetResult().Cmdy(cli.SYSTEM, arg)
}
}
}},
}, ctx.CmdAction()), Hand: func(m *ice.Message, arg ...string) {
m.Confm(FOOTER, LEGAL, func(index int, value string) { m.Echo(value) })
}, ctx.CmdAction(EMAIL, `<a href="mailto:shylinuxc@gmail.com">shylinuxc@gmail.com</a>`), web.ApiAction()), Hand: func(m *ice.Message, arg ...string) {
m.Echo(m.Config(EMAIL))
}},
}})
})
}

View File

@ -11,7 +11,7 @@ const GRANT = "grant"
func init() {
Index.MergeCommands(ice.Commands{
GRANT: {Name: "grant space id auto insert", Help: "授权", Actions: ice.MergeAction(ice.Actions{
GRANT: {Name: "grant space id auto insert", Help: "授权", Actions: ice.MergeActions(ice.Actions{
mdb.INPUTS: {Name: "inputs", Help: "补全", Hand: func(m *ice.Message, arg ...string) {
switch arg[0] {
case web.SPACE:

View File

@ -1,27 +1,20 @@
package chat
import (
"strings"
ice "shylinux.com/x/icebergs"
"shylinux.com/x/icebergs/base/aaa"
"shylinux.com/x/icebergs/base/cli"
"shylinux.com/x/icebergs/base/ctx"
"shylinux.com/x/icebergs/base/gdb"
"shylinux.com/x/icebergs/base/mdb"
"shylinux.com/x/icebergs/base/tcp"
"shylinux.com/x/icebergs/base/web"
"shylinux.com/x/icebergs/core/code"
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) bool {
if m.Option(web.SHARE) != "" {
m.Cmd(web.SHARE, m.Option(web.SHARE), ice.OptionFields("")).Tables(func(value ice.Maps) {
m.Cmd(web.SHARE, m.Option(web.SHARE), ice.OptionFields(""), func(value ice.Maps) {
switch value[mdb.TYPE] {
case web.FIELD, web.STORM:
m.Option(ice.MSG_USERNAME, value[aaa.USERNAME])
@ -33,10 +26,10 @@ func _header_check(m *ice.Message, arg ...string) bool {
return true
}
m.Option(web.SSO, m.Config(web.SSO))
m.Option(web.LOGIN, m.Config(web.LOGIN))
m.Option(web.SSO, m.Conf(web.SERVE, kit.Keym(web.SSO)))
if m.Option("login.dev", m.Cmd(web.SPACE, ice.DEV).Append(mdb.TEXT)) == "" {
m.Option("login.dev", m.Cmd(web.SPACE, ice.SHY).Append(mdb.TEXT))
if m.Option("login.dev", m.CmdAppend(web.SPACE, ice.DEV, mdb.TEXT)) == "" {
m.Option("login.dev", m.CmdAppend(web.SPACE, ice.SHY, mdb.TEXT))
}
return false
}
@ -46,63 +39,48 @@ func _header_share(m *ice.Message, arg ...string) {
} else {
m.Option(mdb.LINK, tcp.ReplaceLocalhost(m, m.Option(mdb.LINK)))
}
m.Option(mdb.LINK, kit.MergeURL(m.Option(mdb.LINK), RIVER, "", STORM, ""))
m.PushQRCode(mdb.TEXT, m.Option(mdb.LINK))
m.Push(mdb.NAME, m.Option(mdb.LINK))
}
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]))
m.Cmdy(aaa.USER, mdb.MODIFY, key, m.Option(key, arg[0]))
}
const (
TITLE = "title"
MENUS = "menus"
TRANS = "trans"
AGENT = "agent"
CHECK = "check"
SHARE = "share"
HEADER_AGENT = "header.agent"
)
const HEADER = "header"
func init() {
Index.Merge(&ice.Context{Configs: ice.Configs{
HEADER: {Name: HEADER, Help: "标题栏", Value: kit.Data(aaa.LOGIN, kit.List("登录", "扫码"))},
}, Commands: ice.Commands{
Index.MergeCommands(ice.Commands{
web.WEB_LOGIN: {Hand: func(m *ice.Message, arg ...string) {
switch arg[0] {
case "/header":
if kit.Select("", arg, 1) == "" {
case web.P(HEADER):
switch kit.Select("", arg, 1) {
case "", aaa.LOGIN:
return // 免登录
}
if kit.Select("", arg, 1) == aaa.LOGIN {
default:
if aaa.Right(m, arg) {
return // 免登录
}
case "/pod/", "/cmd/", "/topic/":
return // 免登录
case "/sso":
return // 免登录
}
m.Warn(m.Option(ice.MSG_USERNAME) == "", ice.ErrNotLogin, arg)
}},
web.P(HEADER): {Name: "/header", Help: "标题栏", Actions: ice.Actions{
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...)
}},
SHARE: {Name: "share type", Help: "共享", Hand: func(m *ice.Message, arg ...string) {
_header_share(m, arg...)
}},
HEADER: {Name: "header", Help: "标题栏", Actions: ice.MergeActions(ice.Actions{
aaa.LOGIN: {Name: "login", Help: "密码登录", Hand: func(m *ice.Message, arg ...string) {
if aaa.UserLogin(m, arg[0], arg[1]) {
web.RenderCookie(m, aaa.SessCreate(m, arg[0]))
}
}},
aaa.LOGOUT: {Name: "logout", Help: "退出登录", Hand: func(m *ice.Message, arg ...string) {
m.Cmd(aaa.SESS, mdb.REMOVE, kit.Dict(mdb.HASH, m.Option(ice.MSG_SESSID)))
aaa.UserLogout(m)
}},
aaa.PASSWORD: {Name: "password", Help: "修改密码", Hand: func(m *ice.Message, arg ...string) {
_header_users(m, m.ActionKey(), arg...)
@ -120,16 +98,18 @@ func init() {
_header_users(m, m.ActionKey(), arg...)
}},
ctx.CONFIG: {Name: "config scope", Help: "拉取配置", Hand: func(m *ice.Message, arg ...string) {
m.Cmdy(web.SPACE, m.Option(ice.MSG_USERPOD), m.Prefix("oauth.oauth"), CHECK, arg)
m.Cmdy(web.SPACE, m.Option(ice.MSG_USERPOD), m.Prefix("oauth.oauth"), "check", arg)
}},
code.WEBPACK: {Name: "webpack", Help: "打包页面", Hand: func(m *ice.Message, arg ...string) {
m.Cmdy(code.WEBPACK, cli.BUILD, m.OptionSimple(mdb.NAME))
"webpack": {Name: "webpack", Help: "打包页面", Hand: func(m *ice.Message, arg ...string) {
m.Cmdy("webpack", cli.BUILD, m.OptionSimple(mdb.NAME))
}},
}, Hand: func(m *ice.Message, arg ...string) {
web.SHARE: {Name: "share type", Help: "共享", Hand: func(m *ice.Message, arg ...string) {
_header_share(m, arg...)
}},
}, ctx.ConfAction(aaa.LOGIN, kit.List("登录", "扫码")), web.ApiAction()), Hand: func(m *ice.Message, arg ...string) {
if !_header_check(m, arg...) {
return
}
_header_agent(m, arg...)
msg := m.Cmd(aaa.USER, m.Option(ice.MSG_USERNAME))
for _, k := range []string{aaa.USERNICK, aaa.LANGUAGE} {
@ -142,10 +122,10 @@ func init() {
m.Option(aaa.AVATAR, kit.Format("https://dayu.oa.com/avatars/%s/profile.jpg", m.R.Header.Get("Staffname")))
}
gdb.Event(m, HEADER_AGENT)
m.Option(TRANS, kit.Format(kit.Value(m.Target().Commands[web.P(m.CommandKey())].Meta, "_trans")))
m.Option(MENUS, m.Config(MENUS))
m.Echo(m.Config(TITLE))
// m.Cmdy(WEBSITE)
}},
}})
})
}

View File

@ -1,21 +0,0 @@
package chat
import (
ice "shylinux.com/x/icebergs"
"shylinux.com/x/icebergs/base/mdb"
)
const INFO = "info"
func init() {
Index.MergeCommands(ice.Commands{
INFO: {Name: "info auto", Help: "信息", Actions: ice.Actions{
mdb.MODIFY: {Name: "modify", Help: "编辑", Hand: func(m *ice.Message, arg ...string) {
m.Cmdy(mdb.MODIFY, RIVER, "", mdb.HASH, mdb.HASH, m.Option(ice.MSG_RIVER), arg)
}},
}, Hand: func(m *ice.Message, arg ...string) {
m.OptionFields(mdb.DETAIL)
m.Cmdy(mdb.SELECT, RIVER, "", mdb.HASH, mdb.HASH, m.Option(ice.MSG_RIVER))
}},
})
}

View File

@ -37,7 +37,7 @@ func init() {
}
Index.MergeCommands(ice.Commands{
LOCATION: {Name: "location hash auto", Help: "地理位置", Actions: ice.MergeAction(ice.Actions{
LOCATION: {Name: "location hash auto", Help: "地理位置", Actions: ice.MergeActions(ice.Actions{
"explore": {Name: "explore", Help: "周边", Hand: func(m *ice.Message, arg ...string) {
m.Echo(get(m, "place/v1/explore", m.OptionSimple("boundary,page_index")))
}},

View File

@ -17,7 +17,7 @@ func init() {
mdb.SHORT, mdb.NAME, mdb.FIELD, "time,name,照片,性别,年龄,身高,体重,籍贯,户口,学历,学校,职业,公司,年薪,资产,家境",
)},
}, Commands: ice.Commands{
"monkey": {Name: "monkey total=888 count=9 run", Help: "猴子开箱子", Meta: kit.Dict("_trans", kit.Dict("name", "姓名")), Actions: ice.MergeAction(ice.Actions{
"monkey": {Name: "monkey total=888 count=9 run", Help: "猴子开箱子", Meta: kit.Dict("_trans", kit.Dict("name", "姓名")), Actions: ice.MergeActions(ice.Actions{
mdb.CREATE: {Name: "create name 照片 性别 年龄 身高 体重 籍贯 户口 学历 学校 职业 公司 年薪 资产 家境", Help: "添加"},
}, mdb.HashAction()), Hand: func(m *ice.Message, arg ...string) {
total := kit.Int(arg[0])
@ -38,7 +38,7 @@ func init() {
}
m.StatusTimeCount()
}},
MISS: {Name: "miss name auto create", Help: "资料", Meta: kit.Dict("_trans", kit.Dict("name", "姓名")), Actions: ice.MergeAction(ice.Actions{
MISS: {Name: "miss name auto create", Help: "资料", Meta: kit.Dict("_trans", kit.Dict("name", "姓名")), Actions: ice.MergeActions(ice.Actions{
mdb.CREATE: {Name: "create name 照片 性别 年龄 身高 体重 籍贯 户口 学历 学校 职业 公司 年薪 资产 家境", Help: "添加"},
}, mdb.HashAction()), Hand: func(m *ice.Message, arg ...string) {
msg := m.Spawn()

View File

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

View File

@ -57,7 +57,7 @@ const (
const OAUTH = "oauth"
var Index = &ice.Context{Name: OAUTH, Help: "认证授权", Commands: ice.Commands{
OAUTH: {Name: "oauth hash auto prunes", Help: "权限", Actions: ice.MergeAction(ice.Actions{
OAUTH: {Name: "oauth hash auto prunes", Help: "权限", Actions: ice.MergeActions(ice.Actions{
CHECK: {Name: "check scope domain", Help: "检查", Hand: func(m *ice.Message, arg ...string) {
m.Echo(_merge_url(m, kit.Select(ice.Info.Make.Domain, m.Option(web.DOMAIN)), APPLY, m.OptionSimple(SCOPE), REDIRECT_URI, _merge_url(m, "", REPLY)))
}},

View File

@ -3,6 +3,7 @@ package chat
import (
ice "shylinux.com/x/icebergs"
"shylinux.com/x/icebergs/base/aaa"
"shylinux.com/x/icebergs/base/gdb"
"shylinux.com/x/icebergs/base/mdb"
kit "shylinux.com/x/toolkits"
)
@ -12,14 +13,21 @@ const OCEAN = "ocean"
func init() {
Index.MergeCommands(ice.Commands{
OCEAN: {Name: "ocean username auto insert invite", Help: "用户", Actions: ice.Actions{
ice.CTX_INIT: {Hand: func(m *ice.Message, arg ...string) {
gdb.Watch(m, RIVER_CREATE)
}},
RIVER_CREATE: {Name: "river.create river template", Help: "建群", Hand: func(m *ice.Message, arg ...string) {
m.Cmd(OCEAN, mdb.INSERT, aaa.USERNAME, m.Option(ice.MSG_USERNAME))
}},
mdb.INPUTS: {Name: "inputs", Help: "补全", Hand: func(m *ice.Message, arg ...string) {
m.Cmdy(aaa.USER, ice.OptionFields(aaa.USERNAME, aaa.USERNICK, aaa.USERZONE))
}},
mdb.INSERT: {Name: "insert username", Help: "添加", Hand: func(m *ice.Message, arg ...string) {
m.Cmdy(mdb.INSERT, RIVER, _river_key(m, OCEAN), mdb.HASH, arg)
m.Option(mdb.SHORT, aaa.USERNAME)
m.Cmdy(mdb.INSERT, m.Prefix(RIVER), _river_key(m, OCEAN), mdb.HASH, arg)
}},
mdb.DELETE: {Name: "delete", Help: "删除", Hand: func(m *ice.Message, arg ...string) {
m.Cmdy(mdb.DELETE, RIVER, _river_key(m, OCEAN), mdb.HASH, m.OptionSimple(aaa.USERNAME))
m.Cmdy(mdb.DELETE, m.Prefix(RIVER), _river_key(m, OCEAN), mdb.HASH, m.OptionSimple(aaa.USERNAME))
}},
}, Hand: func(m *ice.Message, arg ...string) {
m.Fields(len(arg), "time,username")

View File

@ -11,7 +11,7 @@ const PASTE = "paste"
func init() {
Index.MergeCommands(ice.Commands{
PASTE: {Name: "paste hash auto getClipboardData", Help: "粘贴", Actions: ice.MergeAction(ice.Actions{
PASTE: {Name: "paste hash auto getClipboardData", Help: "粘贴", Actions: ice.MergeActions(ice.Actions{
"getClipboardData": {Name: "getClipboardData", Help: "粘贴", Hand: func(m *ice.Message, arg ...string) {
m.Cmdy(PASTE, mdb.CREATE, arg)
}},

View File

@ -17,32 +17,33 @@ const POD = "pod"
func init() {
Index.MergeCommands(ice.Commands{
"/pod/": {Name: "/pod/", Help: "节点", Actions: ctx.CmdAction(), Hand: func(m *ice.Message, arg ...string) {
if strings.HasPrefix(m.R.Header.Get("User-Agent"), "curl") || strings.HasPrefix(m.R.Header.Get("User-Agent"), "Wget") {
m.Option(ice.MSG_USERNAME, "root")
m.Option(ice.MSG_USERROLE, "root")
POD: {Name: "pod", Help: "节点", Actions: ice.MergeActions(ice.Actions{
ice.CTX_INIT: {Hand: func(m *ice.Message, arg ...string) { m.Cmd(aaa.ROLE, aaa.WHITE, POD) }},
}, ctx.CmdAction(), web.ApiAction("/pod/")), Hand: func(m *ice.Message, arg ...string) {
if web.OptionAgentIs(m, "curl", "Wget") {
aaa.UserRoot(m)
m.Option(ice.POD, kit.Select("", arg, 0))
m.Cmdy(web.SHARE_LOCAL, "bin/ice.bin")
return // 下载文件
m.Cmdy(web.SHARE_LOCAL, ice.BIN_ICE_BIN)
return // 下载程序
}
if len(arg) == 0 || kit.Select("", arg, 0) == "" { // 节点列表
web.RenderCmd(m, web.ROUTE)
if len(arg) == 0 || kit.Select("", arg, 0) == "" {
web.RenderCmd(m, web.ROUTE) // 节点列表
} else if len(arg) == 1 { // 节点首页
} else if len(arg) == 1 {
if m.Cmd(web.SPACE, arg[0]).Length() == 0 && !strings.Contains(arg[0], ice.PT) {
m.Cmd(web.DREAM, cli.START, mdb.NAME, arg[0])
m.Cmd(web.DREAM, cli.START, mdb.NAME, arg[0]) // 启动节点
}
aaa.UserRoot(m)
if web.RenderWebsite(m, arg[0], "index.iml", "Header", "", "River", "", "Footer", ""); m.Result() == "" {
web.RenderIndex(m, web.SERVE, ice.VOLCANOS)
if web.RenderWebsite(m, arg[0], ice.INDEX_IML, "Header", "", "River", "", "Footer", ""); m.Result() == "" {
web.RenderIndex(m, ice.VOLCANOS) // 节点首页
}
} else if arg[1] == WEBSITE { // 节点网页
web.RenderWebsite(m, arg[0], path.Join(arg[2:]...))
} else if arg[1] == WEBSITE {
web.RenderWebsite(m, arg[0], path.Join(arg[2:]...)) // 节点网页
} else if arg[1] == "cmd" { // 节点命令
m.Cmdy(web.SPACE, arg[0], m.Prefix(CMD), path.Join(arg[2:]...))
} else if arg[1] == CMD {
m.Cmdy(web.SPACE, arg[0], m.Prefix(CMD), path.Join(arg[2:]...)) // 节点命令
} else {
m.Cmdy(web.SPACE, m.Option(ice.MSG_USERPOD), "web.chat."+strings.TrimPrefix(path.Join(arg[1:]...), "chat/"))
// m.Cmdy(web.SPACE, m.Option(ice.MSG_USERPOD), "web.chat."+ice.PS+path.Join(arg[1:]...))

View File

@ -5,10 +5,10 @@ import (
"shylinux.com/x/icebergs/base/aaa"
"shylinux.com/x/icebergs/base/cli"
"shylinux.com/x/icebergs/base/ctx"
"shylinux.com/x/icebergs/base/gdb"
"shylinux.com/x/icebergs/base/mdb"
"shylinux.com/x/icebergs/base/nfs"
"shylinux.com/x/icebergs/base/web"
"shylinux.com/x/icebergs/core/code"
kit "shylinux.com/x/toolkits"
)
@ -50,12 +50,14 @@ func _river_list(m *ice.Message) {
})
}
const (
RIVER_CREATE = "river.create"
)
const RIVER = "river"
func init() {
Index.MergeCommands(ice.Commands{
RIVER: {Name: "river hash auto create", Help: "群组", Actions: ice.MergeAction(ice.Actions{
ice.CTX_INIT: {Hand: func(m *ice.Message, arg ...string) { m.Config(nfs.TEMPLATE, _river_template) }},
RIVER: {Name: "river hash auto create", Help: "群组", Actions: ice.MergeActions(ice.Actions{
mdb.INPUTS: {Name: "inputs", Help: "补全", Hand: func(m *ice.Message, arg ...string) {
switch m.Option(ctx.ACTION) {
case cli.START, "创建空间":
@ -71,38 +73,22 @@ func init() {
case aaa.USERNAME:
m.Cmdy(aaa.USER).Cut(aaa.USERNAME, aaa.USERNICK, aaa.USERZONE)
default:
m.Cmdy(mdb.INPUTS, RIVER, "", mdb.HASH, arg)
mdb.HashInputs(m, arg)
}
}},
mdb.CREATE: {Name: "create type=public,protected,private name=hi text=hello template=base", Help: "添加", Hand: func(m *ice.Message, arg ...string) {
h := m.Cmdx(mdb.INSERT, RIVER, "", mdb.HASH, arg)
m.Option(ice.MSG_RIVER, h)
m.Echo(h)
m.Conf(RIVER, kit.Keys(mdb.HASH, h, NODE, kit.Keym(mdb.SHORT)), mdb.NAME)
m.Conf(RIVER, kit.Keys(mdb.HASH, h, OCEAN, kit.Keym(mdb.SHORT)), aaa.USERNAME)
m.Cmd(OCEAN, mdb.INSERT, aaa.USERNAME, m.Option(ice.MSG_USERNAME))
kit.Fetch(m.Confv(RIVER, kit.Keym(nfs.TEMPLATE, kit.Select("base", m.Option(nfs.TEMPLATE)))), func(storm string, value ice.Any) {
h := m.Cmdx(STORM, mdb.CREATE, mdb.TYPE, PUBLIC, mdb.NAME, storm, mdb.TEXT, storm)
kit.Fetch(value, func(index int, value string) {
m.Search(value, func(p *ice.Context, s *ice.Context, key string, cmd *ice.Command) {
m.Cmd(STORM, mdb.INSERT, mdb.HASH, h, ice.CTX, s.Cap(ice.CTX_FOLLOW), ice.CMD, key, mdb.HELP, cmd.Help)
})
})
})
h := mdb.HashCreate(m, arg)
gdb.Event(m, RIVER_CREATE, RIVER, m.Option(ice.MSG_RIVER, h), arg)
m.Result(h)
}},
cli.START: {Name: "start name=hi repos template", Help: "创建空间", Hand: func(m *ice.Message, arg ...string) {
m.Cmdy(web.Space(m, m.Option(ice.POD)), web.DREAM, cli.START, arg)
}},
aaa.INVITE: {Name: "invite", Help: "添加设备", Hand: func(m *ice.Message, arg ...string) {
m.Cmd(code.PUBLISH, mdb.CREATE, nfs.FILE, ice.BIN_ICE_BIN)
m.Cmdy(code.PUBLISH, ice.CONTEXTS)
m.Cmdy("publish", ice.CONTEXTS)
}},
}, mdb.HashAction(mdb.FIELD, "time,hash,type,name,text,template"))},
web.P(RIVER): {Name: "/river", Help: "群组", Hand: func(m *ice.Message, arg ...string) {
if m.Warn(m.Option(ice.MSG_USERNAME) == "", ice.ErrNotLogin, RIVER) {
}, mdb.HashAction(mdb.FIELD, "time,hash,type,name,text,template"), web.ApiAction()), Hand: func(m *ice.Message, arg ...string) {
if m.Warn(m.Option(ice.MSG_USERNAME) == "", ice.ErrNotLogin) {
m.RenderStatusUnauthorized()
return // 没有登录
}
@ -121,49 +107,17 @@ func init() {
return // 没有授权
}
switch kit.Select("", arg, 1) {
case STORM, OCEAN, NODE:
if command := m.Commands(kit.Select("", arg, 1)); command != nil {
m.Option(ice.MSG_RIVER, arg[0])
m.Cmdy(arg[1], arg[2:])
case ctx.ACTION, aaa.INVITE:
} else if action := m.Actions(kit.Select("", arg, 1)); action != nil {
m.Option(ice.MSG_RIVER, arg[0])
m.Cmdy(RIVER, arg[1:])
m.Cmdy("", arg[1:])
default:
} else {
m.Cmdy(RIVER, arg)
}
}},
})
}
var _river_template = kit.Dict(
"base", kit.Dict(
"info", kit.List(
"web.chat.info",
"web.chat.ocean",
"web.chat.storm",
"web.chat.node",
),
"scan", kit.List(
"web.chat.scan",
"web.chat.paste",
"web.chat.files",
"web.chat.location",
"web.chat.meet.miss",
"web.wiki.feel",
),
"task", kit.List(
"web.team.task",
"web.team.plan",
"web.mall.asset",
"web.mall.salary",
"web.wiki.word",
),
"draw", kit.List(
"web.wiki.draw",
"web.wiki.data",
"web.wiki.word",
),
),
)

View File

@ -22,7 +22,7 @@ func init() {
mdb.SHORT, "space", mdb.FIELD, "time,hash,username,socket",
)},
}, Commands: ice.Commands{
ROOM: {Name: "room zone id auto", Help: "room", Actions: ice.MergeAction(ice.Actions{
ROOM: {Name: "room zone id auto", Help: "room", Actions: ice.MergeActions(ice.Actions{
mdb.CREATE: {Name: "create zone", Help: "创建", Hand: func(m *ice.Message, arg ...string) {
m.Cmdy(mdb.INSERT, m.PrefixKey(), "", mdb.HASH, m.OptionSimple(mdb.ZONE))
}},
@ -50,7 +50,7 @@ func init() {
m.Action(mdb.INSERT, JOIN)
}
}},
JOIN: {Name: "join space zone auto", Help: "join", Actions: ice.MergeAction(ice.Actions{
JOIN: {Name: "join space zone auto", Help: "join", Actions: ice.MergeActions(ice.Actions{
ice.CTX_INIT: {Hand: func(m *ice.Message, arg ...string) {
// m.Watch(web.SPACE_START, m.PrefixKey())
}},

View File

@ -12,9 +12,7 @@ const SCAN = "scan"
func init() {
Index.MergeCommands(ice.Commands{
SCAN: {Name: "scan hash auto scanQRCode scanQRCode0", Help: "扫码", Meta: kit.Dict(
ice.Display("scan.js"),
), Actions: ice.MergeAction(ice.Actions{
SCAN: {Name: "scan hash auto scanQRCode scanQRCode0", Help: "扫码", Meta: kit.Dict(ice.Display("")), Actions: ice.MergeActions(ice.Actions{
"scanQRCode0": {Name: "scan create", Help: "本机扫码"},
"scanQRCode": {Name: "scan create", Help: "扫码"},
mdb.CREATE: {Name: "create type=text name=hi text:textarea=hi", Help: "添加"},

View File

@ -1,18 +1,15 @@
Volcanos("onimport", {help: "导入数据", list: [], _init: function(can, msg, list, cb, target) {
can.onmotion.clear(can)
Volcanos(chat.ONIMPORT, {help: "导入数据", _init: function(can, msg, cb, target) {
can.onmotion.clear(can), can.base.isFunc(cb) && cb(msg)
can.onappend.table(can, msg)
can.onappend.board(can, msg)
can.base.isFunc(cb) && cb(msg)
},
})
Volcanos("onaction", {help: "控件交互", list: [],
Volcanos(chat.ONACTION, {help: "控件交互",
scanQRCode0: function(event, can) { can.user.agent.scanQRCode() },
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()
can.runAction(can.request(event, data), data.action||button [], function(msg) {
can.user.toastSuccess(can, text), can.Update()
}, true)
}, can) },
scanQRCode0: function(event, can) { can.user.agent.scanQRCode() },
})
Volcanos("onexport", {help: "导出数据", list: []})

View File

@ -11,7 +11,7 @@ const SEARCH = "search"
func init() {
Index.MergeCommands(ice.Commands{
web.P(SEARCH): {Name: "/search", Help: "搜索引擎", Actions: ctx.CmdAction(mdb.SHORT, mdb.NAME), Hand: func(m *ice.Message, arg ...string) {
web.P(SEARCH): {Name: "/search", Help: "搜索引擎", Actions: ctx.CmdAction(), Hand: func(m *ice.Message, arg ...string) {
m.Cmdy(web.Space(m, m.Option(ice.POD)), mdb.SEARCH, arg).StatusTimeCount()
}},
})

View File

@ -13,9 +13,14 @@ const SSO = "sso"
func init() {
Index.MergeCommands(ice.Commands{
"/sso": {Name: "/sso", Help: "登录", Hand: func(m *ice.Message, arg ...string) {
"/sso": {Name: "/sso", Help: "登录", Actions: ice.Actions{
ice.CTX_INIT: {Hand: func(m *ice.Message, arg ...string) { m.Cmd(aaa.ROLE, aaa.WHITE, SSO) }},
}, Hand: func(m *ice.Message, arg ...string) {
if m.Option(ice.MSG_USERNAME) == "" {
web.RenderIndex(m, web.SERVE, ice.VOLCANOS)
web.RenderIndex(m, ice.VOLCANOS)
return
}
if m.Warn(m.Option(cli.BACK) == "") {
return
}
sessid := m.Cmdx(web.SPACE, m.Option(web.SPACE), aaa.SESS, mdb.CREATE,
@ -24,11 +29,6 @@ func init() {
aaa.USERNICK, m.Option(ice.MSG_USERNICK),
)
m.RenderRedirect(kit.MergeURL(m.Option(cli.BACK), ice.MSG_SESSID, sessid))
// m.Cmdy(GRANT, mdb.INSERT, web.SPACE, m.Option(web.SPACE),
// aaa.USERNAME, m.Option(ice.MSG_USERNAME), aaa.USERNICK, m.Option(ice.MSG_USERNICK))
// web.RenderCookie(m, sessid, web.CookieName(m.Option("back")))
// m.RenderRedirect(kit.MergeURL(m.Option("back")))
}},
})
}

View File

@ -23,7 +23,7 @@ func init() {
}
switch arg[0] {
case mdb.HASH:
m.Cmdy(STORM, ice.OptionFields("hash,name"))
m.Cmdy("", ice.OptionFields("hash,name"))
}
}},
mdb.CREATE: {Name: "create type=public,protected,private name=hi text=hello", Help: "创建", Hand: func(m *ice.Message, arg ...string) {
@ -32,7 +32,7 @@ func init() {
mdb.REMOVE: {Name: "remove", Help: "删除", Hand: func(m *ice.Message, arg ...string) {
m.Cmdy(mdb.DELETE, RIVER, _river_key(m, STORM), mdb.HASH, m.OptionSimple(mdb.HASH))
}},
mdb.INSERT: {Name: "insert hash pod ctx cmd help", Help: "添加", Hand: func(m *ice.Message, arg ...string) {
mdb.INSERT: {Name: "insert hash space index", Help: "添加", Hand: func(m *ice.Message, arg ...string) {
m.Cmdy(mdb.INSERT, RIVER, _storm_key(m, m.Option(mdb.HASH)), mdb.LIST, arg[2:])
}},
mdb.MODIFY: {Name: "modify", Help: "编辑", Hand: func(m *ice.Message, arg ...string) {
@ -42,23 +42,6 @@ func init() {
m.Cmdy(mdb.MODIFY, RIVER, _storm_key(m, m.Option(mdb.HASH)), mdb.LIST, m.OptionSimple(mdb.ID), arg)
}
}},
mdb.EXPORT: {Name: "export", Help: "导出", Hand: func(m *ice.Message, arg ...string) {
if m.Option(mdb.ID) == "" {
return
}
msg := m.Cmd(STORM, m.Option(mdb.HASH), m.Option(mdb.ID))
cmd := kit.Keys(msg.Append(ice.CTX), msg.Append(ice.CMD))
m.Cmdy(cmd, mdb.EXPORT)
}},
mdb.IMPORT: {Name: "import", Help: "导入", Hand: func(m *ice.Message, arg ...string) {
if m.Option(mdb.ID) == "" {
return
}
msg := m.Cmd(STORM, m.Option(mdb.HASH), m.Option(mdb.ID))
cmd := kit.Keys(msg.Append(ice.CTX), msg.Append(ice.CMD))
m.Cmdy(cmd, mdb.IMPORT)
}},
SHARE: {Name: "share", Help: "共享", Hand: func(m *ice.Message, arg ...string) { _header_share(m, arg...) }},
}, Hand: func(m *ice.Message, arg ...string) {
if len(arg) == 0 { // 应用列表
m.OptionFields("time,hash,type,name,count")
@ -67,24 +50,20 @@ func init() {
return
}
m.OptionFields("time,id,pod,ctx,cmd,arg,display,style")
m.OptionFields("time,id,space,index,args,style,display")
msg := m.Cmd(mdb.SELECT, RIVER, _storm_key(m, arg[0]), mdb.LIST, mdb.ID, kit.Select("", arg, 1))
if msg.Length() == 0 && len(arg) > 1 { // 虚拟群组
msg.Push(ice.CMD, arg[1])
msg.Push(ctx.INDEX, arg[1])
}
if len(arg) > 2 && arg[2] == ice.RUN { // 执行命令
m.Cmdy(web.Space(m, kit.Select(m.Option(ice.POD), msg.Append(ice.POD))), kit.Keys(msg.Append(ice.CTX), msg.Append(ice.CMD)), arg[3:])
m.Cmdy(web.Space(m, kit.Select(m.Option(ice.POD), msg.Append(web.SPACE))), msg.Append(ctx.INDEX), arg[3:])
return
}
if m.Copy(msg); len(arg) > 1 { // 命令插件
m.Tables(func(value ice.Maps) { m.Cmdy(web.Space(m, value[web.SPACE]), ctx.COMMAND, value[ctx.INDEX]) })
m.ProcessField(arg[0], arg[1], ice.RUN)
m.Tables(func(value ice.Maps) {
m.Cmdy(web.Space(m, value[ice.POD]), ctx.CONTEXT, value[ice.CTX], ctx.COMMAND, value[ice.CMD])
})
} else {
m.PushAction(mdb.EXPORT, mdb.IMPORT)
}
}},
})

View File

@ -4,6 +4,7 @@ import (
"path"
ice "shylinux.com/x/icebergs"
"shylinux.com/x/icebergs/base/aaa"
"shylinux.com/x/icebergs/base/mdb"
"shylinux.com/x/icebergs/base/nfs"
"shylinux.com/x/icebergs/base/web"
@ -23,7 +24,10 @@ func init() {
},
}
Index.MergeCommands(ice.Commands{
TOPIC: {Name: "topic zone id auto create insert", Help: "主题", Actions: ice.MergeAction(ice.Actions{
TOPIC: {Name: "topic zone id auto create insert", Help: "主题", Actions: ice.MergeActions(ice.Actions{
ice.CTX_INIT: {Hand: func(m *ice.Message, arg ...string) {
m.Cmd(aaa.ROLE, aaa.WHITE, TOPIC)
}},
mdb.INPUTS: {Name: "inputs", Help: "补全", Hand: func(m *ice.Message, arg ...string) {
switch arg[0] {
case "tags":

View File

@ -12,23 +12,21 @@ import (
kit "shylinux.com/x/toolkits"
)
func init() {
const (
SEND = "send"
FROM = "from"
TO = "to"
)
func init() {
Index.MergeCommands(ice.Commands{
TRANS: {Name: "trans from to auto", Help: "传输", Actions: ice.MergeAction(ice.Actions{
TRANS: {Name: "trans from to auto", Help: "传输", Actions: ice.MergeActions(ice.Actions{
SEND: {Name: "send", Help: "发送", Hand: func(m *ice.Message, arg ...string) {
m.Cmdy(web.SPACE, m.Option(TO), web.SPIDE, ice.DEV, web.SPIDE_SAVE, kit.Select(nfs.PWD, m.Option("to_path")),
web.MergeURL2(m, path.Join(web.SHARE_LOCAL, m.Option("from_path")), ice.POD, m.Option(FROM),
web.SHARE, m.Cmdx(web.SHARE, mdb.CREATE, mdb.TYPE, web.LOGIN),
),
)
web.Toast(m, ice.SUCCESS, SEND)
m.ProcessHold()
).ProcessHold()
web.ToastSuccess(m, SEND)
}},
ice.RUN: {Name: "run", Help: "执行", Hand: func(m *ice.Message, arg ...string) {
m.Option(ice.POD, m.Option("_pod"))

View File

@ -7,6 +7,7 @@ import (
"strings"
ice "shylinux.com/x/icebergs"
"shylinux.com/x/icebergs/base/aaa"
"shylinux.com/x/icebergs/base/ctx"
"shylinux.com/x/icebergs/base/lex"
"shylinux.com/x/icebergs/base/mdb"
@ -16,7 +17,7 @@ import (
)
func _website_url(m *ice.Message, file string) string {
return strings.Split(web.MergeWebsite(m, file), "?")[0]
return strings.Split(MergeWebsite(m, file), "?")[0]
}
func _website_parse(m *ice.Message, text string, args ...string) (ice.Map, bool) {
if text == "" {
@ -120,6 +121,7 @@ func _website_parse(m *ice.Message, text string, args ...string) (ice.Map, bool)
}
func _website_render(m *ice.Message, w http.ResponseWriter, r *http.Request, kind, text, name string) bool {
msg := m.Spawn(w, r)
m.Debug("what %v", kind)
switch kind {
case nfs.ZML:
web.RenderCmd(msg, "can.parse", text, name)
@ -149,7 +151,7 @@ func _website_render(m *ice.Message, w http.ResponseWriter, r *http.Request, kin
}
func _website_search(m *ice.Message, kind, name, text string, arg ...string) {
m.Cmd(m.PrefixKey(), ice.OptionFields("")).Tables(func(value ice.Maps) {
m.PushSearch(value, mdb.TEXT, web.MergeWebsite(m, value[nfs.PATH]))
m.PushSearch(value, mdb.TEXT, MergeWebsite(m, value[nfs.PATH]))
})
}
@ -160,89 +162,83 @@ const (
const WEBSITE = "website"
func init() {
Index.MergeCommands(ice.Commands{"/website/": {Name: "/website/", Help: "网站", Actions: ctx.CmdAction()},
WEBSITE: {Name: "website path auto create import", Help: "网站", Actions: ice.MergeAction(ice.Actions{
Index.MergeCommands(ice.Commands{
WEBSITE: {Name: "website path auto create import", Help: "网站", Actions: ice.MergeActions(ice.Actions{
ice.CTX_INIT: {Hand: func(m *ice.Message, arg ...string) {
m.Cmd(mdb.RENDER, mdb.CREATE, nfs.TXT, m.PrefixKey())
m.Cmd(mdb.ENGINE, mdb.CREATE, nfs.TXT, m.PrefixKey())
m.Cmd(mdb.RENDER, mdb.CREATE, nfs.IML, m.PrefixKey())
m.Cmd(mdb.ENGINE, mdb.CREATE, nfs.IML, m.PrefixKey())
m.Cmd(aaa.ROLE, aaa.WHITE, WEBSITE)
web.AddRewrite(func(w http.ResponseWriter, r *http.Request) bool {
if r.Method != http.MethodGet {
return false
}
if ok := true; mdb.Richs(m, WEBSITE, nil, r.URL.Path, func(key string, value ice.Map) {
value = kit.GetMeta(value)
ok = _website_render(m, w, r, kit.Format(value[mdb.TYPE]), kit.Format(value[mdb.TEXT]), path.Base(r.URL.Path))
}) != nil && ok {
return true
}
if strings.HasPrefix(r.URL.Path, CHAT_WEBSITE) {
_website_render(m, w, r, kit.Ext(r.URL.Path), m.Cmdx(nfs.CAT, strings.Replace(r.URL.Path, CHAT_WEBSITE, SRC_WEBSITE, 1)), path.Base(r.URL.Path))
return true
}
if m.Cmd(WEBSITE, r.URL.Path, func(value ice.Maps) {
_website_render(m, w, r, value[mdb.TYPE], value[mdb.TEXT], path.Base(r.URL.Path))
}).Length() > 0 {
return true
}
return false
})
}},
lex.PARSE: {Hand: func(m *ice.Message, arg ...string) {
switch kit.Ext(arg[0]) {
case nfs.ZML:
case nfs.ZML: // 前端解析
web.RenderCmd(m, "can.parse", m.Cmdx(nfs.CAT, path.Join(SRC_WEBSITE, arg[0])))
case nfs.IML:
case nfs.IML: // 文件解析
if res, ok := _website_parse(m, m.Cmdx(nfs.CAT, path.Join(SRC_WEBSITE, arg[0])), arg[1:]...); ok {
m.Echo(_website_template2, kit.Format(res))
}
default:
if text := m.Cmd(m.PrefixKey(), ice.PS+arg[0]).Append(mdb.TEXT); text != "" {
default: // 缓存解析
if text := m.CmdAppend("", path.Join(ice.PS, arg[0]), mdb.TEXT); text != "" {
if res, ok := _website_parse(m, text, arg[1:]...); ok {
m.Echo(_website_template2, kit.Format(res))
}
}
}
}},
mdb.SEARCH: {Hand: func(m *ice.Message, arg ...string) {
if arg[0] == mdb.FOREACH && arg[1] == "" {
_website_search(m, arg[0], arg[1], kit.Select("", arg, 2))
}
}},
mdb.RENDER: {Hand: func(m *ice.Message, arg ...string) {
m.EchoIFrame(_website_url(m, strings.TrimPrefix(path.Join(arg[2], arg[1]), SRC_WEBSITE)))
}},
mdb.ENGINE: {Hand: func(m *ice.Message, arg ...string) {
if res, ok := _website_parse(m, m.Cmdx(nfs.CAT, path.Join(arg[2], arg[1]))); ok {
m.Echo(kit.Formats(res))
ctx.DisplayStoryJSON(m)
} else {
m.Echo(_website_url(m, strings.TrimPrefix(path.Join(arg[2], arg[1]), SRC_WEBSITE)))
}
}},
mdb.INPUTS: {Name: "inputs", Help: "补全", Hand: func(m *ice.Message, arg ...string) {
switch m.Option(ctx.ACTION) {
case mdb.CREATE:
m.Cmdy(mdb.INPUTS, m.PrefixKey(), "", mdb.HASH, arg)
default:
mdb.HashInputs(m, arg)
return
}
switch arg[0] {
case nfs.PATH:
m.Cmdy(nfs.DIR, arg[1:]).ProcessAgain()
}
}
}},
mdb.CREATE: {Name: "create path type=iml,zml,json,js,html name text", Help: "创建"},
mdb.IMPORT: {Name: "import path=src/website/", Help: "导入", Hand: func(m *ice.Message, arg ...string) {
m.Cmd(nfs.DIR, kit.Dict(nfs.DIR_ROOT, m.Option(nfs.PATH)), func(p string) {
switch name := strings.TrimPrefix(p, m.Option(nfs.PATH)); kit.Ext(p) {
case nfs.HTML, nfs.JS, nfs.JSON, nfs.ZML, nfs.IML, nfs.TXT:
m.Cmd(m.PrefixKey(), mdb.CREATE, nfs.PATH, ice.PS+name, mdb.TYPE, kit.Ext(p), mdb.NAME, name, mdb.TEXT, m.Cmdx(nfs.CAT, p))
m.Cmd("", mdb.CREATE, nfs.PATH, path.Join(ice.PS, name), mdb.TYPE, kit.Ext(p), mdb.NAME, name, mdb.TEXT, m.Cmdx(nfs.CAT, p))
default:
m.Cmd(m.PrefixKey(), mdb.CREATE, nfs.PATH, ice.PS+name, mdb.TYPE, kit.Ext(p), mdb.NAME, name, mdb.TEXT, p)
m.Cmd("", mdb.CREATE, nfs.PATH, path.Join(ice.PS, name), mdb.TYPE, kit.Ext(p), mdb.NAME, name, mdb.TEXT, p)
}
})
}},
}, mdb.HashAction(mdb.SHORT, nfs.PATH, mdb.FIELD, "time,path,type,name,text")), Hand: func(m *ice.Message, arg ...string) {
mdb.HashSelect(m, arg...).Tables(func(value ice.Maps) { m.PushAnchor(web.MergeWebsite(m, value[nfs.PATH])) })
mdb.RENDER: {Hand: func(m *ice.Message, arg ...string) {
m.EchoIFrame(_website_url(m, strings.TrimPrefix(path.Join(arg[2], arg[1]), SRC_WEBSITE)))
}},
mdb.ENGINE: {Hand: func(m *ice.Message, arg ...string) {
if res, ok := _website_parse(m, m.Cmdx(nfs.CAT, path.Join(arg[2], arg[1]))); ok {
ctx.DisplayStoryJSON(m.Echo(kit.Formats(res)))
} else {
m.Echo(_website_url(m, strings.TrimPrefix(path.Join(arg[2], arg[1]), SRC_WEBSITE)))
}
}},
}, mdb.HashAction(mdb.SHORT, nfs.PATH, mdb.FIELD, "time,path,type,name,text"), ctx.CmdAction(), web.ApiAction("/website/")), Hand: func(m *ice.Message, arg ...string) {
mdb.HashSelect(m, arg...).Tables(func(value ice.Maps) { m.PushAnchor(MergeWebsite(m, value[nfs.PATH])) })
if len(arg) == 0 { // 文件列表
m.Cmd(nfs.DIR, SRC_WEBSITE, func(f os.FileInfo, p string) {
m.Push("", kit.Dict(
@ -253,13 +249,14 @@ func init() {
m.PushAnchor(web.MergeURL2(m, path.Join(CHAT_WEBSITE, strings.TrimPrefix(p, SRC_WEBSITE))))
}).Sort(nfs.PATH)
}
if m.Length() == 0 && len(arg) > 0 { // 文件详情
m.Push(mdb.TEXT, m.Cmdx(nfs.CAT, path.Join(SRC_WEBSITE, path.Join(arg...))))
p := path.Join(SRC_WEBSITE, path.Join(arg...))
if m.Length() == 0 && len(arg) > 0 && !strings.HasSuffix(arg[0], ice.PS) && nfs.ExistsFile(m, p) { // 文件详情
m.Push(mdb.TYPE, kit.Ext(p))
m.Push(mdb.TEXT, m.Cmdx(nfs.CAT, p))
m.Push(nfs.PATH, path.Join(CHAT_WEBSITE, path.Join(arg...)))
m.PushAnchor(web.MergeLink(m, m.Append(nfs.PATH)))
}
if len(arg) > 0 { // 文件预览
if m.Length() > 0 && len(arg) > 0 { // 文件预览
m.PushQRCode(mdb.SCAN, web.MergeURL2(m, m.Append(nfs.PATH)))
m.EchoIFrame(m.Append(nfs.PATH))
}

View File

@ -9,34 +9,23 @@ import (
"shylinux.com/x/icebergs/base/mdb"
"shylinux.com/x/icebergs/base/nfs"
"shylinux.com/x/icebergs/base/ssh"
"shylinux.com/x/icebergs/base/tcp"
"shylinux.com/x/icebergs/base/web"
kit "shylinux.com/x/toolkits"
)
func _defs(m *ice.Message, args ...string) string {
for i := 0; i < len(args); i += 2 {
if m.Option(args[i]) == "" {
m.Option(args[i], args[i+1])
}
}
return m.Option(args[0])
}
func _defs_list(m *ice.Message) string {
list := []string{mdb.LIST}
switch m.Option(mdb.TYPE) {
case "Hash":
list = append(list, "hash auto create")
case "Zone":
list = append(list, "zone id auto insert")
case "Lists":
list = append(list, "id auto insert")
case "Hash":
list = append(list, "hash auto create")
case "Data":
list = append(list, "path auto")
case "Code":
list = append(list, "port path auto start order build download")
}
return _defs(m, mdb.LIST, kit.Join(list, ice.SP))
return m.OptionDefault(mdb.LIST, kit.Join(list, ice.SP))
}
func _autogen_module(m *ice.Message, dir string) {
m.Cmd(nfs.DEFS, dir, `package {{.Option "zone"}}
@ -97,7 +86,7 @@ func _autogen_source(m *ice.Message, main, file string) {
m.Cmd(nfs.PUSH, main, ice.NL, "source "+strings.TrimPrefix(file, ice.SRC+ice.PS))
}
func _autogen_mod(m *ice.Message, file string) (mod string) {
host := kit.ParseURLMap(m.Option(ice.MSG_USERWEB))[tcp.HOSTNAME]
host := web.OptionUserWeb(m).Hostname()
if host == "" {
host = path.Base(kit.Path(""))
} else {
@ -134,7 +123,7 @@ func _autogen_gits(m *ice.Message, arg ...string) string {
return kit.Join(res, ice.NL)
}
func _autogen_version(m *ice.Message) {
if mod := _autogen_mod(m, ice.GO_MOD); !kit.FileExists(".git") {
if mod := _autogen_mod(m, ice.GO_MOD); !nfs.ExistsFile(m, ".git") {
m.Cmdy(cli.SYSTEM, GIT, ice.INIT)
m.Cmd(cli.SYSTEM, GIT, "remote", "add", "origin", "https://"+mod)
m.Cmd("web.code.git.repos", mdb.CREATE, "repos", "https://"+mod, mdb.NAME, path.Base(mod), nfs.PATH, nfs.PWD)
@ -182,17 +171,17 @@ func init() {
m.Cmdy(nfs.DIR, nfs.PWD, nfs.DIR_CLI_FIELDS, kit.Dict(nfs.DIR_REG, `.*\.go`)).RenameAppend(nfs.PATH, arg[0])
}
}},
mdb.CREATE: {Name: "create name=hi help type=Hash,Zone,Lists,Data,Code main=main.go@key zone key", Help: "模块", Hand: func(m *ice.Message, arg ...string) {
_defs(m, mdb.ZONE, m.Option(mdb.NAME), mdb.HELP, m.Option(mdb.NAME))
_defs(m, mdb.KEY, kit.Keys("web.code", m.Option(mdb.ZONE), m.Option(mdb.NAME)))
mdb.CREATE: {Name: "create name=hi help type=Zone,Hash,Data,Code main=main.go@key zone key", Help: "模块", Hand: func(m *ice.Message, arg ...string) {
m.OptionDefault(mdb.ZONE, m.Option(mdb.NAME), mdb.HELP, m.Option(mdb.NAME))
m.OptionDefault(mdb.KEY, kit.Keys("web.code", m.Option(mdb.ZONE), m.Option(mdb.NAME)))
m.Option(mdb.TEXT, kit.Format("`name:\"%s\" help:\"%s\"`", _defs_list(m), m.Option(mdb.HELP)))
nfs.OptionFiles(m, nfs.DiskFile)
if p := path.Join(ice.SRC, m.Option(mdb.ZONE), kit.Keys(m.Option(mdb.NAME), GO)); !kit.FileExists(p) {
if p := path.Join(ice.SRC, m.Option(mdb.ZONE), kit.Keys(m.Option(mdb.NAME), GO)); !nfs.ExistsFile(m, p) {
_autogen_module(m, p)
_autogen_import(m, path.Join(ice.SRC, m.Option(cli.MAIN)), m.Option(mdb.ZONE), _autogen_mod(m, ice.GO_MOD))
}
if p := path.Join(ice.SRC, m.Option(mdb.ZONE), kit.Keys(m.Option(mdb.NAME), SHY)); !kit.FileExists(p) {
if p := path.Join(ice.SRC, m.Option(mdb.ZONE), kit.Keys(m.Option(mdb.NAME), SHY)); !nfs.ExistsFile(m, p) {
_autogen_script(m, p)
_autogen_source(m, path.Join(ice.SRC, m.Option(cli.MAIN)), p)
}
@ -200,7 +189,7 @@ func init() {
_autogen_version(m.Spawn())
}},
ssh.SCRIPT: {Name: "script", Help: "脚本:生成 etc/miss.sh", Hand: func(m *ice.Message, arg ...string) {
m.Cmd(nfs.DEFS, ice.ETC_MISS_SH, m.Conf(web.DREAM, kit.Keym("miss")))
m.Cmd(nfs.DEFS, ice.ETC_MISS_SH, m.Conf(web.DREAM, kit.Keym(nfs.SCRIPT)))
defer m.Cmdy(nfs.CAT, ice.ETC_MISS_SH)
m.Cmdy(nfs.DIR, ice.ETC_MISS_SH)
@ -212,7 +201,7 @@ func init() {
}},
BINPACK: {Name: "binpack", Help: "打包:生成 src/binpack.go", Hand: func(m *ice.Message, arg ...string) {
_autogen_version(m)
if m.Cmd(BINPACK, mdb.CREATE); kit.FileExists(ice.USR_RELEASE) && m.Option(ice.MSG_USERPOD) == "" {
if m.Cmd(BINPACK, mdb.CREATE); nfs.ExistsFile(m, ice.USR_RELEASE) && m.Option(ice.MSG_USERPOD) == "" {
m.Cmd(nfs.COPY, path.Join(ice.USR_RELEASE, "conf.go"), path.Join(ice.USR_ICEBERGS, "conf.go"))
m.Cmd(cli.SYSTEM, "sh", "-c", `cat src/binpack.go|sed 's/package main/package ice/g' > usr/release/binpack.go`)
m.Cmdy(nfs.DIR, "usr/release/binpack.go")

View File

@ -4,12 +4,12 @@ import (
"io"
"io/ioutil"
"net/http"
"os"
"strings"
"sync/atomic"
ice "shylinux.com/x/icebergs"
"shylinux.com/x/icebergs/base/mdb"
"shylinux.com/x/icebergs/base/nfs"
kit "shylinux.com/x/toolkits"
"shylinux.com/x/toolkits/util/bench"
)
@ -23,7 +23,7 @@ func _bench_http(m *ice.Message, target string, arg ...string) {
for _, v := range strings.Split(target, ice.NL) {
switch ls := kit.Split(v); ls[0] {
case http.MethodPost: // POST,url,file
if f, e := os.Open(ls[2]); m.Assert(e) {
if f, e := nfs.OpenFile(m, ls[2]); m.Assert(e) {
defer f.Close()
if req, err := http.NewRequest(http.MethodPost, ls[1], f); m.Assert(err) {
@ -62,7 +62,7 @@ const BENCH = "bench"
func init() {
Index.MergeCommands(ice.Commands{
BENCH: {Name: "bench zone id auto insert", Help: "性能压测", Actions: ice.MergeAction(ice.Actions{
BENCH: {Name: "bench zone id auto insert", Help: "性能压测", Actions: ice.MergeActions(ice.Actions{
mdb.INSERT: {Name: "insert zone=some type=http,redis name=demo text='http://localhost:9020' nconn=3 nreqs=10", Help: "添加"},
ice.RUN: {Name: "run", Help: "执行", Hand: func(m *ice.Message, arg ...string) {
switch m.Option(mdb.TYPE) {

View File

@ -3,8 +3,8 @@ package code
import (
"encoding/base64"
"fmt"
"io"
"io/ioutil"
"os"
"path"
"strings"
@ -14,72 +14,59 @@ import (
kit "shylinux.com/x/toolkits"
)
func _binpack_file(m *ice.Message, arg ...string) string { // file name
if f, e := os.Open(arg[0]); e == nil {
func _binpack_file(m *ice.Message, w io.Writer, arg ...string) { // file name
if f, e := nfs.OpenFile(m, arg[0]); e == nil {
defer f.Close()
if b, e := ioutil.ReadAll(f); e == nil && len(b) > 0 {
return fmt.Sprintf(" \"%s\": \"%s\",", kit.Select(arg[0], arg, 1), base64.StdEncoding.EncodeToString(b))
fmt.Fprintf(w, " \"%s\": \"%s\",\n", kit.Select(arg[0], arg, 1), base64.StdEncoding.EncodeToString(b))
return
}
}
return fmt.Sprintf(" // \"%s\": \"%s\",", kit.Select(arg[0], arg, 1), "")
fmt.Fprintf(w, " // \"%s\": \"%s\",\n", kit.Select(arg[0], arg, 1), "")
}
func _binpack_dir(m *ice.Message, f *os.File, dir string) {
func _binpack_dir(m *ice.Message, w io.Writer, dir string) {
m.Option(nfs.DIR_ROOT, dir)
m.Option(nfs.DIR_DEEP, true)
m.Option(nfs.DIR_TYPE, nfs.CAT)
m.Cmd(nfs.DIR, nfs.PWD).Sort(nfs.PATH).Tables(func(value ice.Maps) {
switch path.Base(value[nfs.PATH]) {
case "go.mod", "go.sum", "binpack.go", "version.go":
case ice.GO_MOD, ice.GO_SUM, "binpack.go", "version.go":
return
}
switch strings.Split(value[nfs.PATH], ice.PS)[0] {
case "var", "polaris", "website":
case ice.BIN, ice.VAR, "website", "polaris":
return
}
fmt.Fprintln(f, _binpack_file(m, path.Join(dir, value[nfs.PATH])))
_binpack_file(m, w, path.Join(dir, value[nfs.PATH]))
})
fmt.Fprintln(f)
fmt.Fprintln(w)
}
func _binpack_can(m *ice.Message, f *os.File, dir string) {
func _binpack_can(m *ice.Message, w io.Writer, dir string) {
m.Option(nfs.DIR_ROOT, dir)
m.Option(nfs.DIR_DEEP, true)
m.Option(nfs.DIR_TYPE, nfs.CAT)
for _, k := range []string{ice.FAVICON, ice.PROTO_JS, ice.FRAME_JS} {
// fmt.Fprintln(f, _binpack_file(m, path.Join(dir, k), ice.PS+k))
fmt.Fprintln(f, _binpack_file(m, path.Join(dir, k), path.Join(ice.USR_VOLCANOS, k)))
_binpack_file(m, w, path.Join(dir, k), path.Join(ice.USR_VOLCANOS, k))
}
for _, k := range []string{LIB, PAGE, PANEL, PLUGIN, "publish/client/nodejs/"} {
m.Cmd(nfs.DIR, k).Sort(nfs.PATH).Tables(func(value ice.Maps) {
// fmt.Fprintln(f, _binpack_file(m, path.Join(dir, value[nfs.PATH]), ice.PS+value[nfs.PATH]))
fmt.Fprintln(f, _binpack_file(m, path.Join(dir, value[nfs.PATH]), path.Join(ice.USR_VOLCANOS, value[nfs.PATH])))
_binpack_file(m, w, path.Join(dir, value[nfs.PATH]), path.Join(ice.USR_VOLCANOS, value[nfs.PATH]))
})
}
fmt.Fprintln(f)
fmt.Fprintln(w)
}
func _binpack_ctx(m *ice.Message, f *os.File) {
_binpack_dir(m, f, ice.SRC)
func _binpack_ctx(m *ice.Message, w io.Writer) {
_binpack_dir(m, w, ice.SRC)
}
const BINPACK = "binpack"
func init() {
Index.MergeCommands(ice.Commands{
BINPACK: {Name: "binpack path auto create remove export", Help: "打包", Actions: ice.MergeAction(ice.Actions{
ice.CTX_INIT: {Hand: func(m *ice.Message, arg ...string) {
if kit.FileExists(path.Join(ice.USR_VOLCANOS, ice.PROTO_JS)) {
m.Cmd(BINPACK, mdb.REMOVE)
return
}
}},
mdb.CREATE: {Name: "create", Help: "创建", Hand: func(m *ice.Message, arg ...string) {
if f, p, e := kit.Create(ice.SRC_BINPACK_GO); m.Assert(e) {
defer f.Close()
func _binpack_all(m *ice.Message) {
if w, p, e := nfs.CreateFile(m, ice.SRC_BINPACK_GO); m.Assert(e) {
defer w.Close()
defer m.Echo(p)
fmt.Fprintln(f, `package main
fmt.Fprintln(w, `package main
import (
"encoding/base64"
@ -89,9 +76,9 @@ import (
func init() {
`)
defer fmt.Fprintln(f, `}`)
defer fmt.Fprintln(w, `}`)
defer fmt.Fprintln(f, `
defer fmt.Fprintln(w, `
for k, v := range pack {
if b, e := base64.StdEncoding.DecodeString(v); e == nil {
nfs.PackFile.WriteFile(k, b)
@ -99,40 +86,50 @@ func init() {
}
`)
fmt.Fprintln(f, ` pack := ice.Maps{`)
defer fmt.Fprintln(f, ` }`)
fmt.Fprintln(w, ` pack := ice.Maps{`)
defer fmt.Fprintln(w, ` }`)
if kit.FileExists(ice.USR_VOLCANOS) && kit.FileExists(ice.USR_INTSHELL) && m.Option(ice.MSG_USERPOD) == "" {
_binpack_can(m, f, ice.USR_VOLCANOS)
_binpack_dir(m, f, ice.USR_INTSHELL)
if nfs.ExistsFile(m, ice.USR_VOLCANOS) && nfs.ExistsFile(m, ice.USR_INTSHELL) && m.Option(ice.MSG_USERPOD) == "" {
_binpack_can(m, w, ice.USR_VOLCANOS)
_binpack_dir(m, w, ice.USR_INTSHELL)
}
_binpack_ctx(m, f)
_binpack_ctx(m, w)
fmt.Fprintln(f, _binpack_file(m, ice.ETC_MISS_SH))
fmt.Fprintln(f, _binpack_file(m, ice.ETC_INIT_SHY))
fmt.Fprintln(f, _binpack_file(m, ice.ETC_EXIT_SHY))
fmt.Fprintln(f)
_binpack_file(m, w, ice.ETC_MISS_SH)
_binpack_file(m, w, ice.ETC_INIT_SHY)
_binpack_file(m, w, ice.ETC_EXIT_SHY)
fmt.Fprintln(w)
fmt.Fprintln(f, _binpack_file(m, ice.LICENSE))
fmt.Fprintln(f, _binpack_file(m, ice.MAKEFILE))
fmt.Fprintln(f, _binpack_file(m, ice.README_MD))
fmt.Fprintln(f)
_binpack_file(m, w, ice.LICENSE)
_binpack_file(m, w, ice.MAKEFILE)
_binpack_file(m, w, ice.README_MD)
fmt.Fprintln(w)
m.Cmd(mdb.SELECT, m.PrefixKey(), "", mdb.HASH, ice.OptionFields(nfs.PATH)).Tables(func(value ice.Maps) {
if s, e := os.Stat(value[nfs.PATH]); e == nil {
mdb.HashSelects(m).Sort(nfs.PATH).Tables(func(value ice.Maps) {
if s, e := nfs.StatFile(m, value[nfs.PATH]); e == nil {
if s.IsDir() {
_binpack_dir(m, f, value[nfs.PATH])
_binpack_dir(m, w, value[nfs.PATH])
} else {
fmt.Fprintln(f, _binpack_file(m, value[nfs.PATH]))
_binpack_file(m, w, value[nfs.PATH])
}
}
})
}
}
const BINPACK = "binpack"
func init() {
Index.MergeCommands(ice.Commands{
BINPACK: {Name: "binpack path auto create insert", Help: "打包", Actions: ice.MergeActions(ice.Actions{
mdb.CREATE: {Name: "create", Help: "创建", Hand: func(m *ice.Message, arg ...string) {
_binpack_all(m)
}},
mdb.INSERT: {Name: "insert", Help: "添加", Hand: func(m *ice.Message, arg ...string) {
m.Cmd(mdb.INSERT, m.PrefixKey(), "", mdb.HASH, nfs.PATH, arg[0])
mdb.INSERT: {Name: "insert path", Help: "添加", Hand: func(m *ice.Message, arg ...string) {
mdb.HashCreate(m, nfs.PATH, m.Option(nfs.PATH))
}},
}, mdb.HashAction(mdb.SHORT, nfs.PATH)), Hand: func(m *ice.Message, arg ...string) {
mdb.HashSelect(m)
}},
})
}

View File

@ -49,7 +49,7 @@ const C = "c"
func init() {
Index.Register(&ice.Context{Name: C, Help: "系统", Commands: ice.Commands{
C: {Name: C, Help: "系统", Actions: ice.MergeAction(ice.Actions{
C: {Name: C, Help: "系统", Actions: ice.MergeActions(ice.Actions{
ice.CTX_INIT: {Hand: func(m *ice.Message, arg ...string) {
for _, cmd := range []string{mdb.SEARCH, mdb.ENGINE, mdb.RENDER, mdb.PLUGIN} {
for _, k := range []string{H, C, CC} {
@ -79,7 +79,7 @@ func init() {
// _go_grep(m, kit.Select(cli.MAIN, arg, 1), arg[2])
}},
}, PlugAction())},
MAN: {Name: MAN, Help: "手册", Actions: ice.MergeAction(ice.Actions{
MAN: {Name: MAN, Help: "手册", Actions: ice.MergeActions(ice.Actions{
ice.CTX_INIT: {Hand: func(m *ice.Message, arg ...string) {
for _, cmd := range []string{mdb.SEARCH, mdb.RENDER, mdb.PLUGIN} {
for _, k := range []string{MAN1, MAN2, MAN3, MAN8} {

View File

@ -16,7 +16,7 @@ const CASE = "case"
func init() {
Index.MergeCommands(ice.Commands{
CASE: {Name: "case dev zone id auto", Help: "用例", Actions: ice.MergeAction(ice.Actions{
CASE: {Name: "case dev zone id auto", Help: "用例", Actions: ice.MergeActions(ice.Actions{
mdb.CREATE: {Name: "create name address", Help: "创建", Hand: func(m *ice.Message, arg ...string) {
m.Cmdy(web.SPIDE, mdb.CREATE, arg)
}},

View File

@ -11,8 +11,8 @@ var Index = &ice.Context{Name: CODE, Help: "编程中心"}
func init() {
web.Index.Register(Index, &web.Frame{},
WEBPACK, BINPACK, AUTOGEN, COMPILE, PUBLISH, UPGRADE, INSTALL,
INNER, VIMER, FAVOR, BENCH, PPROF,
INSTALL, WEBPACK, BINPACK, AUTOGEN, COMPILE, PUBLISH, UPGRADE,
XTERM, VIMER, INNER, FAVOR, BENCH, PPROF,
C, SH, SHY, GO, JS,
)
}

View File

@ -1,27 +1,33 @@
chapter "源码"
code.go
code.shy
install.go
webpack.go
binpack.go
autogen.go
compile.go
publish.go
upgrade.go
install.go
favor.go
inner.go
xterm.shy
xterm.go
vimer.go
inner.go
favor.go
bench.go
pprof.go
case.go
oauth.go
c.go
sh.go
shy.go
go.go
js.go
shy.go
py.go
zml.go
code.go
code.shy
sess.go
template.go
case.go

View File

@ -47,22 +47,10 @@ func init() {
cli.ENV, kit.Dict("GOPROXY", "https://goproxy.cn,direct", "GOPRIVATE", "shylinux.com,github.com", "CGO_ENABLED", "0"),
)},
}, Commands: ice.Commands{
COMPILE: {Name: "compile arch=amd64,386,arm,arm64,mipsle os=linux,darwin,windows src=src/main.go@key run binpack relay install", Help: "编译", Actions: ice.Actions{
COMPILE: {Name: "compile arch=amd64,386,arm,arm64,mipsle os=linux,darwin,windows src=src/main.go@key run binpack relay", Help: "编译", Actions: ice.Actions{
mdb.INPUTS: {Name: "inputs", Help: "补全", Hand: func(m *ice.Message, arg ...string) {
m.Cmdy(nfs.DIR, ice.SRC, nfs.DIR_CLI_FIELDS, kit.Dict(nfs.DIR_REG, `.*\.go$`)).Sort(nfs.PATH)
}},
INSTALL: {Name: "compile", Help: "安装", Hand: func(m *ice.Message, arg ...string) {
if cli.IsAlpine(m) {
web.PushStream(m)
m.Cmd(cli.SYSTEM, "apk", "add", GIT, GO)
return
}
if m.Cmdx(cli.SYSTEM, nfs.FIND, GIT) == "" {
web.Toast(m, "please install git")
m.Echo(ice.FALSE)
return
}
}},
BINPACK: {Name: "binpack", Help: "打包", Hand: func(m *ice.Message, arg ...string) {
m.Cmdy(AUTOGEN, BINPACK)
}},

View File

@ -4,7 +4,6 @@ import (
ice "shylinux.com/x/icebergs"
"shylinux.com/x/icebergs/base/ctx"
"shylinux.com/x/icebergs/base/mdb"
"shylinux.com/x/icebergs/base/nfs"
kit "shylinux.com/x/toolkits"
)
@ -12,22 +11,11 @@ const FAVOR = "favor"
func init() {
Index.MergeCommands(ice.Commands{
FAVOR: {Name: "favor zone id auto insert test page", Help: "收藏夹", Actions: ice.MergeAction(ice.Actions{
FAVOR: {Name: "favor zone id auto insert test page", Help: "收藏夹", Actions: ice.MergeActions(ice.Actions{
mdb.INSERT: {Name: "insert zone=数据结构 type=go name=hi text=hello path file line", Help: "添加"},
INNER: {Name: "inner", Help: "源码", Hand: func(m *ice.Message, arg ...string) {
ctx.ProcessCommand(m, INNER, m.OptionSplit("path,file,line"), arg...)
}},
"test": {Name: "test zone=hi count=10", Help: "测试", Hand: func(m *ice.Message, arg ...string) {
m.Cmd(mdb.INSERT, m.PrefixKey(), "", mdb.HASH, m.OptionSimple(mdb.ZONE))
for i := 0; i < kit.Int(m.Option(mdb.COUNT)); i++ {
m.Cmd(mdb.INSERT, m.PrefixKey(), "", mdb.ZONE, m.Option(mdb.ZONE), mdb.NAME, i)
}
m.Conf(m.PrefixKey(), kit.Keys(mdb.HASH, kit.Hashs(m.Option(mdb.ZONE)), kit.Keym(mdb.LIMIT)), 20)
m.Conf(m.PrefixKey(), kit.Keys(mdb.HASH, kit.Hashs(m.Option(mdb.ZONE)), kit.Keym(mdb.LEAST)), 10)
m.Conf(m.PrefixKey(), kit.Keys(mdb.HASH, kit.Hashs(m.Option(mdb.ZONE)), kit.Keym(mdb.FSIZE)), 500)
m.Cmdy(nfs.DIR, "var/data/", kit.Dict(nfs.DIR_DEEP, true))
m.Echo(kit.Formats(m.Confv(m.PrefixKey())))
}},
}, mdb.ZoneAction(mdb.SHORT, mdb.ZONE, mdb.FIELD, "time,id,type,name,text,path,file,line")), Hand: func(m *ice.Message, arg ...string) {
mdb.ZoneSelectPage(m, arg...).PushAction(kit.Select(mdb.REMOVE, INNER, len(arg) > 0))
}},

View File

@ -242,20 +242,20 @@ func init() {
m.Cmd(mdb.PLUGIN, mdb.CREATE, k, m.Prefix(k))
}
}},
GODOC: {Name: "godoc", Help: "文档", Actions: ice.MergeAction(ice.Actions{
GODOC: {Name: "godoc", Help: "文档", Actions: ice.MergeActions(ice.Actions{
mdb.RENDER: {Hand: func(m *ice.Message, arg ...string) {
m.Cmdy(cli.SYSTEM, GO, "doc", strings.TrimSuffix(arg[1], ice.PT+arg[0]), kit.Dict(cli.CMD_DIR, arg[2])).SetAppend()
}},
}, PlugAction())},
SUM: {Name: "sum", Help: "版本", Actions: ice.MergeAction(ice.Actions{
SUM: {Name: "sum", Help: "版本", Actions: ice.MergeActions(ice.Actions{
mdb.RENDER: {Hand: func(m *ice.Message, arg ...string) { _sum_show(m, path.Join(arg[2], arg[1])) }},
mdb.ENGINE: {Hand: func(m *ice.Message, arg ...string) { _sum_show(m, path.Join(arg[2], arg[1])) }},
}, PlugAction())},
MOD: {Name: "mod", Help: "模块", Actions: ice.MergeAction(ice.Actions{
MOD: {Name: "mod", Help: "模块", Actions: ice.MergeActions(ice.Actions{
mdb.RENDER: {Hand: func(m *ice.Message, arg ...string) { _mod_show(m, path.Join(arg[2], arg[1])) }},
mdb.ENGINE: {Hand: func(m *ice.Message, arg ...string) { _mod_show(m, path.Join(arg[2], arg[1])) }},
}, PlugAction())},
GO: {Name: "go", Help: "后端", Actions: ice.MergeAction(ice.Actions{
GO: {Name: "go", Help: "后端", Actions: ice.MergeActions(ice.Actions{
mdb.SEARCH: {Hand: func(m *ice.Message, arg ...string) {
if arg[0] == GO {
_go_tags(m, kit.Select(cli.MAIN, arg, 1))

View File

@ -100,7 +100,7 @@ const INNER = "inner"
func init() {
Index.Merge(&ice.Context{Commands: ice.Commands{
INNER: {Name: "inner path=src/@key file=main.go line=1 auto", Help: "源代码", Meta: kit.Dict(ice.DisplayLocal("")), Actions: ice.MergeAction(ice.Actions{
INNER: {Name: "inner path=src/@key file=main.go line=1 auto", Help: "源代码", Meta: kit.Dict(ice.DisplayLocal("")), Actions: ice.MergeActions(ice.Actions{
mdb.PLUGIN: {Name: "plugin", Help: "插件", Hand: func(m *ice.Message, arg ...string) {
if m.Cmdy(mdb.PLUGIN, arg); m.Result() == "" {
m.Echo(kit.Select("{}", m.Config(kit.Keys(PLUG, arg[0]))))

View File

@ -13,18 +13,17 @@ import (
"shylinux.com/x/icebergs/base/tcp"
"shylinux.com/x/icebergs/base/web"
kit "shylinux.com/x/toolkits"
"shylinux.com/x/toolkits/file"
)
func _install_path(m *ice.Message, link string) string {
link = kit.Select(m.Option(mdb.LINK), link)
if p := path.Join(ice.USR_INSTALL, kit.TrimExt(link)); kit.FileExists(p) {
if p := path.Join(ice.USR_INSTALL, kit.TrimExt(link)); nfs.ExistsFile(m, p) {
return p
}
if p := path.Join(ice.USR_INSTALL, path.Base(link)); kit.FileExists(p) {
if p := path.Join(ice.USR_INSTALL, path.Base(link)); nfs.ExistsFile(m, p) {
return path.Join(ice.USR_INSTALL, strings.Split(m.Cmdx(cli.SYSTEM, "sh", "-c", kit.Format("tar tf %s| head -n1", p), ice.Option{cli.CMD_OUTPUT, ""}), ice.PS)[0])
}
m.ErrorNotImplement(link)
m.Warn(true, ice.ErrNotFound, link)
return ""
}
func _install_download(m *ice.Message) {
@ -32,34 +31,29 @@ func _install_download(m *ice.Message) {
name := path.Base(strings.Split(link, "?")[0])
file := path.Join(kit.Select(ice.USR_INSTALL, m.Option(nfs.PATH)), name)
defer m.Cmdy(nfs.DIR, file)
if kit.FileExists(file) {
if nfs.ExistsFile(m, file) {
web.ToastSuccess(m)
m.Cmdy(nfs.DIR, file)
return // 文件存在
}
// 创建文件
m.Cmd(nfs.SAVE, file, "")
web.GoToast(m, web.DOWNLOAD, func(toast func(string, int, int)) {
m.Cmd(mdb.INSERT, INSTALL, "", mdb.HASH, mdb.NAME, name, nfs.PATH, file, mdb.LINK, link)
defer web.ToastSuccess(m)
// 下载进度
mdb.Richs(m, INSTALL, "", name, func(key string, value ice.Map) {
value = kit.GetMeta(value)
m.OptionCB(web.SPIDE, func(count int, total int, step int) {
mdb.HashCreate(m, mdb.NAME, name, nfs.PATH, file, mdb.LINK, link)
m.Cmd("web.spide", ice.DEV, web.SPIDE_SAVE, file, web.SPIDE_GET, link, func(count int, total int, step int) {
mdb.HashSelectUpdate(m, name, func(value ice.Map) {
value[mdb.COUNT], value[mdb.TOTAL], value[mdb.VALUE] = count, total, step
})
toast(name, count, total)
})
})
// 下载解压
m.Cmd("web.spide", ice.DEV, web.SPIDE_SAVE, file, web.SPIDE_GET, link)
m.Cmd(nfs.TAR, mdb.EXPORT, name, kit.Dict(cli.CMD_DIR, path.Dir(file)))
web.PushNoticeRefresh(m)
web.ToastSuccess(m)
})
}
func _install_build(m *ice.Message, arg ...string) string {
p := m.Option(cli.CMD_DIR, _install_path(m, ""))
pp := kit.Path(path.Join(p, "_install"))
pp := kit.Path(path.Join(p, _INSTALL))
// 推流
web.PushStream(m)
@ -91,7 +85,7 @@ func _install_order(m *ice.Message, arg ...string) {
}
func _install_spawn(m *ice.Message, arg ...string) {
if kit.Int(m.Option(tcp.PORT)) >= 10000 {
if p := path.Join(ice.USR_LOCAL_DAEMON, m.Option(tcp.PORT)); kit.FileExists(p) {
if p := path.Join(ice.USR_LOCAL_DAEMON, m.Option(tcp.PORT)); nfs.ExistsFile(m, p) {
m.Echo(p)
return
}
@ -101,13 +95,13 @@ func _install_spawn(m *ice.Message, arg ...string) {
target := path.Join(ice.USR_LOCAL_DAEMON, m.Option(tcp.PORT))
source := _install_path(m, "")
file.MkdirAll(target, ice.MOD_DIR)
nfs.MkdirAll(m, target)
defer m.Echo(target)
if m.Option(INSTALL) == "" && kit.FileExists(kit.Path(source, "_install")) {
m.Option(INSTALL, "_install")
if m.Option(INSTALL) == "" && nfs.ExistsFile(m, kit.Path(source, _INSTALL)) {
m.Option(INSTALL, _INSTALL)
}
m.Cmd(nfs.DIR, path.Join(source, m.Option(INSTALL))).Tables(func(value ice.Maps) {
m.Cmd(nfs.DIR, path.Join(source, m.Option(INSTALL)), func(value ice.Maps) {
m.Cmd(cli.SYSTEM, "cp", "-r", strings.TrimSuffix(value[nfs.PATH], ice.PS), target+ice.PS)
})
}
@ -120,6 +114,7 @@ func _install_start(m *ice.Message, arg ...string) {
args = append(args, cb(p)...)
case func(string):
cb(p)
case nil:
default:
m.ErrorNotImplement(cb)
}
@ -129,7 +124,7 @@ func _install_start(m *ice.Message, arg ...string) {
}
}
func _install_stop(m *ice.Message, arg ...string) {
m.Cmd(cli.DAEMON).Tables(func(value ice.Maps) {
m.Cmd(cli.DAEMON, func(value ice.Maps) {
if value[cli.PID] == m.Option(cli.PID) {
m.Cmd(cli.DAEMON, cli.STOP, kit.Dict(mdb.HASH, value[mdb.HASH]))
}
@ -139,7 +134,7 @@ func _install_stop(m *ice.Message, arg ...string) {
func _install_service(m *ice.Message, arg ...string) {
arg = kit.Split(path.Base(arg[0]), "-.")[:1]
m.Fields(len(arg[1:]), "time,port,status,pid,cmd,dir")
m.Cmd(mdb.SELECT, cli.DAEMON, "", mdb.HASH).Tables(func(value ice.Maps) {
m.Cmd(mdb.SELECT, cli.DAEMON, "", mdb.HASH, func(value ice.Maps) {
if strings.Contains(value[ice.CMD], path.Join(ice.BIN, arg[0])) {
m.Push("", value, kit.Split(m.OptionFields()))
}
@ -150,22 +145,16 @@ func _install_service(m *ice.Message, arg ...string) {
const (
PREPARE = "prepare"
_INSTALL = "_install"
)
const INSTALL = "install"
func init() {
Index.MergeCommands(ice.Commands{
INSTALL: {Name: "install name port path auto download", Help: "安装", Meta: kit.Dict(), Actions: ice.MergeAction(ice.Actions{
INSTALL: {Name: "install name port path auto download", Help: "安装", Meta: kit.Dict(), Actions: ice.MergeActions(ice.Actions{
web.DOWNLOAD: {Name: "download link path", Help: "下载", Hand: func(m *ice.Message, arg ...string) {
_install_download(m)
}},
nfs.SOURCE: {Name: "source link path", Help: "源码", Hand: func(m *ice.Message, arg ...string) {
if m.Option(nfs.DIR_ROOT, path.Join(_install_path(m, ""), "_install")); !kit.FileExists(m.Option(nfs.DIR_ROOT)) {
m.Option(nfs.DIR_ROOT, path.Join(_install_path(m, "")))
}
defer m.StatusTime(nfs.PATH, m.Option(nfs.DIR_ROOT))
m.Cmdy(nfs.DIR, m.Option(nfs.PATH))
}},
cli.BUILD: {Name: "build link", Help: "构建", Hand: func(m *ice.Message, arg ...string) {
if err := _install_build(m, arg...); err != "" {
web.ToastFailure(m, cli.BUILD)
@ -186,7 +175,14 @@ func init() {
cli.STOP: {Name: "stop", Help: "停止", Hand: func(m *ice.Message, arg ...string) {
_install_stop(m, arg...)
}},
}, mdb.HashAction(mdb.SHORT, mdb.NAME, mdb.FIELD, "time,name,path,link", nfs.PATH, ice.USR_INSTALL)), Hand: func(m *ice.Message, arg ...string) {
nfs.SOURCE: {Name: "source link path", Help: "源码", Hand: func(m *ice.Message, arg ...string) {
if m.Option(nfs.DIR_ROOT, path.Join(_install_path(m, ""), _INSTALL)); !nfs.ExistsFile(m, m.Option(nfs.DIR_ROOT)) {
m.Option(nfs.DIR_ROOT, path.Join(_install_path(m, "")))
}
m.Cmdy(nfs.DIR, m.Option(nfs.PATH))
m.StatusTimeCount(nfs.PATH, m.Option(nfs.DIR_ROOT))
}},
}, mdb.HashAction(mdb.SHORT, mdb.NAME, mdb.FIELD, "time,name,path,link")), Hand: func(m *ice.Message, arg ...string) {
switch len(arg) {
case 0: // 源码列表
mdb.HashSelect(m, arg...)
@ -211,23 +207,10 @@ func InstallAction(args ...ice.Any) ice.Actions {
m.Cmdy(INSTALL, cli.BUILD, m.Config(nfs.SOURCE))
}},
cli.ORDER: {Name: "order", Help: "加载", Hand: func(m *ice.Message, arg ...string) {
m.Cmdy(INSTALL, cli.ORDER, m.Config(nfs.SOURCE), "_install/bin")
m.Cmdy(INSTALL, cli.ORDER, m.Config(nfs.SOURCE), path.Join(_INSTALL, ice.BIN))
}},
nfs.TRASH: {Name: "trash", Help: "删除", Hand: func(m *ice.Message, arg ...string) {
m.Cmd(nfs.TRASH, m.Option(nfs.PATH))
}},
}
}
func InstallSoftware(m *ice.Message, bin string, list ice.Any) (ok bool) {
if cli.SystemFind(m, bin) != "" {
return true
}
kit.Fetch(list, func(index int, value ice.Map) {
if strings.Contains(m.Cmdx(cli.RUNTIME, kit.Keys(tcp.HOST, cli.OSID)), kit.Format(value[cli.OSID])) {
web.PushStream(m)
m.Cmd(cli.SYSTEM, value[ice.CMD])
ok = true
}
})
return ok
}

View File

@ -68,7 +68,7 @@ const NODE = "node"
func init() {
Index.Register(&ice.Context{Name: JS, Help: "前端", Commands: ice.Commands{
JS: {Name: "js", Help: "前端", Actions: ice.MergeAction(ice.Actions{
JS: {Name: "js", Help: "前端", Actions: ice.MergeActions(ice.Actions{
ice.CTX_INIT: {Hand: func(m *ice.Message, arg ...string) {
for _, cmd := range []string{mdb.SEARCH, mdb.ENGINE, mdb.RENDER, mdb.PLUGIN} {
m.Cmd(cmd, mdb.CREATE, JSON, m.PrefixKey())

View File

@ -23,7 +23,7 @@ func init() {
API_GITHUB = "https://api.github.com/"
)
Index.MergeCommands(ice.Commands{
OAUTH: {Name: "oauth hash auto", Help: "授权", Actions: ice.MergeAction(ice.Actions{
OAUTH: {Name: "oauth hash auto", Help: "授权", Actions: ice.MergeActions(ice.Actions{
ctx.CONFIG: {Name: "config client_id client_secret redirect_uri", Help: "配置", Hand: func(m *ice.Message, arg ...string) {
for _, k := range []string{CLIENT_ID, CLIENT_SECRET, REDIRECT_URI} {
m.Config(k, kit.Select(m.Config(k), m.Option(k)))
@ -34,31 +34,30 @@ func init() {
m.Cmdy(aaa.RSA).Cut("hash,title,public")
return
}
m.Cmdy(mdb.INPUTS, m.PrefixKey(), "", mdb.HASH, arg)
mdb.HashInputs(m, arg)
}},
mdb.CREATE: {Name: "create code", Help: "创建", Hand: func(m *ice.Message, arg ...string) {
m.Cmdy(mdb.INSERT, m.PrefixKey(), "", mdb.HASH, m.OptionSimple(CODE))
mdb.HashCreate(m, m.OptionSimple(CODE))
}},
ACCESS_TOKEN: {Name: "access_token", Help: "令牌", Hand: func(m *ice.Message, arg ...string) {
m.Option(web.SPIDE_HEADER, web.Accept, web.ContentJSON)
data := kit.UnMarshal(m.Cmdx(web.SPIDE_POST, kit.MergeURL2(LOGIN_OAUTH, ACCESS_TOKEN), m.ConfigSimple(CLIENT_ID, CLIENT_SECRET), m.OptionSimple(CODE)))
m.Cmdy(mdb.MODIFY, m.PrefixKey(), "", mdb.HASH, m.OptionSimple(mdb.HASH), kit.Simple(data))
data := web.SpidePost(m, kit.MergeURL2(LOGIN_OAUTH, ACCESS_TOKEN), m.ConfigSimple(CLIENT_ID, CLIENT_SECRET), m.OptionSimple(CODE))
mdb.HashModify(m, m.OptionSimple(mdb.HASH), kit.Simple(data))
}},
"public": {Name: "public hash", Help: "公钥", Hand: func(m *ice.Message, arg ...string) {
m.Option(web.SPIDE_HEADER, web.Accept, web.ContentJSON, web.Authorization, "token "+m.Option(ACCESS_TOKEN))
msg := m.Cmd(aaa.RSA, m.Option(mdb.HASH))
m.PushDetail(m.Cmdx(web.SPIDE_POST, API_GITHUB+"user/keys", web.SPIDE_JSON, "key", msg.Append("public"), msg.AppendSimple("title")))
m.PushDetail(web.SpidePost(m, API_GITHUB+"user/keys", web.SPIDE_JSON, "key", msg.Append("public"), msg.AppendSimple("title")))
m.Echo("https://github.com/settings/keys")
}},
"user": {Name: "user", Help: "用户", Hand: func(m *ice.Message, arg ...string) {
m.Option(web.SPIDE_HEADER, web.Accept, web.ContentJSON, web.Authorization, "token "+m.Option(ACCESS_TOKEN))
data := kit.UnMarshal(m.Cmdx(web.SPIDE_GET, API_GITHUB+"user"))
m.Cmdy(mdb.MODIFY, m.PrefixKey(), "", mdb.HASH, m.OptionSimple(mdb.HASH), kit.Simple(data))
mdb.HashModify(m, m.OptionSimple(mdb.HASH), kit.Simple(web.SpideGet(m, API_GITHUB+"user")))
}},
mdb.DELETE: {Name: "delete", Help: "删除", Hand: func(m *ice.Message, arg ...string) {
mdb.HashSelect(m, m.Option(mdb.HASH))
m.Option(web.SPIDE_HEADER, web.Accept, web.ContentJSON, web.Authorization, "token "+m.Append(ACCESS_TOKEN))
m.Cmd(web.SPIDE_DELETE, API_GITHUB+"user/keys/"+m.Option(mdb.ID))
web.SpideDelete(m, API_GITHUB+"user/keys/"+m.Option(mdb.ID))
}},
}, mdb.HashAction(mdb.FIELD, "time,hash,code,access_token,scope,token_type")), Hand: func(m *ice.Message, arg ...string) {
if mdb.HashSelect(m, arg...).PushAction("user", "public", ACCESS_TOKEN, mdb.REMOVE); len(arg) == 0 {
@ -67,17 +66,13 @@ func init() {
} else if len(arg) == 1 {
m.Option(web.SPIDE_HEADER, web.Accept, web.ContentJSON, web.Authorization, "token "+m.Append(ACCESS_TOKEN))
m.SetAppend()
m.Debug("what %v", m.FormatMeta())
data := kit.UnMarshal(m.Cmdx(web.SPIDE_GET, API_GITHUB+"user/keys"))
m.Debug("what %v", data)
kit.Fetch(data, func(index int, value ice.Map) {
kit.Fetch(web.SpideGet(m, API_GITHUB+"user/keys"), func(index int, value ice.Map) {
m.PushRecord(value, "created_at,title,id,key")
})
m.PushAction(mdb.DELETE)
m.Debug("what %v", m.FormatMeta())
}
}},
"/oauth": {Name: "/oauth", Help: "授权", Actions: ice.MergeAction(ice.Actions{}, ctx.CmdAction()), Hand: func(m *ice.Message, arg ...string) {
"/oauth": {Name: "/oauth", Help: "授权", Actions: ice.MergeActions(ice.Actions{}, ctx.CmdAction()), Hand: func(m *ice.Message, arg ...string) {
if m.Option(CODE) != "" {
web.RenderCmd(m, m.PrefixKey(), m.Cmdx(m.PrefixKey(), mdb.CREATE, m.OptionSimple(CODE)))
}

View File

@ -25,7 +25,7 @@ const PPROF = "pprof"
func init() {
Index.MergeCommands(ice.Commands{
PPROF: {Name: "pprof zone id auto", Help: "性能分析", Actions: ice.MergeAction(ice.Actions{
PPROF: {Name: "pprof zone id auto", Help: "性能分析", Actions: ice.MergeActions(ice.Actions{
ice.CTX_INIT: {Hand: func(m *ice.Message, arg ...string) {
web.AddRewrite(func(w http.ResponseWriter, r *http.Request) bool {
if p := r.URL.Path; strings.HasPrefix(p, "/debug") {
@ -41,7 +41,7 @@ func init() {
m.Cmdy(nfs.DIR, ice.BIN, nfs.DIR_CLI_FIELDS).RenameAppend(nfs.PATH, BINNARY)
case SERVICE:
m.Cmd(web.SPIDE).Tables(func(value ice.Maps) {
m.Push(SERVICE, kit.MergeURL2(value["client.url"], "/debug/pprof/profile"))
m.Push(SERVICE, kit.MergeURL2(value[web.CLIENT_URL], "/debug/pprof/profile"))
})
}
}},
@ -52,11 +52,11 @@ func init() {
cmd := kit.Simple(m.Configv(PPROF), "-text", m.Option(BINNARY), msg.Append(nfs.FILE))
m.Option(mdb.TEXT, strings.Join(kit.Slice(strings.Split(m.Cmdx(cli.SYSTEM, cmd), ice.NL), 0, 20), ice.NL))
m.Option(nfs.FILE, msg.Append(nfs.FILE))
m.Cmd(mdb.INSERT, PPROF, "", m.OptionSimple("zone,text,file"))
mdb.ZoneInsert(m, m.OptionSimple("zone,text,file"))
m.Echo(m.Option(mdb.TEXT)).ProcessInner()
}},
web.SERVE: {Name: "serve", Help: "展示", Hand: func(m *ice.Message, arg ...string) {
u := kit.ParseURL(m.Option(ice.MSG_USERWEB))
u := web.OptionUserWeb(m)
p := u.Hostname() + ":" + m.Cmdx(tcp.PORT, aaa.RIGHT)
m.Cmd(cli.DAEMON, m.Configv(PPROF), "-http="+p, m.Option(BINNARY), m.Option(nfs.FILE))
m.Echo("http://%s/ui/top", p).ProcessInner()

View File

@ -13,7 +13,6 @@ import (
"shylinux.com/x/icebergs/base/gdb"
"shylinux.com/x/icebergs/base/mdb"
"shylinux.com/x/icebergs/base/nfs"
"shylinux.com/x/icebergs/base/tcp"
"shylinux.com/x/icebergs/base/web"
kit "shylinux.com/x/toolkits"
)
@ -23,22 +22,23 @@ func _publish_file(m *ice.Message, file string, arg ...string) string {
arg = kit.Simple(kit.Keys(ice.ICE, runtime.GOOS, runtime.GOARCH))
file = cli.SystemFind(m, os.Args[0])
} else if s, e := os.Stat(file); m.Assert(e) && s.IsDir() {
} else if s, e := nfs.StatFile(m, file); m.Assert(e) && s.IsDir() {
file = m.Cmdx(nfs.TAR, mdb.IMPORT, path.Base(file), file)
defer func() { os.Remove(file) }()
}
// 发布文件
target := path.Join(m.Config(nfs.PATH), kit.Select(path.Base(file), arg, 0))
target := path.Join(ice.USR_PUBLISH, kit.Select(path.Base(file), arg, 0))
m.Logs(mdb.EXPORT, PUBLISH, target, cli.FROM, file)
m.Cmd(nfs.LINK, target, file)
return target
}
func _publish_list(m *ice.Message, arg ...string) {
m.Option(nfs.DIR_DEEP, true)
m.Option(nfs.DIR_ROOT, m.Config(nfs.PATH))
m.Option(nfs.DIR_ROOT, ice.USR_PUBLISH)
m.Option(nfs.DIR_REG, kit.Select("", arg, 0))
m.Cmdy(nfs.DIR, nfs.PWD, kit.Select(nfs.DIR_WEB_FIELDS, arg, 1))
m.Debug("what %v", m.FormatsMeta())
}
func _publish_bin_list(m *ice.Message, dir string) {
p := m.Option(cli.CMD_DIR, dir)
@ -62,11 +62,11 @@ const PUBLISH = "publish"
func init() {
Index.Merge(&ice.Context{Configs: ice.Configs{
PUBLISH: {Name: PUBLISH, Help: "发布", Value: kit.Data(nfs.PATH, ice.USR_PUBLISH, ice.CONTEXTS, _contexts)},
PUBLISH: {Name: PUBLISH, Help: "发布", Value: kit.Data(ice.CONTEXTS, _contexts)},
}, Commands: ice.Commands{
PUBLISH: {Name: "publish path auto create volcanos icebergs intshell", Help: "发布", Actions: ice.Actions{
ice.CTX_INIT: {Hand: func(m *ice.Message, arg ...string) {
m.Cmd(aaa.ROLE, aaa.WHITE, aaa.VOID, m.Config(nfs.PATH))
m.Cmd(aaa.ROLE, aaa.WHITE, aaa.VOID, ice.USR_PUBLISH)
m.Cmd(aaa.ROLE, aaa.WHITE, aaa.VOID, m.PrefixKey())
m.Config(ice.CONTEXTS, _contexts)
gdb.Watch(m, web.SERVE_START, m.PrefixKey())
@ -74,12 +74,6 @@ func init() {
web.SERVE_START: {Name: "serve.start", Help: "服务启动", Hand: func(m *ice.Message, arg ...string) {
_publish_file(m, ice.ICE_BIN)
}},
mdb.SEARCH: {Name: "search type name text", Help: "搜索", Hand: func(m *ice.Message, arg ...string) {
if arg[0] == mdb.FOREACH && arg[1] == "" {
m.PushSearch(mdb.TYPE, ice.CONTEXTS, mdb.NAME, ice.CORE, mdb.TEXT, m.Cmdx(m.PrefixKey(), ice.CONTEXTS, ice.CORE))
}
}},
ice.VOLCANOS: {Name: "volcanos", Help: "火山架", Hand: func(m *ice.Message, arg ...string) {
defer func() { m.EchoQRCode(m.Option(ice.MSG_USERWEB)) }()
defer func() { m.Cmdy(PUBLISH, ice.CONTEXTS) }()
@ -87,17 +81,16 @@ func init() {
}},
ice.ICEBERGS: {Name: "icebergs", Help: "冰山架", Hand: func(m *ice.Message, arg ...string) {
defer func() { m.Cmdy(PUBLISH, ice.CONTEXTS) }()
m.Cmd(PUBLISH, mdb.CREATE, nfs.FILE, ice.BIN_ICE_BIN)
_publish_bin_list(m, m.Config(nfs.PATH))
_publish_bin_list(m, ice.USR_PUBLISH)
}},
ice.INTSHELL: {Name: "intshell", Help: "神农架", Hand: func(m *ice.Message, arg ...string) {
defer func() { m.Cmdy(PUBLISH, ice.CONTEXTS) }()
_publish_list(m, `.*\.(sh|vim|conf)$`)
}},
ice.CONTEXTS: {Name: "contexts", Help: "环境", Hand: func(m *ice.Message, arg ...string) {
u := kit.ParseURL(tcp.ReplaceLocalhost(m, m.Option(ice.MSG_USERWEB)))
u := web.OptionUserWeb(m)
m.Option("httphost", fmt.Sprintf("%s://%s:%s", u.Scheme, strings.Split(u.Host, ice.DF)[0],
kit.Select(kit.Select("80", "443", u.Scheme == "https"), strings.Split(u.Host, ice.DF), 1)))
kit.Select(kit.Select("443", "80", u.Scheme == ice.HTTP), strings.Split(u.Host, ice.DF), 1)))
if len(arg) == 0 {
arg = append(arg, ice.MISC, ice.CORE, ice.BASE)
@ -105,13 +98,13 @@ func init() {
for _, k := range arg {
switch k {
case ice.MISC:
if bin := path.Join(ice.USR_PUBLISH, kit.Keys("ice", runtime.GOOS, runtime.GOARCH)); !kit.FileExists(bin) {
if bin := path.Join(ice.USR_PUBLISH, kit.Keys(ice.ICE, runtime.GOOS, runtime.GOARCH)); !nfs.ExistsFile(m, bin) {
m.Cmd(nfs.LINK, bin, m.Cmdx(cli.RUNTIME, "boot.bin"))
}
case ice.CORE:
if !kit.FileExists(".git") {
repos := web.MergeURL2(m, "/x/"+m.Option(ice.MSG_USERPOD))
if !nfs.ExistsFile(m, ".git") {
repos := web.MergeURL2(m, "/x/"+kit.Select(ice.Info.PathName, m.Option(ice.MSG_USERPOD)))
m.Cmd(cli.SYSTEM, "git", "init")
m.Cmd(cli.SYSTEM, "git", "remote", "add", "origin", repos)
m.Cmd("web.code.git.repos", mdb.CREATE, repos, "master", "", nfs.PWD)
@ -132,7 +125,7 @@ func init() {
_publish_file(m, m.Option(nfs.FILE))
}},
nfs.TRASH: {Name: "trash", Help: "删除", Hand: func(m *ice.Message, arg ...string) {
m.Cmdy(nfs.TRASH, path.Join(m.Config(nfs.PATH), m.Option(nfs.PATH)))
m.Cmdy(nfs.TRASH, path.Join(ice.USR_PUBLISH, m.Option(nfs.PATH)))
}},
mdb.EXPORT: {Name: "export", Help: "工具链", Hand: func(m *ice.Message, arg ...string) {
var list = []string{ice.ETC_PATH}
@ -159,7 +152,7 @@ func init() {
m.Cmd("web.code.git.server", mdb.IMPORT)
}},
}, Hand: func(m *ice.Message, arg ...string) {
m.Option(nfs.DIR_ROOT, m.Config(nfs.PATH))
m.Option(nfs.DIR_ROOT, ice.USR_PUBLISH)
m.Cmdy(nfs.DIR, kit.Select("", arg, 0), nfs.DIR_WEB_FIELDS)
}},
}})

View File

@ -29,7 +29,7 @@ const PY = nfs.PY
func init() {
Index.Merge(&ice.Context{Commands: ice.Commands{
PY: {Name: "py path auto", Help: "脚本", Actions: ice.MergeAction(ice.Actions{
PY: {Name: "py path auto", Help: "脚本", Actions: ice.MergeActions(ice.Actions{
ice.CTX_INIT: {Hand: func(m *ice.Message, arg ...string) {
m.Cmd(mdb.ENGINE, mdb.CREATE, PY, m.PrefixKey())
m.Cmd(mdb.RENDER, mdb.CREATE, PY, m.PrefixKey())

View File

@ -60,7 +60,7 @@ const SH = nfs.SH
func init() {
Index.Register(&ice.Context{Name: SH, Help: "命令", Commands: ice.Commands{
SH: {Name: "sh path auto", Help: "命令", Actions: ice.MergeAction(ice.Actions{
SH: {Name: "sh path auto", Help: "命令", Actions: ice.MergeActions(ice.Actions{
ice.CTX_INIT: {Name: "_init", Help: "初始化", Hand: func(m *ice.Message, arg ...string) {
for _, cmd := range []string{mdb.SEARCH, mdb.ENGINE, mdb.RENDER, mdb.PLUGIN} {
m.Cmd(cmd, mdb.CREATE, m.CommandKey(), m.PrefixKey())

View File

@ -35,7 +35,7 @@ const SHY = "shy"
func init() {
Index.Register(&ice.Context{Name: SHY, Help: "脚本", Commands: ice.Commands{
SHY: {Name: "shy path auto", Help: "脚本", Actions: ice.MergeAction(ice.Actions{
SHY: {Name: "shy path auto", Help: "脚本", Actions: ice.MergeActions(ice.Actions{
ice.CTX_INIT: {Hand: func(m *ice.Message, arg ...string) {
for _, cmd := range []string{mdb.SEARCH, mdb.ENGINE, mdb.RENDER, mdb.PLUGIN} {
m.Cmd(cmd, mdb.CREATE, SHY, m.PrefixKey())

View File

@ -14,7 +14,7 @@ const TEMPLATE = "template"
func init() {
Index.MergeCommands(ice.Commands{
TEMPLATE: {Name: "template name auto", Help: "模板", Actions: ice.MergeAction(ice.Actions{
TEMPLATE: {Name: "template name auto", Help: "模板", Actions: ice.MergeActions(ice.Actions{
ice.CTX_INIT: {Hand: func(m *ice.Message, arg ...string) {
for _, _template := range _template_list {
m.Cmd(TEMPLATE, mdb.CREATE, kit.SimpleKV(kit.Format(_template[0]), _template[1:]...))

View File

@ -18,20 +18,20 @@ const UPGRADE = "upgrade"
func init() {
Index.Merge(&ice.Context{Configs: ice.Configs{
UPGRADE: {Name: UPGRADE, Help: "升级", Value: kit.Dict(mdb.HASH, kit.Dict(
nfs.TARGET, kit.Dict(mdb.LIST, kit.List(mdb.TYPE, "bin", nfs.FILE, "ice.bin")),
nfs.SOURCE, kit.Dict(mdb.LIST, kit.List(mdb.TYPE, "tar", nfs.FILE, "contexts.src.tar.gz")),
nfs.BINARY, kit.Dict(mdb.LIST, kit.List(mdb.TYPE, "tar", nfs.FILE, "contexts.bin.tar.gz")),
nfs.TARGET, kit.Dict(mdb.LIST, kit.List(mdb.TYPE, ice.BIN, nfs.FILE, "ice.bin")),
nfs.SOURCE, kit.Dict(mdb.LIST, kit.List(mdb.TYPE, nfs.TAR, nfs.FILE, "contexts.src.tar.gz")),
nfs.BINARY, kit.Dict(mdb.LIST, kit.List(mdb.TYPE, nfs.TAR, nfs.FILE, "contexts.bin.tar.gz")),
))},
}, Commands: ice.Commands{
UPGRADE: {Name: "upgrade item=target,source,binary run restart", Help: "升级", Actions: ice.Actions{
cli.RESTART: {Name: "restart", Help: "重启", Hand: func(m *ice.Message, arg ...string) {
m.Sleep("1s").Go(func() { m.Cmd(ice.EXIT, 1) })
m.Sleep300ms().Go(func() { m.Cmd(ice.EXIT, 1) })
}},
}, Hand: func(m *ice.Message, arg ...string) {
mdb.Grows(m, m.CommandKey(), kit.Keys(mdb.HASH, kit.Select(cli.SYSTEM, arg, 0)), "", "", func(index int, value ice.Map) {
mdb.ZoneSelect(m, kit.Select(cli.SYSTEM, arg, 0)).Tables(func(value ice.Maps) {
if value[nfs.FILE] == ice.ICE_BIN { // 程序文件
value[nfs.FILE] = kit.Keys(ice.ICE, runtime.GOOS, runtime.GOARCH)
defer m.Cmd(cli.SYSTEM, "mv", value[nfs.FILE], ice.BIN_ICE_BIN)
defer nfs.Rename(m, value[nfs.FILE], ice.BIN_ICE_BIN)
m.Option(ice.EXIT, ice.TRUE)
}
@ -39,14 +39,14 @@ func init() {
dir := kit.Select(kit.Format(value[nfs.FILE]), value[nfs.PATH])
m.Cmd(web.SPIDE, ice.DEV, web.SPIDE_SAVE, dir, web.SPIDE_GET, "/publish/"+kit.Format(value[nfs.FILE]))
switch value[mdb.TYPE] {
case "bin":
case ice.BIN:
os.Chmod(dir, 0755)
case "tar":
case nfs.TAR:
m.Cmd(nfs.TAR, mdb.EXPORT, dir, "-C", path.Dir(dir))
}
})
if web.ToastSuccess(m); m.Option(ice.EXIT) == ice.TRUE {
m.Sleep("1s").Go(func() { m.Cmd(ice.EXIT, 1) })
m.Sleep300ms().Go(func() { m.Cmd(ice.EXIT, 1) })
web.ToastRestart(m)
}
}},

View File

@ -10,6 +10,7 @@ import (
"shylinux.com/x/icebergs/base/mdb"
"shylinux.com/x/icebergs/base/nfs"
"shylinux.com/x/icebergs/base/web"
"shylinux.com/x/icebergs/core/chat"
kit "shylinux.com/x/toolkits"
)
@ -195,7 +196,7 @@ func init() {
mdb.SEARCH: {Name: "search type name text", Help: "搜索", Hand: func(m *ice.Message, arg ...string) {
if arg[0] == mdb.FOREACH && arg[1] == "" {
m.PushSearch(mdb.TYPE, "go", mdb.NAME, "src/main.go", mdb.TEXT, web.MergeCmd(m, ""))
m.PushSearch(mdb.TYPE, "go", mdb.NAME, "src/main.go", mdb.TEXT, chat.MergeCmd(m, ""))
}
}},
mdb.INPUTS: {Name: "inputs", Help: "补全", Hand: func(m *ice.Message, arg ...string) {

View File

@ -2,6 +2,7 @@ package code
import (
"fmt"
"io"
"os"
"path"
"strings"
@ -26,43 +27,46 @@ func _webpack_can(m *ice.Message) {
m.Cmd(nfs.COPY, _volcanos(m, PAGE_CAN_JS), _volcanos(m, ice.PROTO_JS), _volcanos(m, PAGE_CACHE_JS))
m.Cmdy(nfs.DIR, _volcanos(m, PAGE))
}
func _webpack_css(m *ice.Message, css, js io.Writer, p string) {
fmt.Fprintln(css, kit.Format("/* %s */", path.Join(ice.PS, p)))
fmt.Fprintln(css, m.Cmdx(nfs.CAT, strings.TrimPrefix(p, ice.REQUIRE+ice.PS)))
fmt.Fprintln(js, `Volcanos.meta.cache["`+path.Join(ice.PS, p)+`"] = []`)
}
func _webpack_js(m *ice.Message, js io.Writer, p string) {
fmt.Fprintln(js, `_can_name = "`+path.Join(ice.PS, p)+`"`)
fmt.Fprintln(js, m.Cmdx(nfs.CAT, strings.TrimPrefix(p, ice.REQUIRE+ice.PS)))
}
func _webpack_node(m *ice.Message, js io.Writer, p string) {
fmt.Fprintln(js, `_can_name = "`+path.Join(ice.PS, p)+`"`)
fmt.Fprintln(js, m.Cmdx(nfs.CAT, strings.TrimPrefix(p, ice.REQUIRE+ice.PS)))
fmt.Fprintln(js, `Volcanos.meta.cache["`+path.Join(ice.PS, p)+`"] = []`)
}
func _webpack_cache(m *ice.Message, dir string, write bool) {
if _, e := nfs.DiskFile.StatFile(ice.USR_VOLCANOS); os.IsNotExist(e) {
return
}
css, _, e := kit.Create(path.Join(dir, PAGE_CACHE_CSS))
css, _, e := nfs.CreateFile(m, path.Join(dir, PAGE_CACHE_CSS))
m.Assert(e)
defer css.Close()
js, _, e := kit.Create(path.Join(dir, PAGE_CACHE_JS))
js, _, e := nfs.CreateFile(m, path.Join(dir, PAGE_CACHE_JS))
m.Assert(e)
defer js.Close()
defer fmt.Fprintln(js, `_can_name = ""`)
defer _webpack_can(m)
if !write {
return
}
m.Option(nfs.DIR_ROOT, "")
m.Option(nfs.DIR_ROOT, dir)
m.Option(nfs.DIR_DEEP, true)
m.Option(nfs.DIR_TYPE, nfs.CAT)
// m.Cmd(nfs.DIR, ice.SRC).Tables(func(value ice.Maps) {
// if kit.Ext(value[nfs.PATH]) == JS {
// fmt.Fprintln(js, `_can_name = "`+path.Join("/require", ice.Info.Make.Module, value[nfs.PATH])+`"`)
// fmt.Fprintln(js, m.Cmdx(nfs.CAT, value[nfs.PATH]))
// }
// })
m.Option(nfs.DIR_ROOT, dir)
for _, k := range []string{LIB, PANEL, PLUGIN} {
m.Cmd(nfs.DIR, k).Sort(nfs.PATH).Tables(func(value ice.Maps) {
if kit.Ext(value[nfs.PATH]) == CSS {
fmt.Fprintln(css, kit.Format("/* %s */", path.Join(ice.PS, value[nfs.PATH])))
fmt.Fprintln(css, m.Cmdx(nfs.CAT, value[nfs.PATH]))
fmt.Fprintln(js, `Volcanos.meta.cache["`+path.Join(ice.PS, value[nfs.PATH])+`"] = []`)
_webpack_css(m, css, js, value[nfs.PATH])
}
})
}
@ -70,45 +74,37 @@ func _webpack_cache(m *ice.Message, dir string, write bool) {
for _, k := range []string{LIB, PANEL, PLUGIN} {
m.Cmd(nfs.DIR, k).Sort(nfs.PATH).Tables(func(value ice.Maps) {
if kit.Ext(value[nfs.PATH]) == JS {
fmt.Fprintln(js, `_can_name = "`+path.Join(ice.PS, value[nfs.PATH])+`"`)
fmt.Fprintln(js, m.Cmdx(nfs.CAT, value[nfs.PATH]))
_webpack_js(m, js, value[nfs.PATH])
}
})
}
for _, k := range []string{ice.FRAME_JS} {
fmt.Fprintln(js, `_can_name = "`+path.Join(ice.PS, k)+`"`)
fmt.Fprintln(js, m.Cmdx(nfs.CAT, k))
_webpack_js(m, js, k)
}
m.Cmd(mdb.SELECT, m.PrefixKey(), "", mdb.HASH, ice.OptionFields(nfs.PATH)).Sort(nfs.PATH).Tables(func(value ice.Maps) {
mdb.HashSelects(m).Sort(nfs.PATH).Tables(func(value ice.Maps) {
defer fmt.Fprintln(js)
p := value[nfs.PATH]
switch kit.Ext(p) {
case nfs.CSS:
fmt.Fprintln(css, kit.Format("/* %s */", path.Join("/require/node_modules/", p)))
fmt.Fprintln(css, m.Cmdx(nfs.CAT, path.Join("node_modules", p)))
fmt.Fprintln(js, `Volcanos.meta.cache["`+path.Join("/require/node_modules/", p)+`"] = []`)
_webpack_css(m, css, js, path.Join(ice.REQUIRE, ice.NODE_MODULES, ice.LIB, p))
return
case nfs.JS:
default:
p = p + "/lib/" + p + ".js"
}
fmt.Fprintln(js, `_can_name = "`+path.Join("/require/node_modules/", p)+`"`)
fmt.Fprintln(js, m.Cmdx(nfs.CAT, path.Join("node_modules", p)))
fmt.Fprintln(js, `Volcanos.meta.cache["`+path.Join("/require/node_modules/", p)+`"] = []`)
_webpack_node(m, js, path.Join(ice.REQUIRE, ice.NODE_MODULES, ice.LIB, p))
})
}
func _webpack_build(m *ice.Message, file string) {
if f, _, e := kit.Create(kit.Keys(file, JS)); m.Assert(e) {
if f, _, e := nfs.CreateFile(m, kit.Keys(file, JS)); m.Assert(e) {
defer f.Close()
fmt.Fprintln(f, `Volcanos.meta.webpack = true`)
fmt.Fprintln(f, `Volcanos.meta.pack = `+kit.Formats(kit.UnMarshal(kit.Select("{}", m.Option(nfs.CONTENT)))))
fmt.Fprintln(f, `Volcanos.meta.args = `+kit.Formats(kit.Dict(m.OptionSimple(kit.Split(m.Option(ctx.ARGS))...))))
}
if f, p, e := kit.Create(kit.Keys(file, HTML)); m.Assert(e) {
if f, p, e := nfs.CreateFile(m, kit.Keys(file, HTML)); m.Assert(e) {
defer f.Close()
defer m.Echo(p)
@ -142,7 +138,6 @@ const (
PLUGIN = "plugin"
)
const (
PUBLISH_ORDER_JS = "publish/order.js"
PAGE_INDEX_CSS = "page/index.css"
PAGE_CACHE_CSS = "page/cache.css"
PAGE_CACHE_JS = "page/cache.js"
@ -156,26 +151,26 @@ const WEBPACK = "webpack"
func init() {
Index.MergeCommands(ice.Commands{
WEBPACK: {Name: "webpack path auto create remove", Help: "打包", Actions: ice.MergeAction(ice.Actions{
WEBPACK: {Name: "webpack path auto create remove", Help: "打包", Actions: ice.MergeActions(ice.Actions{
mdb.CREATE: {Name: "create", Help: "创建", Hand: func(m *ice.Message, arg ...string) {
_webpack_cache(m.Spawn(), _volcanos(m), true)
}},
mdb.INSERT: {Name: "insert", Help: "添加", Hand: func(m *ice.Message, arg ...string) {
m.Cmd(mdb.INSERT, m.PrefixKey(), "", mdb.HASH, nfs.PATH, arg[0])
}},
mdb.REMOVE: {Name: "remove", Help: "删除", Hand: func(m *ice.Message, arg ...string) {
_webpack_cache(m.Spawn(), _volcanos(m), false)
}},
mdb.INSERT: {Name: "insert path", Help: "添加", Hand: func(m *ice.Message, arg ...string) {
mdb.HashCreate(m, nfs.PATH, m.Option(nfs.PATH))
}},
cli.BUILD: {Name: "build name=hi", Help: "构建", Hand: func(m *ice.Message, arg ...string) {
_webpack_cache(m.Spawn(), _volcanos(m), true)
_webpack_build(m, _publish(m, WEBPACK, m.Option(mdb.NAME)))
}},
nfs.TRASH: {Name: "trash", Help: "删除", Hand: func(m *ice.Message, arg ...string) {
if !strings.Contains(m.Option(nfs.PATH), "page/index") {
m.Cmd(nfs.TRASH, m.Option(nfs.PATH))
}
}},
cli.BUILD: {Name: "build name=hi", Help: "构建", Hand: func(m *ice.Message, arg ...string) {
_webpack_cache(m.Spawn(), _volcanos(m), true)
_webpack_build(m, _publish(m, WEBPACK, m.Option(mdb.NAME)))
}},
}, mdb.HashAction(mdb.SHORT, nfs.PATH)), Hand: func(m *ice.Message, arg ...string) {
}, mdb.HashAction(mdb.SHORT, nfs.PATH, mdb.FIELD, "time,path")), Hand: func(m *ice.Message, arg ...string) {
m.Option(nfs.DIR_DEEP, true)
m.Option(nfs.DIR_TYPE, nfs.CAT)
m.OptionFields(nfs.DIR_WEB_FIELDS)

View File

@ -2,17 +2,18 @@ package code
import (
"encoding/base64"
"io"
"os"
"os/exec"
"path"
"strings"
"time"
pty "shylinux.com/x/creackpty"
ice "shylinux.com/x/icebergs"
"shylinux.com/x/icebergs/base/cli"
"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"
)
@ -22,8 +23,8 @@ func _xterm_socket(m *ice.Message, h, t string) {
m.Option(ice.MSG_DAEMON, m.Conf("", kit.Keys(mdb.HASH, h, mdb.META, mdb.TEXT)))
m.Option(mdb.TEXT, t)
}
func _xterm_get(m *ice.Message, h string, must bool) (f *os.File) {
f, _ = mdb.HashTarget(m, h, func() ice.Any {
func _xterm_get(m *ice.Message, h string, must bool) *os.File {
if f, ok := mdb.HashTarget(m, h, func() ice.Any {
if !must {
return nil
}
@ -36,7 +37,9 @@ func _xterm_get(m *ice.Message, h string, must bool) (f *os.File) {
m.Assert(err)
m.Go(func() {
mdb.HashSelectUpdate(m, h, func(value ice.Map) { value["_cmd"] = cmd })
mdb.HashSelectUpdate(m, h, func(value ice.Map) {
value["_cmd"] = nfs.NewCloser(func() error { return cmd.Process.Kill() })
})
buf := make([]byte, ice.MOD_BUFS)
for {
if n, e := tty.Read(buf); !m.Warn(e) {
@ -49,29 +52,30 @@ func _xterm_get(m *ice.Message, h string, must bool) (f *os.File) {
web.PushNoticeGrow(m, "exit")
})
return tty
}).(*os.File)
return
}).(*os.File); m.Warn(!ok, ice.ErrNotValid, f) {
mdb.HashSelectUpdate(m, h, func(value ice.Map) { delete(value, mdb.TARGET) })
return nil
} else {
return f
}
}
const XTERM = "xterm"
func init() {
Index.MergeCommands(ice.Commands{
XTERM: {Name: "xterm hash refresh", Help: "终端", Actions: ice.MergeAction(ice.Actions{
XTERM: {Name: "xterm hash refresh", Help: "终端", Actions: ice.MergeActions(ice.Actions{
ice.CTX_EXIT: {Hand: func(m *ice.Message, arg ...string) {
mdb.HashSelectValue(m, func(value ice.Map) {
if cmd, ok := value["_cmd"].(*exec.Cmd); ok {
cmd.Process.Kill()
if c, ok := value["_cmd"].(io.Closer); ok {
c.Close()
}
})
}},
mdb.INPUTS: {Name: "inputs", Help: "补全", Hand: func(m *ice.Message, arg ...string) {
switch mdb.HashInputs(m, arg); arg[0] {
case mdb.TYPE:
m.Push(arg[0], "python")
m.Push(arg[0], "node")
m.Push(arg[0], "bash")
m.Push(arg[0], "sh")
m.Push(arg[0], "python", "node", "bash", "sh")
case mdb.NAME:
m.Push(arg[0], path.Base(m.Option(mdb.TYPE)))
}
@ -90,15 +94,6 @@ func init() {
mdb.HashModify(m, m.OptionSimple(mdb.HASH), arg)
}},
mdb.PRUNES: {Name: "prunes", Help: "清理", Hand: func(m *ice.Message, arg ...string) {
mdb.HashSelect(m).Tables(func(value ice.Maps) {
if f := _xterm_get(m, value[mdb.HASH], false); f != nil {
if kit.Time(m.Time())-kit.Time(value[mdb.TIME]) < int64(time.Hour) {
return // 有效终端
}
f.Close()
}
m.Cmd("", mdb.REMOVE, kit.Dict(value))
})
}},
"resize": {Name: "resize", Help: "大小", Hand: func(m *ice.Message, arg ...string) {
pty.Setsize(_xterm_get(m, m.Option(mdb.HASH), true), &pty.Winsize{Rows: uint16(kit.Int(m.Option("rows"))), Cols: uint16(kit.Int(m.Option("cols")))})

View File

@ -7,11 +7,11 @@ import (
ice "shylinux.com/x/icebergs"
"shylinux.com/x/icebergs/base/mdb"
"shylinux.com/x/icebergs/base/nfs"
"shylinux.com/x/icebergs/base/web"
"shylinux.com/x/icebergs/core/chat"
)
func _website_url(m *ice.Message, file string) string {
return strings.Split(web.MergeWebsite(m, file), "?")[0]
return strings.Split(chat.MergeWebsite(m, file), "?")[0]
}
const ZML = nfs.ZML
@ -21,7 +21,7 @@ func init() {
SRC_WEBSITE = "src/website/"
)
Index.Register(&ice.Context{Name: ZML, Help: "网页", Commands: ice.Commands{
ZML: {Name: "zml", Help: "网页", Actions: ice.MergeAction(ice.Actions{
ZML: {Name: "zml", Help: "网页", Actions: ice.MergeActions(ice.Actions{
ice.CTX_INIT: {Hand: func(m *ice.Message, arg ...string) {
m.Cmd(mdb.RENDER, mdb.CREATE, nfs.ZML, m.PrefixKey())
m.Cmd(mdb.ENGINE, mdb.CREATE, nfs.ZML, m.PrefixKey())

View File

@ -68,7 +68,7 @@ func init() {
}, Commands: ice.Commands{
ASSET: {Name: "asset account id auto spend trans bonus", Help: "资产", Meta: kit.Dict(
"_trans", kit.Dict(ACCOUNT, "账户", AMOUNT, "金额", FROM, "转出", TO, "转入", "time", "时间", "name", "商家", "text", "备注"),
), Actions: ice.MergeAction(ice.Actions{
), Actions: ice.MergeActions(ice.Actions{
SPEND: {Name: "spend account name amount time@date text", Help: "支出", Hand: func(m *ice.Message, arg ...string) {
_sub_amount(m, arg)
_asset_insert(m, arg[1], kit.Simple(mdb.TYPE, "支出", arg[2:])...)

View File

@ -9,6 +9,6 @@ const PAPER = "paper"
func init() {
Index.MergeCommands(ice.Commands{
PAPER: {Name: "paper", Help: "问卷", Actions: ice.MergeAction(ice.Actions{}, mdb.ZoneAction(mdb.FIELD, "time,id,type,name,text"))},
PAPER: {Name: "paper", Help: "问卷", Actions: ice.MergeActions(ice.Actions{}, mdb.ZoneAction(mdb.FIELD, "time,id,type,name,text"))},
})
}

View File

@ -15,7 +15,7 @@ const SALARY = "salary"
func init() {
Index.MergeCommands(ice.Commands{
SALARY: {Name: "salary month auto create", Help: "工资", Actions: ice.MergeAction(ice.Actions{
SALARY: {Name: "salary month auto create", Help: "工资", Actions: ice.MergeActions(ice.Actions{
mdb.CREATE: {Name: "create month company amount income tax 公积金 养老保险 医疗保险 生育保险 工伤保险 失业保险 企业公积金 企业养老保险 企业医疗保险 企业生育保险 企业工伤保险 企业失业保险", Help: "添加"},
}, mdb.HashAction(mdb.SHORT, MONTH, mdb.FIELD, "month,company,amount,income,tax")), Hand: func(m *ice.Message, arg ...string) {
mdb.HashSelect(m, arg...)

View File

@ -15,7 +15,7 @@ func init() {
Index.MergeCommands(ice.Commands{
COUNT: {Name: "count begin_time@date end_time@date auto insert", Help: "倒计时", Meta: kit.Dict(
ice.Display(""),
), Actions: ice.MergeAction(ice.Actions{
), Actions: ice.MergeActions(ice.Actions{
mdb.INSERT: {Name: "insert zone type=once,step,week name text begin_time@date close_time@date", Help: "添加", Hand: func(m *ice.Message, arg ...string) {
m.Cmdy(TASK, mdb.INSERT, arg)
}},

View File

@ -13,7 +13,7 @@ const EPIC = "epic"
func init() {
Index.MergeCommands(ice.Commands{
EPIC: {Name: "epic hash list create export import", Help: "史记", Actions: ice.MergeAction(ice.Actions{
EPIC: {Name: "epic hash list create export import", Help: "史记", Actions: ice.MergeActions(ice.Actions{
mdb.CREATE: {Name: "create time@date type name", Help: "创建"},
mdb.MODIFY: {Name: "modify hash time@date type name", Help: "编辑"},
}, mdb.HashAction(mdb.FIELD, "time,hash,type,name,text")), Hand: func(m *ice.Message, arg ...string) {

View File

@ -7,6 +7,7 @@ import (
"shylinux.com/x/icebergs/base/ctx"
"shylinux.com/x/icebergs/base/mdb"
"shylinux.com/x/icebergs/base/web"
"shylinux.com/x/icebergs/core/chat"
kit "shylinux.com/x/toolkits"
)
@ -70,7 +71,7 @@ func init() {
Index.MergeCommands(ice.Commands{
PLAN: {Name: "plan scale=week,day,week,month,year,long begin_time@date list", Help: "计划", Meta: kit.Dict(
ice.Display("/plugin/local/team/plan.js"),
), Actions: ice.MergeAction(ice.Actions{
), Actions: ice.MergeActions(ice.Actions{
mdb.INPUTS: {Name: "inputs", Help: "补全", Hand: func(m *ice.Message, arg ...string) {
m.Cmdy(TODO, mdb.INPUTS, arg)
}},
@ -79,7 +80,7 @@ func init() {
}},
mdb.SEARCH: {Name: "search", Help: "搜索", Hand: func(m *ice.Message, arg ...string) {
if arg[0] == mdb.FOREACH && arg[1] == "" {
m.PushSearch(mdb.TYPE, "plan", mdb.NAME, "", mdb.TEXT, web.MergeCmd(m, ""))
m.PushSearch(mdb.TYPE, "plan", mdb.NAME, "", mdb.TEXT, chat.MergeCmd(m, ""))
}
}},
ice.RUN: {Name: "run", Help: "执行", Hand: func(m *ice.Message, arg ...string) {

View File

@ -57,7 +57,7 @@ const TASK = "task"
func init() {
Index.MergeCommands(ice.Commands{
TASK: {Name: "task zone id auto insert export import", Help: "任务", Actions: ice.MergeAction(ice.Actions{
TASK: {Name: "task zone id auto insert export import", Help: "任务", Actions: ice.MergeActions(ice.Actions{
mdb.INSERT: {Name: "insert zone type=once,step,week name text begin_time@date close_time@date", Help: "添加", Hand: func(m *ice.Message, arg ...string) {
m.Cmdy(mdb.INSERT, m.Prefix(TASK), "", mdb.HASH, m.OptionSimple(mdb.ZONE))
m.Cmdy(mdb.INSERT, m.Prefix(TASK), "", mdb.ZONE, m.Option(mdb.ZONE),

View File

@ -11,7 +11,7 @@ const TODO = "todo"
func init() {
Index.MergeCommands(ice.Commands{
TODO: {Name: "todo hash list create export import", Help: "待办", Actions: ice.MergeAction(ice.Actions{
TODO: {Name: "todo hash list create export import", Help: "待办", Actions: ice.MergeActions(ice.Actions{
mdb.INPUTS: {Name: "inputs", Help: "补全", Hand: func(m *ice.Message, arg ...string) {
m.Cmdy(mdb.INPUTS, m.PrefixKey(), "", mdb.HASH, arg)
m.Cmdy(TASK, mdb.INPUTS, arg)

View File

@ -17,7 +17,7 @@ func init() {
Index.Merge(&ice.Context{Configs: ice.Configs{
DRAW: {Name: DRAW, Help: "思维导图", Value: kit.Data(lex.REGEXP, ".*\\.svg")},
}, Commands: ice.Commands{
DRAW: {Name: "draw path=src/main.svg pid refresh:button=auto save edit actions", Help: "思维导图", Meta: kit.Dict(ice.DisplayLocal("")), Actions: ice.MergeAction(ice.Actions{
DRAW: {Name: "draw path=src/main.svg pid refresh:button=auto save edit actions", Help: "思维导图", Meta: kit.Dict(ice.DisplayLocal("")), Actions: ice.MergeActions(ice.Actions{
ice.CTX_INIT: {Hand: func(m *ice.Message, arg ...string) {
m.Cmd(mdb.RENDER, mdb.CREATE, mdb.TYPE, nfs.SVG, mdb.NAME, m.PrefixKey())
}},

View File

@ -125,7 +125,7 @@ const FIELD = "field"
func init() {
Index.Merge(&ice.Context{Commands: ice.Commands{
FIELD: {Name: "field [name] cmd", Help: "插件", Actions: ice.MergeAction(ice.Actions{
FIELD: {Name: "field [name] cmd", Help: "插件", Actions: ice.MergeActions(ice.Actions{
ice.RUN: {Name: "run", Help: "执行"},
}, ctx.CmdAction()), Hand: func(m *ice.Message, arg ...string) {
if arg = _name(m, arg); strings.Contains(arg[1], ice.NL) {

Some files were not shown because too many files have changed in this diff Show More