mirror of
https://shylinux.com/x/icebergs
synced 2025-04-26 01:24:05 +08:00
opt some
This commit is contained in:
parent
0c6bb3d2c2
commit
25e0f9b050
@ -2,13 +2,11 @@ package cli
|
||||
|
||||
import (
|
||||
"os"
|
||||
"os/user"
|
||||
"path"
|
||||
"runtime"
|
||||
"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"
|
||||
@ -47,13 +45,8 @@ func _runtime_init(m *ice.Message) {
|
||||
name = kit.Slice(strings.Split(name, "\\"), -1)[0]
|
||||
m.Conf(RUNTIME, kit.Keys(BOOT, PATHNAME), name)
|
||||
}
|
||||
if m.Conf(RUNTIME, kit.Keys(BOOT, USERNAME), kit.Select(kit.Env(USER), kit.Env(CTX_USER))) == "" {
|
||||
if user, e := user.Current(); e == nil && user.Name != "" {
|
||||
m.Conf(RUNTIME, kit.Keys(BOOT, USERNAME), kit.Select(user.Name, kit.Env(CTX_USER)))
|
||||
} else {
|
||||
m.Conf(RUNTIME, kit.Keys(BOOT, USERNAME), aaa.ROOT)
|
||||
}
|
||||
}
|
||||
|
||||
m.Conf(RUNTIME, kit.Keys(BOOT, USERNAME), kit.Select(kit.UserName(), kit.Env(CTX_USER)))
|
||||
ice.Info.HostName = m.Conf(RUNTIME, kit.Keys(BOOT, HOSTNAME))
|
||||
ice.Info.PathName = m.Conf(RUNTIME, kit.Keys(BOOT, PATHNAME))
|
||||
ice.Info.UserName = m.Conf(RUNTIME, kit.Keys(BOOT, USERNAME))
|
||||
|
@ -84,7 +84,9 @@ func init() {
|
||||
m.Cmd(mdb.SEARCH, mdb.CREATE, m.CommandKey(), m.PrefixKey())
|
||||
}},
|
||||
mdb.SEARCH: {Name: "search type name text", Help: "搜索", Hand: func(m *ice.Message, arg ...string) {
|
||||
_command_search(m, arg[0], kit.Select("", arg, 1), kit.Select("", arg, 2))
|
||||
if arg[0] == m.CommandKey() || len(arg) > 1 && arg[1] != "" {
|
||||
_command_search(m, arg[0], kit.Select("", arg, 1), kit.Select("", arg, 2))
|
||||
}
|
||||
}},
|
||||
INDEX: {Name: "index", Help: "索引", Hand: func(m *ice.Message, arg ...string) {
|
||||
}},
|
||||
|
@ -132,6 +132,7 @@ func init() {
|
||||
return
|
||||
}
|
||||
_config_make(m, arg[0], arg[1:]...)
|
||||
m.DisplayStoryJSON()
|
||||
}},
|
||||
}})
|
||||
}
|
||||
|
@ -19,7 +19,7 @@ func init() {
|
||||
}},
|
||||
}, Hand: func(m *ice.Message, c *ice.Context, cmd string, arg ...string) {
|
||||
if len(arg) > 1 {
|
||||
m.Cmdy(SELECT, m.PrefixKey(), "", HASH, m.Config(SHORT), arg, func(value map[string]interface{}) {
|
||||
m.Cmdy(SELECT, m.PrefixKey(), "", HASH, m.Config(SHORT), kit.Slice(arg, 0, 1), func(value map[string]interface{}) {
|
||||
m.OptionFields(kit.Select("ctx,cmd,type,name,text", kit.Select(m.OptionFields())))
|
||||
m.Cmdy(kit.Keys(value[TEXT], value[NAME]), m.CommandKey(), arg[0], arg[1], kit.Select("", arg, 2), kit.Slice(arg, 3))
|
||||
})
|
||||
|
@ -200,12 +200,18 @@ func ZoneAction(args ...interface{}) map[string]*ice.Action {
|
||||
})
|
||||
}
|
||||
func ZoneSelect(m *ice.Message, arg ...string) *ice.Message {
|
||||
arg = kit.Slice(arg, 0, 2)
|
||||
m.Fields(len(arg), kit.Fields(TIME, m.Config(SHORT), COUNT), m.Config(FIELD))
|
||||
if m.Cmdy(SELECT, m.PrefixKey(), "", ZONE, arg); kit.Select("", arg, 0) == "" {
|
||||
m.Sort(m.Config(SHORT))
|
||||
m.PushAction(REMOVE)
|
||||
}
|
||||
m.StatusTimeCount()
|
||||
if len(arg) == 0 {
|
||||
m.StatusTimeCount()
|
||||
}
|
||||
if len(arg) == 1 {
|
||||
m.StatusTimeCountTotal(m.Conf(m.PrefixKey(), kit.Keys(HASH, kit.Hashs(arg[0]), kit.Keym("count"))))
|
||||
}
|
||||
return m
|
||||
}
|
||||
func ZoneSelectAll(m *ice.Message, arg ...string) *ice.Message {
|
||||
|
@ -6,8 +6,10 @@ import (
|
||||
|
||||
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,6 +24,9 @@ func init() {
|
||||
AUTOGEN: {Name: "create main=src/main.go zone name=hi help type=Zone,Hash,Lists,Data,Code list key", Help: "模块", Hand: func(m *ice.Message, arg ...string) {
|
||||
m.Cmdy(AUTOGEN, mdb.CREATE, arg)
|
||||
}},
|
||||
web.DREAM: {Name: "dream name repos", Help: "空间", Hand: func(m *ice.Message, arg ...string) {
|
||||
m.Cmdy(web.DREAM, cli.START, arg)
|
||||
}},
|
||||
"script": {Name: "script file=hi/hi.js text=", Help: "脚本", Hand: func(m *ice.Message, arg ...string) {
|
||||
m.Option(mdb.TEXT, strings.TrimSpace(m.Option(mdb.TEXT)))
|
||||
m.Cmdy(TEMPLATE, nfs.DEFS)
|
||||
@ -31,6 +36,13 @@ func init() {
|
||||
m.Option(mdb.TEXT, strings.TrimSpace(m.Option(mdb.TEXT)))
|
||||
m.Cmdy(TEMPLATE, nfs.DEFS)
|
||||
}},
|
||||
mdb.INPUTS: {Name: "inputs", Help: "补全", Hand: func(m *ice.Message, arg ...string) {
|
||||
switch m.Option(ctx.ACTION) {
|
||||
case web.DREAM:
|
||||
m.Cmdy(web.DREAM, mdb.INPUTS, arg)
|
||||
}
|
||||
}},
|
||||
|
||||
COMPILE: {Name: "compile", Help: "编译", Hand: func(m *ice.Message, arg ...string) {
|
||||
if msg := m.Cmd(COMPILE, ice.SRC_MAIN_GO, ice.BIN_ICE_BIN); !cli.IsSuccess(msg) {
|
||||
_inner_make(m, msg)
|
||||
|
@ -32,7 +32,7 @@ func init() {
|
||||
}},
|
||||
}, Configs: map[string]*ice.Config{
|
||||
REFER: {Name: REFER, Help: "参考", Value: kit.Data(
|
||||
nfs.TEMPLATE, `<ul {{.OptionTemplate}}>{{range $index, $value := .Optionv "list"}}<li>{{index $value 0}}: <a href="{{index $value 1}}" target="_blank">{{index $value 1}}</a></li>{{end}}</ul>`,
|
||||
nfs.TEMPLATE, `<ul {{.OptionTemplate}}>{{range $index, $value := .Optionv "list"}}<li>{{index $value 0}}: <a href="{{index $value 1}}" data-name="{{index $value 0}}" target="_blank">{{index $value 1}}</a></li>{{end}}</ul>`,
|
||||
)},
|
||||
}})
|
||||
}
|
||||
|
@ -33,11 +33,38 @@ func init() {
|
||||
LABEL, kit.List(CHART, LABEL),
|
||||
CHAIN, kit.List(CHART, CHAIN),
|
||||
),
|
||||
mdb.SHORT, "type,name,text",
|
||||
mdb.FIELD, "time,hash,type,name,text",
|
||||
)},
|
||||
}, Commands: map[string]*ice.Command{
|
||||
WORD: {Name: "word path=src/main.shy@key auto play", Help: "语言文字", Meta: kit.Dict(
|
||||
ice.DisplayLocal(""),
|
||||
), Action: ice.MergeAction(map[string]*ice.Action{
|
||||
WORD: {Name: "word path=src/main.shy@key auto play", Help: "语言文字", Meta: kit.Dict(ice.DisplayLocal("")), Action: ice.MergeAction(map[string]*ice.Action{
|
||||
ice.CTX_INIT: {Hand: func(m *ice.Message, arg ...string) {
|
||||
m.Cmd(mdb.SEARCH, mdb.CREATE, m.CommandKey(), m.PrefixKey())
|
||||
}},
|
||||
mdb.SEARCH: {Name: "search", Help: "搜索", Hand: func(m *ice.Message, arg ...string) {
|
||||
m.Cmd(mdb.SELECT, m.PrefixKey(), "", mdb.HASH).Table(func(index int, value map[string]string, head []string) {
|
||||
if arg[1] == "" {
|
||||
if value[mdb.TYPE] == SPARK {
|
||||
value[mdb.TEXT] = ice.Render(m, ice.RENDER_SCRIPT, value[mdb.TEXT])
|
||||
}
|
||||
m.PushSearch(value)
|
||||
}
|
||||
})
|
||||
}},
|
||||
mdb.CREATE: {Name: "create", Help: "创建", Hand: func(m *ice.Message, arg ...string) {
|
||||
m.Cmd(mdb.INSERT, m.PrefixKey(), "", mdb.HASH, arg)
|
||||
}},
|
||||
"recent": {Name: "recent", Help: "最近", Hand: func(m *ice.Message, arg ...string) {
|
||||
m.OptionFields(m.Config(mdb.FIELD))
|
||||
m.Cmd(mdb.SELECT, m.PrefixKey(), "", mdb.HASH).Table(func(index int, value map[string]string, head []string) {
|
||||
if value[mdb.TYPE] == "spark" {
|
||||
value[mdb.TEXT] = ice.Render(m, ice.RENDER_SCRIPT, value[mdb.TEXT])
|
||||
}
|
||||
m.Push("", value, head)
|
||||
})
|
||||
m.PushAction(mdb.REMOVE)
|
||||
}},
|
||||
|
||||
mdb.INPUTS: {Name: "inputs", Help: "补全", Hand: func(m *ice.Message, arg ...string) {
|
||||
m.Cmdy(nfs.DIR, "src/", kit.Dict(nfs.DIR_DEEP, ice.TRUE, nfs.DIR_REG, ".*\\.shy"), nfs.DIR_CLI_FIELDS)
|
||||
m.Cmdy(nfs.DIR, "src/help/", kit.Dict(nfs.DIR_DEEP, ice.TRUE, nfs.DIR_REG, ".*\\.shy"), nfs.DIR_CLI_FIELDS)
|
||||
@ -46,7 +73,7 @@ func init() {
|
||||
m.Cmdy(arg[0], ctx.ACTION, ice.RUN, arg[2:])
|
||||
}},
|
||||
ice.PLAY: {Name: "play", Help: "演示"},
|
||||
}, ctx.CmdAction()), Hand: func(m *ice.Message, c *ice.Context, cmd string, arg ...string) {
|
||||
}, ctx.CmdAction(), mdb.HashAction()), Hand: func(m *ice.Message, c *ice.Context, cmd string, arg ...string) {
|
||||
m.Option(nfs.DIR_REG, m.Config(lex.REGEXP))
|
||||
if m.Option(nfs.DIR_DEEP, ice.TRUE); !_wiki_list(m, cmd, arg...) {
|
||||
_word_show(m, arg[0])
|
||||
|
3
meta.go
3
meta.go
@ -318,7 +318,8 @@ func (m *Message) Table(cbs ...func(index int, value map[string]string, head []s
|
||||
return m
|
||||
}
|
||||
|
||||
for i := 0; i < m.Length(); i++ {
|
||||
n := m.Length()
|
||||
for i := 0; i < n; i++ {
|
||||
line := map[string]string{}
|
||||
for _, k := range m.meta[MSG_APPEND] {
|
||||
line[k] = kit.Select("", m.meta[k], i)
|
||||
|
@ -156,61 +156,59 @@ const CONNECT = "connect"
|
||||
|
||||
func init() {
|
||||
psh.Index.Merge(&ice.Context{Configs: map[string]*ice.Config{
|
||||
CONNECT: {Name: CONNECT, Help: "连接", Value: kit.Data(
|
||||
mdb.FIELD, "time,hash,status,username,host,port",
|
||||
)},
|
||||
CONNECT: {Name: CONNECT, Help: "连接", Value: kit.Data(mdb.SHORT, "name", mdb.FIELD, "time,name,status,username,host,port")},
|
||||
}, Commands: map[string]*ice.Command{
|
||||
CONNECT: {Name: "connect hash auto", Help: "连接", Action: ice.MergeAction(map[string]*ice.Action{
|
||||
ice.CTX_INIT: {Hand: func(m *ice.Message, arg ...string) {
|
||||
m.Richs(CONNECT, "", mdb.FOREACH, func(key string, value map[string]interface{}) {
|
||||
if value = kit.GetMeta(value); kit.Value(value, mdb.STATUS) == tcp.OPEN {
|
||||
m.Cmd(CONNECT, tcp.DIAL, aaa.USERNAME, value[aaa.USERNAME], mdb.HASH, key, value)
|
||||
}
|
||||
})
|
||||
}},
|
||||
CONNECT: {Name: "connect name auto", Help: "连接", Action: ice.MergeAction(map[string]*ice.Action{
|
||||
tcp.OPEN: {Name: "open authfile username=shy password verfiy host=shylinux.com port=22 private=.ssh/id_rsa", Help: "终端", Hand: func(m *ice.Message, arg ...string) {
|
||||
aaa.UserRoot(m)
|
||||
_ssh_open(m.OptionLoad(m.Option("authfile")), arg...)
|
||||
m.Echo("exit %v@%v:%v\n", m.Option(aaa.USERNAME), m.Option(tcp.HOST), m.Option(tcp.PORT))
|
||||
}},
|
||||
tcp.DIAL: {Name: "dial username=shy host=shylinux.com port=22 private=.ssh/id_rsa", Help: "添加", Hand: func(m *ice.Message, arg ...string) {
|
||||
tcp.DIAL: {Name: "dial name=shylinux username=shy host=shylinux.com port=22 private=.ssh/id_rsa", Help: "添加", Hand: func(m *ice.Message, arg ...string) {
|
||||
m.Go(func() {
|
||||
_ssh_conn(m, func(client *ssh.Client) {
|
||||
h := m.Option(mdb.HASH)
|
||||
if h == "" {
|
||||
h = m.Rich(CONNECT, "", kit.Dict(
|
||||
aaa.USERNAME, m.Option(aaa.USERNAME),
|
||||
tcp.HOST, m.Option(tcp.HOST), tcp.PORT, m.Option(tcp.PORT),
|
||||
mdb.STATUS, tcp.OPEN, CONNECT, client,
|
||||
))
|
||||
} else {
|
||||
m.Conf(CONNECT, kit.Keys(mdb.HASH, h, CONNECT), client)
|
||||
}
|
||||
m.Cmd(CONNECT, SESSION, mdb.HASH, h)
|
||||
m.Rich(CONNECT, "", kit.Dict(
|
||||
mdb.NAME, m.Option(mdb.NAME),
|
||||
aaa.USERNAME, m.Option(aaa.USERNAME),
|
||||
tcp.HOST, m.Option(tcp.HOST), tcp.PORT, m.Option(tcp.PORT),
|
||||
mdb.STATUS, tcp.OPEN, CONNECT, client,
|
||||
))
|
||||
m.Cmd(CONNECT, SESSION, mdb.NAME, m.Option(mdb.NAME))
|
||||
}, arg...)
|
||||
})
|
||||
m.ProcessRefresh3s()
|
||||
}},
|
||||
|
||||
SESSION: {Name: "session hash", Help: "会话", Hand: func(m *ice.Message, arg ...string) {
|
||||
SESSION: {Name: "session name", Help: "会话", Hand: func(m *ice.Message, arg ...string) {
|
||||
var client *ssh.Client
|
||||
m.Richs(CONNECT, "", m.Option(mdb.HASH), func(key string, value map[string]interface{}) {
|
||||
m.Richs(CONNECT, "", m.Option(mdb.NAME), func(key string, value map[string]interface{}) {
|
||||
client, _ = value[CONNECT].(*ssh.Client)
|
||||
})
|
||||
|
||||
h := m.Rich(SESSION, "", kit.Data(mdb.STATUS, tcp.OPEN, CONNECT, m.Option(mdb.HASH)))
|
||||
h := m.Rich(SESSION, "", kit.Data(mdb.NAME, m.Option(mdb.NAME), mdb.STATUS, tcp.OPEN, CONNECT, m.Option(mdb.NAME)))
|
||||
if session, e := _ssh_session(m, h, client); m.Assert(e) {
|
||||
session.Shell()
|
||||
session.Wait()
|
||||
}
|
||||
m.Echo(h)
|
||||
}},
|
||||
"command": {Name: "command cmd=pwd", Help: "命令", Hand: func(m *ice.Message, arg ...string) {
|
||||
m.Richs(CONNECT, "", m.Option(mdb.NAME), func(key string, value map[string]interface{}) {
|
||||
if client, ok := value[CONNECT].(*ssh.Client); ok {
|
||||
if session, e := client.NewSession(); m.Assert(e) {
|
||||
defer session.Close()
|
||||
if b, e := session.CombinedOutput(m.Option("cmd")); m.Assert(e) {
|
||||
m.Echo(string(b))
|
||||
}
|
||||
}
|
||||
}
|
||||
})
|
||||
}},
|
||||
}, mdb.HashActionStatus()), Hand: func(m *ice.Message, c *ice.Context, cmd string, arg ...string) {
|
||||
mdb.HashSelect(m, arg...).Table(func(index int, value map[string]string, head []string) {
|
||||
m.PushButton(kit.Select("", SESSION, value[mdb.STATUS] == tcp.OPEN), mdb.REMOVE)
|
||||
m.PushButton(kit.Select("", "command,session", value[mdb.STATUS] == tcp.OPEN), mdb.REMOVE)
|
||||
})
|
||||
if len(arg) == 0 {
|
||||
m.Action(tcp.DIAL, mdb.PRUNES)
|
||||
m.Action(tcp.DIAL)
|
||||
}
|
||||
}},
|
||||
}})
|
||||
|
@ -59,21 +59,14 @@ const SESSION = "session"
|
||||
|
||||
func init() {
|
||||
psh.Index.Merge(&ice.Context{Configs: map[string]*ice.Config{
|
||||
SESSION: {Name: SESSION, Help: "会话", Value: kit.Data(
|
||||
mdb.FIELD, "time,hash,status,count,connect",
|
||||
)},
|
||||
SESSION: {Name: SESSION, Help: "会话", Value: kit.Data(mdb.SHORT, "name", mdb.FIELD, "time,name,status,count,connect")},
|
||||
}, Commands: map[string]*ice.Command{
|
||||
SESSION: {Name: "session hash id auto", Help: "会话", Action: ice.MergeAction(map[string]*ice.Action{
|
||||
ice.CTX_INIT: {Hand: func(m *ice.Message, arg ...string) {
|
||||
m.Richs(SESSION, "", mdb.FOREACH, func(key string, value map[string]interface{}) {
|
||||
kit.Value(value, kit.Keym(mdb.STATUS), tcp.CLOSE)
|
||||
})
|
||||
}},
|
||||
SESSION: {Name: "session name id auto", Help: "会话", Action: ice.MergeAction(map[string]*ice.Action{
|
||||
mdb.REPEAT: {Name: "repeat", Help: "执行", Hand: func(m *ice.Message, arg ...string) {
|
||||
m.Cmdy(SESSION, ctx.ACTION, ctx.COMMAND, CMD, m.Option(mdb.TEXT))
|
||||
}},
|
||||
ctx.COMMAND: {Name: "command cmd=pwd", Help: "命令", Hand: func(m *ice.Message, arg ...string) {
|
||||
m.Richs(SESSION, "", m.Option(mdb.HASH), func(key string, value map[string]interface{}) {
|
||||
m.Richs(SESSION, "", m.Option(mdb.NAME), func(key string, value map[string]interface{}) {
|
||||
if w, ok := kit.Value(value, kit.Keym(INPUT)).(io.Writer); ok {
|
||||
m.Grow(SESSION, kit.Keys(mdb.HASH, key), kit.Dict(mdb.TYPE, CMD, mdb.TEXT, m.Option(CMD)))
|
||||
w.Write([]byte(m.Option(CMD) + ice.NL))
|
||||
@ -81,20 +74,18 @@ func init() {
|
||||
})
|
||||
m.ProcessRefresh300ms()
|
||||
}},
|
||||
}, mdb.HashActionStatus()), Hand: func(m *ice.Message, c *ice.Context, cmd string, arg ...string) {
|
||||
}, mdb.ZoneAction()), Hand: func(m *ice.Message, c *ice.Context, cmd string, arg ...string) {
|
||||
if len(arg) == 0 {
|
||||
m.Action(mdb.PRUNES)
|
||||
mdb.HashSelect(m, arg...)
|
||||
m.Set(ice.MSG_APPEND, ctx.ACTION)
|
||||
m.Table(func(index int, value map[string]string, head []string) {
|
||||
mdb.HashSelect(m, arg...).Table(func(index int, value map[string]string, head []string) {
|
||||
m.PushButton(kit.Select("", ctx.COMMAND, value[mdb.STATUS] == tcp.OPEN), mdb.REMOVE)
|
||||
})
|
||||
return
|
||||
}
|
||||
|
||||
m.Action(ctx.COMMAND)
|
||||
m.Fields(len(arg[1:]), "time,id,type,text")
|
||||
mdb.ZoneSelect(m, arg...).Table(func(index int, value map[string]string, head []string) {
|
||||
m.Action(ctx.COMMAND, mdb.PAGE)
|
||||
m.OptionPage(kit.Slice(arg, 2)...)
|
||||
m.Fields(len(kit.Slice(arg, 1, 2)), "time,id,type,text")
|
||||
mdb.ZoneSelect(m, kit.Slice(arg, 0, 2)...).Table(func(index int, value map[string]string, head []string) {
|
||||
m.PushButton(kit.Select("", mdb.REPEAT, value[mdb.TYPE] == CMD))
|
||||
})
|
||||
}},
|
||||
|
@ -25,9 +25,11 @@ func (m *Message) OptionFields(arg ...string) string {
|
||||
return kit.Join(kit.Simple(m.Optionv(MSG_FIELDS)))
|
||||
}
|
||||
func (m *Message) OptionPage(arg ...string) {
|
||||
m.Option(CACHE_LIMIT, kit.Select("10", arg, 0))
|
||||
m.Option(CACHE_OFFEND, kit.Select("0", arg, 1))
|
||||
m.Option(CACHE_LIMIT, kit.Select("", arg, 0))
|
||||
m.Option(CACHE_OFFEND, kit.Select("", arg, 1))
|
||||
m.Option(CACHE_FILTER, kit.Select("", arg, 2))
|
||||
m.Option("offend", kit.Select("", arg, 1))
|
||||
m.Option("limit", kit.Select("", arg, 0))
|
||||
}
|
||||
func (m *Message) OptionLoad(file string) *Message {
|
||||
if f, e := os.Open(file); e == nil {
|
||||
|
12
render.go
12
render.go
@ -119,6 +119,18 @@ func (m *Message) PushAnchor(arg ...interface{}) { // [name] link
|
||||
}
|
||||
}
|
||||
func (m *Message) PushButton(arg ...interface{}) { // name...
|
||||
if m.FieldsIsDetail() {
|
||||
for i, k := range m.meta["key"] {
|
||||
if k == "action" {
|
||||
m.meta["value"][i] = Render(m, RENDER_BUTTON, arg...)
|
||||
return
|
||||
}
|
||||
}
|
||||
}
|
||||
if len(m.meta["action"]) >= m.Length() {
|
||||
m.meta["action"] = []string{}
|
||||
}
|
||||
|
||||
if !m.IsCliUA() {
|
||||
m.Push(ACTION, Render(m, RENDER_BUTTON, arg...))
|
||||
}
|
||||
|
Loading…
x
Reference in New Issue
Block a user