1
0
mirror of https://shylinux.com/x/icebergs synced 2025-04-25 17:18:05 +08:00

opt render

This commit is contained in:
shaoying 2020-03-19 15:51:37 +08:00
parent d8451b0060
commit e749472a9e
15 changed files with 193 additions and 157 deletions

View File

@ -19,8 +19,8 @@ var Index = &ice.Context{Name: "cli", Help: "命令模块",
Configs: map[string]*ice.Config{
ice.CLI_RUNTIME: {Name: "runtime", Help: "运行环境", Value: kit.Dict()},
ice.CLI_SYSTEM: {Name: "system", Help: "系统命令", Value: kit.Data()},
"python": {Name: "python", Help: "系统命令", Value: kit.Data("python", "python", "pip", "pip")},
"daemon": {Name: "daemon", Help: "守护进程", Value: kit.Data(kit.MDB_SHORT, "name")},
"python": {Name: "python", Help: "系统命令", Value: kit.Data("python", "python", "pip", "pip")},
},
Commands: map[string]*ice.Command{
ice.ICE_INIT: {Hand: func(m *ice.Message, c *ice.Context, cmd string, arg ...string) {
@ -145,6 +145,10 @@ var Index = &ice.Context{Name: "cli", Help: "命令模块",
m.Cmdy(prefix, arg)
}
}},
"qrcode": {Name: "qrcode text", Help: "二", Hand: func(m *ice.Message, c *ice.Context, cmd string, arg ...string) {
m.Render(ice.RENDER_QRCODE, kit.Select("hello world", arg, 0))
}},
},
}

View File

