forked from x/icebergs
opt chat
This commit is contained in:
parent
e516bf6ec8
commit
55c606516a
@ -93,7 +93,7 @@ const ROLE = "role"
|
||||
|
||||
func init() {
|
||||
Index.MergeCommands(ice.Commands{
|
||||
ROLE: {Name: "role role auto insert", Help: "角色", Actions: ice.MergeAction(ice.Actions{
|
||||
ROLE: {Name: "role role auto insert", Help: "角色", Actions: ice.MergeActions(ice.Actions{
|
||||
ice.CTX_INIT: {Hand: func(m *ice.Message, arg ...string) {
|
||||
mdb.Rich(m, ROLE, nil, kit.Dict(mdb.NAME, TECH, BLACK, kit.Dict(), WHITE, kit.Dict()))
|
||||
mdb.Rich(m, ROLE, nil, kit.Dict(mdb.NAME, VOID, WHITE, kit.Dict(), BLACK, kit.Dict()))
|
||||
|
@ -12,7 +12,7 @@ func _sess_check(m *ice.Message, sessid string) {
|
||||
m.Option(ice.MSG_USERROLE, VOID)
|
||||
m.Option(ice.MSG_USERNAME, "")
|
||||
m.Option(ice.MSG_USERNICK, "")
|
||||
if m.Warn(sessid == "", ice.ErrNotValid, sessid) {
|
||||
if sessid == "" {
|
||||
return
|
||||
}
|
||||
|
||||
@ -34,9 +34,9 @@ func _sess_create(m *ice.Message, username string) (h string) {
|
||||
return
|
||||
}
|
||||
if msg := m.Cmd(USER, username); msg.Length() > 0 {
|
||||
h = mdb.HashCreate(m, msg.AppendSimple(USERROLE, USERNAME, USERNICK), IP, m.Option(ice.MSG_USERIP), UA, m.Option(ice.MSG_USERUA)).Result()
|
||||
h = mdb.HashCreate(m, msg.AppendSimple(USERROLE, USERNAME, USERNICK), IP, m.Option(ice.MSG_USERIP), UA, m.Option(ice.MSG_USERUA))
|
||||
} else {
|
||||
h = mdb.HashCreate(m, m.OptionSimple(USERROLE, USERNAME, USERNICK), IP, m.Option(ice.MSG_USERIP), UA, m.Option(ice.MSG_USERUA)).Result()
|
||||
h = mdb.HashCreate(m, m.OptionSimple(USERROLE, USERNAME, USERNICK), IP, m.Option(ice.MSG_USERIP), UA, m.Option(ice.MSG_USERUA))
|
||||
}
|
||||
gdb.Event(m, SESS_CREATE, SESS, h, USERNAME, username)
|
||||
return h
|
||||
@ -60,7 +60,7 @@ const SESS = "sess"
|
||||
|
||||
func init() {
|
||||
Index.MergeCommands(ice.Commands{
|
||||
SESS: {Name: "sess hash auto prunes", Help: "会话", Actions: ice.MergeAction(ice.Actions{
|
||||
SESS: {Name: "sess hash auto prunes", Help: "会话", Actions: ice.MergeActions(ice.Actions{
|
||||
mdb.CREATE: {Name: "create username", Help: "创建", Hand: func(m *ice.Message, arg ...string) {
|
||||
_sess_create(m, m.Option(USERNAME))
|
||||
}},
|
||||
@ -77,3 +77,6 @@ func SessCreate(m *ice.Message, username string) string {
|
||||
func SessCheck(m *ice.Message, sessid string) bool {
|
||||
return m.Cmdy(SESS, CHECK, sessid).Option(ice.MSG_USERNAME) != ""
|
||||
}
|
||||
func UserLogout(m *ice.Message) {
|
||||
m.Cmd(SESS, mdb.REMOVE, kit.Dict(mdb.HASH, m.Option(ice.MSG_SESSID)))
|
||||
}
|
||||
|
@ -54,7 +54,7 @@ const TOTP = "totp"
|
||||
|
||||
func init() {
|
||||
Index.MergeCommands(ice.Commands{
|
||||
TOTP: {Name: "totp name auto create", Help: "令牌", Actions: ice.MergeAction(ice.Actions{
|
||||
TOTP: {Name: "totp name auto create", Help: "令牌", Actions: ice.MergeActions(ice.Actions{
|
||||
mdb.CREATE: {Name: "create name=hi secret period=30 number=6", Help: "添加", Hand: func(m *ice.Message, arg ...string) {
|
||||
if m.Option(SECRET) == "" { // 创建密钥
|
||||
m.Option(SECRET, _totp_gen(kit.Int64(m.Option(PERIOD))))
|
||||
|
@ -71,7 +71,7 @@ const USER = "user"
|
||||
|
||||
func init() {
|
||||
Index.MergeCommands(ice.Commands{
|
||||
USER: {Name: "user username auto create", Help: "用户", Actions: ice.MergeAction(ice.Actions{
|
||||
USER: {Name: "user username auto create", Help: "用户", Actions: ice.MergeActions(ice.Actions{
|
||||
mdb.CREATE: {Name: "create username password userrole=void,tech", Help: "创建", Hand: func(m *ice.Message, arg ...string) {
|
||||
_user_create(m, m.Option(USERNAME), m.Option(PASSWORD), m.OptionSimple(USERROLE)...)
|
||||
}},
|
||||
|
@ -26,7 +26,7 @@ func _daemon_exec(m *ice.Message, cmd *exec.Cmd) {
|
||||
h := mdb.HashCreate(m, ice.CMD, kit.Join(cmd.Args, ice.SP),
|
||||
STATUS, START, DIR, cmd.Dir, ENV, kit.Select("", cmd.Env),
|
||||
m.OptionSimple(CMD_INPUT, CMD_OUTPUT, CMD_ERRPUT, mdb.CACHE_CLEAR_ON_EXIT),
|
||||
).Result()
|
||||
)
|
||||
|
||||
// 启动服务
|
||||
if e := cmd.Start(); m.Warn(e, ice.ErrNotStart, cmd.Args) {
|
||||
@ -108,7 +108,7 @@ const DAEMON = "daemon"
|
||||
|
||||
func init() {
|
||||
Index.MergeCommands(ice.Commands{
|
||||
DAEMON: {Name: "daemon hash auto start prunes", Help: "守护进程", Actions: ice.MergeAction(ice.Actions{
|
||||
DAEMON: {Name: "daemon hash auto start prunes", Help: "守护进程", Actions: ice.MergeActions(ice.Actions{
|
||||
ice.CTX_EXIT: {Hand: func(m *ice.Message, arg ...string) {
|
||||
mdb.HashPrunesValue(m, mdb.CACHE_CLEAR_ON_EXIT, ice.TRUE)
|
||||
}},
|
||||
|
@ -21,7 +21,7 @@ const MIRRORS = "mirrors"
|
||||
|
||||
func init() {
|
||||
Index.MergeCommands(ice.Commands{
|
||||
MIRRORS: {Name: "mirrors cli auto", Help: "软件镜像", Actions: ice.MergeAction(ice.Actions{
|
||||
MIRRORS: {Name: "mirrors cli auto", Help: "软件镜像", Actions: ice.MergeActions(ice.Actions{
|
||||
ice.CTX_INIT: {Hand: func(m *ice.Message, arg ...string) {
|
||||
m.Go(func() {
|
||||
m.Sleep300ms() // after runtime init
|
||||
|
@ -79,6 +79,7 @@ const (
|
||||
STYLE = "style"
|
||||
DISPLAY = "display"
|
||||
ACTION = "action"
|
||||
TRANS = "trans"
|
||||
|
||||
CAN_PLUGIN = "can.plugin"
|
||||
)
|
||||
@ -119,6 +120,10 @@ func CmdAction(args ...ice.Any) ice.Actions {
|
||||
m.Cmd(CONFIG, "reset", arg[0])
|
||||
return
|
||||
}
|
||||
if len(arg) > 3 && arg[1] == ACTION && arg[2] == CONFIG && arg[3] == "select" {
|
||||
m.Cmdy(CONFIG, arg[0])
|
||||
return
|
||||
}
|
||||
if aaa.Right(m, arg) && !PodCmd(m, arg) {
|
||||
m.Cmdy(arg)
|
||||
}
|
||||
|
@ -152,3 +152,6 @@ func Load(m *ice.Message, arg ...string) *ice.Message {
|
||||
}
|
||||
return m.Cmd(CONFIG, ice.LOAD, m.Prefix(nfs.JSON), arg)
|
||||
}
|
||||
func ConfAction(args ...ice.Any) ice.Actions {
|
||||
return ice.Actions{ice.CTX_INIT: mdb.AutoConfig(args...)}
|
||||
}
|
||||
|
@ -26,7 +26,7 @@ const CONTEXT = "context"
|
||||
|
||||
func init() {
|
||||
Index.MergeCommands(ice.Commands{
|
||||
CONTEXT: {Name: "context name=web action=context,command,config key auto spide", Help: "模块", Actions: ice.MergeAction(ice.Actions{
|
||||
CONTEXT: {Name: "context name=web action=context,command,config key auto spide", Help: "模块", Actions: ice.MergeActions(ice.Actions{
|
||||
"spide": {Name: "spide", Help: "架构图", Hand: func(m *ice.Message, arg ...string) {
|
||||
if len(arg) == 0 || arg[1] == CONTEXT { // 模块列表
|
||||
m.Cmdy(CONTEXT, kit.Select(ice.ICE, arg, 0), CONTEXT)
|
||||
|
@ -10,13 +10,13 @@ const EVENT = "event"
|
||||
|
||||
func init() {
|
||||
Index.MergeCommands(ice.Commands{
|
||||
EVENT: {Name: "event event id auto listen happen", Help: "事件流", Actions: ice.MergeAction(ice.Actions{
|
||||
EVENT: {Name: "event event id auto listen happen", Help: "事件流", Actions: ice.MergeActions(ice.Actions{
|
||||
LISTEN: {Name: "listen event cmd", Help: "监听", Hand: func(m *ice.Message, arg ...string) {
|
||||
mdb.ZoneInsert(m, m.OptionSimple(EVENT, ice.CMD))
|
||||
}},
|
||||
HAPPEN: {Name: "happen event arg", Help: "触发", Hand: func(m *ice.Message, arg ...string) {
|
||||
mdb.ZoneSelect(m, m.Option(EVENT)).Tables(func(value ice.Maps) {
|
||||
m.Cmd(kit.Split(value[ice.CMD]), m.Option(EVENT), arg[2:]).Cost()
|
||||
mdb.ZoneSelect(m.Spawn(), m.Option(EVENT)).Tables(func(value ice.Maps) {
|
||||
m.Cmdy(kit.Split(value[ice.CMD]), m.Option(EVENT), arg[2:], ice.OptionFields("")).Cost()
|
||||
})
|
||||
}},
|
||||
}, mdb.ZoneAction(mdb.SHORT, EVENT, mdb.FIELD, "time,id,cmd"))},
|
||||
@ -24,10 +24,10 @@ func init() {
|
||||
}
|
||||
func Watch(m *ice.Message, key string, arg ...string) *ice.Message {
|
||||
if len(arg) == 0 {
|
||||
arg = append(arg, m.Prefix(ice.AUTO))
|
||||
arg = append(arg, m.PrefixKey())
|
||||
}
|
||||
return m.Cmd(EVENT, LISTEN, EVENT, key, ice.CMD, kit.Join(arg, ice.SP))
|
||||
}
|
||||
func Event(m *ice.Message, key string, arg ...string) *ice.Message {
|
||||
return m.Cmd(EVENT, HAPPEN, EVENT, key, arg)
|
||||
func Event(m *ice.Message, key string, arg ...ice.Any) *ice.Message {
|
||||
return m.Cmdy(EVENT, HAPPEN, EVENT, key, arg)
|
||||
}
|
||||
|
@ -11,11 +11,11 @@ const ROUTINE = "routine"
|
||||
|
||||
func init() {
|
||||
Index.MergeCommands(ice.Commands{
|
||||
ROUTINE: {Name: "routine hash auto prunes", Help: "协程池", Actions: ice.MergeAction(ice.Actions{
|
||||
ROUTINE: {Name: "routine hash auto prunes", Help: "协程池", Actions: ice.MergeActions(ice.Actions{
|
||||
mdb.CREATE: {Name: "create name", Help: "创建", Hand: func(m *ice.Message, arg ...string) {
|
||||
m.Go(func() {
|
||||
cb := m.OptionCB("")
|
||||
h := mdb.HashCreate(m, m.OptionSimple(mdb.NAME), mdb.STATUS, START, ice.CMD, logs.FileLine(cb, 100)).Result()
|
||||
h := mdb.HashCreate(m, m.OptionSimple(mdb.NAME), mdb.STATUS, START, ice.CMD, logs.FileLine(cb, 100))
|
||||
defer func() {
|
||||
if e := recover(); e == nil {
|
||||
mdb.HashModify(m, mdb.HASH, h, mdb.STATUS, STOP)
|
||||
|
@ -9,6 +9,7 @@ import (
|
||||
ice "shylinux.com/x/icebergs"
|
||||
"shylinux.com/x/icebergs/base/mdb"
|
||||
kit "shylinux.com/x/toolkits"
|
||||
"shylinux.com/x/toolkits/file"
|
||||
"shylinux.com/x/toolkits/logs"
|
||||
)
|
||||
|
||||
@ -25,7 +26,8 @@ func _signal_action(m *ice.Message, arg ...string) {
|
||||
}
|
||||
func _signal_process(m *ice.Message, p string, s os.Signal) {
|
||||
if p == "" {
|
||||
p = logs.ReadFile(ice.Info.PidPath)
|
||||
b, _ := file.ReadFile(ice.Info.PidPath)
|
||||
p = string(b)
|
||||
}
|
||||
if p == "" {
|
||||
p = kit.Format(os.Getpid())
|
||||
@ -52,7 +54,7 @@ const SIGNAL = "signal"
|
||||
|
||||
func init() {
|
||||
Index.MergeCommands(ice.Commands{
|
||||
SIGNAL: {Name: "signal signal auto listen", Help: "信号器", Actions: ice.MergeAction(ice.Actions{
|
||||
SIGNAL: {Name: "signal signal auto listen", Help: "信号器", Actions: ice.MergeActions(ice.Actions{
|
||||
ice.CTX_INIT: {Hand: func(m *ice.Message, arg ...string) {
|
||||
_signal_listen(m, 2, mdb.NAME, "重启", ice.CMD, "exit 1")
|
||||
_signal_listen(m, 3, mdb.NAME, "退出", ice.CMD, "exit 0")
|
||||
|
@ -30,7 +30,7 @@ const TIMER = "timer"
|
||||
|
||||
func init() {
|
||||
Index.MergeCommands(ice.Commands{
|
||||
TIMER: {Name: "timer hash auto create prunes", Help: "定时器", Actions: ice.MergeAction(ice.Actions{
|
||||
TIMER: {Name: "timer hash auto create prunes", Help: "定时器", Actions: ice.MergeActions(ice.Actions{
|
||||
mdb.CREATE: {Name: "create name=hi delay=10ms interval=10s count=3 cmd=runtime", Help: "创建"},
|
||||
mdb.PRUNES: {Name: "prunes", Help: "清理", Hand: func(m *ice.Message, arg ...string) {
|
||||
mdb.HashPrunesValue(m, mdb.COUNT, "0")
|
||||
|
@ -42,7 +42,7 @@ func _hash_insert(m *ice.Message, prefix, chain string, arg ...string) string {
|
||||
if expire := m.Conf(prefix, kit.Keys(chain, kit.Keym(EXPIRE))); expire != "" {
|
||||
arg = kit.Simple(TIME, m.Time(expire), arg)
|
||||
}
|
||||
if m.Optionv(TARGET) != nil {
|
||||
if m.Optionv(TARGET) != nil && m.Option(TARGET) != "" {
|
||||
m.Echo(Rich(m, prefix, chain, kit.Data(arg, TARGET, m.Optionv(TARGET))))
|
||||
} else {
|
||||
m.Echo(Rich(m, prefix, chain, kit.Data(arg)))
|
||||
@ -170,7 +170,7 @@ func HashAction(args ...Any) ice.Actions {
|
||||
}
|
||||
}
|
||||
func HashCloseAction(args ...Any) ice.Actions {
|
||||
return ice.MergeAction(HashAction(args...), ice.Actions{
|
||||
return ice.MergeActions(HashAction(args...), ice.Actions{
|
||||
ice.CTX_EXIT: {Hand: func(m *ice.Message, arg ...string) { HashSelectClose(m) }},
|
||||
})
|
||||
}
|
||||
@ -186,7 +186,7 @@ func HashStatusAction(args ...Any) ice.Actions {
|
||||
return list
|
||||
}
|
||||
func HashStatusCloseAction(args ...Any) ice.Actions {
|
||||
return ice.MergeAction(HashStatusAction(args...), ice.Actions{
|
||||
return ice.MergeActions(HashStatusAction(args...), ice.Actions{
|
||||
ice.CTX_EXIT: {Hand: func(m *ice.Message, arg ...string) { HashSelectClose(m) }},
|
||||
})
|
||||
}
|
||||
@ -201,8 +201,9 @@ func HashArgs(m *ice.Message, arg ...Any) []string {
|
||||
func HashInputs(m *ice.Message, arg ...Any) *ice.Message {
|
||||
return m.Cmdy(INPUTS, m.PrefixKey(), "", HASH, HashArgs(m, arg))
|
||||
}
|
||||
func HashCreate(m *ice.Message, arg ...Any) *ice.Message {
|
||||
return m.Cmdy(INSERT, m.PrefixKey(), "", HASH, HashArgs(m, arg...))
|
||||
func HashCreate(m *ice.Message, arg ...Any) string {
|
||||
msg := m.Spawn()
|
||||
return m.Echo(msg.Cmdx(INSERT, m.PrefixKey(), "", HASH, HashArgs(msg, arg...))).Result()
|
||||
}
|
||||
func HashRemove(m *ice.Message, arg ...Any) *ice.Message {
|
||||
return m.Cmdy(DELETE, m.PrefixKey(), "", HASH, m.OptionSimple(HashShort(m)), arg)
|
||||
@ -291,6 +292,7 @@ func HashSelectValue(m *ice.Message, cb Any) *ice.Message {
|
||||
func HashSelectClose(m *ice.Message) *ice.Message {
|
||||
HashSelectValue(m, func(target ice.Any) {
|
||||
if c, ok := target.(io.Closer); ok {
|
||||
m.Logs(DELETE, TARGET, m.PrefixKey())
|
||||
c.Close()
|
||||
}
|
||||
})
|
||||
@ -315,5 +317,8 @@ func Rich(m *ice.Message, prefix string, chain Any, data Any) string {
|
||||
cache = kit.Data()
|
||||
m.Confv(prefix, chain, cache)
|
||||
}
|
||||
if m.Option(SHORT) != "" {
|
||||
kit.Value(cache, kit.Keym(SHORT), m.Option(SHORT))
|
||||
}
|
||||
return miss.Rich(path.Join(prefix, kit.Keys(chain)), cache, data)
|
||||
}
|
||||
|
@ -274,7 +274,7 @@ func init() {
|
||||
}
|
||||
func AutoConfig(args ...ice.Any) *ice.Action {
|
||||
return &ice.Action{Hand: func(m *ice.Message, arg ...string) {
|
||||
if cs := m.Target().Configs; cs[m.CommandKey()] == nil && len(args) > 0 {
|
||||
if cs := m.Target().Configs; len(args) > 0 {
|
||||
cs[m.CommandKey()] = &ice.Config{Value: kit.Data(args...)}
|
||||
ice.Info.Load(m, m.CommandKey())
|
||||
}
|
||||
|
@ -12,10 +12,18 @@ func init() {
|
||||
}
|
||||
|
||||
func RenderAction(args ...ice.Any) ice.Actions {
|
||||
return ice.MergeAction(ice.Actions{
|
||||
return ice.MergeActions(ice.Actions{
|
||||
ice.CTX_INIT: {Hand: func(m *ice.Message, arg ...string) {
|
||||
if len(args) == 0 {
|
||||
args = append(args, SHORT, TYPE, FIELD, "time,type,name,text")
|
||||
}
|
||||
if cs := m.Target().Configs; cs[m.CommandKey()] == nil {
|
||||
cs[m.CommandKey()] = &ice.Config{Value: kit.Data(SHORT, TYPE)}
|
||||
cs[m.CommandKey()] = &ice.Config{Value: kit.Data(args...)}
|
||||
} else {
|
||||
ls := kit.Simple(args)
|
||||
for i := 0; i < len(ls); i += 2 {
|
||||
m.Config(ls[i], ls[i+1])
|
||||
}
|
||||
}
|
||||
}},
|
||||
CREATE: {Name: "create type name text", Help: "创建", Hand: func(m *ice.Message, arg ...string) {
|
||||
|
@ -16,7 +16,7 @@ func SearchAction() ice.Actions {
|
||||
}
|
||||
}
|
||||
func HashSearchAction(arg ...Any) ice.Actions {
|
||||
return ice.MergeAction(HashAction(arg...), SearchAction())
|
||||
return ice.MergeActions(HashAction(arg...), SearchAction())
|
||||
}
|
||||
func HashSelectSearch(m *ice.Message, args []string, keys ...string) *ice.Message {
|
||||
if len(keys) == 0 {
|
||||
|
@ -215,6 +215,10 @@ func ZoneSelectPage(m *ice.Message, arg ...string) *ice.Message {
|
||||
OptionPages(m, kit.Slice(arg, 2)...)
|
||||
return ZoneSelect(m, arg...)
|
||||
}
|
||||
func ZoneSelects(m *ice.Message, arg ...string) *ice.Message {
|
||||
m.OptionFields(m.Config(FIELD))
|
||||
return ZoneSelect(m, arg...)
|
||||
}
|
||||
func ZoneSelectAll(m *ice.Message, arg ...string) *ice.Message {
|
||||
m.Option(CACHE_LIMIT, "-1")
|
||||
return ZoneSelect(m, arg...)
|
||||
|
@ -34,14 +34,14 @@ func _dir_list(m *ice.Message, root string, name string, level int, deep bool, d
|
||||
}
|
||||
|
||||
list, e := ReadDir(m, path.Join(root, name))
|
||||
if e != nil { // 单个文件
|
||||
if e != nil || len(list) == 0 { // 单个文件
|
||||
ls, _ := ReadDir(m, path.Dir(path.Join(root, name)))
|
||||
for _, s := range ls {
|
||||
if s.Name() == path.Base(name) {
|
||||
list = append(list, s)
|
||||
}
|
||||
}
|
||||
name = path.Dir(name)
|
||||
name, deep = path.Dir(name), false
|
||||
}
|
||||
|
||||
for _, f := range list {
|
||||
@ -178,7 +178,7 @@ func init() {
|
||||
m.Cmdy("web.cache", "upload_watch", m.Option(PATH))
|
||||
}},
|
||||
TRASH: {Name: "trash", Help: "删除", Hand: func(m *ice.Message, arg ...string) {
|
||||
m.Cmdy(TRASH, m.Option(PATH))
|
||||
m.Cmdy(TRASH, mdb.CREATE, m.Option(PATH))
|
||||
}},
|
||||
}, Hand: func(m *ice.Message, arg ...string) {
|
||||
if m.Option(DIR_ROOT) != "" {
|
||||
|
@ -165,3 +165,6 @@ func NewWriteCloser(w func([]byte) (int, error), c func() error) io.WriteCloser
|
||||
func NewReadCloser(r io.Reader) io.ReadCloser {
|
||||
return file.NewReadCloser(r)
|
||||
}
|
||||
func NewCloser(c func() error) io.WriteCloser {
|
||||
return file.NewWriteCloser(func(buf []byte) (int, error) { return 0, nil }, c)
|
||||
}
|
||||
|
@ -37,7 +37,7 @@ const TAIL = "tail"
|
||||
|
||||
func init() {
|
||||
Index.MergeCommands(ice.Commands{
|
||||
TAIL: {Name: "tail name id auto page filter:text create", Help: "日志流", Actions: ice.MergeAction(ice.Actions{
|
||||
TAIL: {Name: "tail name id auto page filter:text create", Help: "日志流", Actions: ice.MergeActions(ice.Actions{
|
||||
ice.CTX_INIT: {Hand: func(m *ice.Message, arg ...string) {
|
||||
mdb.Richs(m, TAIL, "", mdb.FOREACH, func(key string, value ice.Map) {
|
||||
value, _ = kit.GetMeta(value), m.Option(mdb.HASH, key)
|
||||
|
@ -34,7 +34,7 @@ const TRASH = "trash"
|
||||
|
||||
func init() {
|
||||
Index.MergeCommands(ice.Commands{
|
||||
TRASH: {Name: "trash hash auto prunes", Help: "回收站", Actions: ice.MergeAction(ice.Actions{
|
||||
TRASH: {Name: "trash hash auto prunes", Help: "回收站", Actions: ice.MergeActions(ice.Actions{
|
||||
mdb.REVERT: {Name: "revert", Help: "恢复", Hand: func(m *ice.Message, arg ...string) {
|
||||
Rename(m, m.Option(FILE), m.Option(FROM))
|
||||
mdb.HashRemove(m, m.OptionSimple(mdb.HASH))
|
||||
|
@ -66,7 +66,7 @@ const CLIENT = "client"
|
||||
|
||||
func init() {
|
||||
Index.MergeCommands(ice.Commands{
|
||||
CLIENT: {Name: "client hash auto prunes", Help: "客户端", Actions: ice.MergeAction(ice.Actions{
|
||||
CLIENT: {Name: "client hash auto prunes", Help: "客户端", Actions: ice.MergeActions(ice.Actions{
|
||||
ice.CTX_INIT: {Hand: func(m *ice.Message, arg ...string) { m.Conf("", mdb.HASH, "") }},
|
||||
ice.CTX_EXIT: {Hand: func(m *ice.Message, arg ...string) {}},
|
||||
DIAL: {Name: "dial type name port=9010 host=", Help: "连接", Hand: func(m *ice.Message, arg ...string) {
|
||||
|
@ -67,7 +67,7 @@ const HOST = "host"
|
||||
|
||||
func init() {
|
||||
Index.MergeCommands(ice.Commands{
|
||||
HOST: {Name: "host name auto", Help: "主机", Actions: ice.MergeAction(ice.Actions{
|
||||
HOST: {Name: "host name auto", Help: "主机", Actions: ice.MergeActions(ice.Actions{
|
||||
ice.CTX_INIT: {Hand: func(m *ice.Message, arg ...string) {
|
||||
m.Cmd(HOST).Tables(func(value ice.Maps) { m.Cmd(HOST, aaa.WHITE, value[aaa.IP]) })
|
||||
}},
|
||||
|
@ -46,7 +46,7 @@ const PORT = "port"
|
||||
|
||||
func init() {
|
||||
Index.MergeCommands(ice.Commands{
|
||||
PORT: {Name: "port port path auto", Help: "端口", Actions: ice.MergeAction(ice.Actions{
|
||||
PORT: {Name: "port port path auto", Help: "端口", Actions: ice.MergeActions(ice.Actions{
|
||||
aaa.RIGHT: {Name: "right", Help: "分配", Hand: func(m *ice.Message, arg ...string) {
|
||||
m.Echo(_port_right(m, arg...))
|
||||
}},
|
||||
|
@ -28,7 +28,7 @@ func (l Listener) Close() error {
|
||||
|
||||
func _server_listen(m *ice.Message, arg ...string) {
|
||||
l, e := net.Listen(TCP, m.Option(HOST)+":"+m.Option(PORT))
|
||||
l = &Listener{m: m, h: mdb.HashCreate(m, arg, kit.Dict(mdb.TARGET, l), STATUS, kit.Select(ERROR, OPEN, e == nil), ERROR, kit.Format(e)).Result(), s: &Stat{}, Listener: l}
|
||||
l = &Listener{m: m, h: mdb.HashCreate(m, arg, kit.Dict(mdb.TARGET, l), STATUS, kit.Select(ERROR, OPEN, e == nil), ERROR, kit.Format(e)), s: &Stat{}, Listener: l}
|
||||
if e == nil {
|
||||
defer l.Close()
|
||||
}
|
||||
@ -62,7 +62,7 @@ const SERVER = "server"
|
||||
|
||||
func init() {
|
||||
Index.MergeCommands(ice.Commands{
|
||||
SERVER: {Name: "server hash auto prunes", Help: "服务器", Actions: ice.MergeAction(ice.Actions{
|
||||
SERVER: {Name: "server hash auto prunes", Help: "服务器", Actions: ice.MergeActions(ice.Actions{
|
||||
ice.CTX_INIT: {Hand: func(m *ice.Message, arg ...string) { m.Conf("", mdb.HASH, "") }},
|
||||
ice.CTX_EXIT: {Hand: func(m *ice.Message, arg ...string) { mdb.HashSelectClose(m) }},
|
||||
LISTEN: {Name: "listen type name port=9030 host=", Help: "监听", Hand: func(m *ice.Message, arg ...string) {
|
||||
|
@ -66,7 +66,7 @@ const BROAD = "broad"
|
||||
|
||||
func init() {
|
||||
Index.MergeCommands(ice.Commands{
|
||||
BROAD: {Name: "broad hash auto serve", Help: "广播", Actions: ice.MergeAction(ice.Actions{
|
||||
BROAD: {Name: "broad hash auto serve", Help: "广播", Actions: ice.MergeActions(ice.Actions{
|
||||
mdb.SEARCH: {Name: "search type name text", Help: "搜索", Hand: func(m *ice.Message, arg ...string) {
|
||||
_broad_search(m, arg[0], arg[1], kit.Select("", arg, 2))
|
||||
}},
|
||||
|
@ -29,7 +29,7 @@ func _cache_save(m *ice.Message, kind, name, text string, arg ...string) { // fi
|
||||
size := kit.Int(kit.Select(kit.Format(len(text)), arg, 1))
|
||||
file := kit.Select("", arg, 0)
|
||||
text = kit.Select(file, text)
|
||||
h := mdb.HashCreate(m, kit.SimpleKV("", kind, name, text), nfs.FILE, file, nfs.SIZE, size).Result()
|
||||
h := mdb.HashCreate(m, kit.SimpleKV("", kind, name, text), nfs.FILE, file, nfs.SIZE, size)
|
||||
|
||||
// 返回结果
|
||||
m.Push(mdb.TIME, m.Time())
|
||||
@ -61,7 +61,7 @@ func _cache_catch(m *ice.Message, name string) (file, size string) {
|
||||
return "", "0"
|
||||
}
|
||||
func _cache_upload(m *ice.Message, r *http.Request) (kind, name, file, size string) {
|
||||
if b, h, e := r.FormFile(UPLOAD); e == nil {
|
||||
if b, h, e := r.FormFile(UPLOAD); m.Assert(e) {
|
||||
defer b.Close()
|
||||
|
||||
// 创建文件
|
||||
@ -126,7 +126,7 @@ const CACHE = "cache"
|
||||
|
||||
func init() {
|
||||
Index.MergeCommands(ice.Commands{
|
||||
CACHE: {Name: "cache hash auto", Help: "缓存池", Actions: ice.MergeAction(ice.Actions{
|
||||
CACHE: {Name: "cache hash auto", Help: "缓存池", Actions: ice.MergeActions(ice.Actions{
|
||||
WATCH: {Name: "watch key file", Help: "释放", Hand: func(m *ice.Message, arg ...string) {
|
||||
_cache_watch(m, arg[0], arg[1])
|
||||
}},
|
||||
|
@ -102,7 +102,7 @@ func _dream_show(m *ice.Message, name string) {
|
||||
bin := kit.Select(os.Args[0], cli.SystemFind(m, ice.ICE_BIN, kit.Path(path.Join(p, ice.BIN)), kit.Path(ice.BIN)))
|
||||
m.Cmd(cli.DAEMON, bin, SPACE, tcp.DIAL, ice.DEV, ice.OPS, m.OptionSimple(mdb.NAME, RIVER))
|
||||
|
||||
defer gdb.Event(m, DREAM_CREATE, m.OptionSimple(mdb.TYPE, mdb.NAME)...)
|
||||
defer gdb.Event(m, DREAM_CREATE, m.OptionSimple(mdb.TYPE, mdb.NAME))
|
||||
m.Option(cli.CMD_OUTPUT, "")
|
||||
m.Option(cli.CMD_ENV, "")
|
||||
m.Sleep3s()
|
||||
@ -117,7 +117,7 @@ const DREAM = "dream"
|
||||
|
||||
func init() {
|
||||
Index.MergeCommands(ice.Commands{
|
||||
DREAM: {Name: "dream name path auto start", Help: "梦想家", Actions: ice.MergeAction(ice.Actions{
|
||||
DREAM: {Name: "dream name path auto start", Help: "梦想家", Actions: ice.MergeActions(ice.Actions{
|
||||
ice.CTX_INIT: {Hand: func(m *ice.Message, arg ...string) { m.Config(nfs.SCRIPT, _dream_script) }},
|
||||
mdb.INPUTS: {Name: "inputs", Help: "补全", Hand: func(m *ice.Message, arg ...string) {
|
||||
switch arg[0] {
|
||||
|
@ -2,7 +2,6 @@ package web
|
||||
|
||||
import (
|
||||
"net/url"
|
||||
"path"
|
||||
"strings"
|
||||
"time"
|
||||
|
||||
@ -10,10 +9,19 @@ import (
|
||||
"shylinux.com/x/icebergs/base/cli"
|
||||
"shylinux.com/x/icebergs/base/gdb"
|
||||
"shylinux.com/x/icebergs/base/mdb"
|
||||
"shylinux.com/x/icebergs/base/nfs"
|
||||
kit "shylinux.com/x/toolkits"
|
||||
"shylinux.com/x/toolkits/file"
|
||||
)
|
||||
|
||||
func Upload(m *ice.Message) []string { // hash name size
|
||||
up := kit.Simple(m.Optionv(ice.MSG_UPLOAD))
|
||||
if len(up) < 2 {
|
||||
msg := m.Cmdy(CACHE, UPLOAD)
|
||||
up = kit.Simple(msg.Append(mdb.HASH), msg.Append(mdb.NAME), msg.Append(nfs.SIZE))
|
||||
}
|
||||
return up
|
||||
}
|
||||
func PushNotice(m *ice.Message, arg ...ice.Any) {
|
||||
m.Optionv(ice.MSG_OPTS, m.Optionv(ice.MSG_OPTION))
|
||||
if m.Option(ice.MSG_USERPOD) == "" {
|
||||
@ -104,6 +112,14 @@ func PushPodCmd(m *ice.Message, cmd string, arg ...string) {
|
||||
})
|
||||
}
|
||||
|
||||
func OptionAgentIs(m *ice.Message, arg ...string) bool {
|
||||
for _, k := range arg {
|
||||
if strings.HasPrefix(m.Option(ice.MSG_USERUA), k) {
|
||||
return true
|
||||
}
|
||||
}
|
||||
return false
|
||||
}
|
||||
func OptionUserWeb(m *ice.Message) *url.URL {
|
||||
return kit.ParseURL(m.Option(ice.MSG_USERWEB))
|
||||
}
|
||||
@ -116,17 +132,3 @@ func MergeLink(m *ice.Message, url string, arg ...ice.Any) string {
|
||||
func MergePod(m *ice.Message, pod string, arg ...ice.Any) string {
|
||||
return kit.MergePOD(kit.Select(ice.Info.Domain, m.Option(ice.MSG_USERWEB)), pod, arg...)
|
||||
}
|
||||
func MergeCmd(m *ice.Message, cmd string, arg ...ice.Any) string {
|
||||
return mergeurl(m, path.Join(ice.CMD, kit.Select(m.PrefixKey(), cmd)), arg...)
|
||||
}
|
||||
func MergeWebsite(m *ice.Message, web string, arg ...ice.Any) string {
|
||||
return mergeurl(m, path.Join(WEBSITE, web), arg...)
|
||||
}
|
||||
func mergeurl(m *ice.Message, p string, arg ...ice.Any) string {
|
||||
if m.Option(ice.MSG_USERPOD) == "" {
|
||||
p = path.Join("/", p)
|
||||
} else {
|
||||
p = path.Join("/chat", ice.POD, m.Option(ice.MSG_USERPOD), p)
|
||||
}
|
||||
return kit.MergeURL2(kit.Select(ice.Info.Domain, m.Option(ice.MSG_USERWEB)), path.Join(p), arg...)
|
||||
}
|
||||
|
@ -70,7 +70,7 @@ func Render(msg *ice.Message, cmd string, args ...ice.Any) {
|
||||
default:
|
||||
for _, k := range []string{
|
||||
"_option", "_handle", "_output",
|
||||
"cmds", "fields", "sessid", "river", "storm",
|
||||
"cmds", "fields", "sessid",
|
||||
} {
|
||||
msg.Set(k)
|
||||
}
|
||||
@ -86,7 +86,7 @@ func Render(msg *ice.Message, cmd string, args ...ice.Any) {
|
||||
func RenderType(w http.ResponseWriter, name, mime string) {
|
||||
if mime == "" {
|
||||
switch kit.Ext(name) {
|
||||
case nfs.HTML:
|
||||
case "", nfs.HTML:
|
||||
mime = "text/html"
|
||||
case nfs.CSS:
|
||||
mime = "text/css; charset=utf-8"
|
||||
@ -139,16 +139,14 @@ func CookieName(url string) string {
|
||||
return ice.MSG_SESSID + "_" + kit.ParseURLMap(url)[tcp.PORT]
|
||||
}
|
||||
|
||||
func RenderIndex(m *ice.Message, serve, repos string, file ...string) *ice.Message {
|
||||
return m.RenderDownload(path.Join(m.Conf(serve, kit.Keym(repos, nfs.PATH)), kit.Select(m.Conf(serve, kit.Keym(repos, INDEX)), path.Join(file...))))
|
||||
func RenderIndex(m *ice.Message, repos string, file ...string) *ice.Message {
|
||||
if repos == "" {
|
||||
repos = kit.Select(ice.VOLCANOS, ice.INTSHELL, m.IsCliUA())
|
||||
}
|
||||
return m.RenderDownload(path.Join(m.Conf(SERVE, kit.Keym(repos, nfs.PATH)), kit.Select(m.Conf(SERVE, kit.Keym(repos, INDEX)), path.Join(file...))))
|
||||
}
|
||||
func RenderWebsite(m *ice.Message, pod string, dir string, arg ...string) *ice.Message {
|
||||
args := []string{}
|
||||
if pod != "" {
|
||||
args = append(args, SPACE, pod)
|
||||
}
|
||||
m.Echo(m.Cmdx(args, "web.chat.website", lex.PARSE, dir, arg))
|
||||
return m.RenderResult()
|
||||
return m.Echo(m.Cmdx(Space(m, pod), "web.chat.website", lex.PARSE, dir, arg)).RenderResult()
|
||||
}
|
||||
func RenderCmd(m *ice.Message, index string, args ...ice.Any) {
|
||||
list := index
|
||||
|
@ -63,7 +63,7 @@ const ROUTE = "route"
|
||||
|
||||
func init() {
|
||||
Index.MergeCommands(ice.Commands{
|
||||
ROUTE: {Name: "route route ctx cmd auto invite spide", Help: "路由器", Actions: ice.Actions{
|
||||
ROUTE: {Name: "route route index auto invite spide", Help: "路由器", Actions: ice.Actions{
|
||||
aaa.INVITE: {Name: "invite", Help: "添加", Hand: func(m *ice.Message, arg ...string) {
|
||||
m.Cmdy(SPACE, m.Option(ROUTE), SPACE, aaa.INVITE, arg).ProcessInner()
|
||||
}},
|
||||
@ -71,7 +71,7 @@ func init() {
|
||||
m.Cmdy(SPACE, m.Option(ROUTE), DREAM, tcp.START, arg).ProcessInner()
|
||||
}},
|
||||
ctx.COMMAND: {Name: "command", Help: "命令", Hand: func(m *ice.Message, arg ...string) {
|
||||
m.Cmdy(SPACE, m.Option(ROUTE), kit.Keys(m.Option(ice.CTX), m.Option(ice.CMD)), arg)
|
||||
m.Cmdy(SPACE, m.Option(ROUTE), m.Option(ctx.INDEX), arg)
|
||||
}},
|
||||
ice.RUN: {Name: "run", Help: "执行", Hand: func(m *ice.Message, arg ...string) {
|
||||
m.Cmdy(SPACE, m.Option(ROUTE), arg)
|
||||
@ -99,19 +99,12 @@ func init() {
|
||||
}
|
||||
|
||||
} else if len(arg) == 1 || arg[1] == "" { // 模块列表
|
||||
m.Cmd(SPACE, arg[0], ctx.CONTEXT, ice.ICE).Tables(func(value ice.Maps) {
|
||||
m.Push(ice.CTX, kit.Keys(value["ups"], value[mdb.NAME]))
|
||||
m.Push("", value, kit.List(ice.CTX_STATUS, ice.CTX_STREAM, mdb.HELP))
|
||||
})
|
||||
|
||||
} else if len(arg) == 2 || arg[2] == "" { // 命令列表
|
||||
m.Cmd(SPACE, arg[0], ctx.CONTEXT, arg[1], ctx.COMMAND).Tables(func(value ice.Maps) {
|
||||
m.Push(ice.CMD, value[mdb.KEY])
|
||||
m.Push("", value, kit.List(mdb.NAME, mdb.HELP))
|
||||
m.Cmd(SPACE, arg[0], ctx.COMMAND, mdb.SEARCH, ctx.COMMAND, ice.OptionFields(ctx.INDEX, mdb.NAME, mdb.HELP)).Table(func(index int, value ice.Maps, head []string) {
|
||||
m.Push("", value, head)
|
||||
})
|
||||
|
||||
} else { // 命令详情
|
||||
m.Cmdy(SPACE, arg[0], ctx.CONTEXT, arg[1], ctx.COMMAND, arg[2])
|
||||
m.Cmdy(SPACE, arg[0], ctx.COMMAND, arg[1])
|
||||
m.ProcessField(ctx.ACTION, ctx.COMMAND)
|
||||
}
|
||||
}},
|
||||
|
@ -300,7 +300,7 @@ func _serve_login(msg *ice.Message, key string, cmds []string, w http.ResponseWr
|
||||
|
||||
if _, ok := msg.Target().Commands[WEB_LOGIN]; ok { // 单点认证
|
||||
msg.Target().Cmd(msg, WEB_LOGIN, kit.Simple(key, cmds)...)
|
||||
return cmds, msg.Result(0) != ice.ErrWarn && msg.Result(0) != ice.FALSE
|
||||
return cmds, !msg.IsErr() && msg.Result(0) != ice.FALSE
|
||||
}
|
||||
|
||||
if aaa.Right(msg, key, cmds) {
|
||||
@ -329,7 +329,7 @@ const SERVE = "serve"
|
||||
func init() {
|
||||
Index.Merge(&ice.Context{Configs: ice.Configs{
|
||||
SERVE: {Name: SERVE, Help: "服务器", Value: kit.Data(
|
||||
mdb.SHORT, mdb.NAME, mdb.FIELD, "time,status,name,port,dev",
|
||||
mdb.SHORT, mdb.NAME, mdb.FIELD, "time,status,name,proto,host,port,dev",
|
||||
DOMAIN, "", tcp.LOCALHOST, ice.TRUE, LOGHEADERS, ice.FALSE,
|
||||
nfs.PATH, kit.Dict(ice.PS, ice.USR_VOLCANOS),
|
||||
ice.VOLCANOS, kit.Dict(nfs.PATH, ice.USR_VOLCANOS, INDEX, "page/index.html",
|
||||
@ -340,7 +340,7 @@ func init() {
|
||||
),
|
||||
)},
|
||||
}, Commands: ice.Commands{
|
||||
SERVE: {Name: "serve name auto start spide", Help: "服务器", Actions: ice.MergeAction(ice.Actions{
|
||||
SERVE: {Name: "serve name auto start spide", Help: "服务器", Actions: ice.MergeActions(ice.Actions{
|
||||
ice.CTX_INIT: {Hand: func(m *ice.Message, arg ...string) {
|
||||
cli.NodeInfo(m, WORKER, ice.Info.PathName)
|
||||
for _, p := range []string{LOGIN, SHARE, SPACE, ice.VOLCANOS, ice.INTSHELL, ice.PUBLISH, ice.REQUIRE, ice.HELP, ice.CMD} {
|
||||
@ -360,13 +360,13 @@ func init() {
|
||||
cli.START: {Name: "start dev proto=http host port=9020 nodename password username userrole staffname", Help: "启动", Hand: func(m *ice.Message, arg ...string) {
|
||||
_serve_start(m)
|
||||
}},
|
||||
}, mdb.HashAction(mdb.SHORT, mdb.NAME, mdb.FIELD, "time,status,name,proto,host,port,dev"))},
|
||||
}, mdb.HashAction())},
|
||||
|
||||
PP(ice.INTSHELL): {Name: "/intshell/", Help: "命令行", Hand: func(m *ice.Message, arg ...string) {
|
||||
RenderIndex(m, SERVE, ice.INTSHELL, arg...)
|
||||
RenderIndex(m, ice.INTSHELL, arg...)
|
||||
}},
|
||||
PP(ice.VOLCANOS): {Name: "/volcanos/", Help: "浏览器", Hand: func(m *ice.Message, arg ...string) {
|
||||
RenderIndex(m, SERVE, ice.VOLCANOS, arg...)
|
||||
RenderIndex(m, ice.VOLCANOS, arg...)
|
||||
}},
|
||||
PP(ice.PUBLISH): {Name: "/publish/", Help: "定制化", Hand: func(m *ice.Message, arg ...string) {
|
||||
_share_local(aaa.UserRoot(m), ice.USR_PUBLISH, path.Join(arg...))
|
||||
@ -374,10 +374,10 @@ func init() {
|
||||
PP(ice.REQUIRE): {Name: "/require/shylinux.com/x/volcanos/proto.js", Help: "代码库", Hand: func(m *ice.Message, arg ...string) {
|
||||
_share_repos(m, path.Join(arg[0], arg[1], arg[2]), arg[3:]...)
|
||||
}},
|
||||
PP(ice.REQUIRE, ice.NODE_MODULES): {Name: "/require/node_modules/", Help: "依赖库", Hand: func(m *ice.Message, arg ...string) {
|
||||
p := path.Join(ice.USR_VOLCANOS, ice.NODE_MODULES, path.Join(arg...))
|
||||
PP(ice.REQUIRE, ice.LIB, ice.NODE_MODULES): {Name: "/require/lib/node_modules/", Help: "依赖库", Hand: func(m *ice.Message, arg ...string) {
|
||||
p := path.Join(ice.USR_VOLCANOS, ice.LIB, ice.NODE_MODULES, path.Join(arg...))
|
||||
if !nfs.ExistsFile(m, p) {
|
||||
m.Cmd(cli.SYSTEM, "npm", "install", arg[0], kit.Dict(cli.CMD_DIR, ice.USR_VOLCANOS))
|
||||
m.Cmd(cli.SYSTEM, "npm", "install", arg[0], kit.Dict(cli.CMD_DIR, path.Join(ice.USR_VOLCANOS, ice.LIB)))
|
||||
}
|
||||
m.RenderDownload(p)
|
||||
}},
|
||||
|
@ -78,7 +78,7 @@ func _share_local(m *ice.Message, arg ...string) {
|
||||
}
|
||||
|
||||
// 上传文件
|
||||
if p == "bin/ice.bin" {
|
||||
if p == ice.BIN_ICE_BIN {
|
||||
aaa.UserRoot(m).Cmd(SPACE, m.Option(ice.POD), SPIDE, "submit", MergeURL2(m, SHARE_PROXY, nfs.PATH, ""), m.Option(ice.POD), p, size, cache.Format(ice.MOD_TIME))
|
||||
} else {
|
||||
m.Cmd(SPACE, m.Option(ice.POD), SPIDE, ice.DEV, SPIDE_RAW, MergeURL2(m, SHARE_PROXY, nfs.PATH, ""),
|
||||
@ -88,6 +88,10 @@ func _share_local(m *ice.Message, arg ...string) {
|
||||
p = pp
|
||||
}
|
||||
|
||||
if m.Warn(!file.ExistsFile(p)) {
|
||||
m.RenderStatusNotFound()
|
||||
return
|
||||
}
|
||||
m.RenderDownload(p)
|
||||
}
|
||||
func _share_proxy(m *ice.Message) {
|
||||
@ -132,7 +136,7 @@ const SHARE = "share"
|
||||
|
||||
func init() {
|
||||
Index.MergeCommands(ice.Commands{
|
||||
SHARE: {Name: "share hash auto prunes", Help: "共享链", Actions: ice.MergeAction(ice.Actions{
|
||||
SHARE: {Name: "share hash auto prunes", Help: "共享链", Actions: ice.MergeActions(ice.Actions{
|
||||
ice.CTX_INIT: {Hand: func(m *ice.Message, arg ...string) { _share_render(m) }},
|
||||
mdb.CREATE: {Name: "create type name text", Help: "创建", Hand: func(m *ice.Message, arg ...string) {
|
||||
mdb.HashCreate(m, aaa.USERROLE, m.Option(ice.MSG_USERROLE), aaa.USERNAME, m.Option(ice.MSG_USERNAME), aaa.USERNICK, m.Option(ice.MSG_USERNICK),
|
||||
@ -167,7 +171,7 @@ func init() {
|
||||
case LOGIN:
|
||||
m.RenderRedirect(ice.PS, ice.MSG_SESSID, aaa.SessCreate(m, msg.Append(aaa.USERNAME)))
|
||||
default:
|
||||
RenderIndex(m, SERVE, ice.VOLCANOS)
|
||||
RenderIndex(m, ice.VOLCANOS)
|
||||
}
|
||||
}},
|
||||
|
||||
|
@ -216,8 +216,8 @@ func _space_fork(m *ice.Message) {
|
||||
|
||||
switch kind {
|
||||
case CHROME: // 交互节点
|
||||
gdb.Event(m, SPACE_OPEN, args...)
|
||||
defer gdb.Event(m, SPACE_CLOSE, args...)
|
||||
gdb.Event(m, SPACE_OPEN, args)
|
||||
defer gdb.Event(m, SPACE_CLOSE, args)
|
||||
defer mdb.HashRemove(m, mdb.NAME, name)
|
||||
m.Go(func(msg *ice.Message) {
|
||||
switch m.Option(ice.CMD) {
|
||||
@ -234,12 +234,12 @@ func _space_fork(m *ice.Message) {
|
||||
}
|
||||
})
|
||||
case WORKER: // 工作节点
|
||||
gdb.Event(m, DREAM_START, args...)
|
||||
defer gdb.Event(m, DREAM_STOP, args...)
|
||||
gdb.Event(m, DREAM_START, args)
|
||||
defer gdb.Event(m, DREAM_STOP, args)
|
||||
defer m.Cmd(DREAM, DREAM_STOP, args)
|
||||
default: // 服务节点
|
||||
gdb.Event(m, SPACE_START, args...)
|
||||
defer gdb.Event(m, SPACE_STOP, args...)
|
||||
gdb.Event(m, SPACE_START, args)
|
||||
defer gdb.Event(m, SPACE_STOP, args)
|
||||
defer mdb.HashRemove(m, mdb.NAME, name)
|
||||
}
|
||||
_space_handle(m, false, m.Target().Server().(*Frame), s, name)
|
||||
@ -297,8 +297,12 @@ func init() {
|
||||
REDIAL, kit.Dict("a", 3000, "b", 1000, "c", 1000), TIMEOUT, kit.Dict("c", "180s"),
|
||||
)},
|
||||
}, Commands: ice.Commands{
|
||||
SPACE: {Name: "space name cmd auto invite", Help: "空间站", Actions: ice.MergeAction(ice.Actions{
|
||||
SPACE: {Name: "space name cmd auto invite", Help: "空间站", Actions: ice.MergeActions(ice.Actions{
|
||||
ice.CTX_INIT: {Hand: func(m *ice.Message, arg ...string) { m.Conf("", mdb.HASH, "") }},
|
||||
ice.CTX_EXIT: {Hand: func(m *ice.Message, arg ...string) {
|
||||
mdb.HashSelectClose(m)
|
||||
m.Conf("", mdb.HASH, "")
|
||||
}},
|
||||
mdb.REMOVE: {Name: "remove", Help: "删除", Hand: func(m *ice.Message, arg ...string) {
|
||||
mdb.HashModify(m, m.OptionSimple(mdb.NAME), mdb.STATUS, cli.STOP)
|
||||
defer mdb.HashRemove(m, m.OptionSimple(mdb.NAME))
|
||||
|
@ -38,6 +38,7 @@ func _spide_create(m *ice.Message, name, address string) {
|
||||
}
|
||||
}
|
||||
func _spide_list(m *ice.Message, arg ...string) {
|
||||
msg := mdb.HashSelects(m.Spawn(), arg[0])
|
||||
cache, save := "", ""
|
||||
switch arg[1] { // 缓存方法
|
||||
case SPIDE_RAW:
|
||||
@ -50,7 +51,6 @@ func _spide_list(m *ice.Message, arg ...string) {
|
||||
cache, arg = arg[1], arg[1:]
|
||||
}
|
||||
|
||||
msg := mdb.HashSelect(m.Spawn(), arg[0])
|
||||
method := kit.Select(SPIDE_POST, msg.Append(CLIENT_METHOD))
|
||||
switch arg = arg[1:]; arg[0] { // 请求方法
|
||||
case SPIDE_GET:
|
||||
@ -77,6 +77,8 @@ func _spide_list(m *ice.Message, arg ...string) {
|
||||
})
|
||||
|
||||
// 发送请求
|
||||
m.Debug("what %v", msg.Append(CLIENT_NAME))
|
||||
m.Debug("what %v", msg.FormatsMeta())
|
||||
res, e := _spide_send(m, msg.Append(CLIENT_NAME), req, kit.Format(msg.Append(CLIENT_TIMEOUT)))
|
||||
if m.Warn(e, ice.ErrNotFound, uri) {
|
||||
return
|
||||
@ -349,7 +351,7 @@ const SPIDE = "spide"
|
||||
|
||||
func init() {
|
||||
Index.MergeCommands(ice.Commands{
|
||||
SPIDE: {Name: "spide client.name action=raw,msg,save,cache method=GET,PUT,POST,DELETE url format=form,part,json,data,file arg run create", Help: "蜘蛛侠", Actions: ice.MergeAction(ice.Actions{
|
||||
SPIDE: {Name: "spide client.name action=raw,msg,save,cache method=GET,PUT,POST,DELETE url format=form,part,json,data,file arg run create", Help: "蜘蛛侠", Actions: ice.MergeActions(ice.Actions{
|
||||
ice.CTX_INIT: {Hand: func(m *ice.Message, arg ...string) {
|
||||
conf := m.Confm(cli.RUNTIME, cli.CONF)
|
||||
m.Cmd(SPIDE, mdb.CREATE, ice.OPS, kit.Select("http://127.0.0.1:9020", conf[cli.CTX_OPS]))
|
||||
@ -387,3 +389,16 @@ func init() {
|
||||
}},
|
||||
})
|
||||
}
|
||||
|
||||
func SpideGet(m *ice.Message, arg ...ice.Any) ice.Any {
|
||||
return kit.UnMarshal(m.Cmdx(SPIDE_GET, arg))
|
||||
}
|
||||
func SpidePut(m *ice.Message, arg ...ice.Any) ice.Any {
|
||||
return kit.UnMarshal(m.Cmdx(SPIDE_PUT, arg))
|
||||
}
|
||||
func SpidePost(m *ice.Message, arg ...ice.Any) ice.Any {
|
||||
return kit.UnMarshal(m.Cmdx(SPIDE_POST, arg))
|
||||
}
|
||||
func SpideDelete(m *ice.Message, arg ...ice.Any) ice.Any {
|
||||
return kit.UnMarshal(m.Cmdx(SPIDE_DELETE, arg))
|
||||
}
|
||||
|
@ -131,5 +131,8 @@ func init() {
|
||||
)
|
||||
}
|
||||
|
||||
func ApiAction(arg ...string) ice.Actions {
|
||||
return ice.Actions{kit.Select(ice.PS, path.Join(arg...)+ice.PS): {}}
|
||||
}
|
||||
func P(arg ...string) string { return path.Join(ice.PS, path.Join(arg...)) }
|
||||
func PP(arg ...string) string { return P(arg...) + ice.PS }
|
||||
|
5
conf.go
5
conf.go
@ -89,6 +89,11 @@ const ( // DIR
|
||||
CSV = "csv"
|
||||
JSON = "json"
|
||||
|
||||
LIB = "lib"
|
||||
PAGE = "page"
|
||||
PANEL = "panel"
|
||||
PLUGIN = "plugin"
|
||||
|
||||
FAVICON = "favicon.ico"
|
||||
PROTO_JS = "proto.js"
|
||||
FRAME_JS = "frame.js"
|
||||
|
@ -11,33 +11,23 @@ import (
|
||||
)
|
||||
|
||||
func _action_right(m *ice.Message, river string, storm string) (ok bool) {
|
||||
if ok = true; m.Option(ice.MSG_USERROLE) == aaa.VOID {
|
||||
mdb.Richs(m, RIVER, "", river, func(key string, value ice.Map) {
|
||||
if ok = mdb.Richs(m, RIVER, kit.Keys(mdb.HASH, key, OCEAN), m.Option(ice.MSG_USERNAME), nil) != nil; ok {
|
||||
m.Logs(ice.LOG_AUTH, RIVER, river, STORM, storm)
|
||||
}
|
||||
})
|
||||
}
|
||||
return ok
|
||||
return m.Option(ice.MSG_USERROLE) != aaa.VOID || m.Cmd(OCEAN, m.Option(ice.MSG_USERNAME)).Length() > 0
|
||||
}
|
||||
func _action_key(m *ice.Message, arg ...string) string {
|
||||
return kit.Keys(mdb.HASH, kit.Select(m.Option(RIVER), arg, 0), STORM, mdb.HASH, kit.Select(m.Option(STORM), arg, 1))
|
||||
return kit.KeyHash(kit.Select(m.Option(RIVER), arg, 0), STORM, kit.KeyHash(kit.Select(m.Option(STORM), arg, 1)))
|
||||
}
|
||||
func _action_list(m *ice.Message, river, storm string) {
|
||||
m.Cmdy(STORM, storm, ice.Option{ice.MSG_RIVER, river}).Tables(func(value ice.Maps) {
|
||||
m.Cmdy(web.Space(m, kit.Select(m.Option(ice.POD), value[ice.POD])), ctx.COMMAND, kit.Keys(value[ice.CTX], value[ice.CMD]))
|
||||
})
|
||||
m.Cmdy(STORM, storm, kit.Dict(ice.MSG_RIVER, river))
|
||||
}
|
||||
func _action_exec(m *ice.Message, river, storm, index string, arg ...string) {
|
||||
m.Option(ice.MSG_RIVER, river)
|
||||
m.Option(ice.MSG_STORM, storm)
|
||||
|
||||
cmds := []string{index}
|
||||
if mdb.Grows(m, RIVER, _action_key(m, river, storm), mdb.ID, index, func(index int, value ice.Map) {
|
||||
if cmds = kit.Simple(kit.Keys(value[ice.CTX], value[ice.CMD])); kit.Format(value[ice.POD]) != "" {
|
||||
m.Option(ice.POD, value[ice.POD]) // 远程节点
|
||||
if m.Cmd(STORM, storm, index, func(value ice.Maps) {
|
||||
if index = value[ctx.INDEX]; value[web.SPACE] != "" {
|
||||
m.Option(ice.POD, value[web.SPACE])
|
||||
}
|
||||
}) == nil && m.Option(ice.MSG_USERPOD) == "" && !aaa.Right(m, cmds) {
|
||||
}).Length() == 0 && m.Option(ice.MSG_USERPOD) == "" && !aaa.Right(m, index) {
|
||||
return // 没有授权
|
||||
}
|
||||
|
||||
@ -45,13 +35,15 @@ func _action_exec(m *ice.Message, river, storm, index string, arg ...string) {
|
||||
_action_upload(m) // 上传文件
|
||||
}
|
||||
|
||||
if cmds[0] == "web.chat.node" || !ctx.PodCmd(m, cmds, arg) {
|
||||
m.Cmdy(cmds, arg) // 执行命令
|
||||
if index == m.Prefix(NODES) || !ctx.PodCmd(m, index, arg) {
|
||||
m.Cmdy(index, arg) // 执行命令
|
||||
}
|
||||
}
|
||||
func _action_auth(m, msg *ice.Message) bool {
|
||||
if m.Warn(kit.Time() > kit.Time(msg.Append(mdb.TIME)), ice.ErrNotValid) {
|
||||
return false
|
||||
func _action_auth(m *ice.Message, share string) *ice.Message {
|
||||
msg := m.Cmd(web.SHARE, share)
|
||||
if m.Warn(kit.Time(msg.Append(mdb.TIME)) < kit.Time(m.Time()), ice.ErrNotValid) {
|
||||
msg.Append(mdb.TYPE, "")
|
||||
return msg // 共享过期
|
||||
}
|
||||
m.Logs(ice.LOG_AUTH,
|
||||
aaa.USERROLE, m.Option(ice.MSG_USERROLE, msg.Append(aaa.USERROLE)),
|
||||
@ -60,15 +52,15 @@ func _action_auth(m, msg *ice.Message) bool {
|
||||
RIVER, m.Option(ice.MSG_RIVER, msg.Append(RIVER)),
|
||||
STORM, m.Option(ice.MSG_STORM, msg.Append(STORM)),
|
||||
)
|
||||
return _action_right(m, msg.Append(web.RIVER), msg.Append(web.STORM))
|
||||
if m.Warn(!_action_right(m, msg.Append(web.RIVER), msg.Append(web.STORM)), ice.ErrNotRight) {
|
||||
msg.Append(mdb.TYPE, "")
|
||||
return msg // 没有权限
|
||||
}
|
||||
return msg
|
||||
}
|
||||
func _action_share(m *ice.Message, arg ...string) {
|
||||
switch msg := m.Cmd(web.SHARE, arg[0]); msg.Append(mdb.TYPE) {
|
||||
switch msg := _action_auth(m, arg[0]); msg.Append(mdb.TYPE) {
|
||||
case web.STORM:
|
||||
if !_action_auth(m, msg) {
|
||||
break // 没有授权
|
||||
}
|
||||
|
||||
if len(arg) == 1 {
|
||||
_action_list(m, msg.Append(web.RIVER), msg.Append(web.STORM))
|
||||
break // 命令列表
|
||||
@ -78,22 +70,16 @@ func _action_share(m *ice.Message, arg ...string) {
|
||||
_action_exec(m, msg.Append(web.RIVER), msg.Append(web.STORM), arg[1], arg[2:]...)
|
||||
|
||||
case web.FIELD:
|
||||
if !_action_auth(m, msg) {
|
||||
break // 没有授权
|
||||
}
|
||||
|
||||
if arg[0] = msg.Append(mdb.NAME); len(arg) == 1 {
|
||||
if len(arg) == 1 {
|
||||
m.Push(TITLE, msg.Append(TITLE))
|
||||
m.Push(TOPIC, msg.Append(TOPIC))
|
||||
m.Push(ctx.INDEX, msg.Append(mdb.NAME))
|
||||
m.Push(ctx.ARGS, msg.Append(mdb.TEXT))
|
||||
break // 命令列表
|
||||
}
|
||||
|
||||
if m.Option(ice.MSG_UPLOAD) != "" {
|
||||
if arg[1] = msg.Append(mdb.NAME); m.Option(ice.MSG_UPLOAD) != "" {
|
||||
_action_upload(m) // 上传文件
|
||||
}
|
||||
|
||||
m.Cmdy(arg[1:]) // 执行命令
|
||||
}
|
||||
}
|
||||
@ -103,7 +89,6 @@ func _action_upload(m *ice.Message) {
|
||||
}
|
||||
|
||||
const (
|
||||
DOMAIN = "domain"
|
||||
PUBLIC = "public"
|
||||
PROTECTED = "protected"
|
||||
PRIVATE = "private"
|
||||
@ -113,33 +98,11 @@ const ACTION = "action"
|
||||
|
||||
func init() {
|
||||
Index.MergeCommands(ice.Commands{
|
||||
web.P(ACTION): {Name: "/action river storm action arg...", Help: "工作台", Actions: ice.MergeAction(ice.Actions{
|
||||
ice.CTX_INIT: {Hand: func(m *ice.Message, arg ...string) {
|
||||
for _, cmd := range []string{
|
||||
"web.chat.meet.miss",
|
||||
"web.chat.meet.mate",
|
||||
"web.chat.location",
|
||||
"web.chat.paste",
|
||||
"web.chat.scan",
|
||||
"web.wiki.feel",
|
||||
"web.wiki.draw",
|
||||
"web.wiki.data",
|
||||
"web.wiki.word",
|
||||
"web.team.task",
|
||||
"web.team.plan",
|
||||
"web.mall.asset",
|
||||
"web.mall.salary",
|
||||
} {
|
||||
m.Config(kit.Keys(DOMAIN, cmd), ice.TRUE)
|
||||
}
|
||||
}},
|
||||
web.P(ACTION): {Name: "/action river storm action arg...", Help: "工作台", Actions: ice.MergeActions(ice.Actions{
|
||||
mdb.MODIFY: {Name: "modify", Help: "编辑", Hand: func(m *ice.Message, arg ...string) {
|
||||
m.Cmdy(mdb.MODIFY, RIVER, _action_key(m), mdb.LIST, m.OptionSimple(mdb.ID), arg)
|
||||
}},
|
||||
SHARE: {Name: "share", Help: "共享", Hand: func(m *ice.Message, arg ...string) {
|
||||
_header_share(m, arg...)
|
||||
}},
|
||||
"_share": {Name: "_share", Help: "共享", Hand: func(m *ice.Message, arg ...string) {
|
||||
web.SHARE: {Name: "share", Help: "共享", Hand: func(m *ice.Message, arg ...string) {
|
||||
_action_share(m, arg...)
|
||||
}},
|
||||
}, ctx.CmdAction(nfs.PATH, ice.USR_LOCAL_RIVER)), Hand: func(m *ice.Message, arg ...string) {
|
||||
|
@ -1,18 +1,37 @@
|
||||
package chat
|
||||
|
||||
import (
|
||||
"path"
|
||||
|
||||
ice "shylinux.com/x/icebergs"
|
||||
"shylinux.com/x/icebergs/base/web"
|
||||
kit "shylinux.com/x/toolkits"
|
||||
)
|
||||
|
||||
const CHAT = "chat"
|
||||
|
||||
var Index = &ice.Context{Name: CHAT, Help: "聊天中心"}
|
||||
|
||||
func init() {
|
||||
web.Index.Register(Index, &web.Frame{},
|
||||
HEADER, RIVER, STORM, ACTION, FOOTER,
|
||||
SCAN, PASTE, FILES, LOCATION,
|
||||
WEBSITE,
|
||||
)
|
||||
func init() { web.Index.Register(Index, &web.Frame{}) }
|
||||
|
||||
func MergePod(m *ice.Message, pod string, arg ...ice.Any) string {
|
||||
return kit.MergePOD(kit.Select(ice.Info.Domain, m.Option(ice.MSG_USERWEB)), pod, arg...)
|
||||
}
|
||||
func MergeCmd(m *ice.Message, cmd string, arg ...ice.Any) string {
|
||||
return mergeurl(m, path.Join(ice.CMD, kit.Select(m.PrefixKey(), cmd)), arg...)
|
||||
}
|
||||
func MergeWebsite(m *ice.Message, web string, arg ...ice.Any) string {
|
||||
if m.Option(ice.MSG_USERPOD) == "" {
|
||||
return mergeurl(m, path.Join(ice.PS, "chat", WEBSITE, web), arg...)
|
||||
} else {
|
||||
return mergeurl(m, path.Join(WEBSITE, web), arg...)
|
||||
}
|
||||
}
|
||||
func mergeurl(m *ice.Message, p string, arg ...ice.Any) string {
|
||||
if m.Option(ice.MSG_USERPOD) == "" {
|
||||
p = path.Join(ice.PS, p)
|
||||
} else {
|
||||
p = path.Join(ice.PS, "chat", ice.POD, m.Option(ice.MSG_USERPOD), p)
|
||||
}
|
||||
return kit.MergeURL2(kit.Select(ice.Info.Domain, m.Option(ice.MSG_USERWEB)), path.Join(p), arg...)
|
||||
}
|
||||
|
@ -1,31 +1,34 @@
|
||||
chapter "组织"
|
||||
|
||||
header.go
|
||||
footer.go
|
||||
river.go
|
||||
storm.go
|
||||
ocean.go
|
||||
action.go
|
||||
search.go
|
||||
|
||||
info.go
|
||||
node.go
|
||||
chat.go
|
||||
chat.shy
|
||||
|
||||
header.go
|
||||
footer.go
|
||||
action.go
|
||||
search.go
|
||||
river.go
|
||||
storm.go
|
||||
ocean.go
|
||||
nodes.go
|
||||
|
||||
sso.go
|
||||
pod.go
|
||||
cmd.go
|
||||
div.go
|
||||
sso.go
|
||||
grant.go
|
||||
topic.go
|
||||
website.go
|
||||
|
||||
room.go
|
||||
meet.go
|
||||
scan.go
|
||||
scan.js
|
||||
paste.go
|
||||
files.go
|
||||
trans.go
|
||||
location.go
|
||||
location.shy
|
||||
|
||||
room.go
|
||||
meet.go
|
||||
grant.go
|
||||
oauth
|
||||
|
||||
|
@ -5,6 +5,7 @@ import (
|
||||
"strings"
|
||||
|
||||
ice "shylinux.com/x/icebergs"
|
||||
"shylinux.com/x/icebergs/base/aaa"
|
||||
"shylinux.com/x/icebergs/base/ctx"
|
||||
"shylinux.com/x/icebergs/base/mdb"
|
||||
"shylinux.com/x/icebergs/base/nfs"
|
||||
@ -52,67 +53,25 @@ const CMD = "cmd"
|
||||
|
||||
func init() {
|
||||
Index.MergeCommands(ice.Commands{
|
||||
CMD: {Name: "cmd path auto upload up home", Help: "命令", Actions: ice.MergeAction(ice.Actions{
|
||||
web.UPLOAD: {Name: "upload", Help: "上传", Hand: func(m *ice.Message, arg ...string) {
|
||||
m.Cmdy(web.CACHE, web.UPLOAD_WATCH, path.Join(m.Config(nfs.PATH), strings.TrimPrefix(path.Dir(m.R.URL.Path), "/cmd")))
|
||||
}},
|
||||
|
||||
"home": {Name: "home", Help: "根目录", Hand: func(m *ice.Message, arg ...string) {
|
||||
m.ProcessLocation("/chat/cmd/")
|
||||
}},
|
||||
"up": {Name: "up", Help: "上一级", Hand: func(m *ice.Message, arg ...string) {
|
||||
if strings.TrimPrefix(m.R.URL.Path, "/cmd") == ice.PS {
|
||||
m.Cmdy(CMD)
|
||||
} else if strings.HasSuffix(m.R.URL.Path, ice.PS) {
|
||||
m.ProcessLocation("../")
|
||||
} else {
|
||||
m.ProcessLocation(nfs.PWD)
|
||||
}
|
||||
}},
|
||||
}, mdb.HashAction(mdb.SHORT, "type", nfs.PATH, nfs.PWD)), Hand: func(m *ice.Message, arg ...string) {
|
||||
if _cmd_file(m, arg...) {
|
||||
return
|
||||
}
|
||||
if msg := m.Cmd(ctx.COMMAND, arg[0]); msg.Length() > 0 {
|
||||
web.RenderCmd(m, arg[0])
|
||||
return
|
||||
}
|
||||
|
||||
if len(arg) > 0 {
|
||||
m.ProcessLocation(arg[0])
|
||||
return
|
||||
}
|
||||
m.Option(nfs.DIR_ROOT, path.Join(m.Config(nfs.PATH), strings.TrimPrefix(path.Dir(m.R.URL.Path), "/cmd")))
|
||||
m.Cmdy(nfs.DIR, arg)
|
||||
}},
|
||||
"/cmd/": {Name: "/cmd/", Help: "命令", Actions: ice.MergeAction(ice.Actions{
|
||||
ice.CTX_INIT: {Name: "_init", Help: "初始化", Hand: func(m *ice.Message, arg ...string) {
|
||||
m.Cmdy(CMD, mdb.CREATE, mdb.TYPE, "shy", mdb.NAME, "web.wiki.word")
|
||||
m.Cmdy(CMD, mdb.CREATE, mdb.TYPE, "svg", mdb.NAME, "web.wiki.draw")
|
||||
m.Cmdy(CMD, mdb.CREATE, mdb.TYPE, "csv", mdb.NAME, "web.wiki.data")
|
||||
m.Cmdy(CMD, mdb.CREATE, mdb.TYPE, "json", mdb.NAME, "web.wiki.json")
|
||||
|
||||
CMD: {Name: "cmd path auto upload up home", Help: "命令", Actions: ice.MergeActions(ice.Actions{
|
||||
ice.CTX_INIT: {Hand: func(m *ice.Message, arg ...string) {
|
||||
m.Cmd(aaa.ROLE, aaa.WHITE, CMD)
|
||||
m.Cmdy(CMD, mdb.CREATE, mdb.TYPE, nfs.SHY, mdb.NAME, "web.wiki.word")
|
||||
m.Cmdy(CMD, mdb.CREATE, mdb.TYPE, nfs.SVG, mdb.NAME, "web.wiki.draw")
|
||||
m.Cmdy(CMD, mdb.CREATE, mdb.TYPE, nfs.CSV, mdb.NAME, "web.wiki.data")
|
||||
m.Cmdy(CMD, mdb.CREATE, mdb.TYPE, nfs.JSON, mdb.NAME, "web.wiki.json")
|
||||
for _, k := range []string{"mod", "sum"} {
|
||||
m.Cmdy(CMD, mdb.CREATE, mdb.TYPE, k, mdb.NAME, "web.code.inner")
|
||||
}
|
||||
}},
|
||||
}, ctx.CmdAction()), Hand: func(m *ice.Message, arg ...string) {
|
||||
if strings.HasSuffix(m.R.URL.Path, ice.PS) {
|
||||
web.RenderCmd(m, CMD)
|
||||
return // 目录
|
||||
}
|
||||
}, mdb.HashAction(mdb.SHORT, "type", nfs.PATH, nfs.PWD), ctx.CmdAction(), web.ApiAction("/cmd/")), Hand: func(m *ice.Message, arg ...string) {
|
||||
if _cmd_file(m, arg...) {
|
||||
return
|
||||
}
|
||||
|
||||
if ctx.PodCmd(m, ctx.COMMAND, arg[0]) {
|
||||
if !m.IsErr() {
|
||||
if ctx.PodCmd(m, ctx.COMMAND, arg[0]) && !m.IsErr() {
|
||||
web.RenderCmd(m, arg[0], arg[1:]) // 远程命令
|
||||
}
|
||||
} else if m.Cmdy(ctx.COMMAND, arg[0]); m.Length() > 0 {
|
||||
web.RenderCmd(m, arg[0], arg[1:]) // 本地命令
|
||||
} else {
|
||||
m.RenderDownload(path.Join(m.Config(nfs.PATH), path.Join(arg...))) // 文件
|
||||
}
|
||||
}},
|
||||
})
|
||||
|
@ -31,7 +31,7 @@ func init() {
|
||||
nfs.TEMPLATE, _div_template,
|
||||
)},
|
||||
}, Commands: ice.Commands{
|
||||
"/div/": {Name: "/div/", Help: "定制", Actions: ice.MergeAction(ctx.CmdAction()), Hand: func(m *ice.Message, arg ...string) {
|
||||
"/div/": {Name: "/div/", Help: "定制", Actions: ice.MergeActions(ctx.CmdAction()), Hand: func(m *ice.Message, arg ...string) {
|
||||
switch p := path.Join(arg...); kit.Ext(kit.Select("", p)) {
|
||||
case nfs.HTML:
|
||||
m.RenderDownload(p)
|
||||
@ -45,7 +45,7 @@ func init() {
|
||||
web.RenderCmd(m, m.PrefixKey(), p)
|
||||
}
|
||||
}},
|
||||
DIV: {Name: "div hash auto import", Help: "定制", Actions: ice.MergeAction(ice.Actions{
|
||||
DIV: {Name: "div hash auto import", Help: "定制", Actions: ice.MergeActions(ice.Actions{
|
||||
lex.SPLIT: {Name: "split name=hi text", Help: "生成", Hand: func(m *ice.Message, arg ...string) {
|
||||
m.ProcessRewrite(mdb.HASH, m.Cmdx(DIV, mdb.CREATE, m.OptionSimple(mdb.NAME), mdb.TEXT, _div_parse(m, m.Option(mdb.TEXT))))
|
||||
}},
|
||||
|
@ -12,18 +12,13 @@ const FILES = "files"
|
||||
|
||||
func init() {
|
||||
Index.MergeCommands(ice.Commands{
|
||||
FILES: {Name: "files hash auto upload", Help: "文件夹", Actions: ice.MergeAction(ice.Actions{
|
||||
FILES: {Name: "files hash auto upload", Help: "文件夹", Actions: ice.MergeActions(ice.Actions{
|
||||
web.UPLOAD: {Name: "upload", Help: "上传", Hand: func(m *ice.Message, arg ...string) {
|
||||
up := kit.Simple(m.Optionv(ice.MSG_UPLOAD))
|
||||
if len(up) < 2 {
|
||||
msg := m.Cmdy(web.CACHE, web.UPLOAD)
|
||||
up = kit.Simple(msg.Append(mdb.HASH), msg.Append(mdb.NAME), msg.Append(nfs.SIZE))
|
||||
}
|
||||
m.Cmdy(mdb.INSERT, m.PrefixKey(), "", mdb.HASH, mdb.TYPE, kit.Ext(up[1]), mdb.NAME, up[1], nfs.SIZE, up[2], mdb.DATA, up[0])
|
||||
up := web.Upload(m)
|
||||
mdb.HashCreate(m, mdb.TYPE, kit.Ext(up[1]), mdb.NAME, up[1], nfs.SIZE, up[2], mdb.DATA, up[0])
|
||||
}},
|
||||
}, mdb.HashAction(mdb.SHORT, mdb.DATA, mdb.FIELD, "time,hash,type,name,size,data")), Hand: func(m *ice.Message, arg ...string) {
|
||||
mdb.HashSelect(m, arg...)
|
||||
m.Tables(func(value ice.Maps) {
|
||||
mdb.HashSelect(m, arg...).Tables(func(value ice.Maps) {
|
||||
link := web.SHARE_CACHE + value[mdb.DATA]
|
||||
if m.PushDownload(mdb.LINK, value[mdb.NAME], link); len(arg) > 0 && kit.ExtIsImage(value[mdb.NAME]) {
|
||||
m.PushImages("image", link)
|
||||
|
@ -2,29 +2,29 @@ package chat
|
||||
|
||||
import (
|
||||
ice "shylinux.com/x/icebergs"
|
||||
"shylinux.com/x/icebergs/base/aaa"
|
||||
"shylinux.com/x/icebergs/base/cli"
|
||||
"shylinux.com/x/icebergs/base/ctx"
|
||||
"shylinux.com/x/icebergs/base/web"
|
||||
kit "shylinux.com/x/toolkits"
|
||||
)
|
||||
|
||||
const (
|
||||
LEGAL = "legal"
|
||||
EMAIL = "email"
|
||||
)
|
||||
const FOOTER = "footer"
|
||||
|
||||
func init() {
|
||||
Index.Merge(&ice.Context{Configs: ice.Configs{
|
||||
FOOTER: {Name: FOOTER, Help: "状态栏", Value: kit.Dict(LEGAL, kit.List(`<a href="mailto:shylinuxc@gmail.com">shylinuxc@gmail.com</a>`))},
|
||||
}, Commands: ice.Commands{
|
||||
web.P(FOOTER): {Name: "/footer", Help: "状态栏", Actions: ice.MergeAction(ice.Actions{
|
||||
Index.MergeCommands(ice.Commands{
|
||||
FOOTER: {Name: "footer", Help: "状态栏", Actions: ice.MergeActions(ice.Actions{
|
||||
ice.RUN: {Name: "run", Help: "执行", Hand: func(m *ice.Message, arg ...string) {
|
||||
if m.Cmdy(arg); m.Result(1) == ice.ErrNotFound {
|
||||
m.Set(ice.MSG_RESULT).Cmdy(cli.SYSTEM, arg)
|
||||
if aaa.Right(m, arg) {
|
||||
if m.Cmdy(arg); m.IsErrNotFound() {
|
||||
m.SetResult().Cmdy(cli.SYSTEM, arg)
|
||||
}
|
||||
}
|
||||
}},
|
||||
}, ctx.CmdAction()), Hand: func(m *ice.Message, arg ...string) {
|
||||
m.Confm(FOOTER, LEGAL, func(index int, value string) { m.Echo(value) })
|
||||
}, ctx.CmdAction(EMAIL, `<a href="mailto:shylinuxc@gmail.com">shylinuxc@gmail.com</a>`), web.ApiAction()), Hand: func(m *ice.Message, arg ...string) {
|
||||
m.Echo(m.Config(EMAIL))
|
||||
}},
|
||||
}})
|
||||
})
|
||||
}
|
||||
|
@ -11,7 +11,7 @@ const GRANT = "grant"
|
||||
|
||||
func init() {
|
||||
Index.MergeCommands(ice.Commands{
|
||||
GRANT: {Name: "grant space id auto insert", Help: "授权", Actions: ice.MergeAction(ice.Actions{
|
||||
GRANT: {Name: "grant space id auto insert", Help: "授权", Actions: ice.MergeActions(ice.Actions{
|
||||
mdb.INPUTS: {Name: "inputs", Help: "补全", Hand: func(m *ice.Message, arg ...string) {
|
||||
switch arg[0] {
|
||||
case web.SPACE:
|
||||
|
@ -1,27 +1,20 @@
|
||||
package chat
|
||||
|
||||
import (
|
||||
"strings"
|
||||
|
||||
ice "shylinux.com/x/icebergs"
|
||||
"shylinux.com/x/icebergs/base/aaa"
|
||||
"shylinux.com/x/icebergs/base/cli"
|
||||
"shylinux.com/x/icebergs/base/ctx"
|
||||
"shylinux.com/x/icebergs/base/gdb"
|
||||
"shylinux.com/x/icebergs/base/mdb"
|
||||
"shylinux.com/x/icebergs/base/tcp"
|
||||
"shylinux.com/x/icebergs/base/web"
|
||||
"shylinux.com/x/icebergs/core/code"
|
||||
kit "shylinux.com/x/toolkits"
|
||||
)
|
||||
|
||||
func _header_agent(m *ice.Message, arg ...string) {
|
||||
if strings.Index(m.Option(ice.MSG_USERUA), "MicroMessenger") > -1 {
|
||||
m.Cmdy("web.chat.wx.access", "config")
|
||||
}
|
||||
}
|
||||
func _header_check(m *ice.Message, arg ...string) bool {
|
||||
if m.Option(web.SHARE) != "" {
|
||||
m.Cmd(web.SHARE, m.Option(web.SHARE), ice.OptionFields("")).Tables(func(value ice.Maps) {
|
||||
m.Cmd(web.SHARE, m.Option(web.SHARE), ice.OptionFields(""), func(value ice.Maps) {
|
||||
switch value[mdb.TYPE] {
|
||||
case web.FIELD, web.STORM:
|
||||
m.Option(ice.MSG_USERNAME, value[aaa.USERNAME])
|
||||
@ -33,10 +26,10 @@ func _header_check(m *ice.Message, arg ...string) bool {
|
||||
return true
|
||||
}
|
||||
|
||||
m.Option(web.SSO, m.Config(web.SSO))
|
||||
m.Option(web.LOGIN, m.Config(web.LOGIN))
|
||||
m.Option(web.SSO, m.Conf(web.SERVE, kit.Keym(web.SSO)))
|
||||
if m.Option("login.dev", m.Cmd(web.SPACE, ice.DEV).Append(mdb.TEXT)) == "" {
|
||||
m.Option("login.dev", m.Cmd(web.SPACE, ice.SHY).Append(mdb.TEXT))
|
||||
if m.Option("login.dev", m.CmdAppend(web.SPACE, ice.DEV, mdb.TEXT)) == "" {
|
||||
m.Option("login.dev", m.CmdAppend(web.SPACE, ice.SHY, mdb.TEXT))
|
||||
}
|
||||
return false
|
||||
}
|
||||
@ -46,63 +39,48 @@ func _header_share(m *ice.Message, arg ...string) {
|
||||
} else {
|
||||
m.Option(mdb.LINK, tcp.ReplaceLocalhost(m, m.Option(mdb.LINK)))
|
||||
}
|
||||
|
||||
m.Option(mdb.LINK, kit.MergeURL(m.Option(mdb.LINK), RIVER, "", STORM, ""))
|
||||
m.PushQRCode(mdb.TEXT, m.Option(mdb.LINK))
|
||||
m.Push(mdb.NAME, m.Option(mdb.LINK))
|
||||
}
|
||||
func _header_users(m *ice.Message, key string, arg ...string) {
|
||||
m.Option(aaa.USERNAME, m.Option(ice.MSG_USERNAME))
|
||||
m.Cmdy(aaa.USER, ctx.ACTION, mdb.MODIFY, key, m.Option(key, arg[0]))
|
||||
m.Cmdy(aaa.USER, mdb.MODIFY, key, m.Option(key, arg[0]))
|
||||
}
|
||||
|
||||
const (
|
||||
TITLE = "title"
|
||||
MENUS = "menus"
|
||||
TRANS = "trans"
|
||||
AGENT = "agent"
|
||||
CHECK = "check"
|
||||
SHARE = "share"
|
||||
|
||||
HEADER_AGENT = "header.agent"
|
||||
)
|
||||
const HEADER = "header"
|
||||
|
||||
func init() {
|
||||
Index.Merge(&ice.Context{Configs: ice.Configs{
|
||||
HEADER: {Name: HEADER, Help: "标题栏", Value: kit.Data(aaa.LOGIN, kit.List("登录", "扫码"))},
|
||||
}, Commands: ice.Commands{
|
||||
Index.MergeCommands(ice.Commands{
|
||||
web.WEB_LOGIN: {Hand: func(m *ice.Message, arg ...string) {
|
||||
switch arg[0] {
|
||||
case "/header":
|
||||
if kit.Select("", arg, 1) == "" {
|
||||
case web.P(HEADER):
|
||||
switch kit.Select("", arg, 1) {
|
||||
case "", aaa.LOGIN:
|
||||
return // 免登录
|
||||
}
|
||||
if kit.Select("", arg, 1) == aaa.LOGIN {
|
||||
default:
|
||||
if aaa.Right(m, arg) {
|
||||
return // 免登录
|
||||
}
|
||||
case "/pod/", "/cmd/", "/topic/":
|
||||
return // 免登录
|
||||
case "/sso":
|
||||
return // 免登录
|
||||
}
|
||||
m.Warn(m.Option(ice.MSG_USERNAME) == "", ice.ErrNotLogin, arg)
|
||||
}},
|
||||
web.P(HEADER): {Name: "/header", Help: "标题栏", Actions: ice.Actions{
|
||||
AGENT: {Name: "agent", Help: "宿主应用", Hand: func(m *ice.Message, arg ...string) {
|
||||
_header_agent(m, arg...)
|
||||
}},
|
||||
CHECK: {Name: "check", Help: "登录检查", Hand: func(m *ice.Message, arg ...string) {
|
||||
_header_check(m, arg...)
|
||||
}},
|
||||
SHARE: {Name: "share type", Help: "共享", Hand: func(m *ice.Message, arg ...string) {
|
||||
_header_share(m, arg...)
|
||||
}},
|
||||
HEADER: {Name: "header", Help: "标题栏", Actions: ice.MergeActions(ice.Actions{
|
||||
aaa.LOGIN: {Name: "login", Help: "密码登录", Hand: func(m *ice.Message, arg ...string) {
|
||||
if aaa.UserLogin(m, arg[0], arg[1]) {
|
||||
web.RenderCookie(m, aaa.SessCreate(m, arg[0]))
|
||||
}
|
||||
}},
|
||||
aaa.LOGOUT: {Name: "logout", Help: "退出登录", Hand: func(m *ice.Message, arg ...string) {
|
||||
m.Cmd(aaa.SESS, mdb.REMOVE, kit.Dict(mdb.HASH, m.Option(ice.MSG_SESSID)))
|
||||
aaa.UserLogout(m)
|
||||
}},
|
||||
aaa.PASSWORD: {Name: "password", Help: "修改密码", Hand: func(m *ice.Message, arg ...string) {
|
||||
_header_users(m, m.ActionKey(), arg...)
|
||||
@ -120,16 +98,18 @@ func init() {
|
||||
_header_users(m, m.ActionKey(), arg...)
|
||||
}},
|
||||
ctx.CONFIG: {Name: "config scope", Help: "拉取配置", Hand: func(m *ice.Message, arg ...string) {
|
||||
m.Cmdy(web.SPACE, m.Option(ice.MSG_USERPOD), m.Prefix("oauth.oauth"), CHECK, arg)
|
||||
m.Cmdy(web.SPACE, m.Option(ice.MSG_USERPOD), m.Prefix("oauth.oauth"), "check", arg)
|
||||
}},
|
||||
code.WEBPACK: {Name: "webpack", Help: "打包页面", Hand: func(m *ice.Message, arg ...string) {
|
||||
m.Cmdy(code.WEBPACK, cli.BUILD, m.OptionSimple(mdb.NAME))
|
||||
"webpack": {Name: "webpack", Help: "打包页面", Hand: func(m *ice.Message, arg ...string) {
|
||||
m.Cmdy("webpack", cli.BUILD, m.OptionSimple(mdb.NAME))
|
||||
}},
|
||||
}, Hand: func(m *ice.Message, arg ...string) {
|
||||
web.SHARE: {Name: "share type", Help: "共享", Hand: func(m *ice.Message, arg ...string) {
|
||||
_header_share(m, arg...)
|
||||
}},
|
||||
}, ctx.ConfAction(aaa.LOGIN, kit.List("登录", "扫码")), web.ApiAction()), Hand: func(m *ice.Message, arg ...string) {
|
||||
if !_header_check(m, arg...) {
|
||||
return
|
||||
}
|
||||
_header_agent(m, arg...)
|
||||
|
||||
msg := m.Cmd(aaa.USER, m.Option(ice.MSG_USERNAME))
|
||||
for _, k := range []string{aaa.USERNICK, aaa.LANGUAGE} {
|
||||
@ -142,10 +122,10 @@ func init() {
|
||||
m.Option(aaa.AVATAR, kit.Format("https://dayu.oa.com/avatars/%s/profile.jpg", m.R.Header.Get("Staffname")))
|
||||
}
|
||||
|
||||
gdb.Event(m, HEADER_AGENT)
|
||||
m.Option(TRANS, kit.Format(kit.Value(m.Target().Commands[web.P(m.CommandKey())].Meta, "_trans")))
|
||||
m.Option(MENUS, m.Config(MENUS))
|
||||
m.Echo(m.Config(TITLE))
|
||||
// m.Cmdy(WEBSITE)
|
||||
}},
|
||||
}})
|
||||
})
|
||||
}
|
||||
|
@ -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))
|
||||
}},
|
||||
})
|
||||
}
|
@ -37,7 +37,7 @@ func init() {
|
||||
}
|
||||
|
||||
Index.MergeCommands(ice.Commands{
|
||||
LOCATION: {Name: "location hash auto", Help: "地理位置", Actions: ice.MergeAction(ice.Actions{
|
||||
LOCATION: {Name: "location hash auto", Help: "地理位置", Actions: ice.MergeActions(ice.Actions{
|
||||
"explore": {Name: "explore", Help: "周边", Hand: func(m *ice.Message, arg ...string) {
|
||||
m.Echo(get(m, "place/v1/explore", m.OptionSimple("boundary,page_index")))
|
||||
}},
|
||||
|
@ -17,7 +17,7 @@ func init() {
|
||||
mdb.SHORT, mdb.NAME, mdb.FIELD, "time,name,照片,性别,年龄,身高,体重,籍贯,户口,学历,学校,职业,公司,年薪,资产,家境",
|
||||
)},
|
||||
}, Commands: ice.Commands{
|
||||
"monkey": {Name: "monkey total=888 count=9 run", Help: "猴子开箱子", Meta: kit.Dict("_trans", kit.Dict("name", "姓名")), Actions: ice.MergeAction(ice.Actions{
|
||||
"monkey": {Name: "monkey total=888 count=9 run", Help: "猴子开箱子", Meta: kit.Dict("_trans", kit.Dict("name", "姓名")), Actions: ice.MergeActions(ice.Actions{
|
||||
mdb.CREATE: {Name: "create name 照片 性别 年龄 身高 体重 籍贯 户口 学历 学校 职业 公司 年薪 资产 家境", Help: "添加"},
|
||||
}, mdb.HashAction()), Hand: func(m *ice.Message, arg ...string) {
|
||||
total := kit.Int(arg[0])
|
||||
@ -38,7 +38,7 @@ func init() {
|
||||
}
|
||||
m.StatusTimeCount()
|
||||
}},
|
||||
MISS: {Name: "miss name auto create", Help: "资料", Meta: kit.Dict("_trans", kit.Dict("name", "姓名")), Actions: ice.MergeAction(ice.Actions{
|
||||
MISS: {Name: "miss name auto create", Help: "资料", Meta: kit.Dict("_trans", kit.Dict("name", "姓名")), Actions: ice.MergeActions(ice.Actions{
|
||||
mdb.CREATE: {Name: "create name 照片 性别 年龄 身高 体重 籍贯 户口 学历 学校 职业 公司 年薪 资产 家境", Help: "添加"},
|
||||
}, mdb.HashAction()), Hand: func(m *ice.Message, arg ...string) {
|
||||
msg := m.Spawn()
|
||||
|
@ -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)
|
||||
}},
|
||||
})
|
||||
}
|
@ -57,7 +57,7 @@ const (
|
||||
const OAUTH = "oauth"
|
||||
|
||||
var Index = &ice.Context{Name: OAUTH, Help: "认证授权", Commands: ice.Commands{
|
||||
OAUTH: {Name: "oauth hash auto prunes", Help: "权限", Actions: ice.MergeAction(ice.Actions{
|
||||
OAUTH: {Name: "oauth hash auto prunes", Help: "权限", Actions: ice.MergeActions(ice.Actions{
|
||||
CHECK: {Name: "check scope domain", Help: "检查", Hand: func(m *ice.Message, arg ...string) {
|
||||
m.Echo(_merge_url(m, kit.Select(ice.Info.Make.Domain, m.Option(web.DOMAIN)), APPLY, m.OptionSimple(SCOPE), REDIRECT_URI, _merge_url(m, "", REPLY)))
|
||||
}},
|
||||
|
@ -3,6 +3,7 @@ package chat
|
||||
import (
|
||||
ice "shylinux.com/x/icebergs"
|
||||
"shylinux.com/x/icebergs/base/aaa"
|
||||
"shylinux.com/x/icebergs/base/gdb"
|
||||
"shylinux.com/x/icebergs/base/mdb"
|
||||
kit "shylinux.com/x/toolkits"
|
||||
)
|
||||
@ -12,14 +13,21 @@ const OCEAN = "ocean"
|
||||
func init() {
|
||||
Index.MergeCommands(ice.Commands{
|
||||
OCEAN: {Name: "ocean username auto insert invite", Help: "用户", Actions: ice.Actions{
|
||||
ice.CTX_INIT: {Hand: func(m *ice.Message, arg ...string) {
|
||||
gdb.Watch(m, RIVER_CREATE)
|
||||
}},
|
||||
RIVER_CREATE: {Name: "river.create river template", Help: "建群", Hand: func(m *ice.Message, arg ...string) {
|
||||
m.Cmd(OCEAN, mdb.INSERT, aaa.USERNAME, m.Option(ice.MSG_USERNAME))
|
||||
}},
|
||||
mdb.INPUTS: {Name: "inputs", Help: "补全", Hand: func(m *ice.Message, arg ...string) {
|
||||
m.Cmdy(aaa.USER, ice.OptionFields(aaa.USERNAME, aaa.USERNICK, aaa.USERZONE))
|
||||
}},
|
||||
mdb.INSERT: {Name: "insert username", Help: "添加", Hand: func(m *ice.Message, arg ...string) {
|
||||
m.Cmdy(mdb.INSERT, RIVER, _river_key(m, OCEAN), mdb.HASH, arg)
|
||||
m.Option(mdb.SHORT, aaa.USERNAME)
|
||||
m.Cmdy(mdb.INSERT, m.Prefix(RIVER), _river_key(m, OCEAN), mdb.HASH, arg)
|
||||
}},
|
||||
mdb.DELETE: {Name: "delete", Help: "删除", Hand: func(m *ice.Message, arg ...string) {
|
||||
m.Cmdy(mdb.DELETE, RIVER, _river_key(m, OCEAN), mdb.HASH, m.OptionSimple(aaa.USERNAME))
|
||||
m.Cmdy(mdb.DELETE, m.Prefix(RIVER), _river_key(m, OCEAN), mdb.HASH, m.OptionSimple(aaa.USERNAME))
|
||||
}},
|
||||
}, Hand: func(m *ice.Message, arg ...string) {
|
||||
m.Fields(len(arg), "time,username")
|
||||
|
@ -11,7 +11,7 @@ const PASTE = "paste"
|
||||
|
||||
func init() {
|
||||
Index.MergeCommands(ice.Commands{
|
||||
PASTE: {Name: "paste hash auto getClipboardData", Help: "粘贴", Actions: ice.MergeAction(ice.Actions{
|
||||
PASTE: {Name: "paste hash auto getClipboardData", Help: "粘贴", Actions: ice.MergeActions(ice.Actions{
|
||||
"getClipboardData": {Name: "getClipboardData", Help: "粘贴", Hand: func(m *ice.Message, arg ...string) {
|
||||
m.Cmdy(PASTE, mdb.CREATE, arg)
|
||||
}},
|
||||
|
@ -17,32 +17,33 @@ const POD = "pod"
|
||||
|
||||
func init() {
|
||||
Index.MergeCommands(ice.Commands{
|
||||
"/pod/": {Name: "/pod/", Help: "节点", Actions: ctx.CmdAction(), Hand: func(m *ice.Message, arg ...string) {
|
||||
if strings.HasPrefix(m.R.Header.Get("User-Agent"), "curl") || strings.HasPrefix(m.R.Header.Get("User-Agent"), "Wget") {
|
||||
m.Option(ice.MSG_USERNAME, "root")
|
||||
m.Option(ice.MSG_USERROLE, "root")
|
||||
POD: {Name: "pod", Help: "节点", Actions: ice.MergeActions(ice.Actions{
|
||||
ice.CTX_INIT: {Hand: func(m *ice.Message, arg ...string) { m.Cmd(aaa.ROLE, aaa.WHITE, POD) }},
|
||||
}, ctx.CmdAction(), web.ApiAction("/pod/")), Hand: func(m *ice.Message, arg ...string) {
|
||||
if web.OptionAgentIs(m, "curl", "Wget") {
|
||||
aaa.UserRoot(m)
|
||||
m.Option(ice.POD, kit.Select("", arg, 0))
|
||||
m.Cmdy(web.SHARE_LOCAL, "bin/ice.bin")
|
||||
return // 下载文件
|
||||
m.Cmdy(web.SHARE_LOCAL, ice.BIN_ICE_BIN)
|
||||
return // 下载程序
|
||||
}
|
||||
|
||||
if len(arg) == 0 || kit.Select("", arg, 0) == "" { // 节点列表
|
||||
web.RenderCmd(m, web.ROUTE)
|
||||
if len(arg) == 0 || kit.Select("", arg, 0) == "" {
|
||||
web.RenderCmd(m, web.ROUTE) // 节点列表
|
||||
|
||||
} else if len(arg) == 1 { // 节点首页
|
||||
} else if len(arg) == 1 {
|
||||
if m.Cmd(web.SPACE, arg[0]).Length() == 0 && !strings.Contains(arg[0], ice.PT) {
|
||||
m.Cmd(web.DREAM, cli.START, mdb.NAME, arg[0])
|
||||
m.Cmd(web.DREAM, cli.START, mdb.NAME, arg[0]) // 启动节点
|
||||
}
|
||||
aaa.UserRoot(m)
|
||||
if web.RenderWebsite(m, arg[0], "index.iml", "Header", "", "River", "", "Footer", ""); m.Result() == "" {
|
||||
web.RenderIndex(m, web.SERVE, ice.VOLCANOS)
|
||||
if web.RenderWebsite(m, arg[0], ice.INDEX_IML, "Header", "", "River", "", "Footer", ""); m.Result() == "" {
|
||||
web.RenderIndex(m, ice.VOLCANOS) // 节点首页
|
||||
}
|
||||
|
||||
} else if arg[1] == WEBSITE { // 节点网页
|
||||
web.RenderWebsite(m, arg[0], path.Join(arg[2:]...))
|
||||
} else if arg[1] == WEBSITE {
|
||||
web.RenderWebsite(m, arg[0], path.Join(arg[2:]...)) // 节点网页
|
||||
|
||||
} else if arg[1] == "cmd" { // 节点命令
|
||||
m.Cmdy(web.SPACE, arg[0], m.Prefix(CMD), path.Join(arg[2:]...))
|
||||
} else if arg[1] == CMD {
|
||||
m.Cmdy(web.SPACE, arg[0], m.Prefix(CMD), path.Join(arg[2:]...)) // 节点命令
|
||||
} else {
|
||||
m.Cmdy(web.SPACE, m.Option(ice.MSG_USERPOD), "web.chat."+strings.TrimPrefix(path.Join(arg[1:]...), "chat/"))
|
||||
// m.Cmdy(web.SPACE, m.Option(ice.MSG_USERPOD), "web.chat."+ice.PS+path.Join(arg[1:]...))
|
||||
|
@ -5,10 +5,10 @@ import (
|
||||
"shylinux.com/x/icebergs/base/aaa"
|
||||
"shylinux.com/x/icebergs/base/cli"
|
||||
"shylinux.com/x/icebergs/base/ctx"
|
||||
"shylinux.com/x/icebergs/base/gdb"
|
||||
"shylinux.com/x/icebergs/base/mdb"
|
||||
"shylinux.com/x/icebergs/base/nfs"
|
||||
"shylinux.com/x/icebergs/base/web"
|
||||
"shylinux.com/x/icebergs/core/code"
|
||||
kit "shylinux.com/x/toolkits"
|
||||
)
|
||||
|
||||
@ -50,12 +50,14 @@ func _river_list(m *ice.Message) {
|
||||
})
|
||||
}
|
||||
|
||||
const (
|
||||
RIVER_CREATE = "river.create"
|
||||
)
|
||||
const RIVER = "river"
|
||||
|
||||
func init() {
|
||||
Index.MergeCommands(ice.Commands{
|
||||
RIVER: {Name: "river hash auto create", Help: "群组", Actions: ice.MergeAction(ice.Actions{
|
||||
ice.CTX_INIT: {Hand: func(m *ice.Message, arg ...string) { m.Config(nfs.TEMPLATE, _river_template) }},
|
||||
RIVER: {Name: "river hash auto create", Help: "群组", Actions: ice.MergeActions(ice.Actions{
|
||||
mdb.INPUTS: {Name: "inputs", Help: "补全", Hand: func(m *ice.Message, arg ...string) {
|
||||
switch m.Option(ctx.ACTION) {
|
||||
case cli.START, "创建空间":
|
||||
@ -71,38 +73,22 @@ func init() {
|
||||
case aaa.USERNAME:
|
||||
m.Cmdy(aaa.USER).Cut(aaa.USERNAME, aaa.USERNICK, aaa.USERZONE)
|
||||
default:
|
||||
m.Cmdy(mdb.INPUTS, RIVER, "", mdb.HASH, arg)
|
||||
mdb.HashInputs(m, arg)
|
||||
}
|
||||
}},
|
||||
mdb.CREATE: {Name: "create type=public,protected,private name=hi text=hello template=base", Help: "添加", Hand: func(m *ice.Message, arg ...string) {
|
||||
h := m.Cmdx(mdb.INSERT, RIVER, "", mdb.HASH, arg)
|
||||
m.Option(ice.MSG_RIVER, h)
|
||||
m.Echo(h)
|
||||
|
||||
m.Conf(RIVER, kit.Keys(mdb.HASH, h, NODE, kit.Keym(mdb.SHORT)), mdb.NAME)
|
||||
m.Conf(RIVER, kit.Keys(mdb.HASH, h, OCEAN, kit.Keym(mdb.SHORT)), aaa.USERNAME)
|
||||
m.Cmd(OCEAN, mdb.INSERT, aaa.USERNAME, m.Option(ice.MSG_USERNAME))
|
||||
|
||||
kit.Fetch(m.Confv(RIVER, kit.Keym(nfs.TEMPLATE, kit.Select("base", m.Option(nfs.TEMPLATE)))), func(storm string, value ice.Any) {
|
||||
h := m.Cmdx(STORM, mdb.CREATE, mdb.TYPE, PUBLIC, mdb.NAME, storm, mdb.TEXT, storm)
|
||||
|
||||
kit.Fetch(value, func(index int, value string) {
|
||||
m.Search(value, func(p *ice.Context, s *ice.Context, key string, cmd *ice.Command) {
|
||||
m.Cmd(STORM, mdb.INSERT, mdb.HASH, h, ice.CTX, s.Cap(ice.CTX_FOLLOW), ice.CMD, key, mdb.HELP, cmd.Help)
|
||||
})
|
||||
})
|
||||
})
|
||||
h := mdb.HashCreate(m, arg)
|
||||
gdb.Event(m, RIVER_CREATE, RIVER, m.Option(ice.MSG_RIVER, h), arg)
|
||||
m.Result(h)
|
||||
}},
|
||||
cli.START: {Name: "start name=hi repos template", Help: "创建空间", Hand: func(m *ice.Message, arg ...string) {
|
||||
m.Cmdy(web.Space(m, m.Option(ice.POD)), web.DREAM, cli.START, arg)
|
||||
}},
|
||||
aaa.INVITE: {Name: "invite", Help: "添加设备", Hand: func(m *ice.Message, arg ...string) {
|
||||
m.Cmd(code.PUBLISH, mdb.CREATE, nfs.FILE, ice.BIN_ICE_BIN)
|
||||
m.Cmdy(code.PUBLISH, ice.CONTEXTS)
|
||||
m.Cmdy("publish", ice.CONTEXTS)
|
||||
}},
|
||||
}, mdb.HashAction(mdb.FIELD, "time,hash,type,name,text,template"))},
|
||||
web.P(RIVER): {Name: "/river", Help: "群组", Hand: func(m *ice.Message, arg ...string) {
|
||||
if m.Warn(m.Option(ice.MSG_USERNAME) == "", ice.ErrNotLogin, RIVER) {
|
||||
}, mdb.HashAction(mdb.FIELD, "time,hash,type,name,text,template"), web.ApiAction()), Hand: func(m *ice.Message, arg ...string) {
|
||||
if m.Warn(m.Option(ice.MSG_USERNAME) == "", ice.ErrNotLogin) {
|
||||
m.RenderStatusUnauthorized()
|
||||
return // 没有登录
|
||||
}
|
||||
@ -121,49 +107,17 @@ func init() {
|
||||
return // 没有授权
|
||||
}
|
||||
|
||||
switch kit.Select("", arg, 1) {
|
||||
case STORM, OCEAN, NODE:
|
||||
if command := m.Commands(kit.Select("", arg, 1)); command != nil {
|
||||
m.Option(ice.MSG_RIVER, arg[0])
|
||||
m.Cmdy(arg[1], arg[2:])
|
||||
|
||||
case ctx.ACTION, aaa.INVITE:
|
||||
} else if action := m.Actions(kit.Select("", arg, 1)); action != nil {
|
||||
m.Option(ice.MSG_RIVER, arg[0])
|
||||
m.Cmdy(RIVER, arg[1:])
|
||||
m.Cmdy("", arg[1:])
|
||||
|
||||
default:
|
||||
} else {
|
||||
m.Cmdy(RIVER, arg)
|
||||
}
|
||||
}},
|
||||
})
|
||||
}
|
||||
|
||||
var _river_template = kit.Dict(
|
||||
"base", kit.Dict(
|
||||
"info", kit.List(
|
||||
"web.chat.info",
|
||||
"web.chat.ocean",
|
||||
"web.chat.storm",
|
||||
"web.chat.node",
|
||||
),
|
||||
"scan", kit.List(
|
||||
"web.chat.scan",
|
||||
"web.chat.paste",
|
||||
"web.chat.files",
|
||||
"web.chat.location",
|
||||
"web.chat.meet.miss",
|
||||
"web.wiki.feel",
|
||||
),
|
||||
"task", kit.List(
|
||||
"web.team.task",
|
||||
"web.team.plan",
|
||||
"web.mall.asset",
|
||||
"web.mall.salary",
|
||||
"web.wiki.word",
|
||||
),
|
||||
"draw", kit.List(
|
||||
"web.wiki.draw",
|
||||
"web.wiki.data",
|
||||
"web.wiki.word",
|
||||
),
|
||||
),
|
||||
)
|
||||
|
@ -22,7 +22,7 @@ func init() {
|
||||
mdb.SHORT, "space", mdb.FIELD, "time,hash,username,socket",
|
||||
)},
|
||||
}, Commands: ice.Commands{
|
||||
ROOM: {Name: "room zone id auto", Help: "room", Actions: ice.MergeAction(ice.Actions{
|
||||
ROOM: {Name: "room zone id auto", Help: "room", Actions: ice.MergeActions(ice.Actions{
|
||||
mdb.CREATE: {Name: "create zone", Help: "创建", Hand: func(m *ice.Message, arg ...string) {
|
||||
m.Cmdy(mdb.INSERT, m.PrefixKey(), "", mdb.HASH, m.OptionSimple(mdb.ZONE))
|
||||
}},
|
||||
@ -50,7 +50,7 @@ func init() {
|
||||
m.Action(mdb.INSERT, JOIN)
|
||||
}
|
||||
}},
|
||||
JOIN: {Name: "join space zone auto", Help: "join", Actions: ice.MergeAction(ice.Actions{
|
||||
JOIN: {Name: "join space zone auto", Help: "join", Actions: ice.MergeActions(ice.Actions{
|
||||
ice.CTX_INIT: {Hand: func(m *ice.Message, arg ...string) {
|
||||
// m.Watch(web.SPACE_START, m.PrefixKey())
|
||||
}},
|
||||
|
@ -12,9 +12,7 @@ const SCAN = "scan"
|
||||
|
||||
func init() {
|
||||
Index.MergeCommands(ice.Commands{
|
||||
SCAN: {Name: "scan hash auto scanQRCode scanQRCode0", Help: "扫码", Meta: kit.Dict(
|
||||
ice.Display("scan.js"),
|
||||
), Actions: ice.MergeAction(ice.Actions{
|
||||
SCAN: {Name: "scan hash auto scanQRCode scanQRCode0", Help: "扫码", Meta: kit.Dict(ice.Display("")), Actions: ice.MergeActions(ice.Actions{
|
||||
"scanQRCode0": {Name: "scan create", Help: "本机扫码"},
|
||||
"scanQRCode": {Name: "scan create", Help: "扫码"},
|
||||
mdb.CREATE: {Name: "create type=text name=hi text:textarea=hi", Help: "添加"},
|
||||
|
@ -1,18 +1,15 @@
|
||||
Volcanos("onimport", {help: "导入数据", list: [], _init: function(can, msg, list, cb, target) {
|
||||
can.onmotion.clear(can)
|
||||
Volcanos(chat.ONIMPORT, {help: "导入数据", _init: function(can, msg, cb, target) {
|
||||
can.onmotion.clear(can), can.base.isFunc(cb) && cb(msg)
|
||||
can.onappend.table(can, msg)
|
||||
can.onappend.board(can, msg)
|
||||
can.base.isFunc(cb) && cb(msg)
|
||||
},
|
||||
})
|
||||
Volcanos("onaction", {help: "控件交互", list: [],
|
||||
Volcanos(chat.ONACTION, {help: "控件交互",
|
||||
scanQRCode0: function(event, can) { can.user.agent.scanQRCode() },
|
||||
scanQRCode: function(event, can, button) { can.user.agent.scanQRCode(function(text, data) {
|
||||
var msg = can.request(event, data)
|
||||
can.run(event, can.base.Simple(ctx.ACTION, data.action||button, data), function(msg) {
|
||||
can.user.toast(can, text, "添加成功"), can.Update()
|
||||
can.runAction(can.request(event, data), data.action||button [], function(msg) {
|
||||
can.user.toastSuccess(can, text), can.Update()
|
||||
}, true)
|
||||
}, can) },
|
||||
scanQRCode0: function(event, can) { can.user.agent.scanQRCode() },
|
||||
})
|
||||
Volcanos("onexport", {help: "导出数据", list: []})
|
||||
|
||||
|
@ -11,7 +11,7 @@ const SEARCH = "search"
|
||||
|
||||
func init() {
|
||||
Index.MergeCommands(ice.Commands{
|
||||
web.P(SEARCH): {Name: "/search", Help: "搜索引擎", Actions: ctx.CmdAction(mdb.SHORT, mdb.NAME), Hand: func(m *ice.Message, arg ...string) {
|
||||
web.P(SEARCH): {Name: "/search", Help: "搜索引擎", Actions: ctx.CmdAction(), Hand: func(m *ice.Message, arg ...string) {
|
||||
m.Cmdy(web.Space(m, m.Option(ice.POD)), mdb.SEARCH, arg).StatusTimeCount()
|
||||
}},
|
||||
})
|
||||
|
@ -13,9 +13,14 @@ const SSO = "sso"
|
||||
|
||||
func init() {
|
||||
Index.MergeCommands(ice.Commands{
|
||||
"/sso": {Name: "/sso", Help: "登录", Hand: func(m *ice.Message, arg ...string) {
|
||||
"/sso": {Name: "/sso", Help: "登录", Actions: ice.Actions{
|
||||
ice.CTX_INIT: {Hand: func(m *ice.Message, arg ...string) { m.Cmd(aaa.ROLE, aaa.WHITE, SSO) }},
|
||||
}, Hand: func(m *ice.Message, arg ...string) {
|
||||
if m.Option(ice.MSG_USERNAME) == "" {
|
||||
web.RenderIndex(m, web.SERVE, ice.VOLCANOS)
|
||||
web.RenderIndex(m, ice.VOLCANOS)
|
||||
return
|
||||
}
|
||||
if m.Warn(m.Option(cli.BACK) == "") {
|
||||
return
|
||||
}
|
||||
sessid := m.Cmdx(web.SPACE, m.Option(web.SPACE), aaa.SESS, mdb.CREATE,
|
||||
@ -24,11 +29,6 @@ func init() {
|
||||
aaa.USERNICK, m.Option(ice.MSG_USERNICK),
|
||||
)
|
||||
m.RenderRedirect(kit.MergeURL(m.Option(cli.BACK), ice.MSG_SESSID, sessid))
|
||||
|
||||
// m.Cmdy(GRANT, mdb.INSERT, web.SPACE, m.Option(web.SPACE),
|
||||
// aaa.USERNAME, m.Option(ice.MSG_USERNAME), aaa.USERNICK, m.Option(ice.MSG_USERNICK))
|
||||
// web.RenderCookie(m, sessid, web.CookieName(m.Option("back")))
|
||||
// m.RenderRedirect(kit.MergeURL(m.Option("back")))
|
||||
}},
|
||||
})
|
||||
}
|
||||
|
@ -23,7 +23,7 @@ func init() {
|
||||
}
|
||||
switch arg[0] {
|
||||
case mdb.HASH:
|
||||
m.Cmdy(STORM, ice.OptionFields("hash,name"))
|
||||
m.Cmdy("", ice.OptionFields("hash,name"))
|
||||
}
|
||||
}},
|
||||
mdb.CREATE: {Name: "create type=public,protected,private name=hi text=hello", Help: "创建", Hand: func(m *ice.Message, arg ...string) {
|
||||
@ -32,7 +32,7 @@ func init() {
|
||||
mdb.REMOVE: {Name: "remove", Help: "删除", Hand: func(m *ice.Message, arg ...string) {
|
||||
m.Cmdy(mdb.DELETE, RIVER, _river_key(m, STORM), mdb.HASH, m.OptionSimple(mdb.HASH))
|
||||
}},
|
||||
mdb.INSERT: {Name: "insert hash pod ctx cmd help", Help: "添加", Hand: func(m *ice.Message, arg ...string) {
|
||||
mdb.INSERT: {Name: "insert hash space index", Help: "添加", Hand: func(m *ice.Message, arg ...string) {
|
||||
m.Cmdy(mdb.INSERT, RIVER, _storm_key(m, m.Option(mdb.HASH)), mdb.LIST, arg[2:])
|
||||
}},
|
||||
mdb.MODIFY: {Name: "modify", Help: "编辑", Hand: func(m *ice.Message, arg ...string) {
|
||||
@ -42,23 +42,6 @@ func init() {
|
||||
m.Cmdy(mdb.MODIFY, RIVER, _storm_key(m, m.Option(mdb.HASH)), mdb.LIST, m.OptionSimple(mdb.ID), arg)
|
||||
}
|
||||
}},
|
||||
mdb.EXPORT: {Name: "export", Help: "导出", Hand: func(m *ice.Message, arg ...string) {
|
||||
if m.Option(mdb.ID) == "" {
|
||||
return
|
||||
}
|
||||
msg := m.Cmd(STORM, m.Option(mdb.HASH), m.Option(mdb.ID))
|
||||
cmd := kit.Keys(msg.Append(ice.CTX), msg.Append(ice.CMD))
|
||||
m.Cmdy(cmd, mdb.EXPORT)
|
||||
}},
|
||||
mdb.IMPORT: {Name: "import", Help: "导入", Hand: func(m *ice.Message, arg ...string) {
|
||||
if m.Option(mdb.ID) == "" {
|
||||
return
|
||||
}
|
||||
msg := m.Cmd(STORM, m.Option(mdb.HASH), m.Option(mdb.ID))
|
||||
cmd := kit.Keys(msg.Append(ice.CTX), msg.Append(ice.CMD))
|
||||
m.Cmdy(cmd, mdb.IMPORT)
|
||||
}},
|
||||
SHARE: {Name: "share", Help: "共享", Hand: func(m *ice.Message, arg ...string) { _header_share(m, arg...) }},
|
||||
}, Hand: func(m *ice.Message, arg ...string) {
|
||||
if len(arg) == 0 { // 应用列表
|
||||
m.OptionFields("time,hash,type,name,count")
|
||||
@ -67,24 +50,20 @@ func init() {
|
||||
return
|
||||
}
|
||||
|
||||
m.OptionFields("time,id,pod,ctx,cmd,arg,display,style")
|
||||
m.OptionFields("time,id,space,index,args,style,display")
|
||||
msg := m.Cmd(mdb.SELECT, RIVER, _storm_key(m, arg[0]), mdb.LIST, mdb.ID, kit.Select("", arg, 1))
|
||||
if msg.Length() == 0 && len(arg) > 1 { // 虚拟群组
|
||||
msg.Push(ice.CMD, arg[1])
|
||||
msg.Push(ctx.INDEX, arg[1])
|
||||
}
|
||||
|
||||
if len(arg) > 2 && arg[2] == ice.RUN { // 执行命令
|
||||
m.Cmdy(web.Space(m, kit.Select(m.Option(ice.POD), msg.Append(ice.POD))), kit.Keys(msg.Append(ice.CTX), msg.Append(ice.CMD)), arg[3:])
|
||||
m.Cmdy(web.Space(m, kit.Select(m.Option(ice.POD), msg.Append(web.SPACE))), msg.Append(ctx.INDEX), arg[3:])
|
||||
return
|
||||
}
|
||||
|
||||
if m.Copy(msg); len(arg) > 1 { // 命令插件
|
||||
m.Tables(func(value ice.Maps) { m.Cmdy(web.Space(m, value[web.SPACE]), ctx.COMMAND, value[ctx.INDEX]) })
|
||||
m.ProcessField(arg[0], arg[1], ice.RUN)
|
||||
m.Tables(func(value ice.Maps) {
|
||||
m.Cmdy(web.Space(m, value[ice.POD]), ctx.CONTEXT, value[ice.CTX], ctx.COMMAND, value[ice.CMD])
|
||||
})
|
||||
} else {
|
||||
m.PushAction(mdb.EXPORT, mdb.IMPORT)
|
||||
}
|
||||
}},
|
||||
})
|
||||
|
@ -4,6 +4,7 @@ import (
|
||||
"path"
|
||||
|
||||
ice "shylinux.com/x/icebergs"
|
||||
"shylinux.com/x/icebergs/base/aaa"
|
||||
"shylinux.com/x/icebergs/base/mdb"
|
||||
"shylinux.com/x/icebergs/base/nfs"
|
||||
"shylinux.com/x/icebergs/base/web"
|
||||
@ -23,7 +24,10 @@ func init() {
|
||||
},
|
||||
}
|
||||
Index.MergeCommands(ice.Commands{
|
||||
TOPIC: {Name: "topic zone id auto create insert", Help: "主题", Actions: ice.MergeAction(ice.Actions{
|
||||
TOPIC: {Name: "topic zone id auto create insert", Help: "主题", Actions: ice.MergeActions(ice.Actions{
|
||||
ice.CTX_INIT: {Hand: func(m *ice.Message, arg ...string) {
|
||||
m.Cmd(aaa.ROLE, aaa.WHITE, TOPIC)
|
||||
}},
|
||||
mdb.INPUTS: {Name: "inputs", Help: "补全", Hand: func(m *ice.Message, arg ...string) {
|
||||
switch arg[0] {
|
||||
case "tags":
|
||||
|
@ -12,23 +12,21 @@ import (
|
||||
kit "shylinux.com/x/toolkits"
|
||||
)
|
||||
|
||||
func init() {
|
||||
const (
|
||||
SEND = "send"
|
||||
FROM = "from"
|
||||
TO = "to"
|
||||
)
|
||||
|
||||
func init() {
|
||||
Index.MergeCommands(ice.Commands{
|
||||
TRANS: {Name: "trans from to auto", Help: "传输", Actions: ice.MergeAction(ice.Actions{
|
||||
TRANS: {Name: "trans from to auto", Help: "传输", Actions: ice.MergeActions(ice.Actions{
|
||||
SEND: {Name: "send", Help: "发送", Hand: func(m *ice.Message, arg ...string) {
|
||||
m.Cmdy(web.SPACE, m.Option(TO), web.SPIDE, ice.DEV, web.SPIDE_SAVE, kit.Select(nfs.PWD, m.Option("to_path")),
|
||||
web.MergeURL2(m, path.Join(web.SHARE_LOCAL, m.Option("from_path")), ice.POD, m.Option(FROM),
|
||||
web.SHARE, m.Cmdx(web.SHARE, mdb.CREATE, mdb.TYPE, web.LOGIN),
|
||||
),
|
||||
)
|
||||
web.Toast(m, ice.SUCCESS, SEND)
|
||||
m.ProcessHold()
|
||||
).ProcessHold()
|
||||
web.ToastSuccess(m, SEND)
|
||||
}},
|
||||
ice.RUN: {Name: "run", Help: "执行", Hand: func(m *ice.Message, arg ...string) {
|
||||
m.Option(ice.POD, m.Option("_pod"))
|
||||
|
@ -7,6 +7,7 @@ import (
|
||||
"strings"
|
||||
|
||||
ice "shylinux.com/x/icebergs"
|
||||
"shylinux.com/x/icebergs/base/aaa"
|
||||
"shylinux.com/x/icebergs/base/ctx"
|
||||
"shylinux.com/x/icebergs/base/lex"
|
||||
"shylinux.com/x/icebergs/base/mdb"
|
||||
@ -16,7 +17,7 @@ import (
|
||||
)
|
||||
|
||||
func _website_url(m *ice.Message, file string) string {
|
||||
return strings.Split(web.MergeWebsite(m, file), "?")[0]
|
||||
return strings.Split(MergeWebsite(m, file), "?")[0]
|
||||
}
|
||||
func _website_parse(m *ice.Message, text string, args ...string) (ice.Map, bool) {
|
||||
if text == "" {
|
||||
@ -120,6 +121,7 @@ func _website_parse(m *ice.Message, text string, args ...string) (ice.Map, bool)
|
||||
}
|
||||
func _website_render(m *ice.Message, w http.ResponseWriter, r *http.Request, kind, text, name string) bool {
|
||||
msg := m.Spawn(w, r)
|
||||
m.Debug("what %v", kind)
|
||||
switch kind {
|
||||
case nfs.ZML:
|
||||
web.RenderCmd(msg, "can.parse", text, name)
|
||||
@ -149,7 +151,7 @@ func _website_render(m *ice.Message, w http.ResponseWriter, r *http.Request, kin
|
||||
}
|
||||
func _website_search(m *ice.Message, kind, name, text string, arg ...string) {
|
||||
m.Cmd(m.PrefixKey(), ice.OptionFields("")).Tables(func(value ice.Maps) {
|
||||
m.PushSearch(value, mdb.TEXT, web.MergeWebsite(m, value[nfs.PATH]))
|
||||
m.PushSearch(value, mdb.TEXT, MergeWebsite(m, value[nfs.PATH]))
|
||||
})
|
||||
}
|
||||
|
||||
@ -160,89 +162,83 @@ const (
|
||||
const WEBSITE = "website"
|
||||
|
||||
func init() {
|
||||
Index.MergeCommands(ice.Commands{"/website/": {Name: "/website/", Help: "网站", Actions: ctx.CmdAction()},
|
||||
WEBSITE: {Name: "website path auto create import", Help: "网站", Actions: ice.MergeAction(ice.Actions{
|
||||
Index.MergeCommands(ice.Commands{
|
||||
WEBSITE: {Name: "website path auto create import", Help: "网站", Actions: ice.MergeActions(ice.Actions{
|
||||
ice.CTX_INIT: {Hand: func(m *ice.Message, arg ...string) {
|
||||
m.Cmd(mdb.RENDER, mdb.CREATE, nfs.TXT, m.PrefixKey())
|
||||
m.Cmd(mdb.ENGINE, mdb.CREATE, nfs.TXT, m.PrefixKey())
|
||||
m.Cmd(mdb.RENDER, mdb.CREATE, nfs.IML, m.PrefixKey())
|
||||
m.Cmd(mdb.ENGINE, mdb.CREATE, nfs.IML, m.PrefixKey())
|
||||
m.Cmd(aaa.ROLE, aaa.WHITE, WEBSITE)
|
||||
|
||||
web.AddRewrite(func(w http.ResponseWriter, r *http.Request) bool {
|
||||
if r.Method != http.MethodGet {
|
||||
return false
|
||||
}
|
||||
if ok := true; mdb.Richs(m, WEBSITE, nil, r.URL.Path, func(key string, value ice.Map) {
|
||||
value = kit.GetMeta(value)
|
||||
ok = _website_render(m, w, r, kit.Format(value[mdb.TYPE]), kit.Format(value[mdb.TEXT]), path.Base(r.URL.Path))
|
||||
}) != nil && ok {
|
||||
return true
|
||||
}
|
||||
if strings.HasPrefix(r.URL.Path, CHAT_WEBSITE) {
|
||||
_website_render(m, w, r, kit.Ext(r.URL.Path), m.Cmdx(nfs.CAT, strings.Replace(r.URL.Path, CHAT_WEBSITE, SRC_WEBSITE, 1)), path.Base(r.URL.Path))
|
||||
return true
|
||||
}
|
||||
if m.Cmd(WEBSITE, r.URL.Path, func(value ice.Maps) {
|
||||
_website_render(m, w, r, value[mdb.TYPE], value[mdb.TEXT], path.Base(r.URL.Path))
|
||||
}).Length() > 0 {
|
||||
return true
|
||||
}
|
||||
return false
|
||||
})
|
||||
}},
|
||||
lex.PARSE: {Hand: func(m *ice.Message, arg ...string) {
|
||||
switch kit.Ext(arg[0]) {
|
||||
case nfs.ZML:
|
||||
case nfs.ZML: // 前端解析
|
||||
web.RenderCmd(m, "can.parse", m.Cmdx(nfs.CAT, path.Join(SRC_WEBSITE, arg[0])))
|
||||
|
||||
case nfs.IML:
|
||||
case nfs.IML: // 文件解析
|
||||
if res, ok := _website_parse(m, m.Cmdx(nfs.CAT, path.Join(SRC_WEBSITE, arg[0])), arg[1:]...); ok {
|
||||
m.Echo(_website_template2, kit.Format(res))
|
||||
}
|
||||
|
||||
default:
|
||||
if text := m.Cmd(m.PrefixKey(), ice.PS+arg[0]).Append(mdb.TEXT); text != "" {
|
||||
default: // 缓存解析
|
||||
if text := m.CmdAppend("", path.Join(ice.PS, arg[0]), mdb.TEXT); text != "" {
|
||||
if res, ok := _website_parse(m, text, arg[1:]...); ok {
|
||||
m.Echo(_website_template2, kit.Format(res))
|
||||
}
|
||||
}
|
||||
}
|
||||
}},
|
||||
mdb.SEARCH: {Hand: func(m *ice.Message, arg ...string) {
|
||||
if arg[0] == mdb.FOREACH && arg[1] == "" {
|
||||
_website_search(m, arg[0], arg[1], kit.Select("", arg, 2))
|
||||
}
|
||||
}},
|
||||
mdb.RENDER: {Hand: func(m *ice.Message, arg ...string) {
|
||||
m.EchoIFrame(_website_url(m, strings.TrimPrefix(path.Join(arg[2], arg[1]), SRC_WEBSITE)))
|
||||
}},
|
||||
mdb.ENGINE: {Hand: func(m *ice.Message, arg ...string) {
|
||||
if res, ok := _website_parse(m, m.Cmdx(nfs.CAT, path.Join(arg[2], arg[1]))); ok {
|
||||
m.Echo(kit.Formats(res))
|
||||
ctx.DisplayStoryJSON(m)
|
||||
} else {
|
||||
m.Echo(_website_url(m, strings.TrimPrefix(path.Join(arg[2], arg[1]), SRC_WEBSITE)))
|
||||
}
|
||||
}},
|
||||
mdb.INPUTS: {Name: "inputs", Help: "补全", Hand: func(m *ice.Message, arg ...string) {
|
||||
switch m.Option(ctx.ACTION) {
|
||||
case mdb.CREATE:
|
||||
m.Cmdy(mdb.INPUTS, m.PrefixKey(), "", mdb.HASH, arg)
|
||||
default:
|
||||
mdb.HashInputs(m, arg)
|
||||
return
|
||||
}
|
||||
switch arg[0] {
|
||||
case nfs.PATH:
|
||||
m.Cmdy(nfs.DIR, arg[1:]).ProcessAgain()
|
||||
}
|
||||
}
|
||||
}},
|
||||
mdb.CREATE: {Name: "create path type=iml,zml,json,js,html name text", Help: "创建"},
|
||||
mdb.IMPORT: {Name: "import path=src/website/", Help: "导入", Hand: func(m *ice.Message, arg ...string) {
|
||||
m.Cmd(nfs.DIR, kit.Dict(nfs.DIR_ROOT, m.Option(nfs.PATH)), func(p string) {
|
||||
switch name := strings.TrimPrefix(p, m.Option(nfs.PATH)); kit.Ext(p) {
|
||||
case nfs.HTML, nfs.JS, nfs.JSON, nfs.ZML, nfs.IML, nfs.TXT:
|
||||
m.Cmd(m.PrefixKey(), mdb.CREATE, nfs.PATH, ice.PS+name, mdb.TYPE, kit.Ext(p), mdb.NAME, name, mdb.TEXT, m.Cmdx(nfs.CAT, p))
|
||||
m.Cmd("", mdb.CREATE, nfs.PATH, path.Join(ice.PS, name), mdb.TYPE, kit.Ext(p), mdb.NAME, name, mdb.TEXT, m.Cmdx(nfs.CAT, p))
|
||||
default:
|
||||
m.Cmd(m.PrefixKey(), mdb.CREATE, nfs.PATH, ice.PS+name, mdb.TYPE, kit.Ext(p), mdb.NAME, name, mdb.TEXT, p)
|
||||
m.Cmd("", mdb.CREATE, nfs.PATH, path.Join(ice.PS, name), mdb.TYPE, kit.Ext(p), mdb.NAME, name, mdb.TEXT, p)
|
||||
}
|
||||
})
|
||||
}},
|
||||
}, mdb.HashAction(mdb.SHORT, nfs.PATH, mdb.FIELD, "time,path,type,name,text")), Hand: func(m *ice.Message, arg ...string) {
|
||||
mdb.HashSelect(m, arg...).Tables(func(value ice.Maps) { m.PushAnchor(web.MergeWebsite(m, value[nfs.PATH])) })
|
||||
mdb.RENDER: {Hand: func(m *ice.Message, arg ...string) {
|
||||
m.EchoIFrame(_website_url(m, strings.TrimPrefix(path.Join(arg[2], arg[1]), SRC_WEBSITE)))
|
||||
}},
|
||||
mdb.ENGINE: {Hand: func(m *ice.Message, arg ...string) {
|
||||
if res, ok := _website_parse(m, m.Cmdx(nfs.CAT, path.Join(arg[2], arg[1]))); ok {
|
||||
ctx.DisplayStoryJSON(m.Echo(kit.Formats(res)))
|
||||
} else {
|
||||
m.Echo(_website_url(m, strings.TrimPrefix(path.Join(arg[2], arg[1]), SRC_WEBSITE)))
|
||||
}
|
||||
}},
|
||||
}, mdb.HashAction(mdb.SHORT, nfs.PATH, mdb.FIELD, "time,path,type,name,text"), ctx.CmdAction(), web.ApiAction("/website/")), Hand: func(m *ice.Message, arg ...string) {
|
||||
mdb.HashSelect(m, arg...).Tables(func(value ice.Maps) { m.PushAnchor(MergeWebsite(m, value[nfs.PATH])) })
|
||||
if len(arg) == 0 { // 文件列表
|
||||
m.Cmd(nfs.DIR, SRC_WEBSITE, func(f os.FileInfo, p string) {
|
||||
m.Push("", kit.Dict(
|
||||
@ -253,13 +249,14 @@ func init() {
|
||||
m.PushAnchor(web.MergeURL2(m, path.Join(CHAT_WEBSITE, strings.TrimPrefix(p, SRC_WEBSITE))))
|
||||
}).Sort(nfs.PATH)
|
||||
}
|
||||
if m.Length() == 0 && len(arg) > 0 { // 文件详情
|
||||
m.Push(mdb.TEXT, m.Cmdx(nfs.CAT, path.Join(SRC_WEBSITE, path.Join(arg...))))
|
||||
p := path.Join(SRC_WEBSITE, path.Join(arg...))
|
||||
if m.Length() == 0 && len(arg) > 0 && !strings.HasSuffix(arg[0], ice.PS) && nfs.ExistsFile(m, p) { // 文件详情
|
||||
m.Push(mdb.TYPE, kit.Ext(p))
|
||||
m.Push(mdb.TEXT, m.Cmdx(nfs.CAT, p))
|
||||
m.Push(nfs.PATH, path.Join(CHAT_WEBSITE, path.Join(arg...)))
|
||||
m.PushAnchor(web.MergeLink(m, m.Append(nfs.PATH)))
|
||||
}
|
||||
|
||||
if len(arg) > 0 { // 文件预览
|
||||
if m.Length() > 0 && len(arg) > 0 { // 文件预览
|
||||
m.PushQRCode(mdb.SCAN, web.MergeURL2(m, m.Append(nfs.PATH)))
|
||||
m.EchoIFrame(m.Append(nfs.PATH))
|
||||
}
|
||||
|
@ -9,34 +9,23 @@ import (
|
||||
"shylinux.com/x/icebergs/base/mdb"
|
||||
"shylinux.com/x/icebergs/base/nfs"
|
||||
"shylinux.com/x/icebergs/base/ssh"
|
||||
"shylinux.com/x/icebergs/base/tcp"
|
||||
"shylinux.com/x/icebergs/base/web"
|
||||
kit "shylinux.com/x/toolkits"
|
||||
)
|
||||
|
||||
func _defs(m *ice.Message, args ...string) string {
|
||||
for i := 0; i < len(args); i += 2 {
|
||||
if m.Option(args[i]) == "" {
|
||||
m.Option(args[i], args[i+1])
|
||||
}
|
||||
}
|
||||
return m.Option(args[0])
|
||||
}
|
||||
func _defs_list(m *ice.Message) string {
|
||||
list := []string{mdb.LIST}
|
||||
switch m.Option(mdb.TYPE) {
|
||||
case "Hash":
|
||||
list = append(list, "hash auto create")
|
||||
case "Zone":
|
||||
list = append(list, "zone id auto insert")
|
||||
case "Lists":
|
||||
list = append(list, "id auto insert")
|
||||
case "Hash":
|
||||
list = append(list, "hash auto create")
|
||||
case "Data":
|
||||
list = append(list, "path auto")
|
||||
case "Code":
|
||||
list = append(list, "port path auto start order build download")
|
||||
}
|
||||
return _defs(m, mdb.LIST, kit.Join(list, ice.SP))
|
||||
return m.OptionDefault(mdb.LIST, kit.Join(list, ice.SP))
|
||||
}
|
||||
func _autogen_module(m *ice.Message, dir string) {
|
||||
m.Cmd(nfs.DEFS, dir, `package {{.Option "zone"}}
|
||||
@ -97,7 +86,7 @@ func _autogen_source(m *ice.Message, main, file string) {
|
||||
m.Cmd(nfs.PUSH, main, ice.NL, "source "+strings.TrimPrefix(file, ice.SRC+ice.PS))
|
||||
}
|
||||
func _autogen_mod(m *ice.Message, file string) (mod string) {
|
||||
host := kit.ParseURLMap(m.Option(ice.MSG_USERWEB))[tcp.HOSTNAME]
|
||||
host := web.OptionUserWeb(m).Hostname()
|
||||
if host == "" {
|
||||
host = path.Base(kit.Path(""))
|
||||
} else {
|
||||
@ -134,7 +123,7 @@ func _autogen_gits(m *ice.Message, arg ...string) string {
|
||||
return kit.Join(res, ice.NL)
|
||||
}
|
||||
func _autogen_version(m *ice.Message) {
|
||||
if mod := _autogen_mod(m, ice.GO_MOD); !kit.FileExists(".git") {
|
||||
if mod := _autogen_mod(m, ice.GO_MOD); !nfs.ExistsFile(m, ".git") {
|
||||
m.Cmdy(cli.SYSTEM, GIT, ice.INIT)
|
||||
m.Cmd(cli.SYSTEM, GIT, "remote", "add", "origin", "https://"+mod)
|
||||
m.Cmd("web.code.git.repos", mdb.CREATE, "repos", "https://"+mod, mdb.NAME, path.Base(mod), nfs.PATH, nfs.PWD)
|
||||
@ -182,17 +171,17 @@ func init() {
|
||||
m.Cmdy(nfs.DIR, nfs.PWD, nfs.DIR_CLI_FIELDS, kit.Dict(nfs.DIR_REG, `.*\.go`)).RenameAppend(nfs.PATH, arg[0])
|
||||
}
|
||||
}},
|
||||
mdb.CREATE: {Name: "create name=hi help type=Hash,Zone,Lists,Data,Code main=main.go@key zone key", Help: "模块", Hand: func(m *ice.Message, arg ...string) {
|
||||
_defs(m, mdb.ZONE, m.Option(mdb.NAME), mdb.HELP, m.Option(mdb.NAME))
|
||||
_defs(m, mdb.KEY, kit.Keys("web.code", m.Option(mdb.ZONE), m.Option(mdb.NAME)))
|
||||
mdb.CREATE: {Name: "create name=hi help type=Zone,Hash,Data,Code main=main.go@key zone key", Help: "模块", Hand: func(m *ice.Message, arg ...string) {
|
||||
m.OptionDefault(mdb.ZONE, m.Option(mdb.NAME), mdb.HELP, m.Option(mdb.NAME))
|
||||
m.OptionDefault(mdb.KEY, kit.Keys("web.code", m.Option(mdb.ZONE), m.Option(mdb.NAME)))
|
||||
m.Option(mdb.TEXT, kit.Format("`name:\"%s\" help:\"%s\"`", _defs_list(m), m.Option(mdb.HELP)))
|
||||
|
||||
nfs.OptionFiles(m, nfs.DiskFile)
|
||||
if p := path.Join(ice.SRC, m.Option(mdb.ZONE), kit.Keys(m.Option(mdb.NAME), GO)); !kit.FileExists(p) {
|
||||
if p := path.Join(ice.SRC, m.Option(mdb.ZONE), kit.Keys(m.Option(mdb.NAME), GO)); !nfs.ExistsFile(m, p) {
|
||||
_autogen_module(m, p)
|
||||
_autogen_import(m, path.Join(ice.SRC, m.Option(cli.MAIN)), m.Option(mdb.ZONE), _autogen_mod(m, ice.GO_MOD))
|
||||
}
|
||||
if p := path.Join(ice.SRC, m.Option(mdb.ZONE), kit.Keys(m.Option(mdb.NAME), SHY)); !kit.FileExists(p) {
|
||||
if p := path.Join(ice.SRC, m.Option(mdb.ZONE), kit.Keys(m.Option(mdb.NAME), SHY)); !nfs.ExistsFile(m, p) {
|
||||
_autogen_script(m, p)
|
||||
_autogen_source(m, path.Join(ice.SRC, m.Option(cli.MAIN)), p)
|
||||
}
|
||||
@ -200,7 +189,7 @@ func init() {
|
||||
_autogen_version(m.Spawn())
|
||||
}},
|
||||
ssh.SCRIPT: {Name: "script", Help: "脚本:生成 etc/miss.sh", Hand: func(m *ice.Message, arg ...string) {
|
||||
m.Cmd(nfs.DEFS, ice.ETC_MISS_SH, m.Conf(web.DREAM, kit.Keym("miss")))
|
||||
m.Cmd(nfs.DEFS, ice.ETC_MISS_SH, m.Conf(web.DREAM, kit.Keym(nfs.SCRIPT)))
|
||||
defer m.Cmdy(nfs.CAT, ice.ETC_MISS_SH)
|
||||
|
||||
m.Cmdy(nfs.DIR, ice.ETC_MISS_SH)
|
||||
@ -212,7 +201,7 @@ func init() {
|
||||
}},
|
||||
BINPACK: {Name: "binpack", Help: "打包:生成 src/binpack.go", Hand: func(m *ice.Message, arg ...string) {
|
||||
_autogen_version(m)
|
||||
if m.Cmd(BINPACK, mdb.CREATE); kit.FileExists(ice.USR_RELEASE) && m.Option(ice.MSG_USERPOD) == "" {
|
||||
if m.Cmd(BINPACK, mdb.CREATE); nfs.ExistsFile(m, ice.USR_RELEASE) && m.Option(ice.MSG_USERPOD) == "" {
|
||||
m.Cmd(nfs.COPY, path.Join(ice.USR_RELEASE, "conf.go"), path.Join(ice.USR_ICEBERGS, "conf.go"))
|
||||
m.Cmd(cli.SYSTEM, "sh", "-c", `cat src/binpack.go|sed 's/package main/package ice/g' > usr/release/binpack.go`)
|
||||
m.Cmdy(nfs.DIR, "usr/release/binpack.go")
|
||||
|
@ -4,12 +4,12 @@ import (
|
||||
"io"
|
||||
"io/ioutil"
|
||||
"net/http"
|
||||
"os"
|
||||
"strings"
|
||||
"sync/atomic"
|
||||
|
||||
ice "shylinux.com/x/icebergs"
|
||||
"shylinux.com/x/icebergs/base/mdb"
|
||||
"shylinux.com/x/icebergs/base/nfs"
|
||||
kit "shylinux.com/x/toolkits"
|
||||
"shylinux.com/x/toolkits/util/bench"
|
||||
)
|
||||
@ -23,7 +23,7 @@ func _bench_http(m *ice.Message, target string, arg ...string) {
|
||||
for _, v := range strings.Split(target, ice.NL) {
|
||||
switch ls := kit.Split(v); ls[0] {
|
||||
case http.MethodPost: // POST,url,file
|
||||
if f, e := os.Open(ls[2]); m.Assert(e) {
|
||||
if f, e := nfs.OpenFile(m, ls[2]); m.Assert(e) {
|
||||
defer f.Close()
|
||||
|
||||
if req, err := http.NewRequest(http.MethodPost, ls[1], f); m.Assert(err) {
|
||||
@ -62,7 +62,7 @@ const BENCH = "bench"
|
||||
|
||||
func init() {
|
||||
Index.MergeCommands(ice.Commands{
|
||||
BENCH: {Name: "bench zone id auto insert", Help: "性能压测", Actions: ice.MergeAction(ice.Actions{
|
||||
BENCH: {Name: "bench zone id auto insert", Help: "性能压测", Actions: ice.MergeActions(ice.Actions{
|
||||
mdb.INSERT: {Name: "insert zone=some type=http,redis name=demo text='http://localhost:9020' nconn=3 nreqs=10", Help: "添加"},
|
||||
ice.RUN: {Name: "run", Help: "执行", Hand: func(m *ice.Message, arg ...string) {
|
||||
switch m.Option(mdb.TYPE) {
|
||||
|
@ -3,8 +3,8 @@ package code
|
||||
import (
|
||||
"encoding/base64"
|
||||
"fmt"
|
||||
"io"
|
||||
"io/ioutil"
|
||||
"os"
|
||||
"path"
|
||||
"strings"
|
||||
|
||||
@ -14,72 +14,59 @@ import (
|
||||
kit "shylinux.com/x/toolkits"
|
||||
)
|
||||
|
||||
func _binpack_file(m *ice.Message, arg ...string) string { // file name
|
||||
if f, e := os.Open(arg[0]); e == nil {
|
||||
func _binpack_file(m *ice.Message, w io.Writer, arg ...string) { // file name
|
||||
if f, e := nfs.OpenFile(m, arg[0]); e == nil {
|
||||
defer f.Close()
|
||||
if b, e := ioutil.ReadAll(f); e == nil && len(b) > 0 {
|
||||
return fmt.Sprintf(" \"%s\": \"%s\",", kit.Select(arg[0], arg, 1), base64.StdEncoding.EncodeToString(b))
|
||||
fmt.Fprintf(w, " \"%s\": \"%s\",\n", kit.Select(arg[0], arg, 1), base64.StdEncoding.EncodeToString(b))
|
||||
return
|
||||
}
|
||||
}
|
||||
return fmt.Sprintf(" // \"%s\": \"%s\",", kit.Select(arg[0], arg, 1), "")
|
||||
fmt.Fprintf(w, " // \"%s\": \"%s\",\n", kit.Select(arg[0], arg, 1), "")
|
||||
}
|
||||
func _binpack_dir(m *ice.Message, f *os.File, dir string) {
|
||||
func _binpack_dir(m *ice.Message, w io.Writer, dir string) {
|
||||
m.Option(nfs.DIR_ROOT, dir)
|
||||
m.Option(nfs.DIR_DEEP, true)
|
||||
m.Option(nfs.DIR_TYPE, nfs.CAT)
|
||||
|
||||
m.Cmd(nfs.DIR, nfs.PWD).Sort(nfs.PATH).Tables(func(value ice.Maps) {
|
||||
switch path.Base(value[nfs.PATH]) {
|
||||
case "go.mod", "go.sum", "binpack.go", "version.go":
|
||||
case ice.GO_MOD, ice.GO_SUM, "binpack.go", "version.go":
|
||||
return
|
||||
}
|
||||
switch strings.Split(value[nfs.PATH], ice.PS)[0] {
|
||||
case "var", "polaris", "website":
|
||||
case ice.BIN, ice.VAR, "website", "polaris":
|
||||
return
|
||||
}
|
||||
fmt.Fprintln(f, _binpack_file(m, path.Join(dir, value[nfs.PATH])))
|
||||
_binpack_file(m, w, path.Join(dir, value[nfs.PATH]))
|
||||
})
|
||||
fmt.Fprintln(f)
|
||||
fmt.Fprintln(w)
|
||||
}
|
||||
|
||||
func _binpack_can(m *ice.Message, f *os.File, dir string) {
|
||||
func _binpack_can(m *ice.Message, w io.Writer, dir string) {
|
||||
m.Option(nfs.DIR_ROOT, dir)
|
||||
m.Option(nfs.DIR_DEEP, true)
|
||||
m.Option(nfs.DIR_TYPE, nfs.CAT)
|
||||
|
||||
for _, k := range []string{ice.FAVICON, ice.PROTO_JS, ice.FRAME_JS} {
|
||||
// fmt.Fprintln(f, _binpack_file(m, path.Join(dir, k), ice.PS+k))
|
||||
fmt.Fprintln(f, _binpack_file(m, path.Join(dir, k), path.Join(ice.USR_VOLCANOS, k)))
|
||||
_binpack_file(m, w, path.Join(dir, k), path.Join(ice.USR_VOLCANOS, k))
|
||||
}
|
||||
for _, k := range []string{LIB, PAGE, PANEL, PLUGIN, "publish/client/nodejs/"} {
|
||||
m.Cmd(nfs.DIR, k).Sort(nfs.PATH).Tables(func(value ice.Maps) {
|
||||
// fmt.Fprintln(f, _binpack_file(m, path.Join(dir, value[nfs.PATH]), ice.PS+value[nfs.PATH]))
|
||||
fmt.Fprintln(f, _binpack_file(m, path.Join(dir, value[nfs.PATH]), path.Join(ice.USR_VOLCANOS, value[nfs.PATH])))
|
||||
_binpack_file(m, w, path.Join(dir, value[nfs.PATH]), path.Join(ice.USR_VOLCANOS, value[nfs.PATH]))
|
||||
})
|
||||
}
|
||||
fmt.Fprintln(f)
|
||||
fmt.Fprintln(w)
|
||||
}
|
||||
func _binpack_ctx(m *ice.Message, f *os.File) {
|
||||
_binpack_dir(m, f, ice.SRC)
|
||||
func _binpack_ctx(m *ice.Message, w io.Writer) {
|
||||
_binpack_dir(m, w, ice.SRC)
|
||||
}
|
||||
|
||||
const BINPACK = "binpack"
|
||||
|
||||
func init() {
|
||||
Index.MergeCommands(ice.Commands{
|
||||
BINPACK: {Name: "binpack path auto create remove export", Help: "打包", Actions: ice.MergeAction(ice.Actions{
|
||||
ice.CTX_INIT: {Hand: func(m *ice.Message, arg ...string) {
|
||||
if kit.FileExists(path.Join(ice.USR_VOLCANOS, ice.PROTO_JS)) {
|
||||
m.Cmd(BINPACK, mdb.REMOVE)
|
||||
return
|
||||
}
|
||||
}},
|
||||
mdb.CREATE: {Name: "create", Help: "创建", Hand: func(m *ice.Message, arg ...string) {
|
||||
if f, p, e := kit.Create(ice.SRC_BINPACK_GO); m.Assert(e) {
|
||||
defer f.Close()
|
||||
func _binpack_all(m *ice.Message) {
|
||||
if w, p, e := nfs.CreateFile(m, ice.SRC_BINPACK_GO); m.Assert(e) {
|
||||
defer w.Close()
|
||||
defer m.Echo(p)
|
||||
|
||||
fmt.Fprintln(f, `package main
|
||||
fmt.Fprintln(w, `package main
|
||||
|
||||
import (
|
||||
"encoding/base64"
|
||||
@ -89,9 +76,9 @@ import (
|
||||
|
||||
func init() {
|
||||
`)
|
||||
defer fmt.Fprintln(f, `}`)
|
||||
defer fmt.Fprintln(w, `}`)
|
||||
|
||||
defer fmt.Fprintln(f, `
|
||||
defer fmt.Fprintln(w, `
|
||||
for k, v := range pack {
|
||||
if b, e := base64.StdEncoding.DecodeString(v); e == nil {
|
||||
nfs.PackFile.WriteFile(k, b)
|
||||
@ -99,40 +86,50 @@ func init() {
|
||||
}
|
||||
`)
|
||||
|
||||
fmt.Fprintln(f, ` pack := ice.Maps{`)
|
||||
defer fmt.Fprintln(f, ` }`)
|
||||
fmt.Fprintln(w, ` pack := ice.Maps{`)
|
||||
defer fmt.Fprintln(w, ` }`)
|
||||
|
||||
if kit.FileExists(ice.USR_VOLCANOS) && kit.FileExists(ice.USR_INTSHELL) && m.Option(ice.MSG_USERPOD) == "" {
|
||||
_binpack_can(m, f, ice.USR_VOLCANOS)
|
||||
_binpack_dir(m, f, ice.USR_INTSHELL)
|
||||
if nfs.ExistsFile(m, ice.USR_VOLCANOS) && nfs.ExistsFile(m, ice.USR_INTSHELL) && m.Option(ice.MSG_USERPOD) == "" {
|
||||
_binpack_can(m, w, ice.USR_VOLCANOS)
|
||||
_binpack_dir(m, w, ice.USR_INTSHELL)
|
||||
}
|
||||
_binpack_ctx(m, f)
|
||||
_binpack_ctx(m, w)
|
||||
|
||||
fmt.Fprintln(f, _binpack_file(m, ice.ETC_MISS_SH))
|
||||
fmt.Fprintln(f, _binpack_file(m, ice.ETC_INIT_SHY))
|
||||
fmt.Fprintln(f, _binpack_file(m, ice.ETC_EXIT_SHY))
|
||||
fmt.Fprintln(f)
|
||||
_binpack_file(m, w, ice.ETC_MISS_SH)
|
||||
_binpack_file(m, w, ice.ETC_INIT_SHY)
|
||||
_binpack_file(m, w, ice.ETC_EXIT_SHY)
|
||||
fmt.Fprintln(w)
|
||||
|
||||
fmt.Fprintln(f, _binpack_file(m, ice.LICENSE))
|
||||
fmt.Fprintln(f, _binpack_file(m, ice.MAKEFILE))
|
||||
fmt.Fprintln(f, _binpack_file(m, ice.README_MD))
|
||||
fmt.Fprintln(f)
|
||||
_binpack_file(m, w, ice.LICENSE)
|
||||
_binpack_file(m, w, ice.MAKEFILE)
|
||||
_binpack_file(m, w, ice.README_MD)
|
||||
fmt.Fprintln(w)
|
||||
|
||||
m.Cmd(mdb.SELECT, m.PrefixKey(), "", mdb.HASH, ice.OptionFields(nfs.PATH)).Tables(func(value ice.Maps) {
|
||||
if s, e := os.Stat(value[nfs.PATH]); e == nil {
|
||||
mdb.HashSelects(m).Sort(nfs.PATH).Tables(func(value ice.Maps) {
|
||||
if s, e := nfs.StatFile(m, value[nfs.PATH]); e == nil {
|
||||
if s.IsDir() {
|
||||
_binpack_dir(m, f, value[nfs.PATH])
|
||||
_binpack_dir(m, w, value[nfs.PATH])
|
||||
} else {
|
||||
fmt.Fprintln(f, _binpack_file(m, value[nfs.PATH]))
|
||||
_binpack_file(m, w, value[nfs.PATH])
|
||||
}
|
||||
}
|
||||
})
|
||||
}
|
||||
}
|
||||
|
||||
const BINPACK = "binpack"
|
||||
|
||||
func init() {
|
||||
Index.MergeCommands(ice.Commands{
|
||||
BINPACK: {Name: "binpack path auto create insert", Help: "打包", Actions: ice.MergeActions(ice.Actions{
|
||||
mdb.CREATE: {Name: "create", Help: "创建", Hand: func(m *ice.Message, arg ...string) {
|
||||
_binpack_all(m)
|
||||
}},
|
||||
mdb.INSERT: {Name: "insert", Help: "添加", Hand: func(m *ice.Message, arg ...string) {
|
||||
m.Cmd(mdb.INSERT, m.PrefixKey(), "", mdb.HASH, nfs.PATH, arg[0])
|
||||
mdb.INSERT: {Name: "insert path", Help: "添加", Hand: func(m *ice.Message, arg ...string) {
|
||||
mdb.HashCreate(m, nfs.PATH, m.Option(nfs.PATH))
|
||||
}},
|
||||
}, mdb.HashAction(mdb.SHORT, nfs.PATH)), Hand: func(m *ice.Message, arg ...string) {
|
||||
mdb.HashSelect(m)
|
||||
}},
|
||||
})
|
||||
}
|
||||
|
@ -49,7 +49,7 @@ const C = "c"
|
||||
|
||||
func init() {
|
||||
Index.Register(&ice.Context{Name: C, Help: "系统", Commands: ice.Commands{
|
||||
C: {Name: C, Help: "系统", Actions: ice.MergeAction(ice.Actions{
|
||||
C: {Name: C, Help: "系统", Actions: ice.MergeActions(ice.Actions{
|
||||
ice.CTX_INIT: {Hand: func(m *ice.Message, arg ...string) {
|
||||
for _, cmd := range []string{mdb.SEARCH, mdb.ENGINE, mdb.RENDER, mdb.PLUGIN} {
|
||||
for _, k := range []string{H, C, CC} {
|
||||
@ -79,7 +79,7 @@ func init() {
|
||||
// _go_grep(m, kit.Select(cli.MAIN, arg, 1), arg[2])
|
||||
}},
|
||||
}, PlugAction())},
|
||||
MAN: {Name: MAN, Help: "手册", Actions: ice.MergeAction(ice.Actions{
|
||||
MAN: {Name: MAN, Help: "手册", Actions: ice.MergeActions(ice.Actions{
|
||||
ice.CTX_INIT: {Hand: func(m *ice.Message, arg ...string) {
|
||||
for _, cmd := range []string{mdb.SEARCH, mdb.RENDER, mdb.PLUGIN} {
|
||||
for _, k := range []string{MAN1, MAN2, MAN3, MAN8} {
|
||||
|
@ -16,7 +16,7 @@ const CASE = "case"
|
||||
|
||||
func init() {
|
||||
Index.MergeCommands(ice.Commands{
|
||||
CASE: {Name: "case dev zone id auto", Help: "用例", Actions: ice.MergeAction(ice.Actions{
|
||||
CASE: {Name: "case dev zone id auto", Help: "用例", Actions: ice.MergeActions(ice.Actions{
|
||||
mdb.CREATE: {Name: "create name address", Help: "创建", Hand: func(m *ice.Message, arg ...string) {
|
||||
m.Cmdy(web.SPIDE, mdb.CREATE, arg)
|
||||
}},
|
||||
|
@ -11,8 +11,8 @@ var Index = &ice.Context{Name: CODE, Help: "编程中心"}
|
||||
|
||||
func init() {
|
||||
web.Index.Register(Index, &web.Frame{},
|
||||
WEBPACK, BINPACK, AUTOGEN, COMPILE, PUBLISH, UPGRADE, INSTALL,
|
||||
INNER, VIMER, FAVOR, BENCH, PPROF,
|
||||
INSTALL, WEBPACK, BINPACK, AUTOGEN, COMPILE, PUBLISH, UPGRADE,
|
||||
XTERM, VIMER, INNER, FAVOR, BENCH, PPROF,
|
||||
C, SH, SHY, GO, JS,
|
||||
)
|
||||
}
|
||||
|
@ -1,27 +1,33 @@
|
||||
chapter "源码"
|
||||
|
||||
code.go
|
||||
code.shy
|
||||
|
||||
install.go
|
||||
webpack.go
|
||||
binpack.go
|
||||
autogen.go
|
||||
compile.go
|
||||
publish.go
|
||||
upgrade.go
|
||||
install.go
|
||||
|
||||
favor.go
|
||||
inner.go
|
||||
xterm.shy
|
||||
xterm.go
|
||||
vimer.go
|
||||
inner.go
|
||||
favor.go
|
||||
bench.go
|
||||
pprof.go
|
||||
case.go
|
||||
oauth.go
|
||||
|
||||
c.go
|
||||
sh.go
|
||||
shy.go
|
||||
go.go
|
||||
js.go
|
||||
shy.go
|
||||
py.go
|
||||
zml.go
|
||||
|
||||
code.go
|
||||
code.shy
|
||||
sess.go
|
||||
template.go
|
||||
case.go
|
||||
|
||||
|
@ -47,22 +47,10 @@ func init() {
|
||||
cli.ENV, kit.Dict("GOPROXY", "https://goproxy.cn,direct", "GOPRIVATE", "shylinux.com,github.com", "CGO_ENABLED", "0"),
|
||||
)},
|
||||
}, Commands: ice.Commands{
|
||||
COMPILE: {Name: "compile arch=amd64,386,arm,arm64,mipsle os=linux,darwin,windows src=src/main.go@key run binpack relay install", Help: "编译", Actions: ice.Actions{
|
||||
COMPILE: {Name: "compile arch=amd64,386,arm,arm64,mipsle os=linux,darwin,windows src=src/main.go@key run binpack relay", Help: "编译", Actions: ice.Actions{
|
||||
mdb.INPUTS: {Name: "inputs", Help: "补全", Hand: func(m *ice.Message, arg ...string) {
|
||||
m.Cmdy(nfs.DIR, ice.SRC, nfs.DIR_CLI_FIELDS, kit.Dict(nfs.DIR_REG, `.*\.go$`)).Sort(nfs.PATH)
|
||||
}},
|
||||
INSTALL: {Name: "compile", Help: "安装", Hand: func(m *ice.Message, arg ...string) {
|
||||
if cli.IsAlpine(m) {
|
||||
web.PushStream(m)
|
||||
m.Cmd(cli.SYSTEM, "apk", "add", GIT, GO)
|
||||
return
|
||||
}
|
||||
if m.Cmdx(cli.SYSTEM, nfs.FIND, GIT) == "" {
|
||||
web.Toast(m, "please install git")
|
||||
m.Echo(ice.FALSE)
|
||||
return
|
||||
}
|
||||
}},
|
||||
BINPACK: {Name: "binpack", Help: "打包", Hand: func(m *ice.Message, arg ...string) {
|
||||
m.Cmdy(AUTOGEN, BINPACK)
|
||||
}},
|
||||
|
@ -4,7 +4,6 @@ import (
|
||||
ice "shylinux.com/x/icebergs"
|
||||
"shylinux.com/x/icebergs/base/ctx"
|
||||
"shylinux.com/x/icebergs/base/mdb"
|
||||
"shylinux.com/x/icebergs/base/nfs"
|
||||
kit "shylinux.com/x/toolkits"
|
||||
)
|
||||
|
||||
@ -12,22 +11,11 @@ const FAVOR = "favor"
|
||||
|
||||
func init() {
|
||||
Index.MergeCommands(ice.Commands{
|
||||
FAVOR: {Name: "favor zone id auto insert test page", Help: "收藏夹", Actions: ice.MergeAction(ice.Actions{
|
||||
FAVOR: {Name: "favor zone id auto insert test page", Help: "收藏夹", Actions: ice.MergeActions(ice.Actions{
|
||||
mdb.INSERT: {Name: "insert zone=数据结构 type=go name=hi text=hello path file line", Help: "添加"},
|
||||
INNER: {Name: "inner", Help: "源码", Hand: func(m *ice.Message, arg ...string) {
|
||||
ctx.ProcessCommand(m, INNER, m.OptionSplit("path,file,line"), arg...)
|
||||
}},
|
||||
"test": {Name: "test zone=hi count=10", Help: "测试", Hand: func(m *ice.Message, arg ...string) {
|
||||
m.Cmd(mdb.INSERT, m.PrefixKey(), "", mdb.HASH, m.OptionSimple(mdb.ZONE))
|
||||
for i := 0; i < kit.Int(m.Option(mdb.COUNT)); i++ {
|
||||
m.Cmd(mdb.INSERT, m.PrefixKey(), "", mdb.ZONE, m.Option(mdb.ZONE), mdb.NAME, i)
|
||||
}
|
||||
m.Conf(m.PrefixKey(), kit.Keys(mdb.HASH, kit.Hashs(m.Option(mdb.ZONE)), kit.Keym(mdb.LIMIT)), 20)
|
||||
m.Conf(m.PrefixKey(), kit.Keys(mdb.HASH, kit.Hashs(m.Option(mdb.ZONE)), kit.Keym(mdb.LEAST)), 10)
|
||||
m.Conf(m.PrefixKey(), kit.Keys(mdb.HASH, kit.Hashs(m.Option(mdb.ZONE)), kit.Keym(mdb.FSIZE)), 500)
|
||||
m.Cmdy(nfs.DIR, "var/data/", kit.Dict(nfs.DIR_DEEP, true))
|
||||
m.Echo(kit.Formats(m.Confv(m.PrefixKey())))
|
||||
}},
|
||||
}, mdb.ZoneAction(mdb.SHORT, mdb.ZONE, mdb.FIELD, "time,id,type,name,text,path,file,line")), Hand: func(m *ice.Message, arg ...string) {
|
||||
mdb.ZoneSelectPage(m, arg...).PushAction(kit.Select(mdb.REMOVE, INNER, len(arg) > 0))
|
||||
}},
|
||||
|
@ -242,20 +242,20 @@ func init() {
|
||||
m.Cmd(mdb.PLUGIN, mdb.CREATE, k, m.Prefix(k))
|
||||
}
|
||||
}},
|
||||
GODOC: {Name: "godoc", Help: "文档", Actions: ice.MergeAction(ice.Actions{
|
||||
GODOC: {Name: "godoc", Help: "文档", Actions: ice.MergeActions(ice.Actions{
|
||||
mdb.RENDER: {Hand: func(m *ice.Message, arg ...string) {
|
||||
m.Cmdy(cli.SYSTEM, GO, "doc", strings.TrimSuffix(arg[1], ice.PT+arg[0]), kit.Dict(cli.CMD_DIR, arg[2])).SetAppend()
|
||||
}},
|
||||
}, PlugAction())},
|
||||
SUM: {Name: "sum", Help: "版本", Actions: ice.MergeAction(ice.Actions{
|
||||
SUM: {Name: "sum", Help: "版本", Actions: ice.MergeActions(ice.Actions{
|
||||
mdb.RENDER: {Hand: func(m *ice.Message, arg ...string) { _sum_show(m, path.Join(arg[2], arg[1])) }},
|
||||
mdb.ENGINE: {Hand: func(m *ice.Message, arg ...string) { _sum_show(m, path.Join(arg[2], arg[1])) }},
|
||||
}, PlugAction())},
|
||||
MOD: {Name: "mod", Help: "模块", Actions: ice.MergeAction(ice.Actions{
|
||||
MOD: {Name: "mod", Help: "模块", Actions: ice.MergeActions(ice.Actions{
|
||||
mdb.RENDER: {Hand: func(m *ice.Message, arg ...string) { _mod_show(m, path.Join(arg[2], arg[1])) }},
|
||||
mdb.ENGINE: {Hand: func(m *ice.Message, arg ...string) { _mod_show(m, path.Join(arg[2], arg[1])) }},
|
||||
}, PlugAction())},
|
||||
GO: {Name: "go", Help: "后端", Actions: ice.MergeAction(ice.Actions{
|
||||
GO: {Name: "go", Help: "后端", Actions: ice.MergeActions(ice.Actions{
|
||||
mdb.SEARCH: {Hand: func(m *ice.Message, arg ...string) {
|
||||
if arg[0] == GO {
|
||||
_go_tags(m, kit.Select(cli.MAIN, arg, 1))
|
||||
|
@ -100,7 +100,7 @@ const INNER = "inner"
|
||||
|
||||
func init() {
|
||||
Index.Merge(&ice.Context{Commands: ice.Commands{
|
||||
INNER: {Name: "inner path=src/@key file=main.go line=1 auto", Help: "源代码", Meta: kit.Dict(ice.DisplayLocal("")), Actions: ice.MergeAction(ice.Actions{
|
||||
INNER: {Name: "inner path=src/@key file=main.go line=1 auto", Help: "源代码", Meta: kit.Dict(ice.DisplayLocal("")), Actions: ice.MergeActions(ice.Actions{
|
||||
mdb.PLUGIN: {Name: "plugin", Help: "插件", Hand: func(m *ice.Message, arg ...string) {
|
||||
if m.Cmdy(mdb.PLUGIN, arg); m.Result() == "" {
|
||||
m.Echo(kit.Select("{}", m.Config(kit.Keys(PLUG, arg[0]))))
|
||||
|
@ -13,18 +13,17 @@ import (
|
||||
"shylinux.com/x/icebergs/base/tcp"
|
||||
"shylinux.com/x/icebergs/base/web"
|
||||
kit "shylinux.com/x/toolkits"
|
||||
"shylinux.com/x/toolkits/file"
|
||||
)
|
||||
|
||||
func _install_path(m *ice.Message, link string) string {
|
||||
link = kit.Select(m.Option(mdb.LINK), link)
|
||||
if p := path.Join(ice.USR_INSTALL, kit.TrimExt(link)); kit.FileExists(p) {
|
||||
if p := path.Join(ice.USR_INSTALL, kit.TrimExt(link)); nfs.ExistsFile(m, p) {
|
||||
return p
|
||||
}
|
||||
if p := path.Join(ice.USR_INSTALL, path.Base(link)); kit.FileExists(p) {
|
||||
if p := path.Join(ice.USR_INSTALL, path.Base(link)); nfs.ExistsFile(m, p) {
|
||||
return path.Join(ice.USR_INSTALL, strings.Split(m.Cmdx(cli.SYSTEM, "sh", "-c", kit.Format("tar tf %s| head -n1", p), ice.Option{cli.CMD_OUTPUT, ""}), ice.PS)[0])
|
||||
}
|
||||
m.ErrorNotImplement(link)
|
||||
m.Warn(true, ice.ErrNotFound, link)
|
||||
return ""
|
||||
}
|
||||
func _install_download(m *ice.Message) {
|
||||
@ -32,34 +31,29 @@ func _install_download(m *ice.Message) {
|
||||
name := path.Base(strings.Split(link, "?")[0])
|
||||
file := path.Join(kit.Select(ice.USR_INSTALL, m.Option(nfs.PATH)), name)
|
||||
|
||||
defer m.Cmdy(nfs.DIR, file)
|
||||
if kit.FileExists(file) {
|
||||
if nfs.ExistsFile(m, file) {
|
||||
web.ToastSuccess(m)
|
||||
m.Cmdy(nfs.DIR, file)
|
||||
return // 文件存在
|
||||
}
|
||||
|
||||
// 创建文件
|
||||
m.Cmd(nfs.SAVE, file, "")
|
||||
web.GoToast(m, web.DOWNLOAD, func(toast func(string, int, int)) {
|
||||
m.Cmd(mdb.INSERT, INSTALL, "", mdb.HASH, mdb.NAME, name, nfs.PATH, file, mdb.LINK, link)
|
||||
defer web.ToastSuccess(m)
|
||||
|
||||
// 下载进度
|
||||
mdb.Richs(m, INSTALL, "", name, func(key string, value ice.Map) {
|
||||
value = kit.GetMeta(value)
|
||||
m.OptionCB(web.SPIDE, func(count int, total int, step int) {
|
||||
mdb.HashCreate(m, mdb.NAME, name, nfs.PATH, file, mdb.LINK, link)
|
||||
m.Cmd("web.spide", ice.DEV, web.SPIDE_SAVE, file, web.SPIDE_GET, link, func(count int, total int, step int) {
|
||||
mdb.HashSelectUpdate(m, name, func(value ice.Map) {
|
||||
value[mdb.COUNT], value[mdb.TOTAL], value[mdb.VALUE] = count, total, step
|
||||
})
|
||||
toast(name, count, total)
|
||||
})
|
||||
})
|
||||
|
||||
// 下载解压
|
||||
m.Cmd("web.spide", ice.DEV, web.SPIDE_SAVE, file, web.SPIDE_GET, link)
|
||||
m.Cmd(nfs.TAR, mdb.EXPORT, name, kit.Dict(cli.CMD_DIR, path.Dir(file)))
|
||||
web.PushNoticeRefresh(m)
|
||||
web.ToastSuccess(m)
|
||||
})
|
||||
}
|
||||
func _install_build(m *ice.Message, arg ...string) string {
|
||||
p := m.Option(cli.CMD_DIR, _install_path(m, ""))
|
||||
pp := kit.Path(path.Join(p, "_install"))
|
||||
pp := kit.Path(path.Join(p, _INSTALL))
|
||||
|
||||
// 推流
|
||||
web.PushStream(m)
|
||||
@ -91,7 +85,7 @@ func _install_order(m *ice.Message, arg ...string) {
|
||||
}
|
||||
func _install_spawn(m *ice.Message, arg ...string) {
|
||||
if kit.Int(m.Option(tcp.PORT)) >= 10000 {
|
||||
if p := path.Join(ice.USR_LOCAL_DAEMON, m.Option(tcp.PORT)); kit.FileExists(p) {
|
||||
if p := path.Join(ice.USR_LOCAL_DAEMON, m.Option(tcp.PORT)); nfs.ExistsFile(m, p) {
|
||||
m.Echo(p)
|
||||
return
|
||||
}
|
||||
@ -101,13 +95,13 @@ func _install_spawn(m *ice.Message, arg ...string) {
|
||||
|
||||
target := path.Join(ice.USR_LOCAL_DAEMON, m.Option(tcp.PORT))
|
||||
source := _install_path(m, "")
|
||||
file.MkdirAll(target, ice.MOD_DIR)
|
||||
nfs.MkdirAll(m, target)
|
||||
defer m.Echo(target)
|
||||
|
||||
if m.Option(INSTALL) == "" && kit.FileExists(kit.Path(source, "_install")) {
|
||||
m.Option(INSTALL, "_install")
|
||||
if m.Option(INSTALL) == "" && nfs.ExistsFile(m, kit.Path(source, _INSTALL)) {
|
||||
m.Option(INSTALL, _INSTALL)
|
||||
}
|
||||
m.Cmd(nfs.DIR, path.Join(source, m.Option(INSTALL))).Tables(func(value ice.Maps) {
|
||||
m.Cmd(nfs.DIR, path.Join(source, m.Option(INSTALL)), func(value ice.Maps) {
|
||||
m.Cmd(cli.SYSTEM, "cp", "-r", strings.TrimSuffix(value[nfs.PATH], ice.PS), target+ice.PS)
|
||||
})
|
||||
}
|
||||
@ -120,6 +114,7 @@ func _install_start(m *ice.Message, arg ...string) {
|
||||
args = append(args, cb(p)...)
|
||||
case func(string):
|
||||
cb(p)
|
||||
case nil:
|
||||
default:
|
||||
m.ErrorNotImplement(cb)
|
||||
}
|
||||
@ -129,7 +124,7 @@ func _install_start(m *ice.Message, arg ...string) {
|
||||
}
|
||||
}
|
||||
func _install_stop(m *ice.Message, arg ...string) {
|
||||
m.Cmd(cli.DAEMON).Tables(func(value ice.Maps) {
|
||||
m.Cmd(cli.DAEMON, func(value ice.Maps) {
|
||||
if value[cli.PID] == m.Option(cli.PID) {
|
||||
m.Cmd(cli.DAEMON, cli.STOP, kit.Dict(mdb.HASH, value[mdb.HASH]))
|
||||
}
|
||||
@ -139,7 +134,7 @@ func _install_stop(m *ice.Message, arg ...string) {
|
||||
func _install_service(m *ice.Message, arg ...string) {
|
||||
arg = kit.Split(path.Base(arg[0]), "-.")[:1]
|
||||
m.Fields(len(arg[1:]), "time,port,status,pid,cmd,dir")
|
||||
m.Cmd(mdb.SELECT, cli.DAEMON, "", mdb.HASH).Tables(func(value ice.Maps) {
|
||||
m.Cmd(mdb.SELECT, cli.DAEMON, "", mdb.HASH, func(value ice.Maps) {
|
||||
if strings.Contains(value[ice.CMD], path.Join(ice.BIN, arg[0])) {
|
||||
m.Push("", value, kit.Split(m.OptionFields()))
|
||||
}
|
||||
@ -150,22 +145,16 @@ func _install_service(m *ice.Message, arg ...string) {
|
||||
|
||||
const (
|
||||
PREPARE = "prepare"
|
||||
_INSTALL = "_install"
|
||||
)
|
||||
const INSTALL = "install"
|
||||
|
||||
func init() {
|
||||
Index.MergeCommands(ice.Commands{
|
||||
INSTALL: {Name: "install name port path auto download", Help: "安装", Meta: kit.Dict(), Actions: ice.MergeAction(ice.Actions{
|
||||
INSTALL: {Name: "install name port path auto download", Help: "安装", Meta: kit.Dict(), Actions: ice.MergeActions(ice.Actions{
|
||||
web.DOWNLOAD: {Name: "download link path", Help: "下载", Hand: func(m *ice.Message, arg ...string) {
|
||||
_install_download(m)
|
||||
}},
|
||||
nfs.SOURCE: {Name: "source link path", Help: "源码", Hand: func(m *ice.Message, arg ...string) {
|
||||
if m.Option(nfs.DIR_ROOT, path.Join(_install_path(m, ""), "_install")); !kit.FileExists(m.Option(nfs.DIR_ROOT)) {
|
||||
m.Option(nfs.DIR_ROOT, path.Join(_install_path(m, "")))
|
||||
}
|
||||
defer m.StatusTime(nfs.PATH, m.Option(nfs.DIR_ROOT))
|
||||
m.Cmdy(nfs.DIR, m.Option(nfs.PATH))
|
||||
}},
|
||||
cli.BUILD: {Name: "build link", Help: "构建", Hand: func(m *ice.Message, arg ...string) {
|
||||
if err := _install_build(m, arg...); err != "" {
|
||||
web.ToastFailure(m, cli.BUILD)
|
||||
@ -186,7 +175,14 @@ func init() {
|
||||
cli.STOP: {Name: "stop", Help: "停止", Hand: func(m *ice.Message, arg ...string) {
|
||||
_install_stop(m, arg...)
|
||||
}},
|
||||
}, mdb.HashAction(mdb.SHORT, mdb.NAME, mdb.FIELD, "time,name,path,link", nfs.PATH, ice.USR_INSTALL)), Hand: func(m *ice.Message, arg ...string) {
|
||||
nfs.SOURCE: {Name: "source link path", Help: "源码", Hand: func(m *ice.Message, arg ...string) {
|
||||
if m.Option(nfs.DIR_ROOT, path.Join(_install_path(m, ""), _INSTALL)); !nfs.ExistsFile(m, m.Option(nfs.DIR_ROOT)) {
|
||||
m.Option(nfs.DIR_ROOT, path.Join(_install_path(m, "")))
|
||||
}
|
||||
m.Cmdy(nfs.DIR, m.Option(nfs.PATH))
|
||||
m.StatusTimeCount(nfs.PATH, m.Option(nfs.DIR_ROOT))
|
||||
}},
|
||||
}, mdb.HashAction(mdb.SHORT, mdb.NAME, mdb.FIELD, "time,name,path,link")), Hand: func(m *ice.Message, arg ...string) {
|
||||
switch len(arg) {
|
||||
case 0: // 源码列表
|
||||
mdb.HashSelect(m, arg...)
|
||||
@ -211,23 +207,10 @@ func InstallAction(args ...ice.Any) ice.Actions {
|
||||
m.Cmdy(INSTALL, cli.BUILD, m.Config(nfs.SOURCE))
|
||||
}},
|
||||
cli.ORDER: {Name: "order", Help: "加载", Hand: func(m *ice.Message, arg ...string) {
|
||||
m.Cmdy(INSTALL, cli.ORDER, m.Config(nfs.SOURCE), "_install/bin")
|
||||
m.Cmdy(INSTALL, cli.ORDER, m.Config(nfs.SOURCE), path.Join(_INSTALL, ice.BIN))
|
||||
}},
|
||||
nfs.TRASH: {Name: "trash", Help: "删除", Hand: func(m *ice.Message, arg ...string) {
|
||||
m.Cmd(nfs.TRASH, m.Option(nfs.PATH))
|
||||
}},
|
||||
}
|
||||
}
|
||||
func InstallSoftware(m *ice.Message, bin string, list ice.Any) (ok bool) {
|
||||
if cli.SystemFind(m, bin) != "" {
|
||||
return true
|
||||
}
|
||||
kit.Fetch(list, func(index int, value ice.Map) {
|
||||
if strings.Contains(m.Cmdx(cli.RUNTIME, kit.Keys(tcp.HOST, cli.OSID)), kit.Format(value[cli.OSID])) {
|
||||
web.PushStream(m)
|
||||
m.Cmd(cli.SYSTEM, value[ice.CMD])
|
||||
ok = true
|
||||
}
|
||||
})
|
||||
return ok
|
||||
}
|
||||
|
@ -68,7 +68,7 @@ const NODE = "node"
|
||||
|
||||
func init() {
|
||||
Index.Register(&ice.Context{Name: JS, Help: "前端", Commands: ice.Commands{
|
||||
JS: {Name: "js", Help: "前端", Actions: ice.MergeAction(ice.Actions{
|
||||
JS: {Name: "js", Help: "前端", Actions: ice.MergeActions(ice.Actions{
|
||||
ice.CTX_INIT: {Hand: func(m *ice.Message, arg ...string) {
|
||||
for _, cmd := range []string{mdb.SEARCH, mdb.ENGINE, mdb.RENDER, mdb.PLUGIN} {
|
||||
m.Cmd(cmd, mdb.CREATE, JSON, m.PrefixKey())
|
||||
|
@ -23,7 +23,7 @@ func init() {
|
||||
API_GITHUB = "https://api.github.com/"
|
||||
)
|
||||
Index.MergeCommands(ice.Commands{
|
||||
OAUTH: {Name: "oauth hash auto", Help: "授权", Actions: ice.MergeAction(ice.Actions{
|
||||
OAUTH: {Name: "oauth hash auto", Help: "授权", Actions: ice.MergeActions(ice.Actions{
|
||||
ctx.CONFIG: {Name: "config client_id client_secret redirect_uri", Help: "配置", Hand: func(m *ice.Message, arg ...string) {
|
||||
for _, k := range []string{CLIENT_ID, CLIENT_SECRET, REDIRECT_URI} {
|
||||
m.Config(k, kit.Select(m.Config(k), m.Option(k)))
|
||||
@ -34,31 +34,30 @@ func init() {
|
||||
m.Cmdy(aaa.RSA).Cut("hash,title,public")
|
||||
return
|
||||
}
|
||||
m.Cmdy(mdb.INPUTS, m.PrefixKey(), "", mdb.HASH, arg)
|
||||
mdb.HashInputs(m, arg)
|
||||
}},
|
||||
mdb.CREATE: {Name: "create code", Help: "创建", Hand: func(m *ice.Message, arg ...string) {
|
||||
m.Cmdy(mdb.INSERT, m.PrefixKey(), "", mdb.HASH, m.OptionSimple(CODE))
|
||||
mdb.HashCreate(m, m.OptionSimple(CODE))
|
||||
}},
|
||||
ACCESS_TOKEN: {Name: "access_token", Help: "令牌", Hand: func(m *ice.Message, arg ...string) {
|
||||
m.Option(web.SPIDE_HEADER, web.Accept, web.ContentJSON)
|
||||
data := kit.UnMarshal(m.Cmdx(web.SPIDE_POST, kit.MergeURL2(LOGIN_OAUTH, ACCESS_TOKEN), m.ConfigSimple(CLIENT_ID, CLIENT_SECRET), m.OptionSimple(CODE)))
|
||||
m.Cmdy(mdb.MODIFY, m.PrefixKey(), "", mdb.HASH, m.OptionSimple(mdb.HASH), kit.Simple(data))
|
||||
data := web.SpidePost(m, kit.MergeURL2(LOGIN_OAUTH, ACCESS_TOKEN), m.ConfigSimple(CLIENT_ID, CLIENT_SECRET), m.OptionSimple(CODE))
|
||||
mdb.HashModify(m, m.OptionSimple(mdb.HASH), kit.Simple(data))
|
||||
}},
|
||||
"public": {Name: "public hash", Help: "公钥", Hand: func(m *ice.Message, arg ...string) {
|
||||
m.Option(web.SPIDE_HEADER, web.Accept, web.ContentJSON, web.Authorization, "token "+m.Option(ACCESS_TOKEN))
|
||||
msg := m.Cmd(aaa.RSA, m.Option(mdb.HASH))
|
||||
m.PushDetail(m.Cmdx(web.SPIDE_POST, API_GITHUB+"user/keys", web.SPIDE_JSON, "key", msg.Append("public"), msg.AppendSimple("title")))
|
||||
m.PushDetail(web.SpidePost(m, API_GITHUB+"user/keys", web.SPIDE_JSON, "key", msg.Append("public"), msg.AppendSimple("title")))
|
||||
m.Echo("https://github.com/settings/keys")
|
||||
}},
|
||||
"user": {Name: "user", Help: "用户", Hand: func(m *ice.Message, arg ...string) {
|
||||
m.Option(web.SPIDE_HEADER, web.Accept, web.ContentJSON, web.Authorization, "token "+m.Option(ACCESS_TOKEN))
|
||||
data := kit.UnMarshal(m.Cmdx(web.SPIDE_GET, API_GITHUB+"user"))
|
||||
m.Cmdy(mdb.MODIFY, m.PrefixKey(), "", mdb.HASH, m.OptionSimple(mdb.HASH), kit.Simple(data))
|
||||
mdb.HashModify(m, m.OptionSimple(mdb.HASH), kit.Simple(web.SpideGet(m, API_GITHUB+"user")))
|
||||
}},
|
||||
mdb.DELETE: {Name: "delete", Help: "删除", Hand: func(m *ice.Message, arg ...string) {
|
||||
mdb.HashSelect(m, m.Option(mdb.HASH))
|
||||
m.Option(web.SPIDE_HEADER, web.Accept, web.ContentJSON, web.Authorization, "token "+m.Append(ACCESS_TOKEN))
|
||||
m.Cmd(web.SPIDE_DELETE, API_GITHUB+"user/keys/"+m.Option(mdb.ID))
|
||||
web.SpideDelete(m, API_GITHUB+"user/keys/"+m.Option(mdb.ID))
|
||||
}},
|
||||
}, mdb.HashAction(mdb.FIELD, "time,hash,code,access_token,scope,token_type")), Hand: func(m *ice.Message, arg ...string) {
|
||||
if mdb.HashSelect(m, arg...).PushAction("user", "public", ACCESS_TOKEN, mdb.REMOVE); len(arg) == 0 {
|
||||
@ -67,17 +66,13 @@ func init() {
|
||||
} else if len(arg) == 1 {
|
||||
m.Option(web.SPIDE_HEADER, web.Accept, web.ContentJSON, web.Authorization, "token "+m.Append(ACCESS_TOKEN))
|
||||
m.SetAppend()
|
||||
m.Debug("what %v", m.FormatMeta())
|
||||
data := kit.UnMarshal(m.Cmdx(web.SPIDE_GET, API_GITHUB+"user/keys"))
|
||||
m.Debug("what %v", data)
|
||||
kit.Fetch(data, func(index int, value ice.Map) {
|
||||
kit.Fetch(web.SpideGet(m, API_GITHUB+"user/keys"), func(index int, value ice.Map) {
|
||||
m.PushRecord(value, "created_at,title,id,key")
|
||||
})
|
||||
m.PushAction(mdb.DELETE)
|
||||
m.Debug("what %v", m.FormatMeta())
|
||||
}
|
||||
}},
|
||||
"/oauth": {Name: "/oauth", Help: "授权", Actions: ice.MergeAction(ice.Actions{}, ctx.CmdAction()), Hand: func(m *ice.Message, arg ...string) {
|
||||
"/oauth": {Name: "/oauth", Help: "授权", Actions: ice.MergeActions(ice.Actions{}, ctx.CmdAction()), Hand: func(m *ice.Message, arg ...string) {
|
||||
if m.Option(CODE) != "" {
|
||||
web.RenderCmd(m, m.PrefixKey(), m.Cmdx(m.PrefixKey(), mdb.CREATE, m.OptionSimple(CODE)))
|
||||
}
|
||||
|
@ -25,7 +25,7 @@ const PPROF = "pprof"
|
||||
|
||||
func init() {
|
||||
Index.MergeCommands(ice.Commands{
|
||||
PPROF: {Name: "pprof zone id auto", Help: "性能分析", Actions: ice.MergeAction(ice.Actions{
|
||||
PPROF: {Name: "pprof zone id auto", Help: "性能分析", Actions: ice.MergeActions(ice.Actions{
|
||||
ice.CTX_INIT: {Hand: func(m *ice.Message, arg ...string) {
|
||||
web.AddRewrite(func(w http.ResponseWriter, r *http.Request) bool {
|
||||
if p := r.URL.Path; strings.HasPrefix(p, "/debug") {
|
||||
@ -41,7 +41,7 @@ func init() {
|
||||
m.Cmdy(nfs.DIR, ice.BIN, nfs.DIR_CLI_FIELDS).RenameAppend(nfs.PATH, BINNARY)
|
||||
case SERVICE:
|
||||
m.Cmd(web.SPIDE).Tables(func(value ice.Maps) {
|
||||
m.Push(SERVICE, kit.MergeURL2(value["client.url"], "/debug/pprof/profile"))
|
||||
m.Push(SERVICE, kit.MergeURL2(value[web.CLIENT_URL], "/debug/pprof/profile"))
|
||||
})
|
||||
}
|
||||
}},
|
||||
@ -52,11 +52,11 @@ func init() {
|
||||
cmd := kit.Simple(m.Configv(PPROF), "-text", m.Option(BINNARY), msg.Append(nfs.FILE))
|
||||
m.Option(mdb.TEXT, strings.Join(kit.Slice(strings.Split(m.Cmdx(cli.SYSTEM, cmd), ice.NL), 0, 20), ice.NL))
|
||||
m.Option(nfs.FILE, msg.Append(nfs.FILE))
|
||||
m.Cmd(mdb.INSERT, PPROF, "", m.OptionSimple("zone,text,file"))
|
||||
mdb.ZoneInsert(m, m.OptionSimple("zone,text,file"))
|
||||
m.Echo(m.Option(mdb.TEXT)).ProcessInner()
|
||||
}},
|
||||
web.SERVE: {Name: "serve", Help: "展示", Hand: func(m *ice.Message, arg ...string) {
|
||||
u := kit.ParseURL(m.Option(ice.MSG_USERWEB))
|
||||
u := web.OptionUserWeb(m)
|
||||
p := u.Hostname() + ":" + m.Cmdx(tcp.PORT, aaa.RIGHT)
|
||||
m.Cmd(cli.DAEMON, m.Configv(PPROF), "-http="+p, m.Option(BINNARY), m.Option(nfs.FILE))
|
||||
m.Echo("http://%s/ui/top", p).ProcessInner()
|
||||
|
@ -13,7 +13,6 @@ import (
|
||||
"shylinux.com/x/icebergs/base/gdb"
|
||||
"shylinux.com/x/icebergs/base/mdb"
|
||||
"shylinux.com/x/icebergs/base/nfs"
|
||||
"shylinux.com/x/icebergs/base/tcp"
|
||||
"shylinux.com/x/icebergs/base/web"
|
||||
kit "shylinux.com/x/toolkits"
|
||||
)
|
||||
@ -23,22 +22,23 @@ func _publish_file(m *ice.Message, file string, arg ...string) string {
|
||||
arg = kit.Simple(kit.Keys(ice.ICE, runtime.GOOS, runtime.GOARCH))
|
||||
file = cli.SystemFind(m, os.Args[0])
|
||||
|
||||
} else if s, e := os.Stat(file); m.Assert(e) && s.IsDir() {
|
||||
} else if s, e := nfs.StatFile(m, file); m.Assert(e) && s.IsDir() {
|
||||
file = m.Cmdx(nfs.TAR, mdb.IMPORT, path.Base(file), file)
|
||||
defer func() { os.Remove(file) }()
|
||||
}
|
||||
|
||||
// 发布文件
|
||||
target := path.Join(m.Config(nfs.PATH), kit.Select(path.Base(file), arg, 0))
|
||||
target := path.Join(ice.USR_PUBLISH, kit.Select(path.Base(file), arg, 0))
|
||||
m.Logs(mdb.EXPORT, PUBLISH, target, cli.FROM, file)
|
||||
m.Cmd(nfs.LINK, target, file)
|
||||
return target
|
||||
}
|
||||
func _publish_list(m *ice.Message, arg ...string) {
|
||||
m.Option(nfs.DIR_DEEP, true)
|
||||
m.Option(nfs.DIR_ROOT, m.Config(nfs.PATH))
|
||||
m.Option(nfs.DIR_ROOT, ice.USR_PUBLISH)
|
||||
m.Option(nfs.DIR_REG, kit.Select("", arg, 0))
|
||||
m.Cmdy(nfs.DIR, nfs.PWD, kit.Select(nfs.DIR_WEB_FIELDS, arg, 1))
|
||||
m.Debug("what %v", m.FormatsMeta())
|
||||
}
|
||||
func _publish_bin_list(m *ice.Message, dir string) {
|
||||
p := m.Option(cli.CMD_DIR, dir)
|
||||
@ -62,11 +62,11 @@ const PUBLISH = "publish"
|
||||
|
||||
func init() {
|
||||
Index.Merge(&ice.Context{Configs: ice.Configs{
|
||||
PUBLISH: {Name: PUBLISH, Help: "发布", Value: kit.Data(nfs.PATH, ice.USR_PUBLISH, ice.CONTEXTS, _contexts)},
|
||||
PUBLISH: {Name: PUBLISH, Help: "发布", Value: kit.Data(ice.CONTEXTS, _contexts)},
|
||||
}, Commands: ice.Commands{
|
||||
PUBLISH: {Name: "publish path auto create volcanos icebergs intshell", Help: "发布", Actions: ice.Actions{
|
||||
ice.CTX_INIT: {Hand: func(m *ice.Message, arg ...string) {
|
||||
m.Cmd(aaa.ROLE, aaa.WHITE, aaa.VOID, m.Config(nfs.PATH))
|
||||
m.Cmd(aaa.ROLE, aaa.WHITE, aaa.VOID, ice.USR_PUBLISH)
|
||||
m.Cmd(aaa.ROLE, aaa.WHITE, aaa.VOID, m.PrefixKey())
|
||||
m.Config(ice.CONTEXTS, _contexts)
|
||||
gdb.Watch(m, web.SERVE_START, m.PrefixKey())
|
||||
@ -74,12 +74,6 @@ func init() {
|
||||
web.SERVE_START: {Name: "serve.start", Help: "服务启动", Hand: func(m *ice.Message, arg ...string) {
|
||||
_publish_file(m, ice.ICE_BIN)
|
||||
}},
|
||||
mdb.SEARCH: {Name: "search type name text", Help: "搜索", Hand: func(m *ice.Message, arg ...string) {
|
||||
if arg[0] == mdb.FOREACH && arg[1] == "" {
|
||||
m.PushSearch(mdb.TYPE, ice.CONTEXTS, mdb.NAME, ice.CORE, mdb.TEXT, m.Cmdx(m.PrefixKey(), ice.CONTEXTS, ice.CORE))
|
||||
}
|
||||
}},
|
||||
|
||||
ice.VOLCANOS: {Name: "volcanos", Help: "火山架", Hand: func(m *ice.Message, arg ...string) {
|
||||
defer func() { m.EchoQRCode(m.Option(ice.MSG_USERWEB)) }()
|
||||
defer func() { m.Cmdy(PUBLISH, ice.CONTEXTS) }()
|
||||
@ -87,17 +81,16 @@ func init() {
|
||||
}},
|
||||
ice.ICEBERGS: {Name: "icebergs", Help: "冰山架", Hand: func(m *ice.Message, arg ...string) {
|
||||
defer func() { m.Cmdy(PUBLISH, ice.CONTEXTS) }()
|
||||
m.Cmd(PUBLISH, mdb.CREATE, nfs.FILE, ice.BIN_ICE_BIN)
|
||||
_publish_bin_list(m, m.Config(nfs.PATH))
|
||||
_publish_bin_list(m, ice.USR_PUBLISH)
|
||||
}},
|
||||
ice.INTSHELL: {Name: "intshell", Help: "神农架", Hand: func(m *ice.Message, arg ...string) {
|
||||
defer func() { m.Cmdy(PUBLISH, ice.CONTEXTS) }()
|
||||
_publish_list(m, `.*\.(sh|vim|conf)$`)
|
||||
}},
|
||||
ice.CONTEXTS: {Name: "contexts", Help: "环境", Hand: func(m *ice.Message, arg ...string) {
|
||||
u := kit.ParseURL(tcp.ReplaceLocalhost(m, m.Option(ice.MSG_USERWEB)))
|
||||
u := web.OptionUserWeb(m)
|
||||
m.Option("httphost", fmt.Sprintf("%s://%s:%s", u.Scheme, strings.Split(u.Host, ice.DF)[0],
|
||||
kit.Select(kit.Select("80", "443", u.Scheme == "https"), strings.Split(u.Host, ice.DF), 1)))
|
||||
kit.Select(kit.Select("443", "80", u.Scheme == ice.HTTP), strings.Split(u.Host, ice.DF), 1)))
|
||||
|
||||
if len(arg) == 0 {
|
||||
arg = append(arg, ice.MISC, ice.CORE, ice.BASE)
|
||||
@ -105,13 +98,13 @@ func init() {
|
||||
for _, k := range arg {
|
||||
switch k {
|
||||
case ice.MISC:
|
||||
if bin := path.Join(ice.USR_PUBLISH, kit.Keys("ice", runtime.GOOS, runtime.GOARCH)); !kit.FileExists(bin) {
|
||||
if bin := path.Join(ice.USR_PUBLISH, kit.Keys(ice.ICE, runtime.GOOS, runtime.GOARCH)); !nfs.ExistsFile(m, bin) {
|
||||
m.Cmd(nfs.LINK, bin, m.Cmdx(cli.RUNTIME, "boot.bin"))
|
||||
}
|
||||
|
||||
case ice.CORE:
|
||||
if !kit.FileExists(".git") {
|
||||
repos := web.MergeURL2(m, "/x/"+m.Option(ice.MSG_USERPOD))
|
||||
if !nfs.ExistsFile(m, ".git") {
|
||||
repos := web.MergeURL2(m, "/x/"+kit.Select(ice.Info.PathName, m.Option(ice.MSG_USERPOD)))
|
||||
m.Cmd(cli.SYSTEM, "git", "init")
|
||||
m.Cmd(cli.SYSTEM, "git", "remote", "add", "origin", repos)
|
||||
m.Cmd("web.code.git.repos", mdb.CREATE, repos, "master", "", nfs.PWD)
|
||||
@ -132,7 +125,7 @@ func init() {
|
||||
_publish_file(m, m.Option(nfs.FILE))
|
||||
}},
|
||||
nfs.TRASH: {Name: "trash", Help: "删除", Hand: func(m *ice.Message, arg ...string) {
|
||||
m.Cmdy(nfs.TRASH, path.Join(m.Config(nfs.PATH), m.Option(nfs.PATH)))
|
||||
m.Cmdy(nfs.TRASH, path.Join(ice.USR_PUBLISH, m.Option(nfs.PATH)))
|
||||
}},
|
||||
mdb.EXPORT: {Name: "export", Help: "工具链", Hand: func(m *ice.Message, arg ...string) {
|
||||
var list = []string{ice.ETC_PATH}
|
||||
@ -159,7 +152,7 @@ func init() {
|
||||
m.Cmd("web.code.git.server", mdb.IMPORT)
|
||||
}},
|
||||
}, Hand: func(m *ice.Message, arg ...string) {
|
||||
m.Option(nfs.DIR_ROOT, m.Config(nfs.PATH))
|
||||
m.Option(nfs.DIR_ROOT, ice.USR_PUBLISH)
|
||||
m.Cmdy(nfs.DIR, kit.Select("", arg, 0), nfs.DIR_WEB_FIELDS)
|
||||
}},
|
||||
}})
|
||||
|
@ -29,7 +29,7 @@ const PY = nfs.PY
|
||||
|
||||
func init() {
|
||||
Index.Merge(&ice.Context{Commands: ice.Commands{
|
||||
PY: {Name: "py path auto", Help: "脚本", Actions: ice.MergeAction(ice.Actions{
|
||||
PY: {Name: "py path auto", Help: "脚本", Actions: ice.MergeActions(ice.Actions{
|
||||
ice.CTX_INIT: {Hand: func(m *ice.Message, arg ...string) {
|
||||
m.Cmd(mdb.ENGINE, mdb.CREATE, PY, m.PrefixKey())
|
||||
m.Cmd(mdb.RENDER, mdb.CREATE, PY, m.PrefixKey())
|
||||
|
@ -60,7 +60,7 @@ const SH = nfs.SH
|
||||
|
||||
func init() {
|
||||
Index.Register(&ice.Context{Name: SH, Help: "命令", Commands: ice.Commands{
|
||||
SH: {Name: "sh path auto", Help: "命令", Actions: ice.MergeAction(ice.Actions{
|
||||
SH: {Name: "sh path auto", Help: "命令", Actions: ice.MergeActions(ice.Actions{
|
||||
ice.CTX_INIT: {Name: "_init", Help: "初始化", Hand: func(m *ice.Message, arg ...string) {
|
||||
for _, cmd := range []string{mdb.SEARCH, mdb.ENGINE, mdb.RENDER, mdb.PLUGIN} {
|
||||
m.Cmd(cmd, mdb.CREATE, m.CommandKey(), m.PrefixKey())
|
||||
|
@ -35,7 +35,7 @@ const SHY = "shy"
|
||||
|
||||
func init() {
|
||||
Index.Register(&ice.Context{Name: SHY, Help: "脚本", Commands: ice.Commands{
|
||||
SHY: {Name: "shy path auto", Help: "脚本", Actions: ice.MergeAction(ice.Actions{
|
||||
SHY: {Name: "shy path auto", Help: "脚本", Actions: ice.MergeActions(ice.Actions{
|
||||
ice.CTX_INIT: {Hand: func(m *ice.Message, arg ...string) {
|
||||
for _, cmd := range []string{mdb.SEARCH, mdb.ENGINE, mdb.RENDER, mdb.PLUGIN} {
|
||||
m.Cmd(cmd, mdb.CREATE, SHY, m.PrefixKey())
|
||||
|
@ -14,7 +14,7 @@ const TEMPLATE = "template"
|
||||
|
||||
func init() {
|
||||
Index.MergeCommands(ice.Commands{
|
||||
TEMPLATE: {Name: "template name auto", Help: "模板", Actions: ice.MergeAction(ice.Actions{
|
||||
TEMPLATE: {Name: "template name auto", Help: "模板", Actions: ice.MergeActions(ice.Actions{
|
||||
ice.CTX_INIT: {Hand: func(m *ice.Message, arg ...string) {
|
||||
for _, _template := range _template_list {
|
||||
m.Cmd(TEMPLATE, mdb.CREATE, kit.SimpleKV(kit.Format(_template[0]), _template[1:]...))
|
||||
|
@ -18,20 +18,20 @@ const UPGRADE = "upgrade"
|
||||
func init() {
|
||||
Index.Merge(&ice.Context{Configs: ice.Configs{
|
||||
UPGRADE: {Name: UPGRADE, Help: "升级", Value: kit.Dict(mdb.HASH, kit.Dict(
|
||||
nfs.TARGET, kit.Dict(mdb.LIST, kit.List(mdb.TYPE, "bin", nfs.FILE, "ice.bin")),
|
||||
nfs.SOURCE, kit.Dict(mdb.LIST, kit.List(mdb.TYPE, "tar", nfs.FILE, "contexts.src.tar.gz")),
|
||||
nfs.BINARY, kit.Dict(mdb.LIST, kit.List(mdb.TYPE, "tar", nfs.FILE, "contexts.bin.tar.gz")),
|
||||
nfs.TARGET, kit.Dict(mdb.LIST, kit.List(mdb.TYPE, ice.BIN, nfs.FILE, "ice.bin")),
|
||||
nfs.SOURCE, kit.Dict(mdb.LIST, kit.List(mdb.TYPE, nfs.TAR, nfs.FILE, "contexts.src.tar.gz")),
|
||||
nfs.BINARY, kit.Dict(mdb.LIST, kit.List(mdb.TYPE, nfs.TAR, nfs.FILE, "contexts.bin.tar.gz")),
|
||||
))},
|
||||
}, Commands: ice.Commands{
|
||||
UPGRADE: {Name: "upgrade item=target,source,binary run restart", Help: "升级", Actions: ice.Actions{
|
||||
cli.RESTART: {Name: "restart", Help: "重启", Hand: func(m *ice.Message, arg ...string) {
|
||||
m.Sleep("1s").Go(func() { m.Cmd(ice.EXIT, 1) })
|
||||
m.Sleep300ms().Go(func() { m.Cmd(ice.EXIT, 1) })
|
||||
}},
|
||||
}, Hand: func(m *ice.Message, arg ...string) {
|
||||
mdb.Grows(m, m.CommandKey(), kit.Keys(mdb.HASH, kit.Select(cli.SYSTEM, arg, 0)), "", "", func(index int, value ice.Map) {
|
||||
mdb.ZoneSelect(m, kit.Select(cli.SYSTEM, arg, 0)).Tables(func(value ice.Maps) {
|
||||
if value[nfs.FILE] == ice.ICE_BIN { // 程序文件
|
||||
value[nfs.FILE] = kit.Keys(ice.ICE, runtime.GOOS, runtime.GOARCH)
|
||||
defer m.Cmd(cli.SYSTEM, "mv", value[nfs.FILE], ice.BIN_ICE_BIN)
|
||||
defer nfs.Rename(m, value[nfs.FILE], ice.BIN_ICE_BIN)
|
||||
m.Option(ice.EXIT, ice.TRUE)
|
||||
}
|
||||
|
||||
@ -39,14 +39,14 @@ func init() {
|
||||
dir := kit.Select(kit.Format(value[nfs.FILE]), value[nfs.PATH])
|
||||
m.Cmd(web.SPIDE, ice.DEV, web.SPIDE_SAVE, dir, web.SPIDE_GET, "/publish/"+kit.Format(value[nfs.FILE]))
|
||||
switch value[mdb.TYPE] {
|
||||
case "bin":
|
||||
case ice.BIN:
|
||||
os.Chmod(dir, 0755)
|
||||
case "tar":
|
||||
case nfs.TAR:
|
||||
m.Cmd(nfs.TAR, mdb.EXPORT, dir, "-C", path.Dir(dir))
|
||||
}
|
||||
})
|
||||
if web.ToastSuccess(m); m.Option(ice.EXIT) == ice.TRUE {
|
||||
m.Sleep("1s").Go(func() { m.Cmd(ice.EXIT, 1) })
|
||||
m.Sleep300ms().Go(func() { m.Cmd(ice.EXIT, 1) })
|
||||
web.ToastRestart(m)
|
||||
}
|
||||
}},
|
||||
|
@ -10,6 +10,7 @@ import (
|
||||
"shylinux.com/x/icebergs/base/mdb"
|
||||
"shylinux.com/x/icebergs/base/nfs"
|
||||
"shylinux.com/x/icebergs/base/web"
|
||||
"shylinux.com/x/icebergs/core/chat"
|
||||
kit "shylinux.com/x/toolkits"
|
||||
)
|
||||
|
||||
@ -195,7 +196,7 @@ func init() {
|
||||
|
||||
mdb.SEARCH: {Name: "search type name text", Help: "搜索", Hand: func(m *ice.Message, arg ...string) {
|
||||
if arg[0] == mdb.FOREACH && arg[1] == "" {
|
||||
m.PushSearch(mdb.TYPE, "go", mdb.NAME, "src/main.go", mdb.TEXT, web.MergeCmd(m, ""))
|
||||
m.PushSearch(mdb.TYPE, "go", mdb.NAME, "src/main.go", mdb.TEXT, chat.MergeCmd(m, ""))
|
||||
}
|
||||
}},
|
||||
mdb.INPUTS: {Name: "inputs", Help: "补全", Hand: func(m *ice.Message, arg ...string) {
|
||||
|
@ -2,6 +2,7 @@ package code
|
||||
|
||||
import (
|
||||
"fmt"
|
||||
"io"
|
||||
"os"
|
||||
"path"
|
||||
"strings"
|
||||
@ -26,43 +27,46 @@ func _webpack_can(m *ice.Message) {
|
||||
m.Cmd(nfs.COPY, _volcanos(m, PAGE_CAN_JS), _volcanos(m, ice.PROTO_JS), _volcanos(m, PAGE_CACHE_JS))
|
||||
m.Cmdy(nfs.DIR, _volcanos(m, PAGE))
|
||||
}
|
||||
func _webpack_css(m *ice.Message, css, js io.Writer, p string) {
|
||||
fmt.Fprintln(css, kit.Format("/* %s */", path.Join(ice.PS, p)))
|
||||
fmt.Fprintln(css, m.Cmdx(nfs.CAT, strings.TrimPrefix(p, ice.REQUIRE+ice.PS)))
|
||||
fmt.Fprintln(js, `Volcanos.meta.cache["`+path.Join(ice.PS, p)+`"] = []`)
|
||||
}
|
||||
func _webpack_js(m *ice.Message, js io.Writer, p string) {
|
||||
fmt.Fprintln(js, `_can_name = "`+path.Join(ice.PS, p)+`"`)
|
||||
fmt.Fprintln(js, m.Cmdx(nfs.CAT, strings.TrimPrefix(p, ice.REQUIRE+ice.PS)))
|
||||
}
|
||||
func _webpack_node(m *ice.Message, js io.Writer, p string) {
|
||||
fmt.Fprintln(js, `_can_name = "`+path.Join(ice.PS, p)+`"`)
|
||||
fmt.Fprintln(js, m.Cmdx(nfs.CAT, strings.TrimPrefix(p, ice.REQUIRE+ice.PS)))
|
||||
fmt.Fprintln(js, `Volcanos.meta.cache["`+path.Join(ice.PS, p)+`"] = []`)
|
||||
}
|
||||
func _webpack_cache(m *ice.Message, dir string, write bool) {
|
||||
if _, e := nfs.DiskFile.StatFile(ice.USR_VOLCANOS); os.IsNotExist(e) {
|
||||
return
|
||||
}
|
||||
|
||||
css, _, e := kit.Create(path.Join(dir, PAGE_CACHE_CSS))
|
||||
css, _, e := nfs.CreateFile(m, path.Join(dir, PAGE_CACHE_CSS))
|
||||
m.Assert(e)
|
||||
defer css.Close()
|
||||
|
||||
js, _, e := kit.Create(path.Join(dir, PAGE_CACHE_JS))
|
||||
js, _, e := nfs.CreateFile(m, path.Join(dir, PAGE_CACHE_JS))
|
||||
m.Assert(e)
|
||||
defer js.Close()
|
||||
defer fmt.Fprintln(js, `_can_name = ""`)
|
||||
|
||||
defer _webpack_can(m)
|
||||
if !write {
|
||||
return
|
||||
}
|
||||
|
||||
m.Option(nfs.DIR_ROOT, "")
|
||||
m.Option(nfs.DIR_ROOT, dir)
|
||||
m.Option(nfs.DIR_DEEP, true)
|
||||
m.Option(nfs.DIR_TYPE, nfs.CAT)
|
||||
|
||||
// m.Cmd(nfs.DIR, ice.SRC).Tables(func(value ice.Maps) {
|
||||
// if kit.Ext(value[nfs.PATH]) == JS {
|
||||
// fmt.Fprintln(js, `_can_name = "`+path.Join("/require", ice.Info.Make.Module, value[nfs.PATH])+`"`)
|
||||
// fmt.Fprintln(js, m.Cmdx(nfs.CAT, value[nfs.PATH]))
|
||||
// }
|
||||
// })
|
||||
|
||||
m.Option(nfs.DIR_ROOT, dir)
|
||||
for _, k := range []string{LIB, PANEL, PLUGIN} {
|
||||
m.Cmd(nfs.DIR, k).Sort(nfs.PATH).Tables(func(value ice.Maps) {
|
||||
if kit.Ext(value[nfs.PATH]) == CSS {
|
||||
fmt.Fprintln(css, kit.Format("/* %s */", path.Join(ice.PS, value[nfs.PATH])))
|
||||
fmt.Fprintln(css, m.Cmdx(nfs.CAT, value[nfs.PATH]))
|
||||
fmt.Fprintln(js, `Volcanos.meta.cache["`+path.Join(ice.PS, value[nfs.PATH])+`"] = []`)
|
||||
_webpack_css(m, css, js, value[nfs.PATH])
|
||||
}
|
||||
})
|
||||
}
|
||||
@ -70,45 +74,37 @@ func _webpack_cache(m *ice.Message, dir string, write bool) {
|
||||
for _, k := range []string{LIB, PANEL, PLUGIN} {
|
||||
m.Cmd(nfs.DIR, k).Sort(nfs.PATH).Tables(func(value ice.Maps) {
|
||||
if kit.Ext(value[nfs.PATH]) == JS {
|
||||
fmt.Fprintln(js, `_can_name = "`+path.Join(ice.PS, value[nfs.PATH])+`"`)
|
||||
fmt.Fprintln(js, m.Cmdx(nfs.CAT, value[nfs.PATH]))
|
||||
_webpack_js(m, js, value[nfs.PATH])
|
||||
}
|
||||
})
|
||||
}
|
||||
for _, k := range []string{ice.FRAME_JS} {
|
||||
fmt.Fprintln(js, `_can_name = "`+path.Join(ice.PS, k)+`"`)
|
||||
fmt.Fprintln(js, m.Cmdx(nfs.CAT, k))
|
||||
_webpack_js(m, js, k)
|
||||
}
|
||||
|
||||
m.Cmd(mdb.SELECT, m.PrefixKey(), "", mdb.HASH, ice.OptionFields(nfs.PATH)).Sort(nfs.PATH).Tables(func(value ice.Maps) {
|
||||
mdb.HashSelects(m).Sort(nfs.PATH).Tables(func(value ice.Maps) {
|
||||
defer fmt.Fprintln(js)
|
||||
|
||||
p := value[nfs.PATH]
|
||||
switch kit.Ext(p) {
|
||||
case nfs.CSS:
|
||||
fmt.Fprintln(css, kit.Format("/* %s */", path.Join("/require/node_modules/", p)))
|
||||
fmt.Fprintln(css, m.Cmdx(nfs.CAT, path.Join("node_modules", p)))
|
||||
fmt.Fprintln(js, `Volcanos.meta.cache["`+path.Join("/require/node_modules/", p)+`"] = []`)
|
||||
_webpack_css(m, css, js, path.Join(ice.REQUIRE, ice.NODE_MODULES, ice.LIB, p))
|
||||
return
|
||||
case nfs.JS:
|
||||
default:
|
||||
p = p + "/lib/" + p + ".js"
|
||||
}
|
||||
|
||||
fmt.Fprintln(js, `_can_name = "`+path.Join("/require/node_modules/", p)+`"`)
|
||||
fmt.Fprintln(js, m.Cmdx(nfs.CAT, path.Join("node_modules", p)))
|
||||
fmt.Fprintln(js, `Volcanos.meta.cache["`+path.Join("/require/node_modules/", p)+`"] = []`)
|
||||
_webpack_node(m, js, path.Join(ice.REQUIRE, ice.NODE_MODULES, ice.LIB, p))
|
||||
})
|
||||
}
|
||||
func _webpack_build(m *ice.Message, file string) {
|
||||
if f, _, e := kit.Create(kit.Keys(file, JS)); m.Assert(e) {
|
||||
if f, _, e := nfs.CreateFile(m, kit.Keys(file, JS)); m.Assert(e) {
|
||||
defer f.Close()
|
||||
fmt.Fprintln(f, `Volcanos.meta.webpack = true`)
|
||||
fmt.Fprintln(f, `Volcanos.meta.pack = `+kit.Formats(kit.UnMarshal(kit.Select("{}", m.Option(nfs.CONTENT)))))
|
||||
fmt.Fprintln(f, `Volcanos.meta.args = `+kit.Formats(kit.Dict(m.OptionSimple(kit.Split(m.Option(ctx.ARGS))...))))
|
||||
}
|
||||
|
||||
if f, p, e := kit.Create(kit.Keys(file, HTML)); m.Assert(e) {
|
||||
if f, p, e := nfs.CreateFile(m, kit.Keys(file, HTML)); m.Assert(e) {
|
||||
defer f.Close()
|
||||
defer m.Echo(p)
|
||||
|
||||
@ -142,7 +138,6 @@ const (
|
||||
PLUGIN = "plugin"
|
||||
)
|
||||
const (
|
||||
PUBLISH_ORDER_JS = "publish/order.js"
|
||||
PAGE_INDEX_CSS = "page/index.css"
|
||||
PAGE_CACHE_CSS = "page/cache.css"
|
||||
PAGE_CACHE_JS = "page/cache.js"
|
||||
@ -156,26 +151,26 @@ const WEBPACK = "webpack"
|
||||
|
||||
func init() {
|
||||
Index.MergeCommands(ice.Commands{
|
||||
WEBPACK: {Name: "webpack path auto create remove", Help: "打包", Actions: ice.MergeAction(ice.Actions{
|
||||
WEBPACK: {Name: "webpack path auto create remove", Help: "打包", Actions: ice.MergeActions(ice.Actions{
|
||||
mdb.CREATE: {Name: "create", Help: "创建", Hand: func(m *ice.Message, arg ...string) {
|
||||
_webpack_cache(m.Spawn(), _volcanos(m), true)
|
||||
}},
|
||||
mdb.INSERT: {Name: "insert", Help: "添加", Hand: func(m *ice.Message, arg ...string) {
|
||||
m.Cmd(mdb.INSERT, m.PrefixKey(), "", mdb.HASH, nfs.PATH, arg[0])
|
||||
}},
|
||||
mdb.REMOVE: {Name: "remove", Help: "删除", Hand: func(m *ice.Message, arg ...string) {
|
||||
_webpack_cache(m.Spawn(), _volcanos(m), false)
|
||||
}},
|
||||
mdb.INSERT: {Name: "insert path", Help: "添加", Hand: func(m *ice.Message, arg ...string) {
|
||||
mdb.HashCreate(m, nfs.PATH, m.Option(nfs.PATH))
|
||||
}},
|
||||
cli.BUILD: {Name: "build name=hi", Help: "构建", Hand: func(m *ice.Message, arg ...string) {
|
||||
_webpack_cache(m.Spawn(), _volcanos(m), true)
|
||||
_webpack_build(m, _publish(m, WEBPACK, m.Option(mdb.NAME)))
|
||||
}},
|
||||
nfs.TRASH: {Name: "trash", Help: "删除", Hand: func(m *ice.Message, arg ...string) {
|
||||
if !strings.Contains(m.Option(nfs.PATH), "page/index") {
|
||||
m.Cmd(nfs.TRASH, m.Option(nfs.PATH))
|
||||
}
|
||||
}},
|
||||
cli.BUILD: {Name: "build name=hi", Help: "构建", Hand: func(m *ice.Message, arg ...string) {
|
||||
_webpack_cache(m.Spawn(), _volcanos(m), true)
|
||||
_webpack_build(m, _publish(m, WEBPACK, m.Option(mdb.NAME)))
|
||||
}},
|
||||
}, mdb.HashAction(mdb.SHORT, nfs.PATH)), Hand: func(m *ice.Message, arg ...string) {
|
||||
}, mdb.HashAction(mdb.SHORT, nfs.PATH, mdb.FIELD, "time,path")), Hand: func(m *ice.Message, arg ...string) {
|
||||
m.Option(nfs.DIR_DEEP, true)
|
||||
m.Option(nfs.DIR_TYPE, nfs.CAT)
|
||||
m.OptionFields(nfs.DIR_WEB_FIELDS)
|
||||
|
@ -2,17 +2,18 @@ package code
|
||||
|
||||
import (
|
||||
"encoding/base64"
|
||||
"io"
|
||||
"os"
|
||||
"os/exec"
|
||||
"path"
|
||||
"strings"
|
||||
"time"
|
||||
|
||||
pty "shylinux.com/x/creackpty"
|
||||
ice "shylinux.com/x/icebergs"
|
||||
"shylinux.com/x/icebergs/base/cli"
|
||||
"shylinux.com/x/icebergs/base/ctx"
|
||||
"shylinux.com/x/icebergs/base/mdb"
|
||||
"shylinux.com/x/icebergs/base/nfs"
|
||||
"shylinux.com/x/icebergs/base/web"
|
||||
kit "shylinux.com/x/toolkits"
|
||||
)
|
||||
@ -22,8 +23,8 @@ func _xterm_socket(m *ice.Message, h, t string) {
|
||||
m.Option(ice.MSG_DAEMON, m.Conf("", kit.Keys(mdb.HASH, h, mdb.META, mdb.TEXT)))
|
||||
m.Option(mdb.TEXT, t)
|
||||
}
|
||||
func _xterm_get(m *ice.Message, h string, must bool) (f *os.File) {
|
||||
f, _ = mdb.HashTarget(m, h, func() ice.Any {
|
||||
func _xterm_get(m *ice.Message, h string, must bool) *os.File {
|
||||
if f, ok := mdb.HashTarget(m, h, func() ice.Any {
|
||||
if !must {
|
||||
return nil
|
||||
}
|
||||
@ -36,7 +37,9 @@ func _xterm_get(m *ice.Message, h string, must bool) (f *os.File) {
|
||||
m.Assert(err)
|
||||
|
||||
m.Go(func() {
|
||||
mdb.HashSelectUpdate(m, h, func(value ice.Map) { value["_cmd"] = cmd })
|
||||
mdb.HashSelectUpdate(m, h, func(value ice.Map) {
|
||||
value["_cmd"] = nfs.NewCloser(func() error { return cmd.Process.Kill() })
|
||||
})
|
||||
buf := make([]byte, ice.MOD_BUFS)
|
||||
for {
|
||||
if n, e := tty.Read(buf); !m.Warn(e) {
|
||||
@ -49,29 +52,30 @@ func _xterm_get(m *ice.Message, h string, must bool) (f *os.File) {
|
||||
web.PushNoticeGrow(m, "exit")
|
||||
})
|
||||
return tty
|
||||
}).(*os.File)
|
||||
return
|
||||
}).(*os.File); m.Warn(!ok, ice.ErrNotValid, f) {
|
||||
mdb.HashSelectUpdate(m, h, func(value ice.Map) { delete(value, mdb.TARGET) })
|
||||
return nil
|
||||
} else {
|
||||
return f
|
||||
}
|
||||
}
|
||||
|
||||
const XTERM = "xterm"
|
||||
|
||||
func init() {
|
||||
Index.MergeCommands(ice.Commands{
|
||||
XTERM: {Name: "xterm hash refresh", Help: "终端", Actions: ice.MergeAction(ice.Actions{
|
||||
XTERM: {Name: "xterm hash refresh", Help: "终端", Actions: ice.MergeActions(ice.Actions{
|
||||
ice.CTX_EXIT: {Hand: func(m *ice.Message, arg ...string) {
|
||||
mdb.HashSelectValue(m, func(value ice.Map) {
|
||||
if cmd, ok := value["_cmd"].(*exec.Cmd); ok {
|
||||
cmd.Process.Kill()
|
||||
if c, ok := value["_cmd"].(io.Closer); ok {
|
||||
c.Close()
|
||||
}
|
||||
})
|
||||
}},
|
||||
mdb.INPUTS: {Name: "inputs", Help: "补全", Hand: func(m *ice.Message, arg ...string) {
|
||||
switch mdb.HashInputs(m, arg); arg[0] {
|
||||
case mdb.TYPE:
|
||||
m.Push(arg[0], "python")
|
||||
m.Push(arg[0], "node")
|
||||
m.Push(arg[0], "bash")
|
||||
m.Push(arg[0], "sh")
|
||||
m.Push(arg[0], "python", "node", "bash", "sh")
|
||||
case mdb.NAME:
|
||||
m.Push(arg[0], path.Base(m.Option(mdb.TYPE)))
|
||||
}
|
||||
@ -90,15 +94,6 @@ func init() {
|
||||
mdb.HashModify(m, m.OptionSimple(mdb.HASH), arg)
|
||||
}},
|
||||
mdb.PRUNES: {Name: "prunes", Help: "清理", Hand: func(m *ice.Message, arg ...string) {
|
||||
mdb.HashSelect(m).Tables(func(value ice.Maps) {
|
||||
if f := _xterm_get(m, value[mdb.HASH], false); f != nil {
|
||||
if kit.Time(m.Time())-kit.Time(value[mdb.TIME]) < int64(time.Hour) {
|
||||
return // 有效终端
|
||||
}
|
||||
f.Close()
|
||||
}
|
||||
m.Cmd("", mdb.REMOVE, kit.Dict(value))
|
||||
})
|
||||
}},
|
||||
"resize": {Name: "resize", Help: "大小", Hand: func(m *ice.Message, arg ...string) {
|
||||
pty.Setsize(_xterm_get(m, m.Option(mdb.HASH), true), &pty.Winsize{Rows: uint16(kit.Int(m.Option("rows"))), Cols: uint16(kit.Int(m.Option("cols")))})
|
||||
|
@ -7,11 +7,11 @@ import (
|
||||
ice "shylinux.com/x/icebergs"
|
||||
"shylinux.com/x/icebergs/base/mdb"
|
||||
"shylinux.com/x/icebergs/base/nfs"
|
||||
"shylinux.com/x/icebergs/base/web"
|
||||
"shylinux.com/x/icebergs/core/chat"
|
||||
)
|
||||
|
||||
func _website_url(m *ice.Message, file string) string {
|
||||
return strings.Split(web.MergeWebsite(m, file), "?")[0]
|
||||
return strings.Split(chat.MergeWebsite(m, file), "?")[0]
|
||||
}
|
||||
|
||||
const ZML = nfs.ZML
|
||||
@ -21,7 +21,7 @@ func init() {
|
||||
SRC_WEBSITE = "src/website/"
|
||||
)
|
||||
Index.Register(&ice.Context{Name: ZML, Help: "网页", Commands: ice.Commands{
|
||||
ZML: {Name: "zml", Help: "网页", Actions: ice.MergeAction(ice.Actions{
|
||||
ZML: {Name: "zml", Help: "网页", Actions: ice.MergeActions(ice.Actions{
|
||||
ice.CTX_INIT: {Hand: func(m *ice.Message, arg ...string) {
|
||||
m.Cmd(mdb.RENDER, mdb.CREATE, nfs.ZML, m.PrefixKey())
|
||||
m.Cmd(mdb.ENGINE, mdb.CREATE, nfs.ZML, m.PrefixKey())
|
||||
|
@ -68,7 +68,7 @@ func init() {
|
||||
}, Commands: ice.Commands{
|
||||
ASSET: {Name: "asset account id auto spend trans bonus", Help: "资产", Meta: kit.Dict(
|
||||
"_trans", kit.Dict(ACCOUNT, "账户", AMOUNT, "金额", FROM, "转出", TO, "转入", "time", "时间", "name", "商家", "text", "备注"),
|
||||
), Actions: ice.MergeAction(ice.Actions{
|
||||
), Actions: ice.MergeActions(ice.Actions{
|
||||
SPEND: {Name: "spend account name amount time@date text", Help: "支出", Hand: func(m *ice.Message, arg ...string) {
|
||||
_sub_amount(m, arg)
|
||||
_asset_insert(m, arg[1], kit.Simple(mdb.TYPE, "支出", arg[2:])...)
|
||||
|
@ -9,6 +9,6 @@ const PAPER = "paper"
|
||||
|
||||
func init() {
|
||||
Index.MergeCommands(ice.Commands{
|
||||
PAPER: {Name: "paper", Help: "问卷", Actions: ice.MergeAction(ice.Actions{}, mdb.ZoneAction(mdb.FIELD, "time,id,type,name,text"))},
|
||||
PAPER: {Name: "paper", Help: "问卷", Actions: ice.MergeActions(ice.Actions{}, mdb.ZoneAction(mdb.FIELD, "time,id,type,name,text"))},
|
||||
})
|
||||
}
|
||||
|
@ -15,7 +15,7 @@ const SALARY = "salary"
|
||||
|
||||
func init() {
|
||||
Index.MergeCommands(ice.Commands{
|
||||
SALARY: {Name: "salary month auto create", Help: "工资", Actions: ice.MergeAction(ice.Actions{
|
||||
SALARY: {Name: "salary month auto create", Help: "工资", Actions: ice.MergeActions(ice.Actions{
|
||||
mdb.CREATE: {Name: "create month company amount income tax 公积金 养老保险 医疗保险 生育保险 工伤保险 失业保险 企业公积金 企业养老保险 企业医疗保险 企业生育保险 企业工伤保险 企业失业保险", Help: "添加"},
|
||||
}, mdb.HashAction(mdb.SHORT, MONTH, mdb.FIELD, "month,company,amount,income,tax")), Hand: func(m *ice.Message, arg ...string) {
|
||||
mdb.HashSelect(m, arg...)
|
||||
|
@ -15,7 +15,7 @@ func init() {
|
||||
Index.MergeCommands(ice.Commands{
|
||||
COUNT: {Name: "count begin_time@date end_time@date auto insert", Help: "倒计时", Meta: kit.Dict(
|
||||
ice.Display(""),
|
||||
), Actions: ice.MergeAction(ice.Actions{
|
||||
), Actions: ice.MergeActions(ice.Actions{
|
||||
mdb.INSERT: {Name: "insert zone type=once,step,week name text begin_time@date close_time@date", Help: "添加", Hand: func(m *ice.Message, arg ...string) {
|
||||
m.Cmdy(TASK, mdb.INSERT, arg)
|
||||
}},
|
||||
|
@ -13,7 +13,7 @@ const EPIC = "epic"
|
||||
|
||||
func init() {
|
||||
Index.MergeCommands(ice.Commands{
|
||||
EPIC: {Name: "epic hash list create export import", Help: "史记", Actions: ice.MergeAction(ice.Actions{
|
||||
EPIC: {Name: "epic hash list create export import", Help: "史记", Actions: ice.MergeActions(ice.Actions{
|
||||
mdb.CREATE: {Name: "create time@date type name", Help: "创建"},
|
||||
mdb.MODIFY: {Name: "modify hash time@date type name", Help: "编辑"},
|
||||
}, mdb.HashAction(mdb.FIELD, "time,hash,type,name,text")), Hand: func(m *ice.Message, arg ...string) {
|
||||
|
@ -7,6 +7,7 @@ import (
|
||||
"shylinux.com/x/icebergs/base/ctx"
|
||||
"shylinux.com/x/icebergs/base/mdb"
|
||||
"shylinux.com/x/icebergs/base/web"
|
||||
"shylinux.com/x/icebergs/core/chat"
|
||||
kit "shylinux.com/x/toolkits"
|
||||
)
|
||||
|
||||
@ -70,7 +71,7 @@ func init() {
|
||||
Index.MergeCommands(ice.Commands{
|
||||
PLAN: {Name: "plan scale=week,day,week,month,year,long begin_time@date list", Help: "计划", Meta: kit.Dict(
|
||||
ice.Display("/plugin/local/team/plan.js"),
|
||||
), Actions: ice.MergeAction(ice.Actions{
|
||||
), Actions: ice.MergeActions(ice.Actions{
|
||||
mdb.INPUTS: {Name: "inputs", Help: "补全", Hand: func(m *ice.Message, arg ...string) {
|
||||
m.Cmdy(TODO, mdb.INPUTS, arg)
|
||||
}},
|
||||
@ -79,7 +80,7 @@ func init() {
|
||||
}},
|
||||
mdb.SEARCH: {Name: "search", Help: "搜索", Hand: func(m *ice.Message, arg ...string) {
|
||||
if arg[0] == mdb.FOREACH && arg[1] == "" {
|
||||
m.PushSearch(mdb.TYPE, "plan", mdb.NAME, "", mdb.TEXT, web.MergeCmd(m, ""))
|
||||
m.PushSearch(mdb.TYPE, "plan", mdb.NAME, "", mdb.TEXT, chat.MergeCmd(m, ""))
|
||||
}
|
||||
}},
|
||||
ice.RUN: {Name: "run", Help: "执行", Hand: func(m *ice.Message, arg ...string) {
|
||||
|
@ -57,7 +57,7 @@ const TASK = "task"
|
||||
|
||||
func init() {
|
||||
Index.MergeCommands(ice.Commands{
|
||||
TASK: {Name: "task zone id auto insert export import", Help: "任务", Actions: ice.MergeAction(ice.Actions{
|
||||
TASK: {Name: "task zone id auto insert export import", Help: "任务", Actions: ice.MergeActions(ice.Actions{
|
||||
mdb.INSERT: {Name: "insert zone type=once,step,week name text begin_time@date close_time@date", Help: "添加", Hand: func(m *ice.Message, arg ...string) {
|
||||
m.Cmdy(mdb.INSERT, m.Prefix(TASK), "", mdb.HASH, m.OptionSimple(mdb.ZONE))
|
||||
m.Cmdy(mdb.INSERT, m.Prefix(TASK), "", mdb.ZONE, m.Option(mdb.ZONE),
|
||||
|
@ -11,7 +11,7 @@ const TODO = "todo"
|
||||
|
||||
func init() {
|
||||
Index.MergeCommands(ice.Commands{
|
||||
TODO: {Name: "todo hash list create export import", Help: "待办", Actions: ice.MergeAction(ice.Actions{
|
||||
TODO: {Name: "todo hash list create export import", Help: "待办", Actions: ice.MergeActions(ice.Actions{
|
||||
mdb.INPUTS: {Name: "inputs", Help: "补全", Hand: func(m *ice.Message, arg ...string) {
|
||||
m.Cmdy(mdb.INPUTS, m.PrefixKey(), "", mdb.HASH, arg)
|
||||
m.Cmdy(TASK, mdb.INPUTS, arg)
|
||||
|
@ -17,7 +17,7 @@ func init() {
|
||||
Index.Merge(&ice.Context{Configs: ice.Configs{
|
||||
DRAW: {Name: DRAW, Help: "思维导图", Value: kit.Data(lex.REGEXP, ".*\\.svg")},
|
||||
}, Commands: ice.Commands{
|
||||
DRAW: {Name: "draw path=src/main.svg pid refresh:button=auto save edit actions", Help: "思维导图", Meta: kit.Dict(ice.DisplayLocal("")), Actions: ice.MergeAction(ice.Actions{
|
||||
DRAW: {Name: "draw path=src/main.svg pid refresh:button=auto save edit actions", Help: "思维导图", Meta: kit.Dict(ice.DisplayLocal("")), Actions: ice.MergeActions(ice.Actions{
|
||||
ice.CTX_INIT: {Hand: func(m *ice.Message, arg ...string) {
|
||||
m.Cmd(mdb.RENDER, mdb.CREATE, mdb.TYPE, nfs.SVG, mdb.NAME, m.PrefixKey())
|
||||
}},
|
||||
|
@ -125,7 +125,7 @@ const FIELD = "field"
|
||||
|
||||
func init() {
|
||||
Index.Merge(&ice.Context{Commands: ice.Commands{
|
||||
FIELD: {Name: "field [name] cmd", Help: "插件", Actions: ice.MergeAction(ice.Actions{
|
||||
FIELD: {Name: "field [name] cmd", Help: "插件", Actions: ice.MergeActions(ice.Actions{
|
||||
ice.RUN: {Name: "run", Help: "执行"},
|
||||
}, ctx.CmdAction()), Hand: func(m *ice.Message, arg ...string) {
|
||||
if arg = _name(m, arg); strings.Contains(arg[1], ice.NL) {
|
||||
|
Some files were not shown because too many files have changed in this diff Show More
Loading…
x
Reference in New Issue
Block a user