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() { func init() {
Index.MergeCommands(ice.Commands{ 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) { 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, TECH, BLACK, kit.Dict(), WHITE, kit.Dict()))
mdb.Rich(m, ROLE, nil, kit.Dict(mdb.NAME, VOID, WHITE, kit.Dict(), BLACK, 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_USERROLE, VOID)
m.Option(ice.MSG_USERNAME, "") m.Option(ice.MSG_USERNAME, "")
m.Option(ice.MSG_USERNICK, "") m.Option(ice.MSG_USERNICK, "")
if m.Warn(sessid == "", ice.ErrNotValid, sessid) { if sessid == "" {
return return
} }
@ -34,9 +34,9 @@ func _sess_create(m *ice.Message, username string) (h string) {
return return
} }
if msg := m.Cmd(USER, username); msg.Length() > 0 { 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 { } 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) gdb.Event(m, SESS_CREATE, SESS, h, USERNAME, username)
return h return h
@ -60,7 +60,7 @@ const SESS = "sess"
func init() { func init() {
Index.MergeCommands(ice.Commands{ 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) { mdb.CREATE: {Name: "create username", Help: "创建", Hand: func(m *ice.Message, arg ...string) {
_sess_create(m, m.Option(USERNAME)) _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 { func SessCheck(m *ice.Message, sessid string) bool {
return m.Cmdy(SESS, CHECK, sessid).Option(ice.MSG_USERNAME) != "" 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() { func init() {
Index.MergeCommands(ice.Commands{ 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) { mdb.CREATE: {Name: "create name=hi secret period=30 number=6", Help: "添加", Hand: func(m *ice.Message, arg ...string) {
if m.Option(SECRET) == "" { // 创建密钥 if m.Option(SECRET) == "" { // 创建密钥
m.Option(SECRET, _totp_gen(kit.Int64(m.Option(PERIOD)))) m.Option(SECRET, _totp_gen(kit.Int64(m.Option(PERIOD))))

View File

@ -71,7 +71,7 @@ const USER = "user"
func init() { func init() {
Index.MergeCommands(ice.Commands{ 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) { 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)...) _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), h := mdb.HashCreate(m, ice.CMD, kit.Join(cmd.Args, ice.SP),
STATUS, START, DIR, cmd.Dir, ENV, kit.Select("", cmd.Env), STATUS, START, DIR, cmd.Dir, ENV, kit.Select("", cmd.Env),
m.OptionSimple(CMD_INPUT, CMD_OUTPUT, CMD_ERRPUT, mdb.CACHE_CLEAR_ON_EXIT), 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) { if e := cmd.Start(); m.Warn(e, ice.ErrNotStart, cmd.Args) {
@ -108,7 +108,7 @@ const DAEMON = "daemon"
func init() { func init() {
Index.MergeCommands(ice.Commands{ 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) { ice.CTX_EXIT: {Hand: func(m *ice.Message, arg ...string) {
mdb.HashPrunesValue(m, mdb.CACHE_CLEAR_ON_EXIT, ice.TRUE) mdb.HashPrunesValue(m, mdb.CACHE_CLEAR_ON_EXIT, ice.TRUE)
}}, }},

View File

@ -21,7 +21,7 @@ const MIRRORS = "mirrors"
func init() { func init() {
Index.MergeCommands(ice.Commands{ 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) { ice.CTX_INIT: {Hand: func(m *ice.Message, arg ...string) {
m.Go(func() { m.Go(func() {
m.Sleep300ms() // after runtime init m.Sleep300ms() // after runtime init

View File

@ -79,6 +79,7 @@ const (
STYLE = "style" STYLE = "style"
DISPLAY = "display" DISPLAY = "display"
ACTION = "action" ACTION = "action"
TRANS = "trans"
CAN_PLUGIN = "can.plugin" CAN_PLUGIN = "can.plugin"
) )
@ -119,6 +120,10 @@ func CmdAction(args ...ice.Any) ice.Actions {
m.Cmd(CONFIG, "reset", arg[0]) m.Cmd(CONFIG, "reset", arg[0])
return 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) { if aaa.Right(m, arg) && !PodCmd(m, arg) {
m.Cmdy(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) 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() { func init() {
Index.MergeCommands(ice.Commands{ 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) { "spide": {Name: "spide", Help: "架构图", Hand: func(m *ice.Message, arg ...string) {
if len(arg) == 0 || arg[1] == CONTEXT { // 模块列表 if len(arg) == 0 || arg[1] == CONTEXT { // 模块列表
m.Cmdy(CONTEXT, kit.Select(ice.ICE, arg, 0), CONTEXT) m.Cmdy(CONTEXT, kit.Select(ice.ICE, arg, 0), CONTEXT)

View File

@ -10,13 +10,13 @@ const EVENT = "event"
func init() { func init() {
Index.MergeCommands(ice.Commands{ 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) { LISTEN: {Name: "listen event cmd", Help: "监听", Hand: func(m *ice.Message, arg ...string) {
mdb.ZoneInsert(m, m.OptionSimple(EVENT, ice.CMD)) mdb.ZoneInsert(m, m.OptionSimple(EVENT, ice.CMD))
}}, }},
HAPPEN: {Name: "happen event arg", Help: "触发", Hand: func(m *ice.Message, arg ...string) { HAPPEN: {Name: "happen event arg", Help: "触发", Hand: func(m *ice.Message, arg ...string) {
mdb.ZoneSelect(m, m.Option(EVENT)).Tables(func(value ice.Maps) { mdb.ZoneSelect(m.Spawn(), m.Option(EVENT)).Tables(func(value ice.Maps) {
m.Cmd(kit.Split(value[ice.CMD]), m.Option(EVENT), arg[2:]).Cost() 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"))}, }, 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 { func Watch(m *ice.Message, key string, arg ...string) *ice.Message {
if len(arg) == 0 { 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)) 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 { func Event(m *ice.Message, key string, arg ...ice.Any) *ice.Message {
return m.Cmd(EVENT, HAPPEN, EVENT, key, arg) return m.Cmdy(EVENT, HAPPEN, EVENT, key, arg)
} }

View File

@ -11,11 +11,11 @@ const ROUTINE = "routine"
func init() { func init() {
Index.MergeCommands(ice.Commands{ 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) { mdb.CREATE: {Name: "create name", Help: "创建", Hand: func(m *ice.Message, arg ...string) {
m.Go(func() { m.Go(func() {
cb := m.OptionCB("") 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() { defer func() {
if e := recover(); e == nil { if e := recover(); e == nil {
mdb.HashModify(m, mdb.HASH, h, mdb.STATUS, STOP) mdb.HashModify(m, mdb.HASH, h, mdb.STATUS, STOP)

View File

@ -9,6 +9,7 @@ import (
ice "shylinux.com/x/icebergs" ice "shylinux.com/x/icebergs"
"shylinux.com/x/icebergs/base/mdb" "shylinux.com/x/icebergs/base/mdb"
kit "shylinux.com/x/toolkits" kit "shylinux.com/x/toolkits"
"shylinux.com/x/toolkits/file"
"shylinux.com/x/toolkits/logs" "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) { func _signal_process(m *ice.Message, p string, s os.Signal) {
if p == "" { if p == "" {
p = logs.ReadFile(ice.Info.PidPath) b, _ := file.ReadFile(ice.Info.PidPath)
p = string(b)
} }
if p == "" { if p == "" {
p = kit.Format(os.Getpid()) p = kit.Format(os.Getpid())
@ -52,7 +54,7 @@ const SIGNAL = "signal"
func init() { func init() {
Index.MergeCommands(ice.Commands{ 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) { ice.CTX_INIT: {Hand: func(m *ice.Message, arg ...string) {
_signal_listen(m, 2, mdb.NAME, "重启", ice.CMD, "exit 1") _signal_listen(m, 2, mdb.NAME, "重启", ice.CMD, "exit 1")
_signal_listen(m, 3, mdb.NAME, "退出", ice.CMD, "exit 0") _signal_listen(m, 3, mdb.NAME, "退出", ice.CMD, "exit 0")

View File

@ -30,7 +30,7 @@ const TIMER = "timer"
func init() { func init() {
Index.MergeCommands(ice.Commands{ 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.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.PRUNES: {Name: "prunes", Help: "清理", Hand: func(m *ice.Message, arg ...string) {
mdb.HashPrunesValue(m, mdb.COUNT, "0") 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 != "" { if expire := m.Conf(prefix, kit.Keys(chain, kit.Keym(EXPIRE))); expire != "" {
arg = kit.Simple(TIME, m.Time(expire), arg) 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)))) m.Echo(Rich(m, prefix, chain, kit.Data(arg, TARGET, m.Optionv(TARGET))))
} else { } else {
m.Echo(Rich(m, prefix, chain, kit.Data(arg))) 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 { 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) }}, ice.CTX_EXIT: {Hand: func(m *ice.Message, arg ...string) { HashSelectClose(m) }},
}) })
} }
@ -186,7 +186,7 @@ func HashStatusAction(args ...Any) ice.Actions {
return list return list
} }
func HashStatusCloseAction(args ...Any) ice.Actions { 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) }}, 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 { func HashInputs(m *ice.Message, arg ...Any) *ice.Message {
return m.Cmdy(INPUTS, m.PrefixKey(), "", HASH, HashArgs(m, arg)) return m.Cmdy(INPUTS, m.PrefixKey(), "", HASH, HashArgs(m, arg))
} }
func HashCreate(m *ice.Message, arg ...Any) *ice.Message { func HashCreate(m *ice.Message, arg ...Any) string {
return m.Cmdy(INSERT, m.PrefixKey(), "", HASH, HashArgs(m, arg...)) 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 { func HashRemove(m *ice.Message, arg ...Any) *ice.Message {
return m.Cmdy(DELETE, m.PrefixKey(), "", HASH, m.OptionSimple(HashShort(m)), arg) 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 { func HashSelectClose(m *ice.Message) *ice.Message {
HashSelectValue(m, func(target ice.Any) { HashSelectValue(m, func(target ice.Any) {
if c, ok := target.(io.Closer); ok { if c, ok := target.(io.Closer); ok {
m.Logs(DELETE, TARGET, m.PrefixKey())
c.Close() c.Close()
} }
}) })
@ -315,5 +317,8 @@ func Rich(m *ice.Message, prefix string, chain Any, data Any) string {
cache = kit.Data() cache = kit.Data()
m.Confv(prefix, chain, cache) 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) 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 { func AutoConfig(args ...ice.Any) *ice.Action {
return &ice.Action{Hand: func(m *ice.Message, arg ...string) { 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...)} cs[m.CommandKey()] = &ice.Config{Value: kit.Data(args...)}
ice.Info.Load(m, m.CommandKey()) ice.Info.Load(m, m.CommandKey())
} }

View File

@ -12,10 +12,18 @@ func init() {
} }
func RenderAction(args ...ice.Any) ice.Actions { 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) { 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 { 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) { 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 { 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 { func HashSelectSearch(m *ice.Message, args []string, keys ...string) *ice.Message {
if len(keys) == 0 { 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)...) OptionPages(m, kit.Slice(arg, 2)...)
return ZoneSelect(m, arg...) 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 { func ZoneSelectAll(m *ice.Message, arg ...string) *ice.Message {
m.Option(CACHE_LIMIT, "-1") m.Option(CACHE_LIMIT, "-1")
return ZoneSelect(m, arg...) 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)) 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))) ls, _ := ReadDir(m, path.Dir(path.Join(root, name)))
for _, s := range ls { for _, s := range ls {
if s.Name() == path.Base(name) { if s.Name() == path.Base(name) {
list = append(list, s) list = append(list, s)
} }
} }
name = path.Dir(name) name, deep = path.Dir(name), false
} }
for _, f := range list { for _, f := range list {
@ -178,7 +178,7 @@ func init() {
m.Cmdy("web.cache", "upload_watch", m.Option(PATH)) m.Cmdy("web.cache", "upload_watch", m.Option(PATH))
}}, }},
TRASH: {Name: "trash", Help: "删除", Hand: func(m *ice.Message, arg ...string) { 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) { }, Hand: func(m *ice.Message, arg ...string) {
if m.Option(DIR_ROOT) != "" { 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 { func NewReadCloser(r io.Reader) io.ReadCloser {
return file.NewReadCloser(r) 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() { func init() {
Index.MergeCommands(ice.Commands{ 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) { ice.CTX_INIT: {Hand: func(m *ice.Message, arg ...string) {
mdb.Richs(m, TAIL, "", mdb.FOREACH, func(key string, value ice.Map) { mdb.Richs(m, TAIL, "", mdb.FOREACH, func(key string, value ice.Map) {
value, _ = kit.GetMeta(value), m.Option(mdb.HASH, key) value, _ = kit.GetMeta(value), m.Option(mdb.HASH, key)

View File

@ -34,7 +34,7 @@ const TRASH = "trash"
func init() { func init() {
Index.MergeCommands(ice.Commands{ 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) { mdb.REVERT: {Name: "revert", Help: "恢复", Hand: func(m *ice.Message, arg ...string) {
Rename(m, m.Option(FILE), m.Option(FROM)) Rename(m, m.Option(FILE), m.Option(FROM))
mdb.HashRemove(m, m.OptionSimple(mdb.HASH)) mdb.HashRemove(m, m.OptionSimple(mdb.HASH))

View File

@ -66,7 +66,7 @@ const CLIENT = "client"
func init() { func init() {
Index.MergeCommands(ice.Commands{ 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_INIT: {Hand: func(m *ice.Message, arg ...string) { m.Conf("", mdb.HASH, "") }},
ice.CTX_EXIT: {Hand: func(m *ice.Message, arg ...string) {}}, 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) { 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() { func init() {
Index.MergeCommands(ice.Commands{ 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) { 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]) }) 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() { func init() {
Index.MergeCommands(ice.Commands{ 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) { aaa.RIGHT: {Name: "right", Help: "分配", Hand: func(m *ice.Message, arg ...string) {
m.Echo(_port_right(m, arg...)) 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) { func _server_listen(m *ice.Message, arg ...string) {
l, e := net.Listen(TCP, m.Option(HOST)+":"+m.Option(PORT)) 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 { if e == nil {
defer l.Close() defer l.Close()
} }
@ -62,7 +62,7 @@ const SERVER = "server"
func init() { func init() {
Index.MergeCommands(ice.Commands{ 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_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) }}, 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) { 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() { func init() {
Index.MergeCommands(ice.Commands{ 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) { 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)) _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)) size := kit.Int(kit.Select(kit.Format(len(text)), arg, 1))
file := kit.Select("", arg, 0) file := kit.Select("", arg, 0)
text = kit.Select(file, text) 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()) m.Push(mdb.TIME, m.Time())
@ -61,7 +61,7 @@ func _cache_catch(m *ice.Message, name string) (file, size string) {
return "", "0" return "", "0"
} }
func _cache_upload(m *ice.Message, r *http.Request) (kind, name, file, size string) { 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() defer b.Close()
// 创建文件 // 创建文件
@ -126,7 +126,7 @@ const CACHE = "cache"
func init() { func init() {
Index.MergeCommands(ice.Commands{ 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) { WATCH: {Name: "watch key file", Help: "释放", Hand: func(m *ice.Message, arg ...string) {
_cache_watch(m, arg[0], arg[1]) _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))) 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)) 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_OUTPUT, "")
m.Option(cli.CMD_ENV, "") m.Option(cli.CMD_ENV, "")
m.Sleep3s() m.Sleep3s()
@ -117,7 +117,7 @@ const DREAM = "dream"
func init() { func init() {
Index.MergeCommands(ice.Commands{ 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) }}, 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) { mdb.INPUTS: {Name: "inputs", Help: "补全", Hand: func(m *ice.Message, arg ...string) {
switch arg[0] { switch arg[0] {

View File

@ -2,7 +2,6 @@ package web
import ( import (
"net/url" "net/url"
"path"
"strings" "strings"
"time" "time"
@ -10,10 +9,19 @@ import (
"shylinux.com/x/icebergs/base/cli" "shylinux.com/x/icebergs/base/cli"
"shylinux.com/x/icebergs/base/gdb" "shylinux.com/x/icebergs/base/gdb"
"shylinux.com/x/icebergs/base/mdb" "shylinux.com/x/icebergs/base/mdb"
"shylinux.com/x/icebergs/base/nfs"
kit "shylinux.com/x/toolkits" kit "shylinux.com/x/toolkits"
"shylinux.com/x/toolkits/file" "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) { func PushNotice(m *ice.Message, arg ...ice.Any) {
m.Optionv(ice.MSG_OPTS, m.Optionv(ice.MSG_OPTION)) m.Optionv(ice.MSG_OPTS, m.Optionv(ice.MSG_OPTION))
if m.Option(ice.MSG_USERPOD) == "" { 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 { func OptionUserWeb(m *ice.Message) *url.URL {
return kit.ParseURL(m.Option(ice.MSG_USERWEB)) 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 { 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...) 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: default:
for _, k := range []string{ for _, k := range []string{
"_option", "_handle", "_output", "_option", "_handle", "_output",
"cmds", "fields", "sessid", "river", "storm", "cmds", "fields", "sessid",
} { } {
msg.Set(k) 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) { func RenderType(w http.ResponseWriter, name, mime string) {
if mime == "" { if mime == "" {
switch kit.Ext(name) { switch kit.Ext(name) {
case nfs.HTML: case "", nfs.HTML:
mime = "text/html" mime = "text/html"
case nfs.CSS: case nfs.CSS:
mime = "text/css; charset=utf-8" mime = "text/css; charset=utf-8"
@ -139,16 +139,14 @@ func CookieName(url string) string {
return ice.MSG_SESSID + "_" + kit.ParseURLMap(url)[tcp.PORT] return ice.MSG_SESSID + "_" + kit.ParseURLMap(url)[tcp.PORT]
} }
func RenderIndex(m *ice.Message, serve, repos string, file ...string) *ice.Message { func RenderIndex(m *ice.Message, 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...)))) 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 { func RenderWebsite(m *ice.Message, pod string, dir string, arg ...string) *ice.Message {
args := []string{} return m.Echo(m.Cmdx(Space(m, pod), "web.chat.website", lex.PARSE, dir, arg)).RenderResult()
if pod != "" {
args = append(args, SPACE, pod)
}
m.Echo(m.Cmdx(args, "web.chat.website", lex.PARSE, dir, arg))
return m.RenderResult()
} }
func RenderCmd(m *ice.Message, index string, args ...ice.Any) { func RenderCmd(m *ice.Message, index string, args ...ice.Any) {
list := index list := index

View File

@ -63,7 +63,7 @@ const ROUTE = "route"
func init() { func init() {
Index.MergeCommands(ice.Commands{ 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) { aaa.INVITE: {Name: "invite", Help: "添加", Hand: func(m *ice.Message, arg ...string) {
m.Cmdy(SPACE, m.Option(ROUTE), SPACE, aaa.INVITE, arg).ProcessInner() 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() m.Cmdy(SPACE, m.Option(ROUTE), DREAM, tcp.START, arg).ProcessInner()
}}, }},
ctx.COMMAND: {Name: "command", Help: "命令", Hand: func(m *ice.Message, arg ...string) { ctx.COMMAND: {Name: "command", Help: "命令", Hand: func(m *ice.Message, arg ...string) {
m.Cmdy(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) { ice.RUN: {Name: "run", Help: "执行", Hand: func(m *ice.Message, arg ...string) {
m.Cmdy(SPACE, m.Option(ROUTE), arg) m.Cmdy(SPACE, m.Option(ROUTE), arg)
@ -99,19 +99,12 @@ func init() {
} }
} else if len(arg) == 1 || arg[1] == "" { // 模块列表 } else if len(arg) == 1 || arg[1] == "" { // 模块列表
m.Cmd(SPACE, arg[0], ctx.CONTEXT, ice.ICE).Tables(func(value ice.Maps) { 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(ice.CTX, kit.Keys(value["ups"], value[mdb.NAME])) m.Push("", value, head)
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))
}) })
} else { // 命令详情 } 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) 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 { // 单点认证 if _, ok := msg.Target().Commands[WEB_LOGIN]; ok { // 单点认证
msg.Target().Cmd(msg, WEB_LOGIN, kit.Simple(key, cmds)...) msg.Target().Cmd(msg, WEB_LOGIN, kit.Simple(key, cmds)...)
return cmds, msg.Result(0) != ice.ErrWarn && msg.Result(0) != ice.FALSE return cmds, !msg.IsErr() && msg.Result(0) != ice.FALSE
} }
if aaa.Right(msg, key, cmds) { if aaa.Right(msg, key, cmds) {
@ -329,7 +329,7 @@ const SERVE = "serve"
func init() { func init() {
Index.Merge(&ice.Context{Configs: ice.Configs{ Index.Merge(&ice.Context{Configs: ice.Configs{
SERVE: {Name: SERVE, Help: "服务器", Value: kit.Data( 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, DOMAIN, "", tcp.LOCALHOST, ice.TRUE, LOGHEADERS, ice.FALSE,
nfs.PATH, kit.Dict(ice.PS, ice.USR_VOLCANOS), nfs.PATH, kit.Dict(ice.PS, ice.USR_VOLCANOS),
ice.VOLCANOS, kit.Dict(nfs.PATH, ice.USR_VOLCANOS, INDEX, "page/index.html", ice.VOLCANOS, kit.Dict(nfs.PATH, ice.USR_VOLCANOS, INDEX, "page/index.html",
@ -340,7 +340,7 @@ func init() {
), ),
)}, )},
}, Commands: ice.Commands{ }, 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) { ice.CTX_INIT: {Hand: func(m *ice.Message, arg ...string) {
cli.NodeInfo(m, WORKER, ice.Info.PathName) 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} { 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) { 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) _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) { 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) { 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) { PP(ice.PUBLISH): {Name: "/publish/", Help: "定制化", Hand: func(m *ice.Message, arg ...string) {
_share_local(aaa.UserRoot(m), ice.USR_PUBLISH, path.Join(arg...)) _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) { 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:]...) _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) { 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.NODE_MODULES, path.Join(arg...)) p := path.Join(ice.USR_VOLCANOS, ice.LIB, ice.NODE_MODULES, path.Join(arg...))
if !nfs.ExistsFile(m, p) { 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) 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)) 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 { } else {
m.Cmd(SPACE, m.Option(ice.POD), SPIDE, ice.DEV, SPIDE_RAW, MergeURL2(m, SHARE_PROXY, nfs.PATH, ""), 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 p = pp
} }
if m.Warn(!file.ExistsFile(p)) {
m.RenderStatusNotFound()
return
}
m.RenderDownload(p) m.RenderDownload(p)
} }
func _share_proxy(m *ice.Message) { func _share_proxy(m *ice.Message) {
@ -132,7 +136,7 @@ const SHARE = "share"
func init() { func init() {
Index.MergeCommands(ice.Commands{ 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) }}, 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.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), 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: case LOGIN:
m.RenderRedirect(ice.PS, ice.MSG_SESSID, aaa.SessCreate(m, msg.Append(aaa.USERNAME))) m.RenderRedirect(ice.PS, ice.MSG_SESSID, aaa.SessCreate(m, msg.Append(aaa.USERNAME)))
default: default:
RenderIndex(m, SERVE, ice.VOLCANOS) RenderIndex(m, ice.VOLCANOS)
} }
}}, }},

View File

@ -216,8 +216,8 @@ func _space_fork(m *ice.Message) {
switch kind { switch kind {
case CHROME: // 交互节点 case CHROME: // 交互节点
gdb.Event(m, SPACE_OPEN, args...) gdb.Event(m, SPACE_OPEN, args)
defer gdb.Event(m, SPACE_CLOSE, args...) defer gdb.Event(m, SPACE_CLOSE, args)
defer mdb.HashRemove(m, mdb.NAME, name) defer mdb.HashRemove(m, mdb.NAME, name)
m.Go(func(msg *ice.Message) { m.Go(func(msg *ice.Message) {
switch m.Option(ice.CMD) { switch m.Option(ice.CMD) {
@ -234,12 +234,12 @@ func _space_fork(m *ice.Message) {
} }
}) })
case WORKER: // 工作节点 case WORKER: // 工作节点
gdb.Event(m, DREAM_START, args...) gdb.Event(m, DREAM_START, args)
defer gdb.Event(m, DREAM_STOP, args...) defer gdb.Event(m, DREAM_STOP, args)
defer m.Cmd(DREAM, DREAM_STOP, args) defer m.Cmd(DREAM, DREAM_STOP, args)
default: // 服务节点 default: // 服务节点
gdb.Event(m, SPACE_START, args...) gdb.Event(m, SPACE_START, args)
defer gdb.Event(m, SPACE_STOP, args...) defer gdb.Event(m, SPACE_STOP, args)
defer mdb.HashRemove(m, mdb.NAME, name) defer mdb.HashRemove(m, mdb.NAME, name)
} }
_space_handle(m, false, m.Target().Server().(*Frame), s, 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"), REDIAL, kit.Dict("a", 3000, "b", 1000, "c", 1000), TIMEOUT, kit.Dict("c", "180s"),
)}, )},
}, Commands: ice.Commands{ }, 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_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.REMOVE: {Name: "remove", Help: "删除", Hand: func(m *ice.Message, arg ...string) {
mdb.HashModify(m, m.OptionSimple(mdb.NAME), mdb.STATUS, cli.STOP) mdb.HashModify(m, m.OptionSimple(mdb.NAME), mdb.STATUS, cli.STOP)
defer mdb.HashRemove(m, m.OptionSimple(mdb.NAME)) 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) { func _spide_list(m *ice.Message, arg ...string) {
msg := mdb.HashSelects(m.Spawn(), arg[0])
cache, save := "", "" cache, save := "", ""
switch arg[1] { // 缓存方法 switch arg[1] { // 缓存方法
case SPIDE_RAW: case SPIDE_RAW:
@ -50,7 +51,6 @@ func _spide_list(m *ice.Message, arg ...string) {
cache, arg = arg[1], arg[1:] cache, arg = arg[1], arg[1:]
} }
msg := mdb.HashSelect(m.Spawn(), arg[0])
method := kit.Select(SPIDE_POST, msg.Append(CLIENT_METHOD)) method := kit.Select(SPIDE_POST, msg.Append(CLIENT_METHOD))
switch arg = arg[1:]; arg[0] { // 请求方法 switch arg = arg[1:]; arg[0] { // 请求方法
case SPIDE_GET: 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))) res, e := _spide_send(m, msg.Append(CLIENT_NAME), req, kit.Format(msg.Append(CLIENT_TIMEOUT)))
if m.Warn(e, ice.ErrNotFound, uri) { if m.Warn(e, ice.ErrNotFound, uri) {
return return
@ -349,7 +351,7 @@ const SPIDE = "spide"
func init() { func init() {
Index.MergeCommands(ice.Commands{ 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) { ice.CTX_INIT: {Hand: func(m *ice.Message, arg ...string) {
conf := m.Confm(cli.RUNTIME, cli.CONF) 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])) 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 P(arg ...string) string { return path.Join(ice.PS, path.Join(arg...)) }
func PP(arg ...string) string { return P(arg...) + ice.PS } func PP(arg ...string) string { return P(arg...) + ice.PS }

View File

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

View File

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

View File

@ -1,18 +1,37 @@
package chat package chat
import ( import (
"path"
ice "shylinux.com/x/icebergs" ice "shylinux.com/x/icebergs"
"shylinux.com/x/icebergs/base/web" "shylinux.com/x/icebergs/base/web"
kit "shylinux.com/x/toolkits"
) )
const CHAT = "chat" const CHAT = "chat"
var Index = &ice.Context{Name: CHAT, Help: "聊天中心"} var Index = &ice.Context{Name: CHAT, Help: "聊天中心"}
func init() { func init() { web.Index.Register(Index, &web.Frame{}) }
web.Index.Register(Index, &web.Frame{},
HEADER, RIVER, STORM, ACTION, FOOTER, func MergePod(m *ice.Message, pod string, arg ...ice.Any) string {
SCAN, PASTE, FILES, LOCATION, return kit.MergePOD(kit.Select(ice.Info.Domain, m.Option(ice.MSG_USERWEB)), pod, arg...)
WEBSITE, }
) 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 "组织" chapter "组织"
header.go
footer.go
river.go
storm.go
ocean.go
action.go
search.go
info.go
node.go
chat.go chat.go
chat.shy chat.shy
header.go
footer.go
action.go
search.go
river.go
storm.go
ocean.go
nodes.go
sso.go
pod.go pod.go
cmd.go cmd.go
div.go div.go
sso.go topic.go
grant.go
website.go website.go
room.go
meet.go
scan.go scan.go
scan.js scan.js
paste.go paste.go
files.go files.go
trans.go trans.go
location.go location.go
location.shy
room.go
meet.go
grant.go
oauth

View File

@ -5,6 +5,7 @@ import (
"strings" "strings"
ice "shylinux.com/x/icebergs" ice "shylinux.com/x/icebergs"
"shylinux.com/x/icebergs/base/aaa"
"shylinux.com/x/icebergs/base/ctx" "shylinux.com/x/icebergs/base/ctx"
"shylinux.com/x/icebergs/base/mdb" "shylinux.com/x/icebergs/base/mdb"
"shylinux.com/x/icebergs/base/nfs" "shylinux.com/x/icebergs/base/nfs"
@ -52,67 +53,25 @@ const CMD = "cmd"
func init() { func init() {
Index.MergeCommands(ice.Commands{ Index.MergeCommands(ice.Commands{
CMD: {Name: "cmd path auto upload up home", Help: "命令", Actions: ice.MergeAction(ice.Actions{ CMD: {Name: "cmd path auto upload up home", Help: "命令", Actions: ice.MergeActions(ice.Actions{
web.UPLOAD: {Name: "upload", Help: "上传", Hand: func(m *ice.Message, arg ...string) { ice.CTX_INIT: {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"))) 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")
"home": {Name: "home", Help: "根目录", Hand: func(m *ice.Message, arg ...string) { m.Cmdy(CMD, mdb.CREATE, mdb.TYPE, nfs.CSV, mdb.NAME, "web.wiki.data")
m.ProcessLocation("/chat/cmd/") m.Cmdy(CMD, mdb.CREATE, mdb.TYPE, nfs.JSON, mdb.NAME, "web.wiki.json")
}},
"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")
for _, k := range []string{"mod", "sum"} { for _, k := range []string{"mod", "sum"} {
m.Cmdy(CMD, mdb.CREATE, mdb.TYPE, k, mdb.NAME, "web.code.inner") m.Cmdy(CMD, mdb.CREATE, mdb.TYPE, k, mdb.NAME, "web.code.inner")
} }
}}, }},
}, ctx.CmdAction()), Hand: func(m *ice.Message, arg ...string) { }, mdb.HashAction(mdb.SHORT, "type", nfs.PATH, nfs.PWD), ctx.CmdAction(), web.ApiAction("/cmd/")), Hand: func(m *ice.Message, arg ...string) {
if strings.HasSuffix(m.R.URL.Path, ice.PS) {
web.RenderCmd(m, CMD)
return // 目录
}
if _cmd_file(m, arg...) { if _cmd_file(m, arg...) {
return return
} }
if ctx.PodCmd(m, ctx.COMMAND, arg[0]) && !m.IsErr() {
if ctx.PodCmd(m, ctx.COMMAND, arg[0]) { web.RenderCmd(m, arg[0], arg[1:]) // 远程命令
if !m.IsErr() {
web.RenderCmd(m, arg[0], arg[1:]) // 远程命令
}
} else if m.Cmdy(ctx.COMMAND, arg[0]); m.Length() > 0 { } else if m.Cmdy(ctx.COMMAND, arg[0]); m.Length() > 0 {
web.RenderCmd(m, arg[0], arg[1:]) // 本地命令 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, nfs.TEMPLATE, _div_template,
)}, )},
}, Commands: ice.Commands{ }, 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)) { switch p := path.Join(arg...); kit.Ext(kit.Select("", p)) {
case nfs.HTML: case nfs.HTML:
m.RenderDownload(p) m.RenderDownload(p)
@ -45,7 +45,7 @@ func init() {
web.RenderCmd(m, m.PrefixKey(), p) 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) { 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)))) 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() { func init() {
Index.MergeCommands(ice.Commands{ 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) { web.UPLOAD: {Name: "upload", Help: "上传", Hand: func(m *ice.Message, arg ...string) {
up := kit.Simple(m.Optionv(ice.MSG_UPLOAD)) up := web.Upload(m)
if len(up) < 2 { mdb.HashCreate(m, mdb.TYPE, kit.Ext(up[1]), mdb.NAME, up[1], nfs.SIZE, up[2], mdb.DATA, up[0])
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])
}}, }},
}, mdb.HashAction(mdb.SHORT, mdb.DATA, mdb.FIELD, "time,hash,type,name,size,data")), Hand: func(m *ice.Message, arg ...string) { }, 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...) mdb.HashSelect(m, arg...).Tables(func(value ice.Maps) {
m.Tables(func(value ice.Maps) {
link := web.SHARE_CACHE + value[mdb.DATA] link := web.SHARE_CACHE + value[mdb.DATA]
if m.PushDownload(mdb.LINK, value[mdb.NAME], link); len(arg) > 0 && kit.ExtIsImage(value[mdb.NAME]) { if m.PushDownload(mdb.LINK, value[mdb.NAME], link); len(arg) > 0 && kit.ExtIsImage(value[mdb.NAME]) {
m.PushImages("image", link) m.PushImages("image", link)

View File

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

View File

@ -11,7 +11,7 @@ const GRANT = "grant"
func init() { func init() {
Index.MergeCommands(ice.Commands{ 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) { mdb.INPUTS: {Name: "inputs", Help: "补全", Hand: func(m *ice.Message, arg ...string) {
switch arg[0] { switch arg[0] {
case web.SPACE: case web.SPACE:

View File

@ -1,27 +1,20 @@
package chat package chat
import ( import (
"strings"
ice "shylinux.com/x/icebergs" ice "shylinux.com/x/icebergs"
"shylinux.com/x/icebergs/base/aaa" "shylinux.com/x/icebergs/base/aaa"
"shylinux.com/x/icebergs/base/cli" "shylinux.com/x/icebergs/base/cli"
"shylinux.com/x/icebergs/base/ctx" "shylinux.com/x/icebergs/base/ctx"
"shylinux.com/x/icebergs/base/gdb"
"shylinux.com/x/icebergs/base/mdb" "shylinux.com/x/icebergs/base/mdb"
"shylinux.com/x/icebergs/base/tcp" "shylinux.com/x/icebergs/base/tcp"
"shylinux.com/x/icebergs/base/web" "shylinux.com/x/icebergs/base/web"
"shylinux.com/x/icebergs/core/code"
kit "shylinux.com/x/toolkits" kit "shylinux.com/x/toolkits"
) )
func _header_agent(m *ice.Message, arg ...string) {
if strings.Index(m.Option(ice.MSG_USERUA), "MicroMessenger") > -1 {
m.Cmdy("web.chat.wx.access", "config")
}
}
func _header_check(m *ice.Message, arg ...string) bool { func _header_check(m *ice.Message, arg ...string) bool {
if m.Option(web.SHARE) != "" { 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] { switch value[mdb.TYPE] {
case web.FIELD, web.STORM: case web.FIELD, web.STORM:
m.Option(ice.MSG_USERNAME, value[aaa.USERNAME]) m.Option(ice.MSG_USERNAME, value[aaa.USERNAME])
@ -33,10 +26,10 @@ func _header_check(m *ice.Message, arg ...string) bool {
return true return true
} }
m.Option(web.SSO, m.Config(web.SSO))
m.Option(web.LOGIN, m.Config(web.LOGIN)) m.Option(web.LOGIN, m.Config(web.LOGIN))
m.Option(web.SSO, m.Conf(web.SERVE, kit.Keym(web.SSO))) if m.Option("login.dev", m.CmdAppend(web.SPACE, ice.DEV, mdb.TEXT)) == "" {
if m.Option("login.dev", m.Cmd(web.SPACE, ice.DEV).Append(mdb.TEXT)) == "" { m.Option("login.dev", m.CmdAppend(web.SPACE, ice.SHY, mdb.TEXT))
m.Option("login.dev", m.Cmd(web.SPACE, ice.SHY).Append(mdb.TEXT))
} }
return false return false
} }
@ -46,63 +39,48 @@ func _header_share(m *ice.Message, arg ...string) {
} else { } else {
m.Option(mdb.LINK, tcp.ReplaceLocalhost(m, m.Option(mdb.LINK))) m.Option(mdb.LINK, tcp.ReplaceLocalhost(m, m.Option(mdb.LINK)))
} }
m.Option(mdb.LINK, kit.MergeURL(m.Option(mdb.LINK), RIVER, "", STORM, "")) m.Option(mdb.LINK, kit.MergeURL(m.Option(mdb.LINK), RIVER, "", STORM, ""))
m.PushQRCode(mdb.TEXT, m.Option(mdb.LINK)) m.PushQRCode(mdb.TEXT, m.Option(mdb.LINK))
m.Push(mdb.NAME, m.Option(mdb.LINK)) m.Push(mdb.NAME, m.Option(mdb.LINK))
} }
func _header_users(m *ice.Message, key string, arg ...string) { func _header_users(m *ice.Message, key string, arg ...string) {
m.Option(aaa.USERNAME, m.Option(ice.MSG_USERNAME)) m.Option(aaa.USERNAME, m.Option(ice.MSG_USERNAME))
m.Cmdy(aaa.USER, ctx.ACTION, mdb.MODIFY, key, m.Option(key, arg[0])) m.Cmdy(aaa.USER, mdb.MODIFY, key, m.Option(key, arg[0]))
} }
const ( const (
TITLE = "title" TITLE = "title"
MENUS = "menus" MENUS = "menus"
TRANS = "trans" TRANS = "trans"
AGENT = "agent"
CHECK = "check" HEADER_AGENT = "header.agent"
SHARE = "share"
) )
const HEADER = "header" const HEADER = "header"
func init() { func init() {
Index.Merge(&ice.Context{Configs: ice.Configs{ Index.MergeCommands(ice.Commands{
HEADER: {Name: HEADER, Help: "标题栏", Value: kit.Data(aaa.LOGIN, kit.List("登录", "扫码"))},
}, Commands: ice.Commands{
web.WEB_LOGIN: {Hand: func(m *ice.Message, arg ...string) { web.WEB_LOGIN: {Hand: func(m *ice.Message, arg ...string) {
switch arg[0] { switch arg[0] {
case "/header": case web.P(HEADER):
if kit.Select("", arg, 1) == "" { switch kit.Select("", arg, 1) {
case "", aaa.LOGIN:
return // 免登录 return // 免登录
} }
if kit.Select("", arg, 1) == aaa.LOGIN { default:
if aaa.Right(m, arg) {
return // 免登录 return // 免登录
} }
case "/pod/", "/cmd/", "/topic/":
return // 免登录
case "/sso":
return // 免登录
} }
m.Warn(m.Option(ice.MSG_USERNAME) == "", ice.ErrNotLogin, arg) m.Warn(m.Option(ice.MSG_USERNAME) == "", ice.ErrNotLogin, arg)
}}, }},
web.P(HEADER): {Name: "/header", Help: "标题栏", Actions: ice.Actions{ HEADER: {Name: "header", Help: "标题栏", Actions: ice.MergeActions(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...)
}},
aaa.LOGIN: {Name: "login", Help: "密码登录", Hand: func(m *ice.Message, arg ...string) { aaa.LOGIN: {Name: "login", Help: "密码登录", Hand: func(m *ice.Message, arg ...string) {
if aaa.UserLogin(m, arg[0], arg[1]) { if aaa.UserLogin(m, arg[0], arg[1]) {
web.RenderCookie(m, aaa.SessCreate(m, arg[0])) web.RenderCookie(m, aaa.SessCreate(m, arg[0]))
} }
}}, }},
aaa.LOGOUT: {Name: "logout", Help: "退出登录", Hand: func(m *ice.Message, arg ...string) { aaa.LOGOUT: {Name: "logout", Help: "退出登录", Hand: func(m *ice.Message, arg ...string) {
m.Cmd(aaa.SESS, mdb.REMOVE, kit.Dict(mdb.HASH, m.Option(ice.MSG_SESSID))) aaa.UserLogout(m)
}}, }},
aaa.PASSWORD: {Name: "password", Help: "修改密码", Hand: func(m *ice.Message, arg ...string) { aaa.PASSWORD: {Name: "password", Help: "修改密码", Hand: func(m *ice.Message, arg ...string) {
_header_users(m, m.ActionKey(), arg...) _header_users(m, m.ActionKey(), arg...)
@ -120,16 +98,18 @@ func init() {
_header_users(m, m.ActionKey(), arg...) _header_users(m, m.ActionKey(), arg...)
}}, }},
ctx.CONFIG: {Name: "config scope", Help: "拉取配置", Hand: func(m *ice.Message, arg ...string) { 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) { "webpack": {Name: "webpack", Help: "打包页面", Hand: func(m *ice.Message, arg ...string) {
m.Cmdy(code.WEBPACK, cli.BUILD, m.OptionSimple(mdb.NAME)) 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...) { if !_header_check(m, arg...) {
return return
} }
_header_agent(m, arg...)
msg := m.Cmd(aaa.USER, m.Option(ice.MSG_USERNAME)) msg := m.Cmd(aaa.USER, m.Option(ice.MSG_USERNAME))
for _, k := range []string{aaa.USERNICK, aaa.LANGUAGE} { 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"))) 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(TRANS, kit.Format(kit.Value(m.Target().Commands[web.P(m.CommandKey())].Meta, "_trans")))
m.Option(MENUS, m.Config(MENUS)) m.Option(MENUS, m.Config(MENUS))
m.Echo(m.Config(TITLE)) 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{ 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) { "explore": {Name: "explore", Help: "周边", Hand: func(m *ice.Message, arg ...string) {
m.Echo(get(m, "place/v1/explore", m.OptionSimple("boundary,page_index"))) 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,照片,性别,年龄,身高,体重,籍贯,户口,学历,学校,职业,公司,年薪,资产,家境", mdb.SHORT, mdb.NAME, mdb.FIELD, "time,name,照片,性别,年龄,身高,体重,籍贯,户口,学历,学校,职业,公司,年薪,资产,家境",
)}, )},
}, Commands: ice.Commands{ }, 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.CREATE: {Name: "create name 照片 性别 年龄 身高 体重 籍贯 户口 学历 学校 职业 公司 年薪 资产 家境", Help: "添加"},
}, mdb.HashAction()), Hand: func(m *ice.Message, arg ...string) { }, mdb.HashAction()), Hand: func(m *ice.Message, arg ...string) {
total := kit.Int(arg[0]) total := kit.Int(arg[0])
@ -38,7 +38,7 @@ func init() {
} }
m.StatusTimeCount() 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.CREATE: {Name: "create name 照片 性别 年龄 身高 体重 籍贯 户口 学历 学校 职业 公司 年薪 资产 家境", Help: "添加"},
}, mdb.HashAction()), Hand: func(m *ice.Message, arg ...string) { }, mdb.HashAction()), Hand: func(m *ice.Message, arg ...string) {
msg := m.Spawn() 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" const OAUTH = "oauth"
var Index = &ice.Context{Name: OAUTH, Help: "认证授权", Commands: ice.Commands{ 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) { 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))) 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 ( import (
ice "shylinux.com/x/icebergs" ice "shylinux.com/x/icebergs"
"shylinux.com/x/icebergs/base/aaa" "shylinux.com/x/icebergs/base/aaa"
"shylinux.com/x/icebergs/base/gdb"
"shylinux.com/x/icebergs/base/mdb" "shylinux.com/x/icebergs/base/mdb"
kit "shylinux.com/x/toolkits" kit "shylinux.com/x/toolkits"
) )
@ -12,14 +13,21 @@ const OCEAN = "ocean"
func init() { func init() {
Index.MergeCommands(ice.Commands{ Index.MergeCommands(ice.Commands{
OCEAN: {Name: "ocean username auto insert invite", Help: "用户", Actions: ice.Actions{ 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) { mdb.INPUTS: {Name: "inputs", Help: "补全", Hand: func(m *ice.Message, arg ...string) {
m.Cmdy(aaa.USER, ice.OptionFields(aaa.USERNAME, aaa.USERNICK, aaa.USERZONE)) 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) { 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) { 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) { }, Hand: func(m *ice.Message, arg ...string) {
m.Fields(len(arg), "time,username") m.Fields(len(arg), "time,username")

View File

@ -11,7 +11,7 @@ const PASTE = "paste"
func init() { func init() {
Index.MergeCommands(ice.Commands{ 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) { "getClipboardData": {Name: "getClipboardData", Help: "粘贴", Hand: func(m *ice.Message, arg ...string) {
m.Cmdy(PASTE, mdb.CREATE, arg) m.Cmdy(PASTE, mdb.CREATE, arg)
}}, }},

View File

@ -17,32 +17,33 @@ const POD = "pod"
func init() { func init() {
Index.MergeCommands(ice.Commands{ Index.MergeCommands(ice.Commands{
"/pod/": {Name: "/pod/", Help: "节点", Actions: ctx.CmdAction(), Hand: func(m *ice.Message, arg ...string) { POD: {Name: "pod", Help: "节点", Actions: ice.MergeActions(ice.Actions{
if strings.HasPrefix(m.R.Header.Get("User-Agent"), "curl") || strings.HasPrefix(m.R.Header.Get("User-Agent"), "Wget") { ice.CTX_INIT: {Hand: func(m *ice.Message, arg ...string) { m.Cmd(aaa.ROLE, aaa.WHITE, POD) }},
m.Option(ice.MSG_USERNAME, "root") }, ctx.CmdAction(), web.ApiAction("/pod/")), Hand: func(m *ice.Message, arg ...string) {
m.Option(ice.MSG_USERROLE, "root") if web.OptionAgentIs(m, "curl", "Wget") {
aaa.UserRoot(m)
m.Option(ice.POD, kit.Select("", arg, 0)) m.Option(ice.POD, kit.Select("", arg, 0))
m.Cmdy(web.SHARE_LOCAL, "bin/ice.bin") m.Cmdy(web.SHARE_LOCAL, ice.BIN_ICE_BIN)
return // 下载文件 return // 下载程序
} }
if len(arg) == 0 || kit.Select("", arg, 0) == "" { // 节点列表 if len(arg) == 0 || kit.Select("", arg, 0) == "" {
web.RenderCmd(m, web.ROUTE) 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) { 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) aaa.UserRoot(m)
if web.RenderWebsite(m, arg[0], "index.iml", "Header", "", "River", "", "Footer", ""); m.Result() == "" { if web.RenderWebsite(m, arg[0], ice.INDEX_IML, "Header", "", "River", "", "Footer", ""); m.Result() == "" {
web.RenderIndex(m, web.SERVE, ice.VOLCANOS) web.RenderIndex(m, ice.VOLCANOS) // 节点首页
} }
} else if arg[1] == WEBSITE { // 节点网页 } else if arg[1] == WEBSITE {
web.RenderWebsite(m, arg[0], path.Join(arg[2:]...)) web.RenderWebsite(m, arg[0], path.Join(arg[2:]...)) // 节点网页
} else if arg[1] == "cmd" { // 节点命令 } else if arg[1] == CMD {
m.Cmdy(web.SPACE, arg[0], m.Prefix(CMD), path.Join(arg[2:]...)) m.Cmdy(web.SPACE, arg[0], m.Prefix(CMD), path.Join(arg[2:]...)) // 节点命令
} else { } 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."+strings.TrimPrefix(path.Join(arg[1:]...), "chat/"))
// m.Cmdy(web.SPACE, m.Option(ice.MSG_USERPOD), "web.chat."+ice.PS+path.Join(arg[1:]...)) // 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/aaa"
"shylinux.com/x/icebergs/base/cli" "shylinux.com/x/icebergs/base/cli"
"shylinux.com/x/icebergs/base/ctx" "shylinux.com/x/icebergs/base/ctx"
"shylinux.com/x/icebergs/base/gdb"
"shylinux.com/x/icebergs/base/mdb" "shylinux.com/x/icebergs/base/mdb"
"shylinux.com/x/icebergs/base/nfs" "shylinux.com/x/icebergs/base/nfs"
"shylinux.com/x/icebergs/base/web" "shylinux.com/x/icebergs/base/web"
"shylinux.com/x/icebergs/core/code"
kit "shylinux.com/x/toolkits" kit "shylinux.com/x/toolkits"
) )
@ -50,12 +50,14 @@ func _river_list(m *ice.Message) {
}) })
} }
const (
RIVER_CREATE = "river.create"
)
const RIVER = "river" const RIVER = "river"
func init() { func init() {
Index.MergeCommands(ice.Commands{ Index.MergeCommands(ice.Commands{
RIVER: {Name: "river hash auto create", Help: "群组", Actions: ice.MergeAction(ice.Actions{ RIVER: {Name: "river hash auto create", Help: "群组", Actions: ice.MergeActions(ice.Actions{
ice.CTX_INIT: {Hand: func(m *ice.Message, arg ...string) { m.Config(nfs.TEMPLATE, _river_template) }},
mdb.INPUTS: {Name: "inputs", Help: "补全", Hand: func(m *ice.Message, arg ...string) { mdb.INPUTS: {Name: "inputs", Help: "补全", Hand: func(m *ice.Message, arg ...string) {
switch m.Option(ctx.ACTION) { switch m.Option(ctx.ACTION) {
case cli.START, "创建空间": case cli.START, "创建空间":
@ -71,38 +73,22 @@ func init() {
case aaa.USERNAME: case aaa.USERNAME:
m.Cmdy(aaa.USER).Cut(aaa.USERNAME, aaa.USERNICK, aaa.USERZONE) m.Cmdy(aaa.USER).Cut(aaa.USERNAME, aaa.USERNICK, aaa.USERZONE)
default: 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) { 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) h := mdb.HashCreate(m, arg)
m.Option(ice.MSG_RIVER, h) gdb.Event(m, RIVER_CREATE, RIVER, m.Option(ice.MSG_RIVER, h), arg)
m.Echo(h) m.Result(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)
})
})
})
}}, }},
cli.START: {Name: "start name=hi repos template", Help: "创建空间", Hand: func(m *ice.Message, arg ...string) { 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) 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) { 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("publish", ice.CONTEXTS)
m.Cmdy(code.PUBLISH, ice.CONTEXTS)
}}, }},
}, mdb.HashAction(mdb.FIELD, "time,hash,type,name,text,template"))}, }, mdb.HashAction(mdb.FIELD, "time,hash,type,name,text,template"), web.ApiAction()), Hand: func(m *ice.Message, arg ...string) {
web.P(RIVER): {Name: "/river", Help: "群组", Hand: func(m *ice.Message, arg ...string) { if m.Warn(m.Option(ice.MSG_USERNAME) == "", ice.ErrNotLogin) {
if m.Warn(m.Option(ice.MSG_USERNAME) == "", ice.ErrNotLogin, RIVER) {
m.RenderStatusUnauthorized() m.RenderStatusUnauthorized()
return // 没有登录 return // 没有登录
} }
@ -121,49 +107,17 @@ func init() {
return // 没有授权 return // 没有授权
} }
switch kit.Select("", arg, 1) { if command := m.Commands(kit.Select("", arg, 1)); command != nil {
case STORM, OCEAN, NODE:
m.Option(ice.MSG_RIVER, arg[0]) m.Option(ice.MSG_RIVER, arg[0])
m.Cmdy(arg[1], arg[2:]) m.Cmdy(arg[1], arg[2:])
case ctx.ACTION, aaa.INVITE: } else if action := m.Actions(kit.Select("", arg, 1)); action != nil {
m.Option(ice.MSG_RIVER, arg[0]) m.Option(ice.MSG_RIVER, arg[0])
m.Cmdy(RIVER, arg[1:]) m.Cmdy("", arg[1:])
default: } else {
m.Cmdy(RIVER, arg) 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", mdb.SHORT, "space", mdb.FIELD, "time,hash,username,socket",
)}, )},
}, Commands: ice.Commands{ }, 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) { 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)) m.Cmdy(mdb.INSERT, m.PrefixKey(), "", mdb.HASH, m.OptionSimple(mdb.ZONE))
}}, }},
@ -50,7 +50,7 @@ func init() {
m.Action(mdb.INSERT, JOIN) 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) { ice.CTX_INIT: {Hand: func(m *ice.Message, arg ...string) {
// m.Watch(web.SPACE_START, m.PrefixKey()) // m.Watch(web.SPACE_START, m.PrefixKey())
}}, }},

View File

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

View File

@ -1,18 +1,15 @@
Volcanos("onimport", {help: "导入数据", list: [], _init: function(can, msg, list, cb, target) { Volcanos(chat.ONIMPORT, {help: "导入数据", _init: function(can, msg, cb, target) {
can.onmotion.clear(can) can.onmotion.clear(can), can.base.isFunc(cb) && cb(msg)
can.onappend.table(can, msg) can.onappend.table(can, msg)
can.onappend.board(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) { scanQRCode: function(event, can, button) { can.user.agent.scanQRCode(function(text, data) {
var msg = can.request(event, data) can.runAction(can.request(event, data), data.action||button [], function(msg) {
can.run(event, can.base.Simple(ctx.ACTION, data.action||button, data), function(msg) { can.user.toastSuccess(can, text), can.Update()
can.user.toast(can, text, "添加成功"), can.Update()
}, true) }, true)
}, can) }, }, can) },
scanQRCode0: function(event, can) { can.user.agent.scanQRCode() },
}) })
Volcanos("onexport", {help: "导出数据", list: []})

View File

@ -11,7 +11,7 @@ const SEARCH = "search"
func init() { func init() {
Index.MergeCommands(ice.Commands{ 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() m.Cmdy(web.Space(m, m.Option(ice.POD)), mdb.SEARCH, arg).StatusTimeCount()
}}, }},
}) })

View File

@ -13,9 +13,14 @@ const SSO = "sso"
func init() { func init() {
Index.MergeCommands(ice.Commands{ 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) == "" { 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 return
} }
sessid := m.Cmdx(web.SPACE, m.Option(web.SPACE), aaa.SESS, mdb.CREATE, 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), aaa.USERNICK, m.Option(ice.MSG_USERNICK),
) )
m.RenderRedirect(kit.MergeURL(m.Option(cli.BACK), ice.MSG_SESSID, sessid)) 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] { switch arg[0] {
case mdb.HASH: 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) { 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) { mdb.REMOVE: {Name: "remove", Help: "删除", Hand: func(m *ice.Message, arg ...string) {
m.Cmdy(mdb.DELETE, RIVER, _river_key(m, STORM), mdb.HASH, m.OptionSimple(mdb.HASH)) m.Cmdy(mdb.DELETE, RIVER, _river_key(m, 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:]) 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) { 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) 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) { }, Hand: func(m *ice.Message, arg ...string) {
if len(arg) == 0 { // 应用列表 if len(arg) == 0 { // 应用列表
m.OptionFields("time,hash,type,name,count") m.OptionFields("time,hash,type,name,count")
@ -67,24 +50,20 @@ func init() {
return 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)) msg := m.Cmd(mdb.SELECT, RIVER, _storm_key(m, arg[0]), mdb.LIST, mdb.ID, kit.Select("", arg, 1))
if msg.Length() == 0 && len(arg) > 1 { // 虚拟群组 if 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 { // 执行命令 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 return
} }
if m.Copy(msg); len(arg) > 1 { // 命令插件 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.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" "path"
ice "shylinux.com/x/icebergs" ice "shylinux.com/x/icebergs"
"shylinux.com/x/icebergs/base/aaa"
"shylinux.com/x/icebergs/base/mdb" "shylinux.com/x/icebergs/base/mdb"
"shylinux.com/x/icebergs/base/nfs" "shylinux.com/x/icebergs/base/nfs"
"shylinux.com/x/icebergs/base/web" "shylinux.com/x/icebergs/base/web"
@ -23,7 +24,10 @@ func init() {
}, },
} }
Index.MergeCommands(ice.Commands{ 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) { mdb.INPUTS: {Name: "inputs", Help: "补全", Hand: func(m *ice.Message, arg ...string) {
switch arg[0] { switch arg[0] {
case "tags": case "tags":

View File

@ -12,23 +12,21 @@ import (
kit "shylinux.com/x/toolkits" kit "shylinux.com/x/toolkits"
) )
const (
SEND = "send"
FROM = "from"
TO = "to"
)
func init() { func init() {
const (
SEND = "send"
FROM = "from"
TO = "to"
)
Index.MergeCommands(ice.Commands{ 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) { 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")), 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.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.SHARE, m.Cmdx(web.SHARE, mdb.CREATE, mdb.TYPE, web.LOGIN),
), ),
) ).ProcessHold()
web.Toast(m, ice.SUCCESS, SEND) web.ToastSuccess(m, SEND)
m.ProcessHold()
}}, }},
ice.RUN: {Name: "run", Help: "执行", Hand: func(m *ice.Message, arg ...string) { ice.RUN: {Name: "run", Help: "执行", Hand: func(m *ice.Message, arg ...string) {
m.Option(ice.POD, m.Option("_pod")) m.Option(ice.POD, m.Option("_pod"))

View File

@ -7,6 +7,7 @@ import (
"strings" "strings"
ice "shylinux.com/x/icebergs" ice "shylinux.com/x/icebergs"
"shylinux.com/x/icebergs/base/aaa"
"shylinux.com/x/icebergs/base/ctx" "shylinux.com/x/icebergs/base/ctx"
"shylinux.com/x/icebergs/base/lex" "shylinux.com/x/icebergs/base/lex"
"shylinux.com/x/icebergs/base/mdb" "shylinux.com/x/icebergs/base/mdb"
@ -16,7 +17,7 @@ import (
) )
func _website_url(m *ice.Message, file string) string { 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) { func _website_parse(m *ice.Message, text string, args ...string) (ice.Map, bool) {
if text == "" { 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 { func _website_render(m *ice.Message, w http.ResponseWriter, r *http.Request, kind, text, name string) bool {
msg := m.Spawn(w, r) msg := m.Spawn(w, r)
m.Debug("what %v", kind)
switch kind { switch kind {
case nfs.ZML: case nfs.ZML:
web.RenderCmd(msg, "can.parse", text, name) 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) { func _website_search(m *ice.Message, kind, name, text string, arg ...string) {
m.Cmd(m.PrefixKey(), ice.OptionFields("")).Tables(func(value ice.Maps) { 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,74 +162,58 @@ const (
const WEBSITE = "website" const WEBSITE = "website"
func init() { func init() {
Index.MergeCommands(ice.Commands{"/website/": {Name: "/website/", Help: "网站", Actions: ctx.CmdAction()}, Index.MergeCommands(ice.Commands{
WEBSITE: {Name: "website path auto create import", Help: "网站", Actions: ice.MergeAction(ice.Actions{ WEBSITE: {Name: "website path auto create import", Help: "网站", Actions: ice.MergeActions(ice.Actions{
ice.CTX_INIT: {Hand: func(m *ice.Message, arg ...string) { ice.CTX_INIT: {Hand: func(m *ice.Message, arg ...string) {
m.Cmd(mdb.RENDER, mdb.CREATE, nfs.TXT, m.PrefixKey()) m.Cmd(mdb.RENDER, mdb.CREATE, nfs.TXT, m.PrefixKey())
m.Cmd(mdb.ENGINE, 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.RENDER, mdb.CREATE, nfs.IML, m.PrefixKey())
m.Cmd(mdb.ENGINE, 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 { web.AddRewrite(func(w http.ResponseWriter, r *http.Request) bool {
if r.Method != http.MethodGet { if r.Method != http.MethodGet {
return false 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) { 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)) _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 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 return false
}) })
}}, }},
lex.PARSE: {Hand: func(m *ice.Message, arg ...string) { lex.PARSE: {Hand: func(m *ice.Message, arg ...string) {
switch kit.Ext(arg[0]) { 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]))) 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 { 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)) m.Echo(_website_template2, kit.Format(res))
} }
default: default: // 缓存解析
if text := m.Cmd(m.PrefixKey(), ice.PS+arg[0]).Append(mdb.TEXT); text != "" { if text := m.CmdAppend("", path.Join(ice.PS, arg[0]), mdb.TEXT); text != "" {
if res, ok := _website_parse(m, text, arg[1:]...); ok { if res, ok := _website_parse(m, text, arg[1:]...); ok {
m.Echo(_website_template2, kit.Format(res)) 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) { mdb.INPUTS: {Name: "inputs", Help: "补全", Hand: func(m *ice.Message, arg ...string) {
switch m.Option(ctx.ACTION) { switch m.Option(ctx.ACTION) {
case mdb.CREATE: case mdb.CREATE:
m.Cmdy(mdb.INPUTS, m.PrefixKey(), "", mdb.HASH, arg) mdb.HashInputs(m, arg)
default: return
switch arg[0] { }
case nfs.PATH: switch arg[0] {
m.Cmdy(nfs.DIR, arg[1:]).ProcessAgain() 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.CREATE: {Name: "create path type=iml,zml,json,js,html name text", Help: "创建"},
@ -235,14 +221,24 @@ func init() {
m.Cmd(nfs.DIR, kit.Dict(nfs.DIR_ROOT, m.Option(nfs.PATH)), func(p 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) { 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: 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: 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.RENDER: {Hand: func(m *ice.Message, arg ...string) {
mdb.HashSelect(m, arg...).Tables(func(value ice.Maps) { m.PushAnchor(web.MergeWebsite(m, value[nfs.PATH])) }) 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 { // 文件列表 if len(arg) == 0 { // 文件列表
m.Cmd(nfs.DIR, SRC_WEBSITE, func(f os.FileInfo, p string) { m.Cmd(nfs.DIR, SRC_WEBSITE, func(f os.FileInfo, p string) {
m.Push("", kit.Dict( m.Push("", kit.Dict(
@ -253,13 +249,14 @@ func init() {
m.PushAnchor(web.MergeURL2(m, path.Join(CHAT_WEBSITE, strings.TrimPrefix(p, SRC_WEBSITE)))) m.PushAnchor(web.MergeURL2(m, path.Join(CHAT_WEBSITE, strings.TrimPrefix(p, SRC_WEBSITE))))
}).Sort(nfs.PATH) }).Sort(nfs.PATH)
} }
if m.Length() == 0 && len(arg) > 0 { // 文件详情 p := path.Join(SRC_WEBSITE, path.Join(arg...))
m.Push(mdb.TEXT, m.Cmdx(nfs.CAT, 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.Push(nfs.PATH, path.Join(CHAT_WEBSITE, path.Join(arg...)))
m.PushAnchor(web.MergeLink(m, m.Append(nfs.PATH))) m.PushAnchor(web.MergeLink(m, m.Append(nfs.PATH)))
} }
if m.Length() > 0 && len(arg) > 0 { // 文件预览
if len(arg) > 0 { // 文件预览
m.PushQRCode(mdb.SCAN, web.MergeURL2(m, m.Append(nfs.PATH))) m.PushQRCode(mdb.SCAN, web.MergeURL2(m, m.Append(nfs.PATH)))
m.EchoIFrame(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/mdb"
"shylinux.com/x/icebergs/base/nfs" "shylinux.com/x/icebergs/base/nfs"
"shylinux.com/x/icebergs/base/ssh" "shylinux.com/x/icebergs/base/ssh"
"shylinux.com/x/icebergs/base/tcp"
"shylinux.com/x/icebergs/base/web" "shylinux.com/x/icebergs/base/web"
kit "shylinux.com/x/toolkits" 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 { func _defs_list(m *ice.Message) string {
list := []string{mdb.LIST} list := []string{mdb.LIST}
switch m.Option(mdb.TYPE) { switch m.Option(mdb.TYPE) {
case "Hash":
list = append(list, "hash auto create")
case "Zone": case "Zone":
list = append(list, "zone id auto insert") list = append(list, "zone id auto insert")
case "Lists": case "Hash":
list = append(list, "id auto insert") list = append(list, "hash auto create")
case "Data": case "Data":
list = append(list, "path auto") list = append(list, "path auto")
case "Code": case "Code":
list = append(list, "port path auto start order build download") 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) { func _autogen_module(m *ice.Message, dir string) {
m.Cmd(nfs.DEFS, dir, `package {{.Option "zone"}} 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)) 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) { 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 == "" { if host == "" {
host = path.Base(kit.Path("")) host = path.Base(kit.Path(""))
} else { } else {
@ -134,7 +123,7 @@ func _autogen_gits(m *ice.Message, arg ...string) string {
return kit.Join(res, ice.NL) return kit.Join(res, ice.NL)
} }
func _autogen_version(m *ice.Message) { 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.Cmdy(cli.SYSTEM, GIT, ice.INIT)
m.Cmd(cli.SYSTEM, GIT, "remote", "add", "origin", "https://"+mod) 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) 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]) 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) { 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) {
_defs(m, mdb.ZONE, m.Option(mdb.NAME), mdb.HELP, m.Option(mdb.NAME)) m.OptionDefault(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))) 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))) m.Option(mdb.TEXT, kit.Format("`name:\"%s\" help:\"%s\"`", _defs_list(m), m.Option(mdb.HELP)))
nfs.OptionFiles(m, nfs.DiskFile) 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_module(m, p)
_autogen_import(m, path.Join(ice.SRC, m.Option(cli.MAIN)), m.Option(mdb.ZONE), _autogen_mod(m, ice.GO_MOD)) _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_script(m, p)
_autogen_source(m, path.Join(ice.SRC, m.Option(cli.MAIN)), p) _autogen_source(m, path.Join(ice.SRC, m.Option(cli.MAIN)), p)
} }
@ -200,7 +189,7 @@ func init() {
_autogen_version(m.Spawn()) _autogen_version(m.Spawn())
}}, }},
ssh.SCRIPT: {Name: "script", Help: "脚本:生成 etc/miss.sh", Hand: func(m *ice.Message, arg ...string) { 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) defer m.Cmdy(nfs.CAT, ice.ETC_MISS_SH)
m.Cmdy(nfs.DIR, 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) { BINPACK: {Name: "binpack", Help: "打包:生成 src/binpack.go", Hand: func(m *ice.Message, arg ...string) {
_autogen_version(m) _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(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.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") m.Cmdy(nfs.DIR, "usr/release/binpack.go")

View File

@ -4,12 +4,12 @@ import (
"io" "io"
"io/ioutil" "io/ioutil"
"net/http" "net/http"
"os"
"strings" "strings"
"sync/atomic" "sync/atomic"
ice "shylinux.com/x/icebergs" ice "shylinux.com/x/icebergs"
"shylinux.com/x/icebergs/base/mdb" "shylinux.com/x/icebergs/base/mdb"
"shylinux.com/x/icebergs/base/nfs"
kit "shylinux.com/x/toolkits" kit "shylinux.com/x/toolkits"
"shylinux.com/x/toolkits/util/bench" "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) { for _, v := range strings.Split(target, ice.NL) {
switch ls := kit.Split(v); ls[0] { switch ls := kit.Split(v); ls[0] {
case http.MethodPost: // POST,url,file 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() defer f.Close()
if req, err := http.NewRequest(http.MethodPost, ls[1], f); m.Assert(err) { if req, err := http.NewRequest(http.MethodPost, ls[1], f); m.Assert(err) {
@ -62,7 +62,7 @@ const BENCH = "bench"
func init() { func init() {
Index.MergeCommands(ice.Commands{ 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: "添加"}, 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) { ice.RUN: {Name: "run", Help: "执行", Hand: func(m *ice.Message, arg ...string) {
switch m.Option(mdb.TYPE) { switch m.Option(mdb.TYPE) {

View File

@ -3,8 +3,8 @@ package code
import ( import (
"encoding/base64" "encoding/base64"
"fmt" "fmt"
"io"
"io/ioutil" "io/ioutil"
"os"
"path" "path"
"strings" "strings"
@ -14,72 +14,59 @@ import (
kit "shylinux.com/x/toolkits" kit "shylinux.com/x/toolkits"
) )
func _binpack_file(m *ice.Message, arg ...string) string { // file name func _binpack_file(m *ice.Message, w io.Writer, arg ...string) { // file name
if f, e := os.Open(arg[0]); e == nil { if f, e := nfs.OpenFile(m, arg[0]); e == nil {
defer f.Close() defer f.Close()
if b, e := ioutil.ReadAll(f); e == nil && len(b) > 0 { 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_ROOT, dir)
m.Option(nfs.DIR_DEEP, true) m.Option(nfs.DIR_DEEP, true)
m.Option(nfs.DIR_TYPE, nfs.CAT) m.Option(nfs.DIR_TYPE, nfs.CAT)
m.Cmd(nfs.DIR, nfs.PWD).Sort(nfs.PATH).Tables(func(value ice.Maps) { m.Cmd(nfs.DIR, nfs.PWD).Sort(nfs.PATH).Tables(func(value ice.Maps) {
switch path.Base(value[nfs.PATH]) { 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 return
} }
switch strings.Split(value[nfs.PATH], ice.PS)[0] { switch strings.Split(value[nfs.PATH], ice.PS)[0] {
case "var", "polaris", "website": case ice.BIN, ice.VAR, "website", "polaris":
return 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_ROOT, dir)
m.Option(nfs.DIR_DEEP, true) m.Option(nfs.DIR_DEEP, true)
m.Option(nfs.DIR_TYPE, nfs.CAT) m.Option(nfs.DIR_TYPE, nfs.CAT)
for _, k := range []string{ice.FAVICON, ice.PROTO_JS, ice.FRAME_JS} { 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)) _binpack_file(m, w, path.Join(dir, k), path.Join(ice.USR_VOLCANOS, k))
fmt.Fprintln(f, _binpack_file(m, path.Join(dir, k), path.Join(ice.USR_VOLCANOS, k)))
} }
for _, k := range []string{LIB, PAGE, PANEL, PLUGIN, "publish/client/nodejs/"} { for _, k := range []string{LIB, PAGE, PANEL, PLUGIN, "publish/client/nodejs/"} {
m.Cmd(nfs.DIR, k).Sort(nfs.PATH).Tables(func(value ice.Maps) { 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])) _binpack_file(m, w, path.Join(dir, value[nfs.PATH]), path.Join(ice.USR_VOLCANOS, value[nfs.PATH]))
fmt.Fprintln(f, _binpack_file(m, 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) { func _binpack_ctx(m *ice.Message, w io.Writer) {
_binpack_dir(m, f, ice.SRC) _binpack_dir(m, w, ice.SRC)
} }
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)
const BINPACK = "binpack" fmt.Fprintln(w, `package main
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()
defer m.Echo(p)
fmt.Fprintln(f, `package main
import ( import (
"encoding/base64" "encoding/base64"
@ -89,9 +76,9 @@ import (
func init() { func init() {
`) `)
defer fmt.Fprintln(f, `}`) defer fmt.Fprintln(w, `}`)
defer fmt.Fprintln(f, ` defer fmt.Fprintln(w, `
for k, v := range pack { for k, v := range pack {
if b, e := base64.StdEncoding.DecodeString(v); e == nil { if b, e := base64.StdEncoding.DecodeString(v); e == nil {
nfs.PackFile.WriteFile(k, b) nfs.PackFile.WriteFile(k, b)
@ -99,40 +86,50 @@ func init() {
} }
`) `)
fmt.Fprintln(f, ` pack := ice.Maps{`) fmt.Fprintln(w, ` pack := ice.Maps{`)
defer fmt.Fprintln(f, ` }`) defer fmt.Fprintln(w, ` }`)
if kit.FileExists(ice.USR_VOLCANOS) && kit.FileExists(ice.USR_INTSHELL) && m.Option(ice.MSG_USERPOD) == "" { if nfs.ExistsFile(m, ice.USR_VOLCANOS) && nfs.ExistsFile(m, ice.USR_INTSHELL) && m.Option(ice.MSG_USERPOD) == "" {
_binpack_can(m, f, ice.USR_VOLCANOS) _binpack_can(m, w, ice.USR_VOLCANOS)
_binpack_dir(m, f, ice.USR_INTSHELL) _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)) _binpack_file(m, w, ice.ETC_MISS_SH)
fmt.Fprintln(f, _binpack_file(m, ice.ETC_INIT_SHY)) _binpack_file(m, w, ice.ETC_INIT_SHY)
fmt.Fprintln(f, _binpack_file(m, ice.ETC_EXIT_SHY)) _binpack_file(m, w, ice.ETC_EXIT_SHY)
fmt.Fprintln(f) fmt.Fprintln(w)
fmt.Fprintln(f, _binpack_file(m, ice.LICENSE)) _binpack_file(m, w, ice.LICENSE)
fmt.Fprintln(f, _binpack_file(m, ice.MAKEFILE)) _binpack_file(m, w, ice.MAKEFILE)
fmt.Fprintln(f, _binpack_file(m, ice.README_MD)) _binpack_file(m, w, ice.README_MD)
fmt.Fprintln(f) fmt.Fprintln(w)
m.Cmd(mdb.SELECT, m.PrefixKey(), "", mdb.HASH, ice.OptionFields(nfs.PATH)).Tables(func(value ice.Maps) { mdb.HashSelects(m).Sort(nfs.PATH).Tables(func(value ice.Maps) {
if s, e := os.Stat(value[nfs.PATH]); e == nil { if s, e := nfs.StatFile(m, value[nfs.PATH]); e == nil {
if s.IsDir() { if s.IsDir() {
_binpack_dir(m, f, value[nfs.PATH]) _binpack_dir(m, w, value[nfs.PATH])
} else { } 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) { mdb.INSERT: {Name: "insert path", Help: "添加", Hand: func(m *ice.Message, arg ...string) {
m.Cmd(mdb.INSERT, m.PrefixKey(), "", mdb.HASH, nfs.PATH, arg[0]) mdb.HashCreate(m, nfs.PATH, m.Option(nfs.PATH))
}}, }},
}, mdb.HashAction(mdb.SHORT, nfs.PATH)), Hand: func(m *ice.Message, arg ...string) { }, 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() { func init() {
Index.Register(&ice.Context{Name: C, Help: "系统", Commands: ice.Commands{ 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) { ice.CTX_INIT: {Hand: func(m *ice.Message, arg ...string) {
for _, cmd := range []string{mdb.SEARCH, mdb.ENGINE, mdb.RENDER, mdb.PLUGIN} { for _, cmd := range []string{mdb.SEARCH, mdb.ENGINE, mdb.RENDER, mdb.PLUGIN} {
for _, k := range []string{H, C, CC} { for _, k := range []string{H, C, CC} {
@ -79,7 +79,7 @@ func init() {
// _go_grep(m, kit.Select(cli.MAIN, arg, 1), arg[2]) // _go_grep(m, kit.Select(cli.MAIN, arg, 1), arg[2])
}}, }},
}, PlugAction())}, }, 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) { ice.CTX_INIT: {Hand: func(m *ice.Message, arg ...string) {
for _, cmd := range []string{mdb.SEARCH, mdb.RENDER, mdb.PLUGIN} { for _, cmd := range []string{mdb.SEARCH, mdb.RENDER, mdb.PLUGIN} {
for _, k := range []string{MAN1, MAN2, MAN3, MAN8} { for _, k := range []string{MAN1, MAN2, MAN3, MAN8} {

View File

@ -16,7 +16,7 @@ const CASE = "case"
func init() { func init() {
Index.MergeCommands(ice.Commands{ 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) { mdb.CREATE: {Name: "create name address", Help: "创建", Hand: func(m *ice.Message, arg ...string) {
m.Cmdy(web.SPIDE, mdb.CREATE, arg) m.Cmdy(web.SPIDE, mdb.CREATE, arg)
}}, }},

View File

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

View File

@ -1,27 +1,33 @@
chapter "源码" chapter "源码"
code.go
code.shy
install.go
webpack.go webpack.go
binpack.go binpack.go
autogen.go autogen.go
compile.go compile.go
publish.go publish.go
upgrade.go upgrade.go
install.go
favor.go xterm.shy
inner.go xterm.go
vimer.go vimer.go
inner.go
favor.go
bench.go bench.go
pprof.go pprof.go
case.go oauth.go
c.go c.go
sh.go sh.go
shy.go
go.go go.go
js.go js.go
shy.go py.go
zml.go
code.go
code.shy
sess.go
template.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"), cli.ENV, kit.Dict("GOPROXY", "https://goproxy.cn,direct", "GOPRIVATE", "shylinux.com,github.com", "CGO_ENABLED", "0"),
)}, )},
}, Commands: ice.Commands{ }, 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) { 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) 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) { BINPACK: {Name: "binpack", Help: "打包", Hand: func(m *ice.Message, arg ...string) {
m.Cmdy(AUTOGEN, BINPACK) m.Cmdy(AUTOGEN, BINPACK)
}}, }},

View File

@ -4,7 +4,6 @@ import (
ice "shylinux.com/x/icebergs" ice "shylinux.com/x/icebergs"
"shylinux.com/x/icebergs/base/ctx" "shylinux.com/x/icebergs/base/ctx"
"shylinux.com/x/icebergs/base/mdb" "shylinux.com/x/icebergs/base/mdb"
"shylinux.com/x/icebergs/base/nfs"
kit "shylinux.com/x/toolkits" kit "shylinux.com/x/toolkits"
) )
@ -12,22 +11,11 @@ const FAVOR = "favor"
func init() { func init() {
Index.MergeCommands(ice.Commands{ 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: "添加"}, 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) { INNER: {Name: "inner", Help: "源码", Hand: func(m *ice.Message, arg ...string) {
ctx.ProcessCommand(m, INNER, m.OptionSplit("path,file,line"), arg...) 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.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)) 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)) 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) { 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() m.Cmdy(cli.SYSTEM, GO, "doc", strings.TrimSuffix(arg[1], ice.PT+arg[0]), kit.Dict(cli.CMD_DIR, arg[2])).SetAppend()
}}, }},
}, PlugAction())}, }, 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.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])) }}, mdb.ENGINE: {Hand: func(m *ice.Message, arg ...string) { _sum_show(m, path.Join(arg[2], arg[1])) }},
}, PlugAction())}, }, 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.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])) }}, mdb.ENGINE: {Hand: func(m *ice.Message, arg ...string) { _mod_show(m, path.Join(arg[2], arg[1])) }},
}, PlugAction())}, }, 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) { mdb.SEARCH: {Hand: func(m *ice.Message, arg ...string) {
if arg[0] == GO { if arg[0] == GO {
_go_tags(m, kit.Select(cli.MAIN, arg, 1)) _go_tags(m, kit.Select(cli.MAIN, arg, 1))

View File

@ -100,7 +100,7 @@ const INNER = "inner"
func init() { func init() {
Index.Merge(&ice.Context{Commands: ice.Commands{ 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) { mdb.PLUGIN: {Name: "plugin", Help: "插件", Hand: func(m *ice.Message, arg ...string) {
if m.Cmdy(mdb.PLUGIN, arg); m.Result() == "" { if m.Cmdy(mdb.PLUGIN, arg); m.Result() == "" {
m.Echo(kit.Select("{}", m.Config(kit.Keys(PLUG, arg[0])))) 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/tcp"
"shylinux.com/x/icebergs/base/web" "shylinux.com/x/icebergs/base/web"
kit "shylinux.com/x/toolkits" kit "shylinux.com/x/toolkits"
"shylinux.com/x/toolkits/file"
) )
func _install_path(m *ice.Message, link string) string { func _install_path(m *ice.Message, link string) string {
link = kit.Select(m.Option(mdb.LINK), link) 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 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]) 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 "" return ""
} }
func _install_download(m *ice.Message) { func _install_download(m *ice.Message) {
@ -32,34 +31,29 @@ func _install_download(m *ice.Message) {
name := path.Base(strings.Split(link, "?")[0]) name := path.Base(strings.Split(link, "?")[0])
file := path.Join(kit.Select(ice.USR_INSTALL, m.Option(nfs.PATH)), name) file := path.Join(kit.Select(ice.USR_INSTALL, m.Option(nfs.PATH)), name)
defer m.Cmdy(nfs.DIR, file) if nfs.ExistsFile(m, file) {
if kit.FileExists(file) { web.ToastSuccess(m)
m.Cmdy(nfs.DIR, file)
return // 文件存在 return // 文件存在
} }
// 创建文件
m.Cmd(nfs.SAVE, file, "") m.Cmd(nfs.SAVE, file, "")
web.GoToast(m, web.DOWNLOAD, func(toast func(string, int, int)) { 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) mdb.HashCreate(m, mdb.NAME, name, nfs.PATH, file, mdb.LINK, link)
defer web.ToastSuccess(m) 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) {
// 下载进度
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) {
value[mdb.COUNT], value[mdb.TOTAL], value[mdb.VALUE] = count, total, step value[mdb.COUNT], value[mdb.TOTAL], value[mdb.VALUE] = count, total, step
toast(name, count, total)
}) })
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))) 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 { func _install_build(m *ice.Message, arg ...string) string {
p := m.Option(cli.CMD_DIR, _install_path(m, "")) 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) web.PushStream(m)
@ -91,7 +85,7 @@ func _install_order(m *ice.Message, arg ...string) {
} }
func _install_spawn(m *ice.Message, arg ...string) { func _install_spawn(m *ice.Message, arg ...string) {
if kit.Int(m.Option(tcp.PORT)) >= 10000 { 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) m.Echo(p)
return return
} }
@ -101,13 +95,13 @@ func _install_spawn(m *ice.Message, arg ...string) {
target := path.Join(ice.USR_LOCAL_DAEMON, m.Option(tcp.PORT)) target := path.Join(ice.USR_LOCAL_DAEMON, m.Option(tcp.PORT))
source := _install_path(m, "") source := _install_path(m, "")
file.MkdirAll(target, ice.MOD_DIR) nfs.MkdirAll(m, target)
defer m.Echo(target) defer m.Echo(target)
if m.Option(INSTALL) == "" && kit.FileExists(kit.Path(source, "_install")) { if m.Option(INSTALL) == "" && nfs.ExistsFile(m, kit.Path(source, _INSTALL)) {
m.Option(INSTALL, "_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) 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)...) args = append(args, cb(p)...)
case func(string): case func(string):
cb(p) cb(p)
case nil:
default: default:
m.ErrorNotImplement(cb) m.ErrorNotImplement(cb)
} }
@ -129,7 +124,7 @@ func _install_start(m *ice.Message, arg ...string) {
} }
} }
func _install_stop(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) { if value[cli.PID] == m.Option(cli.PID) {
m.Cmd(cli.DAEMON, cli.STOP, kit.Dict(mdb.HASH, value[mdb.HASH])) 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) { func _install_service(m *ice.Message, arg ...string) {
arg = kit.Split(path.Base(arg[0]), "-.")[:1] arg = kit.Split(path.Base(arg[0]), "-.")[:1]
m.Fields(len(arg[1:]), "time,port,status,pid,cmd,dir") 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])) { if strings.Contains(value[ice.CMD], path.Join(ice.BIN, arg[0])) {
m.Push("", value, kit.Split(m.OptionFields())) m.Push("", value, kit.Split(m.OptionFields()))
} }
@ -149,23 +144,17 @@ func _install_service(m *ice.Message, arg ...string) {
} }
const ( const (
PREPARE = "prepare" PREPARE = "prepare"
_INSTALL = "_install"
) )
const INSTALL = "install" const INSTALL = "install"
func init() { func init() {
Index.MergeCommands(ice.Commands{ 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) { web.DOWNLOAD: {Name: "download link path", Help: "下载", Hand: func(m *ice.Message, arg ...string) {
_install_download(m) _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) { cli.BUILD: {Name: "build link", Help: "构建", Hand: func(m *ice.Message, arg ...string) {
if err := _install_build(m, arg...); err != "" { if err := _install_build(m, arg...); err != "" {
web.ToastFailure(m, cli.BUILD) web.ToastFailure(m, cli.BUILD)
@ -186,7 +175,14 @@ func init() {
cli.STOP: {Name: "stop", Help: "停止", Hand: func(m *ice.Message, arg ...string) { cli.STOP: {Name: "stop", Help: "停止", Hand: func(m *ice.Message, arg ...string) {
_install_stop(m, arg...) _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) { switch len(arg) {
case 0: // 源码列表 case 0: // 源码列表
mdb.HashSelect(m, arg...) mdb.HashSelect(m, arg...)
@ -211,23 +207,10 @@ func InstallAction(args ...ice.Any) ice.Actions {
m.Cmdy(INSTALL, cli.BUILD, m.Config(nfs.SOURCE)) m.Cmdy(INSTALL, cli.BUILD, m.Config(nfs.SOURCE))
}}, }},
cli.ORDER: {Name: "order", Help: "加载", Hand: func(m *ice.Message, arg ...string) { 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) { nfs.TRASH: {Name: "trash", Help: "删除", Hand: func(m *ice.Message, arg ...string) {
m.Cmd(nfs.TRASH, m.Option(nfs.PATH)) 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() { func init() {
Index.Register(&ice.Context{Name: JS, Help: "前端", Commands: ice.Commands{ 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) { ice.CTX_INIT: {Hand: func(m *ice.Message, arg ...string) {
for _, cmd := range []string{mdb.SEARCH, mdb.ENGINE, mdb.RENDER, mdb.PLUGIN} { for _, cmd := range []string{mdb.SEARCH, mdb.ENGINE, mdb.RENDER, mdb.PLUGIN} {
m.Cmd(cmd, mdb.CREATE, JSON, m.PrefixKey()) m.Cmd(cmd, mdb.CREATE, JSON, m.PrefixKey())

View File

@ -23,7 +23,7 @@ func init() {
API_GITHUB = "https://api.github.com/" API_GITHUB = "https://api.github.com/"
) )
Index.MergeCommands(ice.Commands{ 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) { 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} { for _, k := range []string{CLIENT_ID, CLIENT_SECRET, REDIRECT_URI} {
m.Config(k, kit.Select(m.Config(k), m.Option(k))) 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") m.Cmdy(aaa.RSA).Cut("hash,title,public")
return 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) { 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) { ACCESS_TOKEN: {Name: "access_token", Help: "令牌", Hand: func(m *ice.Message, arg ...string) {
m.Option(web.SPIDE_HEADER, web.Accept, web.ContentJSON) 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))) data := web.SpidePost(m, 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)) mdb.HashModify(m, m.OptionSimple(mdb.HASH), kit.Simple(data))
}}, }},
"public": {Name: "public hash", Help: "公钥", Hand: func(m *ice.Message, arg ...string) { "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)) 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)) 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") m.Echo("https://github.com/settings/keys")
}}, }},
"user": {Name: "user", Help: "用户", Hand: func(m *ice.Message, arg ...string) { "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)) 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")) mdb.HashModify(m, m.OptionSimple(mdb.HASH), kit.Simple(web.SpideGet(m, API_GITHUB+"user")))
m.Cmdy(mdb.MODIFY, m.PrefixKey(), "", mdb.HASH, m.OptionSimple(mdb.HASH), kit.Simple(data))
}}, }},
mdb.DELETE: {Name: "delete", Help: "删除", Hand: func(m *ice.Message, arg ...string) { mdb.DELETE: {Name: "delete", Help: "删除", Hand: func(m *ice.Message, arg ...string) {
mdb.HashSelect(m, m.Option(mdb.HASH)) mdb.HashSelect(m, m.Option(mdb.HASH))
m.Option(web.SPIDE_HEADER, web.Accept, web.ContentJSON, web.Authorization, "token "+m.Append(ACCESS_TOKEN)) 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) { }, 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 { 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 { } else if len(arg) == 1 {
m.Option(web.SPIDE_HEADER, web.Accept, web.ContentJSON, web.Authorization, "token "+m.Append(ACCESS_TOKEN)) m.Option(web.SPIDE_HEADER, web.Accept, web.ContentJSON, web.Authorization, "token "+m.Append(ACCESS_TOKEN))
m.SetAppend() m.SetAppend()
m.Debug("what %v", m.FormatMeta()) kit.Fetch(web.SpideGet(m, API_GITHUB+"user/keys"), func(index int, value ice.Map) {
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) {
m.PushRecord(value, "created_at,title,id,key") m.PushRecord(value, "created_at,title,id,key")
}) })
m.PushAction(mdb.DELETE) 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) != "" { if m.Option(CODE) != "" {
web.RenderCmd(m, m.PrefixKey(), m.Cmdx(m.PrefixKey(), mdb.CREATE, m.OptionSimple(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() { func init() {
Index.MergeCommands(ice.Commands{ 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) { ice.CTX_INIT: {Hand: func(m *ice.Message, arg ...string) {
web.AddRewrite(func(w http.ResponseWriter, r *http.Request) bool { web.AddRewrite(func(w http.ResponseWriter, r *http.Request) bool {
if p := r.URL.Path; strings.HasPrefix(p, "/debug") { 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) m.Cmdy(nfs.DIR, ice.BIN, nfs.DIR_CLI_FIELDS).RenameAppend(nfs.PATH, BINNARY)
case SERVICE: case SERVICE:
m.Cmd(web.SPIDE).Tables(func(value ice.Maps) { 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)) 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(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.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() m.Echo(m.Option(mdb.TEXT)).ProcessInner()
}}, }},
web.SERVE: {Name: "serve", Help: "展示", Hand: func(m *ice.Message, arg ...string) { 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) 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.Cmd(cli.DAEMON, m.Configv(PPROF), "-http="+p, m.Option(BINNARY), m.Option(nfs.FILE))
m.Echo("http://%s/ui/top", p).ProcessInner() 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/gdb"
"shylinux.com/x/icebergs/base/mdb" "shylinux.com/x/icebergs/base/mdb"
"shylinux.com/x/icebergs/base/nfs" "shylinux.com/x/icebergs/base/nfs"
"shylinux.com/x/icebergs/base/tcp"
"shylinux.com/x/icebergs/base/web" "shylinux.com/x/icebergs/base/web"
kit "shylinux.com/x/toolkits" 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)) arg = kit.Simple(kit.Keys(ice.ICE, runtime.GOOS, runtime.GOARCH))
file = cli.SystemFind(m, os.Args[0]) 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) file = m.Cmdx(nfs.TAR, mdb.IMPORT, path.Base(file), file)
defer func() { os.Remove(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.Logs(mdb.EXPORT, PUBLISH, target, cli.FROM, file)
m.Cmd(nfs.LINK, target, file) m.Cmd(nfs.LINK, target, file)
return target return target
} }
func _publish_list(m *ice.Message, arg ...string) { func _publish_list(m *ice.Message, arg ...string) {
m.Option(nfs.DIR_DEEP, true) 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.Option(nfs.DIR_REG, kit.Select("", arg, 0))
m.Cmdy(nfs.DIR, nfs.PWD, kit.Select(nfs.DIR_WEB_FIELDS, arg, 1)) 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) { func _publish_bin_list(m *ice.Message, dir string) {
p := m.Option(cli.CMD_DIR, dir) p := m.Option(cli.CMD_DIR, dir)
@ -62,11 +62,11 @@ const PUBLISH = "publish"
func init() { func init() {
Index.Merge(&ice.Context{Configs: ice.Configs{ 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{ }, Commands: ice.Commands{
PUBLISH: {Name: "publish path auto create volcanos icebergs intshell", Help: "发布", Actions: ice.Actions{ PUBLISH: {Name: "publish path auto create volcanos icebergs intshell", Help: "发布", Actions: ice.Actions{
ice.CTX_INIT: {Hand: func(m *ice.Message, arg ...string) { 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.Cmd(aaa.ROLE, aaa.WHITE, aaa.VOID, m.PrefixKey())
m.Config(ice.CONTEXTS, _contexts) m.Config(ice.CONTEXTS, _contexts)
gdb.Watch(m, web.SERVE_START, m.PrefixKey()) 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) { web.SERVE_START: {Name: "serve.start", Help: "服务启动", Hand: func(m *ice.Message, arg ...string) {
_publish_file(m, ice.ICE_BIN) _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) { ice.VOLCANOS: {Name: "volcanos", Help: "火山架", Hand: func(m *ice.Message, arg ...string) {
defer func() { m.EchoQRCode(m.Option(ice.MSG_USERWEB)) }() defer func() { m.EchoQRCode(m.Option(ice.MSG_USERWEB)) }()
defer func() { m.Cmdy(PUBLISH, ice.CONTEXTS) }() 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) { ice.ICEBERGS: {Name: "icebergs", Help: "冰山架", Hand: func(m *ice.Message, arg ...string) {
defer func() { m.Cmdy(PUBLISH, ice.CONTEXTS) }() defer func() { m.Cmdy(PUBLISH, ice.CONTEXTS) }()
m.Cmd(PUBLISH, mdb.CREATE, nfs.FILE, ice.BIN_ICE_BIN) _publish_bin_list(m, ice.USR_PUBLISH)
_publish_bin_list(m, m.Config(nfs.PATH))
}}, }},
ice.INTSHELL: {Name: "intshell", Help: "神农架", Hand: func(m *ice.Message, arg ...string) { ice.INTSHELL: {Name: "intshell", Help: "神农架", Hand: func(m *ice.Message, arg ...string) {
defer func() { m.Cmdy(PUBLISH, ice.CONTEXTS) }() defer func() { m.Cmdy(PUBLISH, ice.CONTEXTS) }()
_publish_list(m, `.*\.(sh|vim|conf)$`) _publish_list(m, `.*\.(sh|vim|conf)$`)
}}, }},
ice.CONTEXTS: {Name: "contexts", Help: "环境", Hand: func(m *ice.Message, arg ...string) { 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], 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 { if len(arg) == 0 {
arg = append(arg, ice.MISC, ice.CORE, ice.BASE) arg = append(arg, ice.MISC, ice.CORE, ice.BASE)
@ -105,13 +98,13 @@ func init() {
for _, k := range arg { for _, k := range arg {
switch k { switch k {
case ice.MISC: 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")) m.Cmd(nfs.LINK, bin, m.Cmdx(cli.RUNTIME, "boot.bin"))
} }
case ice.CORE: case ice.CORE:
if !kit.FileExists(".git") { if !nfs.ExistsFile(m, ".git") {
repos := web.MergeURL2(m, "/x/"+m.Option(ice.MSG_USERPOD)) 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", "init")
m.Cmd(cli.SYSTEM, "git", "remote", "add", "origin", repos) m.Cmd(cli.SYSTEM, "git", "remote", "add", "origin", repos)
m.Cmd("web.code.git.repos", mdb.CREATE, repos, "master", "", nfs.PWD) 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)) _publish_file(m, m.Option(nfs.FILE))
}}, }},
nfs.TRASH: {Name: "trash", Help: "删除", Hand: func(m *ice.Message, arg ...string) { 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) { mdb.EXPORT: {Name: "export", Help: "工具链", Hand: func(m *ice.Message, arg ...string) {
var list = []string{ice.ETC_PATH} var list = []string{ice.ETC_PATH}
@ -159,7 +152,7 @@ func init() {
m.Cmd("web.code.git.server", mdb.IMPORT) m.Cmd("web.code.git.server", mdb.IMPORT)
}}, }},
}, Hand: func(m *ice.Message, arg ...string) { }, 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) m.Cmdy(nfs.DIR, kit.Select("", arg, 0), nfs.DIR_WEB_FIELDS)
}}, }},
}}) }})

View File

@ -29,7 +29,7 @@ const PY = nfs.PY
func init() { func init() {
Index.Merge(&ice.Context{Commands: ice.Commands{ 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) { ice.CTX_INIT: {Hand: func(m *ice.Message, arg ...string) {
m.Cmd(mdb.ENGINE, mdb.CREATE, PY, m.PrefixKey()) m.Cmd(mdb.ENGINE, mdb.CREATE, PY, m.PrefixKey())
m.Cmd(mdb.RENDER, 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() { func init() {
Index.Register(&ice.Context{Name: SH, Help: "命令", Commands: ice.Commands{ 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) { 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} { for _, cmd := range []string{mdb.SEARCH, mdb.ENGINE, mdb.RENDER, mdb.PLUGIN} {
m.Cmd(cmd, mdb.CREATE, m.CommandKey(), m.PrefixKey()) m.Cmd(cmd, mdb.CREATE, m.CommandKey(), m.PrefixKey())

View File

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

View File

@ -14,7 +14,7 @@ const TEMPLATE = "template"
func init() { func init() {
Index.MergeCommands(ice.Commands{ 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) { ice.CTX_INIT: {Hand: func(m *ice.Message, arg ...string) {
for _, _template := range _template_list { for _, _template := range _template_list {
m.Cmd(TEMPLATE, mdb.CREATE, kit.SimpleKV(kit.Format(_template[0]), _template[1:]...)) m.Cmd(TEMPLATE, mdb.CREATE, kit.SimpleKV(kit.Format(_template[0]), _template[1:]...))

View File

@ -18,20 +18,20 @@ const UPGRADE = "upgrade"
func init() { func init() {
Index.Merge(&ice.Context{Configs: ice.Configs{ Index.Merge(&ice.Context{Configs: ice.Configs{
UPGRADE: {Name: UPGRADE, Help: "升级", Value: kit.Dict(mdb.HASH, kit.Dict( 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.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, "tar", nfs.FILE, "contexts.src.tar.gz")), 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, "tar", nfs.FILE, "contexts.bin.tar.gz")), nfs.BINARY, kit.Dict(mdb.LIST, kit.List(mdb.TYPE, nfs.TAR, nfs.FILE, "contexts.bin.tar.gz")),
))}, ))},
}, Commands: ice.Commands{ }, Commands: ice.Commands{
UPGRADE: {Name: "upgrade item=target,source,binary run restart", Help: "升级", Actions: ice.Actions{ 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) { 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) { }, 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 { // 程序文件 if value[nfs.FILE] == ice.ICE_BIN { // 程序文件
value[nfs.FILE] = kit.Keys(ice.ICE, runtime.GOOS, runtime.GOARCH) 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) m.Option(ice.EXIT, ice.TRUE)
} }
@ -39,14 +39,14 @@ func init() {
dir := kit.Select(kit.Format(value[nfs.FILE]), value[nfs.PATH]) 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])) m.Cmd(web.SPIDE, ice.DEV, web.SPIDE_SAVE, dir, web.SPIDE_GET, "/publish/"+kit.Format(value[nfs.FILE]))
switch value[mdb.TYPE] { switch value[mdb.TYPE] {
case "bin": case ice.BIN:
os.Chmod(dir, 0755) os.Chmod(dir, 0755)
case "tar": case nfs.TAR:
m.Cmd(nfs.TAR, mdb.EXPORT, dir, "-C", path.Dir(dir)) m.Cmd(nfs.TAR, mdb.EXPORT, dir, "-C", path.Dir(dir))
} }
}) })
if web.ToastSuccess(m); m.Option(ice.EXIT) == ice.TRUE { 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) web.ToastRestart(m)
} }
}}, }},

View File

@ -10,6 +10,7 @@ import (
"shylinux.com/x/icebergs/base/mdb" "shylinux.com/x/icebergs/base/mdb"
"shylinux.com/x/icebergs/base/nfs" "shylinux.com/x/icebergs/base/nfs"
"shylinux.com/x/icebergs/base/web" "shylinux.com/x/icebergs/base/web"
"shylinux.com/x/icebergs/core/chat"
kit "shylinux.com/x/toolkits" 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) { mdb.SEARCH: {Name: "search type name text", Help: "搜索", Hand: func(m *ice.Message, arg ...string) {
if arg[0] == mdb.FOREACH && arg[1] == "" { 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) { mdb.INPUTS: {Name: "inputs", Help: "补全", Hand: func(m *ice.Message, arg ...string) {

View File

@ -2,6 +2,7 @@ package code
import ( import (
"fmt" "fmt"
"io"
"os" "os"
"path" "path"
"strings" "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.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)) 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) { func _webpack_cache(m *ice.Message, dir string, write bool) {
if _, e := nfs.DiskFile.StatFile(ice.USR_VOLCANOS); os.IsNotExist(e) { if _, e := nfs.DiskFile.StatFile(ice.USR_VOLCANOS); os.IsNotExist(e) {
return 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) m.Assert(e)
defer css.Close() 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) m.Assert(e)
defer js.Close() defer js.Close()
defer fmt.Fprintln(js, `_can_name = ""`) defer fmt.Fprintln(js, `_can_name = ""`)
defer _webpack_can(m) defer _webpack_can(m)
if !write { if !write {
return return
} }
m.Option(nfs.DIR_ROOT, "") m.Option(nfs.DIR_ROOT, dir)
m.Option(nfs.DIR_DEEP, true) m.Option(nfs.DIR_DEEP, true)
m.Option(nfs.DIR_TYPE, nfs.CAT) 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} { for _, k := range []string{LIB, PANEL, PLUGIN} {
m.Cmd(nfs.DIR, k).Sort(nfs.PATH).Tables(func(value ice.Maps) { m.Cmd(nfs.DIR, k).Sort(nfs.PATH).Tables(func(value ice.Maps) {
if kit.Ext(value[nfs.PATH]) == CSS { if kit.Ext(value[nfs.PATH]) == CSS {
fmt.Fprintln(css, kit.Format("/* %s */", path.Join(ice.PS, value[nfs.PATH]))) _webpack_css(m, css, js, 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])+`"] = []`)
} }
}) })
} }
@ -70,45 +74,37 @@ func _webpack_cache(m *ice.Message, dir string, write bool) {
for _, k := range []string{LIB, PANEL, PLUGIN} { for _, k := range []string{LIB, PANEL, PLUGIN} {
m.Cmd(nfs.DIR, k).Sort(nfs.PATH).Tables(func(value ice.Maps) { m.Cmd(nfs.DIR, k).Sort(nfs.PATH).Tables(func(value ice.Maps) {
if kit.Ext(value[nfs.PATH]) == JS { if kit.Ext(value[nfs.PATH]) == JS {
fmt.Fprintln(js, `_can_name = "`+path.Join(ice.PS, value[nfs.PATH])+`"`) _webpack_js(m, js, value[nfs.PATH])
fmt.Fprintln(js, m.Cmdx(nfs.CAT, value[nfs.PATH]))
} }
}) })
} }
for _, k := range []string{ice.FRAME_JS} { for _, k := range []string{ice.FRAME_JS} {
fmt.Fprintln(js, `_can_name = "`+path.Join(ice.PS, k)+`"`) _webpack_js(m, js, k)
fmt.Fprintln(js, m.Cmdx(nfs.CAT, 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) defer fmt.Fprintln(js)
p := value[nfs.PATH] p := value[nfs.PATH]
switch kit.Ext(p) { switch kit.Ext(p) {
case nfs.CSS: case nfs.CSS:
fmt.Fprintln(css, kit.Format("/* %s */", path.Join("/require/node_modules/", p))) _webpack_css(m, css, js, path.Join(ice.REQUIRE, ice.NODE_MODULES, ice.LIB, 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)+`"] = []`)
return return
case nfs.JS: case nfs.JS:
default: default:
p = p + "/lib/" + p + ".js" p = p + "/lib/" + p + ".js"
} }
_webpack_node(m, js, path.Join(ice.REQUIRE, ice.NODE_MODULES, ice.LIB, p))
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)+`"] = []`)
}) })
} }
func _webpack_build(m *ice.Message, file string) { 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() defer f.Close()
fmt.Fprintln(f, `Volcanos.meta.webpack = true`) 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.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))...)))) 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 f.Close()
defer m.Echo(p) defer m.Echo(p)
@ -142,13 +138,12 @@ const (
PLUGIN = "plugin" PLUGIN = "plugin"
) )
const ( const (
PUBLISH_ORDER_JS = "publish/order.js" PAGE_INDEX_CSS = "page/index.css"
PAGE_INDEX_CSS = "page/index.css" PAGE_CACHE_CSS = "page/cache.css"
PAGE_CACHE_CSS = "page/cache.css" PAGE_CACHE_JS = "page/cache.js"
PAGE_CACHE_JS = "page/cache.js" PAGE_INDEX_JS = "page/index.js"
PAGE_INDEX_JS = "page/index.js" PAGE_CAN_CSS = "page/can.css"
PAGE_CAN_CSS = "page/can.css" PAGE_CAN_JS = "page/can.js"
PAGE_CAN_JS = "page/can.js"
) )
const DEVPACK = "devpack" const DEVPACK = "devpack"
@ -156,26 +151,26 @@ const WEBPACK = "webpack"
func init() { func init() {
Index.MergeCommands(ice.Commands{ 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) { mdb.CREATE: {Name: "create", Help: "创建", Hand: func(m *ice.Message, arg ...string) {
_webpack_cache(m.Spawn(), _volcanos(m), true) _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) { mdb.REMOVE: {Name: "remove", Help: "删除", Hand: func(m *ice.Message, arg ...string) {
_webpack_cache(m.Spawn(), _volcanos(m), false) _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) { nfs.TRASH: {Name: "trash", Help: "删除", Hand: func(m *ice.Message, arg ...string) {
if !strings.Contains(m.Option(nfs.PATH), "page/index") { if !strings.Contains(m.Option(nfs.PATH), "page/index") {
m.Cmd(nfs.TRASH, m.Option(nfs.PATH)) m.Cmd(nfs.TRASH, m.Option(nfs.PATH))
} }
}}, }},
cli.BUILD: {Name: "build name=hi", Help: "构建", Hand: func(m *ice.Message, arg ...string) { }, mdb.HashAction(mdb.SHORT, nfs.PATH, mdb.FIELD, "time,path")), 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) {
m.Option(nfs.DIR_DEEP, true) m.Option(nfs.DIR_DEEP, true)
m.Option(nfs.DIR_TYPE, nfs.CAT) m.Option(nfs.DIR_TYPE, nfs.CAT)
m.OptionFields(nfs.DIR_WEB_FIELDS) m.OptionFields(nfs.DIR_WEB_FIELDS)

View File

@ -2,17 +2,18 @@ package code
import ( import (
"encoding/base64" "encoding/base64"
"io"
"os" "os"
"os/exec" "os/exec"
"path" "path"
"strings" "strings"
"time"
pty "shylinux.com/x/creackpty" pty "shylinux.com/x/creackpty"
ice "shylinux.com/x/icebergs" ice "shylinux.com/x/icebergs"
"shylinux.com/x/icebergs/base/cli" "shylinux.com/x/icebergs/base/cli"
"shylinux.com/x/icebergs/base/ctx" "shylinux.com/x/icebergs/base/ctx"
"shylinux.com/x/icebergs/base/mdb" "shylinux.com/x/icebergs/base/mdb"
"shylinux.com/x/icebergs/base/nfs"
"shylinux.com/x/icebergs/base/web" "shylinux.com/x/icebergs/base/web"
kit "shylinux.com/x/toolkits" kit "shylinux.com/x/toolkits"
) )
@ -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(ice.MSG_DAEMON, m.Conf("", kit.Keys(mdb.HASH, h, mdb.META, mdb.TEXT)))
m.Option(mdb.TEXT, t) m.Option(mdb.TEXT, t)
} }
func _xterm_get(m *ice.Message, h string, must bool) (f *os.File) { func _xterm_get(m *ice.Message, h string, must bool) *os.File {
f, _ = mdb.HashTarget(m, h, func() ice.Any { if f, ok := mdb.HashTarget(m, h, func() ice.Any {
if !must { if !must {
return nil return nil
} }
@ -36,7 +37,9 @@ func _xterm_get(m *ice.Message, h string, must bool) (f *os.File) {
m.Assert(err) m.Assert(err)
m.Go(func() { 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) buf := make([]byte, ice.MOD_BUFS)
for { for {
if n, e := tty.Read(buf); !m.Warn(e) { 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") web.PushNoticeGrow(m, "exit")
}) })
return tty return tty
}).(*os.File) }).(*os.File); m.Warn(!ok, ice.ErrNotValid, f) {
return mdb.HashSelectUpdate(m, h, func(value ice.Map) { delete(value, mdb.TARGET) })
return nil
} else {
return f
}
} }
const XTERM = "xterm" const XTERM = "xterm"
func init() { func init() {
Index.MergeCommands(ice.Commands{ 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) { ice.CTX_EXIT: {Hand: func(m *ice.Message, arg ...string) {
mdb.HashSelectValue(m, func(value ice.Map) { mdb.HashSelectValue(m, func(value ice.Map) {
if cmd, ok := value["_cmd"].(*exec.Cmd); ok { if c, ok := value["_cmd"].(io.Closer); ok {
cmd.Process.Kill() c.Close()
} }
}) })
}}, }},
mdb.INPUTS: {Name: "inputs", Help: "补全", Hand: func(m *ice.Message, arg ...string) { mdb.INPUTS: {Name: "inputs", Help: "补全", Hand: func(m *ice.Message, arg ...string) {
switch mdb.HashInputs(m, arg); arg[0] { switch mdb.HashInputs(m, arg); arg[0] {
case mdb.TYPE: case mdb.TYPE:
m.Push(arg[0], "python") m.Push(arg[0], "python", "node", "bash", "sh")
m.Push(arg[0], "node")
m.Push(arg[0], "bash")
m.Push(arg[0], "sh")
case mdb.NAME: case mdb.NAME:
m.Push(arg[0], path.Base(m.Option(mdb.TYPE))) 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.HashModify(m, m.OptionSimple(mdb.HASH), arg)
}}, }},
mdb.PRUNES: {Name: "prunes", Help: "清理", Hand: func(m *ice.Message, arg ...string) { 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) { "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")))}) 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" ice "shylinux.com/x/icebergs"
"shylinux.com/x/icebergs/base/mdb" "shylinux.com/x/icebergs/base/mdb"
"shylinux.com/x/icebergs/base/nfs" "shylinux.com/x/icebergs/base/nfs"
"shylinux.com/x/icebergs/base/web" "shylinux.com/x/icebergs/core/chat"
) )
func _website_url(m *ice.Message, file string) string { 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 const ZML = nfs.ZML
@ -21,7 +21,7 @@ func init() {
SRC_WEBSITE = "src/website/" SRC_WEBSITE = "src/website/"
) )
Index.Register(&ice.Context{Name: ZML, Help: "网页", Commands: ice.Commands{ 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) { ice.CTX_INIT: {Hand: func(m *ice.Message, arg ...string) {
m.Cmd(mdb.RENDER, mdb.CREATE, nfs.ZML, m.PrefixKey()) m.Cmd(mdb.RENDER, mdb.CREATE, nfs.ZML, m.PrefixKey())
m.Cmd(mdb.ENGINE, 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{ }, Commands: ice.Commands{
ASSET: {Name: "asset account id auto spend trans bonus", Help: "资产", Meta: kit.Dict( ASSET: {Name: "asset account id auto spend trans bonus", Help: "资产", Meta: kit.Dict(
"_trans", kit.Dict(ACCOUNT, "账户", AMOUNT, "金额", FROM, "转出", TO, "转入", "time", "时间", "name", "商家", "text", "备注"), "_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) { SPEND: {Name: "spend account name amount time@date text", Help: "支出", Hand: func(m *ice.Message, arg ...string) {
_sub_amount(m, arg) _sub_amount(m, arg)
_asset_insert(m, arg[1], kit.Simple(mdb.TYPE, "支出", arg[2:])...) _asset_insert(m, arg[1], kit.Simple(mdb.TYPE, "支出", arg[2:])...)

View File

@ -9,6 +9,6 @@ const PAPER = "paper"
func init() { func init() {
Index.MergeCommands(ice.Commands{ 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() { func init() {
Index.MergeCommands(ice.Commands{ 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.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.HashAction(mdb.SHORT, MONTH, mdb.FIELD, "month,company,amount,income,tax")), Hand: func(m *ice.Message, arg ...string) {
mdb.HashSelect(m, arg...) mdb.HashSelect(m, arg...)

View File

@ -15,7 +15,7 @@ func init() {
Index.MergeCommands(ice.Commands{ Index.MergeCommands(ice.Commands{
COUNT: {Name: "count begin_time@date end_time@date auto insert", Help: "倒计时", Meta: kit.Dict( COUNT: {Name: "count begin_time@date end_time@date auto insert", Help: "倒计时", Meta: kit.Dict(
ice.Display(""), 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) { 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) m.Cmdy(TASK, mdb.INSERT, arg)
}}, }},

View File

@ -13,7 +13,7 @@ const EPIC = "epic"
func init() { func init() {
Index.MergeCommands(ice.Commands{ 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.CREATE: {Name: "create time@date type name", Help: "创建"},
mdb.MODIFY: {Name: "modify hash 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) { }, 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/ctx"
"shylinux.com/x/icebergs/base/mdb" "shylinux.com/x/icebergs/base/mdb"
"shylinux.com/x/icebergs/base/web" "shylinux.com/x/icebergs/base/web"
"shylinux.com/x/icebergs/core/chat"
kit "shylinux.com/x/toolkits" kit "shylinux.com/x/toolkits"
) )
@ -70,7 +71,7 @@ func init() {
Index.MergeCommands(ice.Commands{ Index.MergeCommands(ice.Commands{
PLAN: {Name: "plan scale=week,day,week,month,year,long begin_time@date list", Help: "计划", Meta: kit.Dict( 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"), 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) { mdb.INPUTS: {Name: "inputs", Help: "补全", Hand: func(m *ice.Message, arg ...string) {
m.Cmdy(TODO, mdb.INPUTS, arg) m.Cmdy(TODO, mdb.INPUTS, arg)
}}, }},
@ -79,7 +80,7 @@ func init() {
}}, }},
mdb.SEARCH: {Name: "search", Help: "搜索", Hand: func(m *ice.Message, arg ...string) { mdb.SEARCH: {Name: "search", Help: "搜索", Hand: func(m *ice.Message, arg ...string) {
if arg[0] == mdb.FOREACH && arg[1] == "" { 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) { ice.RUN: {Name: "run", Help: "执行", Hand: func(m *ice.Message, arg ...string) {

View File

@ -57,7 +57,7 @@ const TASK = "task"
func init() { func init() {
Index.MergeCommands(ice.Commands{ 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) { 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.HASH, m.OptionSimple(mdb.ZONE))
m.Cmdy(mdb.INSERT, m.Prefix(TASK), "", mdb.ZONE, m.Option(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() { func init() {
Index.MergeCommands(ice.Commands{ 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) { mdb.INPUTS: {Name: "inputs", Help: "补全", Hand: func(m *ice.Message, arg ...string) {
m.Cmdy(mdb.INPUTS, m.PrefixKey(), "", mdb.HASH, arg) m.Cmdy(mdb.INPUTS, m.PrefixKey(), "", mdb.HASH, arg)
m.Cmdy(TASK, mdb.INPUTS, arg) m.Cmdy(TASK, mdb.INPUTS, arg)

View File

@ -17,7 +17,7 @@ func init() {
Index.Merge(&ice.Context{Configs: ice.Configs{ Index.Merge(&ice.Context{Configs: ice.Configs{
DRAW: {Name: DRAW, Help: "思维导图", Value: kit.Data(lex.REGEXP, ".*\\.svg")}, DRAW: {Name: DRAW, Help: "思维导图", Value: kit.Data(lex.REGEXP, ".*\\.svg")},
}, Commands: ice.Commands{ }, 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) { ice.CTX_INIT: {Hand: func(m *ice.Message, arg ...string) {
m.Cmd(mdb.RENDER, mdb.CREATE, mdb.TYPE, nfs.SVG, mdb.NAME, m.PrefixKey()) 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() { func init() {
Index.Merge(&ice.Context{Commands: ice.Commands{ 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: "执行"}, ice.RUN: {Name: "run", Help: "执行"},
}, ctx.CmdAction()), Hand: func(m *ice.Message, arg ...string) { }, ctx.CmdAction()), Hand: func(m *ice.Message, arg ...string) {
if arg = _name(m, arg); strings.Contains(arg[1], ice.NL) { 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