@ -9,6 +9,7 @@ import (
"fmt"
"io"
"os"
"path"
"strconv"
"strings"
"time"
@ -23,6 +24,35 @@ type Frame struct {
exit bool
}
func Render(msg *ice.Message, cmd string, args ...interface{}) {
msg.Log(ice.LOG_EXPORT, "%s: %v", cmd, args)
switch arg := kit.Simple(args...); cmd {
case ice.RENDER_OUTPUT:
case ice.RENDER_DOWNLOAD:
os.Link(kit.Select(path.Base(arg[0]), arg, 2), arg[0])
case ice.RENDER_RESULT:
fmt.Fprintf(msg.O, msg.Result())
case ice.RENDER_QRCODE:
msg.Cmdy("cli.python", "qrcode", kit.Format(args[0], args[1:]...))
fallthrough
default:
// 转换结果
res := msg.Result()
if res == "" {
res = msg.Table().Result()
}
// 输出结果
if fmt.Fprintf(msg.O, res); !strings.HasSuffix(res, "\n") {
fmt.Fprintf(msg.O, "\n")
}
}
msg.Append(ice.MSG_OUTPUT, ice.RENDER_OUTPUT)
}
func (f *Frame) prompt(m *ice.Message) *Frame {
if f.out == os.Stdout {
for _, v := range kit.Simple(m.Optionv(ice.MSG_PROMPT)) {
@ -119,16 +149,10 @@ func (f *Frame) parse(m *ice.Message, line string) *Frame {
// 执行命令
msg.Cmdy(ln[0], ln[1:])
// 转换结果
res := msg.Result()
if res == "" {
res = msg.Table().Result()
}
// 渲染引擎
_args, _ := msg.Optionv(ice.MSG_ARGS).([]interface{})
Render(msg, msg.Option(ice.MSG_OUTPUT), _args...)
// 输出结果
if f.printf(msg, res); !strings.HasSuffix(res, "\n") {
f.printf(msg, "\n")
}
}
return f
}
@ -162,6 +186,7 @@ func (f *Frame) Start(m *ice.Message, arg ...string) bool {
m.Cap(ice.CTX_STREAM, arg[0])
}
}
m.I, m.O = f.in, f.out
line := ""
bio := bufio.NewScanner(f.in)

View File

@ -40,9 +40,10 @@ func Count(m *ice.Message, cmd, key, name string) int {
m.Conf(cmd, kit.Keys(key, name), count+1)
return count
}
func Render(msg *ice.Message, cmd string, args ...interface{}) *ice.Message {
func Render(msg *ice.Message, cmd string, args ...interface{}) {
msg.Log(ice.LOG_EXPORT, "%s: %v", cmd, args)
switch arg := kit.Simple(args...); cmd {
case ice.RENDER_OUTPUT:
case "redirect":
http.Redirect(msg.W, msg.R, kit.MergeURL(arg[0], arg[1:]), 307)
@ -56,27 +57,32 @@ func Render(msg *ice.Message, cmd string, args ...interface{}) *ice.Message {
msg.W.WriteHeader(kit.Int(kit.Select("200", arg, 0)))
msg.W.Write([]byte(kit.Select("", arg, 1)))
case "result":
msg.W.Write([]byte(kit.Format(arg[0], args[1:]...)))
case "cookie":
expire := time.Now().Add(kit.Duration(msg.Conf(ice.AAA_SESS, "meta.expire")))
http.SetCookie(msg.W, &http.Cookie{Value: arg[0], Name: kit.Select(ice.MSG_SESSID, arg, 1), Path: "/", Expires: expire})
case "qrcode":
case ice.RENDER_DOWNLOAD:
msg.W.Header().Set("Content-Disposition", fmt.Sprintf("filename=%s", kit.Select(path.Base(arg[0]), arg, 2)))
msg.W.Header().Set("Content-Type", kit.Select("text/html", arg, 1))
http.ServeFile(msg.W, msg.R, arg[0])
case ice.RENDER_RESULT:
if len(arg) > 0 {
msg.W.Write([]byte(kit.Format(arg[0], args[1:]...)))
} else {
msg.W.Write([]byte(msg.Result()))
}
case ice.RENDER_QRCODE:
if qr, e := qrcode.New(arg[0], qrcode.Medium); msg.Assert(e) {
msg.W.Header().Set("Content-Type", "image/png")
msg.Assert(qr.Write(256, msg.W))
}
case "download":
msg.W.Header().Set("Content-Disposition", fmt.Sprintf("filename=%s", kit.Select(path.Base(arg[0]), arg, 2)))
msg.W.Header().Set("Content-Type", kit.Select("text/html", arg, 1))
http.ServeFile(msg.W, msg.R, arg[0])
default:
msg.W.Write([]byte(kit.Format(cmd, args...)))
msg.W.Header().Set("Content-Type", "application/json")
fmt.Fprint(msg.W, msg.Formats("meta"))
}
msg.Append("_output", "render")
return msg
msg.Append(ice.MSG_OUTPUT, ice.RENDER_OUTPUT)
}
func IsLocalIP(msg *ice.Message, ip string) (ok bool) {
if ip == "::1" || strings.HasPrefix(ip, "127.") {
@ -301,14 +307,8 @@ func (web *Frame) HandleCmd(m *ice.Message, key string, cmd *ice.Command) {
msg.Target().Run(msg, cmd, msg.Option(ice.MSG_USERURL), cmds...)
// 渲染引擎
switch msg.Append("_output") {
case "render":
case "result":
fmt.Fprint(w, msg.Result())
default:
w.Header().Set("Content-Type", "application/json")
fmt.Fprint(w, msg.Formats("meta"))
}
_args, _ := msg.Optionv(ice.MSG_ARGS).([]interface{})
Render(msg, msg.Option(ice.MSG_OUTPUT), _args...)
})
})
}
@ -1778,7 +1778,7 @@ var Index = &ice.Context{Name: "web", Help: "网络模块",
m.Option("name", value["name"])
m.Option("text", value["text"])
m.Render(m.Conf(ice.WEB_SHARE, "meta.template.simple"))
m.Append("_output", "result")
m.Option(ice.MSG_OUTPUT, ice.RENDER_RESULT)
}
})
}},

20
conf.go
View File

@ -20,8 +20,10 @@ const ( // MSG
MSG_SOURCE = "_source"
MSG_TARGET = "_target"
MSG_ACTION = "_action"
MSG_HANDLE = "_handle"
MSG_ACTION = "_action"
MSG_OUTPUT = "_output"
MSG_ARGS = "_args"
MSG_STDOUT = "_stdout"
MSG_PROMPT = "_prompt"
@ -37,6 +39,7 @@ const ( // MSG
MSG_RIVER = "sess.river"
MSG_STORM = "sess.storm"
)
const ( // CTX
CTX_STATUS = "status"
CTX_STREAM = "stream"
@ -163,10 +166,6 @@ const ( // ROLE
ROLE_TECH = "tech"
ROLE_VOID = "void"
)
const ( // CHAT
CHAT_RIVER = "river"
CHAT_STORM = "storm"
)
const ( // TYPE
TYPE_SPIDE = "spide"
TYPE_SPACE = "space"
@ -184,6 +183,10 @@ const ( // TYPE
TYPE_INNER = "inner"
TYPE_MEDIA = "media"
)
const ( // CHAT
CHAT_RIVER = "river"
CHAT_STORM = "storm"
)
const ( // FAVOR
FAVOR_CHAT = "chat.init"
FAVOR_TMUX = "tmux.init"
@ -205,6 +208,13 @@ const ( // STORY
STORY_UPLOAD = "upload"
STORY_DOWNLOAD = "download"
)
const ( // RENDER
RENDER_OUTPUT = "_output"
RENDER_TEMPLATE = "_template"
RENDER_DOWNLOAD = "_download"
RENDER_RESULT = "_result"
RENDER_QRCODE = "_qrcode"
)
var Alias = map[string]string{
CTX_CONTEXT: "ctx.context",

View File

@ -153,7 +153,7 @@ var Index = &ice.Context{Name: "chat", Help: "聊天中心",
case "login":
// 密码登录
if len(arg) > 2 {
m.Option(ice.MSG_SESSID, web.Render(m, "cookie", m.Cmdx(ice.AAA_USER, "login", m.Option(ice.MSG_USERNAME, arg[1]), arg[2])))
web.Render(m, "cookie", m.Option(ice.MSG_SESSID, m.Cmdx(ice.AAA_USER, "login", m.Option(ice.MSG_USERNAME, arg[1]), arg[2])))
}
default:

View File

@ -102,6 +102,11 @@ var Index = &ice.Context{Name: "code", Help: "编程中心",
})
case "prune":
if len(arg) > 1 && arg[1] == "all" {
m.Conf("login", "hash", "")
break
}
list := []string{}
m.Richs("login", nil, "*", func(key string, value map[string]interface{}) {
if len(arg) > 1 && arg[1] == "all" || value["status"] == "logout" {

2
go.sum
View File

@ -2,8 +2,6 @@ github.com/gomarkdown/markdown v0.0.0-20200127000047-1813ea067497 h1:wJkj+x9gPYl
github.com/gomarkdown/markdown v0.0.0-20200127000047-1813ea067497/go.mod h1:aii0r/K0ZnHv7G0KF7xy1v0A7s2Ljrb5byB7MO5p6TU=
github.com/gorilla/websocket v1.4.1 h1:q7AeDBpnBk8AogcD4DSag/Ukw/KV+YhzLj2bP5HvKCM=
github.com/gorilla/websocket v1.4.1/go.mod h1:YR8l580nyteQvAITg2hZ9XVh4b55+EU/adAjf1fMHhE=
github.com/shylinux/toolkits v0.1.2 h1:yP24DXfcU5c7u3NVAxCGiMy5UMBRQH4gkKUZXOIN5fk=
github.com/shylinux/toolkits v0.1.2/go.mod h1:Y68Ot6xOmo1bun67YvqC3chDGeU2gDxtsUnvVDGJm4g=
github.com/shylinux/toolkits v0.1.3 h1:bqxmbPFBKkOpv9uEb4bbeeovowsiBK7zDrPrQMUDlSc=
github.com/shylinux/toolkits v0.1.3/go.mod h1:Y68Ot6xOmo1bun67YvqC3chDGeU2gDxtsUnvVDGJm4g=
github.com/skip2/go-qrcode v0.0.0-20191027152451-9434209cb086 h1:RYiqpb2ii2Z6J4x0wxK46kvPBbFuZcdhS+CIztmYgZs=

View File

@ -276,7 +276,7 @@ var Index = &ice.Context{Name: "lark", Help: "机器人",
switch parse(m); m.Option("msg.type") {
case "url_verification":
// 绑定验证
m.Append("_output", "result")
m.Option(ice.MSG_OUTPUT, ice.RENDER_RESULT)
m.Echo(kit.Format(map[string]interface{}{"challenge": m.Option("msg.challenge")}))
case "event_callback":

View File

@ -1 +1 @@
bind C-F command-prompt -p "send favor:" -I "tmux.auto" 'run-shell -b "curl $ctx_dev/code/tmux/favor?cmds=%%"'
bind C-F command-prompt -p "send favor:" -I "tmux.auto" 'run-shell -b "curl $ctx_dev/code/tmux/favor?cmds=`echo %%|sed \"s/ /%20/g\"`"'

View File

@ -15,8 +15,9 @@ import (
var Index = &ice.Context{Name: "tmux", Help: "工作台",
Caches: map[string]*ice.Cache{},
Configs: map[string]*ice.Config{
"prefix": {Name: "buffer", Help: "缓存", Value: kit.Data("cmd", []interface{}{ice.CLI_SYSTEM, "tmux"})},
"prefix": {Name: "prefix", Help: "前缀", Value: kit.Data("cmd", []interface{}{ice.CLI_SYSTEM, "tmux"})},
"buffer": {Name: "buffer", Help: "缓存", Value: kit.Data()},
"session": {Name: "session", Help: "会话", Value: kit.Data(
"format", "#{session_id},#{session_attached},#{session_name},#{session_windows},#{session_height},#{session_width}",
"fields", "id,tag,session,windows,height,width",
@ -29,11 +30,10 @@ var Index = &ice.Context{Name: "tmux", Help: "工作台",
"format", "#{pane_id},#{pane_active},#{pane_index},#{pane_tty},#{pane_height},#{pane_width}",
"fields", "id,tag,pane,tty,height,width",
)},
"view": {Name: "pane", Help: "终端", Value: kit.Data(
"format", "#{pane_id},#{pane_active},#{pane_index},#{pane_tty},#{pane_height},#{pane_width}",
"fields", "id,tag,pane,tty,height,width",
)},
"relay": {Name: "relay", Help: "跳板", Value: kit.Data(kit.MDB_SHORT, kit.MDB_NAME,
"view": {Name: "pane", Help: "终端", Value: kit.Data()},
"local": {Name: "local", Help: "虚拟机", Value: kit.Data(kit.MDB_SHORT, kit.MDB_NAME)},
"relay": {Name: "relay", Help: "跳板机", Value: kit.Data(kit.MDB_SHORT, kit.MDB_NAME,
"count", 100, "sleep", "100ms", "tail", kit.Dict(
"verify", "Verification code:",
"password", "Password:",
@ -99,7 +99,7 @@ var Index = &ice.Context{Name: "tmux", Help: "工作台",
m.Cmd(ice.WEB_FAVOR, kit.Select("tmux.auto", arg, 1)).Table(func(index int, value map[string]string, head []string) {
switch value["type"] {
case "shell":
case ice.TYPE_SHELL:
// 发送命令
m.Cmdy(prefix, "send-keys", "-t", arg[0], value["text"], "Enter")
time.Sleep(10 * time.Millisecond)
@ -112,7 +112,7 @@ var Index = &ice.Context{Name: "tmux", Help: "工作台",
}
}},
"text": {Name: "text", Help: "文本", List: kit.List(
"text": {Name: "text", Help: "文本", Meta: kit.Dict("remote", "pod"), List: kit.List(
kit.MDB_INPUT, "text", "name", "name",
kit.MDB_INPUT, "button", "value", "保存",
kit.MDB_INPUT, "textarea", "name", "text",
@ -121,11 +121,9 @@ var Index = &ice.Context{Name: "tmux", Help: "工作台",
if len(arg) > 1 && arg[1] != "" {
m.Cmd(prefix, "set-buffer", arg[1])
}
m.Cmdy(prefix, "show-buffer").Set("append")
m.Cmdy(prefix, "show-buffer").Set(ice.MSG_APPEND)
}},
"buffer": {Name: "buffer", Help: "缓存", Meta: kit.Dict(
"remote", "pod",
), List: kit.List(
"buffer": {Name: "buffer", Help: "缓存", Meta: kit.Dict("remote", "pod"), List: kit.List(
kit.MDB_INPUT, "text", "name", "buffer", "action", "auto",
kit.MDB_INPUT, "text", "name", "value",
kit.MDB_INPUT, "button", "value", "查看", "action", "auto",
@ -139,7 +137,7 @@ var Index = &ice.Context{Name: "tmux", Help: "工作台",
if len(arg) > 0 {
// 查看缓存
m.Cmdy(prefix, "show-buffer", "-b", arg[0]).Set("append")
m.Cmdy(prefix, "show-buffer", "-b", arg[0]).Set(ice.MSG_APPEND)
return
}
@ -155,7 +153,7 @@ var Index = &ice.Context{Name: "tmux", Help: "工作台",
}
}
}},
"session": {Name: "session", Help: "会话", Meta: kit.Dict("detail", []string{"选择", "运行", "编辑", "删除", "下载"}), List: kit.List(
"session": {Name: "session [session [window [pane [cmd]]]]", Help: "会话", Meta: kit.Dict("detail", []string{"选择", "编辑", "删除", "下载"}), List: kit.List(
kit.MDB_INPUT, "text", "name", "session", "action", "auto",
kit.MDB_INPUT, "text", "name", "window", "action", "auto",
kit.MDB_INPUT, "text", "name", "pane", "action", "auto",
@ -166,68 +164,51 @@ var Index = &ice.Context{Name: "tmux", Help: "工作台",
if len(arg) > 1 && arg[0] == "action" {
switch arg[1] {
case "运行":
target := ""
switch arg[2] {
case "session":
target = arg[3]
}
m.Cmd("auto", target, m.Option("hot"))
arg = arg[:0]
case "select":
case "select", "选择":
if arg[2] == "session" {
// 选择会话
m.Cmd(prefix, "switch-client", "-t", arg[3])
arg = arg[:0]
break
}
if m.Cmd(prefix, "switch-client", "-t", m.Option("session")); arg[2] == "window" {
// 选择窗口
m.Cmd(prefix, "select-window", "-t", m.Option("session")+":"+arg[3])
arg = []string{m.Option("session")}
break
}
if m.Cmd(prefix, "select-window", "-t", m.Option("session")+":"+m.Option("window")); arg[2] == "pane" {
// 选择终端
m.Cmd(prefix, "select-pane", "-t", m.Option("session")+":"+m.Option("window")+"."+arg[3])
arg = []string{m.Option("session"), m.Option("window")}
}
case "modify":
case "modify", "编辑":
switch arg[2] {
case "session":
// 重命名会话
m.Cmd(prefix, "rename-session", "-t", arg[4], arg[3])
arg = arg[:0]
case "window":
// 重命名窗口
m.Cmd(prefix, "rename-window", "-t", m.Option("session")+":"+arg[4], arg[3])
arg = []string{m.Option("session")}
}
case "delete":
case "delete", "删除":
switch arg[2] {
case "session":
// 删除会话
m.Cmd(prefix, "kill-session", "-t", arg[3])
arg = arg[:0]
case "window":
// 删除窗口
m.Cmd(prefix, "kill-window", "-t", m.Option("session")+":"+arg[3])
arg = []string{m.Option("session")}
case "pane":
// 删除终端
m.Cmd(prefix, "kill-pane", "-t", m.Option("session")+":"+m.Option("window")+"."+arg[3])
arg = []string{m.Option("session"), m.Option("window")}
}
}
return
}
if len(arg) == 0 {
// 会话列表
m.Split(m.Cmdx(prefix, "list-session",
"-F", m.Conf(cmd, "meta.format")), m.Conf(cmd, "meta.fields"), ",", "\n")
m.Split(m.Cmdx(prefix, "list-session", "-F", m.Conf(cmd, "meta.format")), m.Conf(cmd, "meta.fields"), ",", "\n")
return
}
@ -237,8 +218,7 @@ var Index = &ice.Context{Name: "tmux", Help: "工作台",
m.Option("cmd_env", "TMUX", "")
m.Option("cmd_dir", m.Conf(ice.WEB_DREAM, "meta.path"))
m.Cmd(prefix, "new-session", "-ds", arg[0])
m.Cmd("auto", arg[0], arg[1:])
arg = arg[:1]
m.Cmd("auto", arg[0])
}
if len(arg) == 1 {
@ -280,15 +260,15 @@ var Index = &ice.Context{Name: "tmux", Help: "工作台",
}},
"view": {Name: "view", Help: "终端", Hand: func(m *ice.Message, c *ice.Context, cmd string, arg ...string) {
prefix := kit.Simple(m.Confv("prefix", "meta.cmd"))
m.Cmdy(prefix, "capture-pane", "-pt", kit.Select("", arg, 0)).Set("append")
m.Cmdy(prefix, "capture-pane", "-pt", kit.Select("", arg, 0)).Set(ice.MSG_APPEND)
}},
"local": {Name: "local which target", Help: "虚拟机", Hand: func(m *ice.Message, c *ice.Context, cmd string, arg ...string) {
"local": {Name: "local name name", Help: "虚拟机", Hand: func(m *ice.Message, c *ice.Context, cmd string, arg ...string) {
prefix := kit.Simple(m.Confv("prefix", "meta.cmd"))
m.Cmd("web.code.docker.auto", arg[1])
m.Cmdy(prefix, "send-keys", "-t", arg[1], "docker exec -it ", arg[1], " bash", "Enter")
}},
"relay": {Name: "relay which target", Help: "跳板机", Hand: func(m *ice.Message, c *ice.Context, cmd string, arg ...string) {
"relay": {Name: "relay [name [favor]]", Help: "跳板机", Hand: func(m *ice.Message, c *ice.Context, cmd string, arg ...string) {
prefix := kit.Simple(m.Confv("prefix", "meta.cmd"))
if len(arg) == 0 {
// 认证列表
@ -304,10 +284,10 @@ var Index = &ice.Context{Name: "tmux", Help: "工作台",
})
return
}
if len(arg) > 4 {
// 添加认证
m.Rich(cmd, nil, kit.Dict(
kit.MDB_NAME, arg[0], kit.MDB_TEXT, arg[1],
m.Rich(cmd, nil, kit.Dict(kit.MDB_NAME, arg[0], kit.MDB_TEXT, arg[1],
"username", arg[2], "website", arg[3], "password", arg[4],
))
return
@ -335,18 +315,22 @@ var Index = &ice.Context{Name: "tmux", Help: "工作台",
}
})
}},
"/favor": {Name: "/favor", Help: "收藏", Hand: func(m *ice.Message, c *ice.Context, cmd string, arg ...string) {
current := ""
m.Cmd("session").Table(func(index int, value map[string]string, head []string) {
if value["tag"] == "1" {
// 当前会话
current = value["session"]
}
})
m.Option(ice.MSG_OUTPUT, ice.RENDER_RESULT)
switch arg = kit.Split(kit.Select("tmux.auto", arg, 0)); arg[0] {
case "ice":
if m.Cmdy(arg[1:]); len(m.Resultv()) == 0 {
m.Table()
}
default:
m.Append("_output", "result")
m.Cmd("auto", current, arg)
}
}},

View File

@ -43,15 +43,11 @@ func get(key string) string {
var Index = &ice.Context{Name: "totp", Help: "动态码",
Caches: map[string]*ice.Cache{},
Configs: map[string]*ice.Config{
"totp": {Name: "totp", Help: "动态码", Value: kit.Data(kit.MDB_SHORT, "name")},
"totp": {Name: "totp", Help: "动态码", Value: kit.Data(kit.MDB_SHORT, "name", "share", "otpauth://totp/%s?secret=%s")},
},
Commands: map[string]*ice.Command{
ice.ICE_INIT: {Hand: func(m *ice.Message, c *ice.Context, cmd string, arg ...string) {
m.Load()
}},
ice.ICE_EXIT: {Hand: func(m *ice.Message, c *ice.Context, cmd string, arg ...string) {
m.Save("totp")
}},
ice.ICE_INIT: {Hand: func(m *ice.Message, c *ice.Context, cmd string, arg ...string) {}},
ice.ICE_EXIT: {Hand: func(m *ice.Message, c *ice.Context, cmd string, arg ...string) {}},
"new": {Name: "new user [secret]", Help: "创建密钥", Hand: func(m *ice.Message, c *ice.Context, cmd string, arg ...string) {
if len(arg) == 0 {
@ -64,7 +60,11 @@ var Index = &ice.Context{Name: "totp", Help: "动态码",
if m.Richs("totp", nil, arg[0], func(key string, value map[string]interface{}) {
// 密钥详情
m.Push("detail", value)
if len(arg) > 1 {
m.Render(ice.RENDER_QRCODE, kit.Format(m.Conf("totp", "meta.share"), value["name"], value["text"]))
} else {
m.Push("detail", value)
}
}) != nil {
return
}
@ -80,7 +80,7 @@ var Index = &ice.Context{Name: "totp", Help: "动态码",
)))
// 创建共享
defer m.Cmdy(ice.WEB_SHARE, "optauth", arg[0], kit.Format("otpauth://totp/%s?secret=%s", arg[0], arg[1]))
defer m.Cmdy(ice.WEB_SHARE, "optauth", arg[0], kit.Format(m.Conf("totp", "meta.share"), arg[0], arg[1]))
}},
"get": {Name: "get user [secret]", Help: "获取密码", Hand: func(m *ice.Message, c *ice.Context, cmd string, arg ...string) {
if len(arg) == 0 {

View File

@ -32,7 +32,7 @@ var Index = &ice.Context{Name: "vim", Help: "编辑器",
})
m.Info("%s %s cmd: %v sub: %v", m.Option("you"), m.Option(ice.MSG_USERURL), m.Optionv("cmds"), m.Optionv("sub"))
m.Append("_output", "result")
m.Option(ice.MSG_OUTPUT, ice.RENDER_RESULT)
}},
"/help": {Name: "/help", Help: "帮助", Hand: func(m *ice.Message, c *ice.Context, cmd string, arg ...string) {
m.Cmdy("help")

View File

@ -32,11 +32,11 @@ func parse(m *ice.Message) {
}
func reply(m *ice.Message) {
m.Append("_output", "result")
m.Option(ice.MSG_OUTPUT, ice.RENDER_RESULT)
m.Render(m.Conf("login", "meta.template.text"))
}
func action(m *ice.Message) {
m.Append("_output", "result")
m.Option(ice.MSG_OUTPUT, ice.RENDER_RESULT)
m.Echo(`<xml>
<ToUserName><![CDATA[%s]]></ToUserName>

View File

@ -33,7 +33,7 @@ var Index = &ice.Context{Name: "zsh", Help: "命令行",
})
m.Info("%s %s cmd: %v sub: %v", m.Option("you"), m.Option(ice.MSG_USERURL), m.Optionv("cmds"), m.Optionv("sub"))
m.Append("_output", "result")
m.Option(ice.MSG_OUTPUT, ice.RENDER_RESULT)
}},
"/help": {Name: "/help", Help: "帮助", Hand: func(m *ice.Message, c *ice.Context, cmd string, arg ...string) {
@ -197,7 +197,7 @@ var Index = &ice.Context{Name: "zsh", Help: "命令行",
}
// 下载文件
web.Render(m, "download", kit.Select("file", "result", m.Append("file") == ""))
m.Render(kit.Select(ice.RENDER_DOWNLOAD, ice.RENDER_RESULT, m.Append("file") == ""), m.Append("text"))
}},
"/upload": {Name: "/upload", Help: "上传", Hand: func(m *ice.Message, c *ice.Context, cmd string, arg ...string) {
// 缓存文件

124
type.go
View File

@ -179,10 +179,13 @@ type Message struct {
source *Context
target *Context
frames interface{}
cb func(*Message) *Message
W http.ResponseWriter
R *http.Request
O io.Writer
I io.Reader
wait chan bool
}
@ -317,19 +320,18 @@ func (m *Message) Spawns(arg ...interface{}) *Message {
}
func (m *Message) Spawn(arg ...interface{}) *Message {
msg := &Message{
time: time.Now(),
code: -1,
code: -1, time: time.Now(),
meta: map[string][]string{},
data: map[string]interface{}{},
message: m,
root: m.root,
message: m, root: m.root,
source: m.target,
target: m.target,
R: m.R,
W: m.W,
W: m.W, R: m.R,
O: m.O, I: m.I,
}
if len(arg) > 0 {
@ -451,7 +453,11 @@ func (m *Message) Copy(msg *Message, arg ...string) *Message {
if kit.IndexOf(m.meta[MSG_OPTION], k) == -1 {
m.meta[MSG_OPTION] = append(m.meta[MSG_OPTION], k)
}
m.meta[k] = append(m.meta[k], msg.meta[k]...)
if _, ok := msg.meta[k]; ok {
m.meta[k] = msg.meta[k]
} else {
m.data[k] = msg.data[k]
}
}
// 复制数据
@ -619,16 +625,20 @@ func (m *Message) Table(cbs ...interface{}) *Message {
}
return m
}
func (m *Message) Render(str string, arg ...interface{}) *Message {
if len(arg) == 0 {
arg = append(arg, m)
func (m *Message) Render(cmd string, args ...interface{}) *Message {
m.Log(LOG_EXPORT, "%s: %v", cmd, args)
m.Optionv(MSG_OUTPUT, cmd)
m.Optionv(MSG_ARGS, args)
switch cmd {
case RENDER_TEMPLATE:
if len(args) == 0 {
args = append(args, m)
}
if res, err := kit.Render(cmd, args[0]); m.Assert(err) {
m.Echo(string(res))
}
}
if res, err := kit.Render(str, arg[0]); m.Assert(err) {
m.Echo(string(res))
}
return m
}
func (m *Message) Qrcode(str string, arg ...interface{}) *Message {
return m
}
func (m *Message) Parse(meta string, key string, arg ...string) *Message {
@ -948,15 +958,15 @@ func (m *Message) Starts(name string, help string, arg ...string) *Message {
return m
}
func (m *Message) Right(arg ...interface{}) bool {
return m.Option(MSG_USERROLE) == ROLE_ROOT || !m.Warn(m.Cmdx(AAA_ROLE, "right", m.Option(MSG_USERROLE), kit.Keys(arg...)) != "ok", "no right")
}
func (m *Message) Space(arg interface{}) []string {
if arg == nil || kit.Format(arg) == m.Conf(CLI_RUNTIME, "node.name") {
return nil
}
return []string{WEB_SPACE, kit.Format(arg)}
}
func (m *Message) Right(arg ...interface{}) bool {
return m.Option(MSG_USERROLE) == ROLE_ROOT || !m.Warn(m.Cmdx(AAA_ROLE, "right", m.Option(MSG_USERROLE), kit.Keys(arg...)) != "ok", "no right")
}
func (m *Message) Event(key string, arg ...string) *Message {
m.Cmd(GDB_EVENT, "action", key, arg)
return m
@ -966,44 +976,6 @@ func (m *Message) Watch(key string, arg ...string) *Message {
return m
}
func (m *Message) Preview(arg string) (res string) {
list := kit.Split(arg)
m.Search(list[0], func(p *Context, s *Context, key string, cmd *Command) {
res = kit.Format(kit.Dict("feature", cmd.Meta, "inputs", cmd.List))
})
return res
}
func (m *Message) Prefile(favor string, id string) map[string]string {
res := map[string]string{}
m.Option("render", "")
m.Option("_action", "")
m.Cmd(WEB_FAVOR, kit.Select(m.Option("favor"), favor), id).Table(func(index int, value map[string]string, head []string) {
res[value["key"]] = value["value"]
})
res["content"] = m.Cmdx(CLI_SYSTEM, "sed", "-n", kit.Format("%d,%dp", kit.Int(res["extra.row"]), kit.Int(res["extra.row"])+3), res["extra.buf"])
return res
}
func (m *Message) Prefix(arg ...string) string {
return kit.Keys(m.Cap(CTX_FOLLOW), arg)
}
func (m *Message) Save(arg ...string) *Message {
list := []string{}
for _, k := range arg {
list = append(list, kit.Keys(m.Cap(CTX_FOLLOW), k))
}
m.Cmd(CTX_CONFIG, "save", kit.Keys(m.Cap(CTX_FOLLOW), "json"), list)
return m
}
func (m *Message) Load(arg ...string) *Message {
list := []string{}
for _, k := range arg {
list = append(list, kit.Keys(m.Cap(CTX_FOLLOW), k))
}
m.Cmd(CTX_CONFIG, "load", kit.Keys(m.Cap(CTX_FOLLOW), "json"), list)
return m
}
func (m *Message) Travel(cb interface{}) *Message {
list := []*Context{m.target}
for i := 0; i < len(list); i++ {
@ -1117,6 +1089,44 @@ func (m *Message) Search(key interface{}, cb interface{}) *Message {
}
return m
}
func (m *Message) Preview(arg string) (res string) {
list := kit.Split(arg)
m.Search(list[0], func(p *Context, s *Context, key string, cmd *Command) {
res = kit.Format(kit.Dict("feature", cmd.Meta, "inputs", cmd.List))
})
return res
}
func (m *Message) Prefile(favor string, id string) map[string]string {
res := map[string]string{}
m.Option("render", "")
m.Option("_action", "")
m.Cmd(WEB_FAVOR, kit.Select(m.Option("favor"), favor), id).Table(func(index int, value map[string]string, head []string) {
res[value["key"]] = value["value"]
})
res["content"] = m.Cmdx(CLI_SYSTEM, "sed", "-n", kit.Format("%d,%dp", kit.Int(res["extra.row"]), kit.Int(res["extra.row"])+3), res["extra.buf"])
return res
}
func (m *Message) Prefix(arg ...string) string {
return kit.Keys(m.Cap(CTX_FOLLOW), arg)
}
func (m *Message) Save(arg ...string) *Message {
list := []string{}
for _, k := range arg {
list = append(list, kit.Keys(m.Cap(CTX_FOLLOW), k))
}
m.Cmd(CTX_CONFIG, "save", kit.Keys(m.Cap(CTX_FOLLOW), "json"), list)
return m
}
func (m *Message) Load(arg ...string) *Message {
list := []string{}
for _, k := range arg {
list = append(list, kit.Keys(m.Cap(CTX_FOLLOW), k))
}
m.Cmd(CTX_CONFIG, "load", kit.Keys(m.Cap(CTX_FOLLOW), "json"), list)
return m
}
func (m *Message) Richs(key string, chain interface{}, raw interface{}, cb interface{}) (res map[string]interface{}) {
// 数据结构