1
0
forked from x/icebergs
This commit is contained in:
IT 老营长 @云轩领航-创始人 2023-03-24 08:04:27 +08:00
parent f0fd9ed204
commit af6cc2fcf3
15 changed files with 114 additions and 291 deletions

View File

@ -14,8 +14,6 @@ func _context_list(m *ice.Message, sub *ice.Context, name string) {
return
}
m.Push(mdb.NAME, s.Cap(ice.CTX_FOLLOW))
m.Push(mdb.STATUS, s.Cap(ice.CTX_STATUS))
m.Push(mdb.STREAM, s.Cap(ice.CTX_STREAM))
m.Push(mdb.HELP, s.Help)
})
}
@ -28,7 +26,7 @@ func init() {
if len(arg) == 0 {
arg = append(arg, m.Source().Cap(ice.CTX_FOLLOW))
}
m.Search(arg[0]+ice.PT, func(p *ice.Context, s *ice.Context, key string) {
m.Search(arg[0]+ice.PT, func(p *ice.Context, s *ice.Context) {
msg := m.Spawn(s)
defer m.Copy(msg)
switch kit.Select(CONTEXT, arg, 1) {

View File

@ -10,7 +10,7 @@ import (
type configMessage interface {
Option(key string, arg ...Any) string
PrefixKey(...Any) string
PrefixKey() string
Confv(...Any) Any
}

View File

@ -164,8 +164,8 @@ func OptionLoad(m *ice.Message, file string) *ice.Message {
}
type templateMessage interface {
PrefixKey(arg ...ice.Any) string
Cmdx(arg ...ice.Any) string
PrefixKey() string
}
func Template(m templateMessage, file string, arg ...ice.Any) string {

View File

@ -33,7 +33,7 @@ type Frame struct {
}
func (f *Frame) prompt(m *ice.Message, list ...string) *Frame {
if f.source != STDIO || m.Target().Cap(ice.CTX_STATUS) == ice.CTX_CLOSE {
if f.source != STDIO {
return f
}
kit.If(len(list) == 0, func() { list = append(list, f.ps1...) })
@ -58,9 +58,6 @@ func (f *Frame) printf(m *ice.Message, str string, arg ...ice.Any) *Frame {
if f.source != STDIO {
return f
}
if m.Target().Cap(ice.CTX_STATUS) == ice.CTX_CLOSE {
return f
}
fmt.Fprint(f.stdout, kit.Format(str, arg...))
return f
}
@ -155,7 +152,7 @@ func (f *Frame) Start(m *ice.Message, arg ...string) {
m.Optionv(FRAME, f)
switch f.source = kit.Select(STDIO, arg, 0); f.source {
case STDIO:
if m.Cap(ice.CTX_STREAM, f.source); f.target == nil {
if f.target == nil {
f.target = m.Target()
}
r, w, _ := os.Pipe()

View File

@ -112,7 +112,7 @@ func PushPodCmd(m *ice.Message, cmd string, arg ...string) {
type Message interface {
Option(key string, arg ...ice.Any) string
PrefixKey(arg ...ice.Any) string
PrefixKey() string
}
func OptionAgentIs(m Message, arg ...string) bool {

View File

@ -259,8 +259,6 @@ const ( // CTX
CTX_DAEMON = "ctx_daemon"
CTX_FOLLOW = "follow"
CTX_STATUS = "status"
CTX_STREAM = "stream"
CTX_BEGIN = "begin"
CTX_START = "start"

38
data.go
View File

@ -9,25 +9,24 @@ import (
kit "shylinux.com/x/toolkits"
)
func (m *Message) ActionKey() string {
return strings.TrimPrefix(strings.TrimSuffix(m._sub, PS), PS)
}
func (m *Message) CommandKey() string {
return strings.TrimPrefix(strings.TrimSuffix(m._key, PS), PS)
}
func (m *Message) PrefixRawKey(arg ...Any) string {
return kit.Keys(m.Prefix(m._key), kit.Keys(arg...))
}
func (m *Message) PrefixKey(arg ...Any) string {
return kit.Keys(m.Prefix(m.CommandKey()), kit.Keys(arg...))
}
func (m *Message) Prefix(arg ...string) string {
return m.Target().Prefix(arg...)
}
func (m *Message) ActionKey() string { return strings.TrimPrefix(strings.TrimSuffix(m._sub, PS), PS) }
func (m *Message) CommandKey() string { return strings.TrimPrefix(strings.TrimSuffix(m._key, PS), PS) }
func (m *Message) PrefixKey() string { return m.Prefix(m.CommandKey()) }
func (m *Message) PrefixPath(arg ...Any) string {
return strings.TrimPrefix(path.Join(strings.ReplaceAll(m.PrefixRawKey(arg...), PT, PS)), "web") + PS
}
func (m *Message) PrefixRawKey(arg ...Any) string { return m.Prefix(m._key, kit.Keys(arg...)) }
func (m *Message) Prefix(arg ...string) string { return m.Target().Prefix(arg...) }
func SaveImportant(m *Message, arg ...string) {
if Info.Important != true {
return
}
for i, v := range arg {
kit.If(v == "" || strings.Contains(v, SP), func() { arg[i] = "\"" + v + "\"" })
}
m.Cmd("nfs.push", VAR_DATA_IMPORTANT, kit.Join(arg, SP), NL)
}
func loadImportant(m *Message) {
if f, e := os.Open(VAR_DATA_IMPORTANT); e == nil {
defer f.Close()
@ -40,13 +39,4 @@ func loadImportant(m *Message) {
}
Info.Important = true
}
func SaveImportant(m *Message, arg ...string) {
if Info.Important != true {
return
}
for i, v := range arg {
kit.If(v == "" || strings.Contains(v, SP), func() { arg[i] = "\"" + v + "\"" })
}
m.Cmd("nfs.push", VAR_DATA_IMPORTANT, kit.Join(arg, SP), NL)
}
func removeImportant(m *Message) { os.Remove(VAR_DATA_IMPORTANT) }

25
exec.go
View File

@ -3,7 +3,6 @@ package ice
import (
"errors"
"io"
"sync"
"time"
kit "shylinux.com/x/toolkits"
@ -27,9 +26,7 @@ func (m *Message) TryCatch(msg *Message, catch bool, cb ...func(msg *Message)) *
}
}
}()
if len(cb) > 0 {
cb[0](msg)
}
kit.If(len(cb) > 0, func() { cb[0](msg) })
return m
}
func (m *Message) Assert(expr Any) bool {
@ -56,26 +53,6 @@ func (m *Message) Sleep(d Any, arg ...Any) *Message {
func (m *Message) Sleep300ms(arg ...Any) *Message { return m.Sleep("300ms", arg...) }
func (m *Message) Sleep30ms(arg ...Any) *Message { return m.Sleep("30ms", arg...) }
func (m *Message) Sleep3s(arg ...Any) *Message { return m.Sleep("3s", arg...) }
func (m *Message) TableGo(cb Any) *Message {
wg, lock := sync.WaitGroup{}, &task.Lock{}
defer wg.Wait()
m.Tables(func(value Maps) {
wg.Add(1)
task.Put(logs.FileLine(cb), func(*task.Task) error {
defer wg.Done()
switch cb := cb.(type) {
case func(Maps, *task.Lock):
cb(value, lock)
case func(Maps):
cb(value)
default:
m.ErrorNotImplement(cb)
}
return nil
})
})
return m
}
func (m *Message) Go(cb Any, arg ...Any) *Message {
kit.If(len(arg) == 0, func() { arg = append(arg, logs.FileLine(cb)) })
task.Put(arg[0], func(task *task.Task) error {

View File

@ -50,13 +50,9 @@ const (
var Index = &Context{Name: ICE, Help: "冰山模块", Commands: Commands{
CTX_INIT: {Hand: func(m *Message, arg ...string) {
m.Travel(func(p *Context, c *Context) {
kit.If(p != nil, func() { m.Go(func() { c._command(m.Spawn(c), c.Commands[CTX_INIT], CTX_INIT, arg...) }) })
kit.If(p != nil, func() { c._command(m.Spawn(c), c.Commands[CTX_INIT], CTX_INIT, arg...) })
})
loadImportant(m)
loadImportant(m)
loadImportant(m)
loadImportant(m)
loadImportant(m)
}},
INIT: {Hand: func(m *Message, arg ...string) {
m.Cmd(CTX_INIT)

22
misc.go
View File

@ -484,3 +484,25 @@ func (m *Message) CmdAppend(arg ...Any) string {
field := kit.Slice(args, -1)[0]
return m._command(kit.Slice(args, 0, -1), OptionFields(field)).Append(field)
}
func (m *Message) IsCliUA() bool {
if m.Option(MSG_USERUA) == "" || !strings.HasPrefix(m.Option(MSG_USERUA), "Mozilla") {
return true
}
return false
}
func (m *Message) IsMobileUA() bool {
return strings.Contains(m.Option(MSG_USERUA), "Mobile")
}
func (m *Message) MergePodCmd(pod, cmd string, arg ...Any) string {
ls := []string{"chat"}
kit.If(kit.Keys(m.Option(MSG_USERPOD), pod), func(p string) { ls = append(ls, POD, p) })
if cmd == "" {
if _, ok := Info.Index[m.CommandKey()]; ok {
cmd = m.CommandKey()
} else {
cmd = m.PrefixKey()
}
}
ls = append(ls, CMD, cmd)
return kit.MergeURL2(strings.Split(kit.Select(Info.Domain, m.Option(MSG_USERWEB)), QS)[0], PS+kit.Join(ls, PS), arg...)
}

View File

@ -123,7 +123,7 @@ func _status_list(m *ice.Message) (files, adds, dels int, last time.Time) {
last = ci.Author.When
}
}
tags := kit.Format(mdb.Cache(m, m.PrefixKey(value[REPOS], TAGS), func() ice.Any { return _git_cmds(m, "describe", "--tags") }))
tags := _git_cmds(m, "describe", "--tags")
kit.SplitKV(ice.SP, ice.NL, _git_cmds(m, STATUS, "-sb"), func(text string, ls []string) {
switch kit.Ext(ls[1]) {
case "swp", "swo", ice.BIN, ice.VAR:
@ -238,7 +238,6 @@ func init() {
}}, OPT: {Help: "优化"}, PRO: {Help: "升级"},
COMMIT: {Name: "commit action=opt,add,pro comment=some", Help: "提交", Hand: func(m *ice.Message, arg ...string) {
_repos_cmd(m, m.Option(REPOS), COMMIT, "-am", m.Option(ctx.ACTION)+ice.SP+m.Option(COMMENT))
mdb.Cache(m, m.PrefixKey(m.Option(REPOS), TAGS), nil)
m.ProcessBack()
}},
PIE: {Help: "饼图", Hand: func(m *ice.Message, arg ...string) { m.Cmdy(TOTAL, PIE) }},
@ -248,7 +247,6 @@ func init() {
}
_repos_cmd(m, m.Option(REPOS), TAG, m.Option(VERSION))
_repos_cmd(m, m.Option(REPOS), PUSH, "--tags")
mdb.Cache(m, m.PrefixKey(m.Option(REPOS), TAGS), nil)
ctx.ProcessRefresh(m)
}},
TAGS: {Help: "标签", Hand: func(m *ice.Message, arg ...string) { _status_tags(m) }},

View File

@ -3,6 +3,7 @@ package git
import (
"path"
"strings"
"sync"
"time"
ice "shylinux.com/x/icebergs"
@ -11,6 +12,7 @@ import (
"shylinux.com/x/icebergs/base/mdb"
"shylinux.com/x/icebergs/base/nfs"
kit "shylinux.com/x/toolkits"
"shylinux.com/x/toolkits/logs"
"shylinux.com/x/toolkits/task"
)
@ -44,7 +46,7 @@ func init() {
return
}
from, days, adds, dels, rest, commit := "", 0, 0, 0, 0, 0
ReposList(m).TableGo(func(value ice.Maps, lock *task.Lock) {
TableGo(ReposList(m), func(value ice.Maps, lock *task.Lock) {
if mdb.Config(m, kit.Keys("skip", value[REPOS])) == ice.TRUE {
return
}
@ -123,3 +125,23 @@ func init() {
}},
})
}
func TableGo(m *ice.Message, cb ice.Any) *ice.Message {
wg, lock := sync.WaitGroup{}, &task.Lock{}
defer wg.Wait()
m.Tables(func(value ice.Maps) {
wg.Add(1)
task.Put(logs.FileLine(cb), func(*task.Task) error {
defer wg.Done()
switch cb := cb.(type) {
case func(ice.Maps, *task.Lock):
cb(value, lock)
case func(ice.Maps):
cb(value)
default:
m.ErrorNotImplement(cb)
}
return nil
})
})
return m
}

View File

@ -13,77 +13,37 @@ type Option struct {
func OptionFields(arg ...string) Option { return Option{MSG_FIELDS, kit.Join(arg)} }
func (m *Message) OptionFields(arg ...string) string {
if len(arg) > 0 {
m.Option(MSG_FIELDS, kit.Join(arg))
}
kit.If(len(arg) > 0, func() { m.Option(MSG_FIELDS, kit.Join(arg)) })
return kit.Join(kit.Simple(m.Optionv(MSG_FIELDS)))
}
func (m *Message) OptionDefault(arg ...string) string {
for i := 0; i < len(arg); i += 2 {
if m.Option(arg[i]) == "" && arg[i+1] != "" {
m.Option(arg[i], arg[i+1])
}
}
kit.For(arg, func(k, v string) { kit.If(m.Option(k) == "" && v != "", func() { m.Option(k, v) }) })
return m.Option(arg[0])
}
func (m *Message) OptionSimple(key ...string) (res []string) {
if len(key) == 0 {
for _, k := range kit.Split(kit.Select("type,name,text", m.Conf(m.PrefixKey(), kit.Keym(FIELD)))) {
switch k {
case TIME, HASH:
continue
}
if k == "" || m.Option(k) == "" {
continue
}
res = append(res, k, m.Option(k))
}
return
}
for _, k := range kit.Split(kit.Join(key)) {
if k == "" || m.Option(k) == "" {
continue
}
res = append(res, k, m.Option(k))
}
kit.If(len(key) == 0, func() { key = kit.Filters(kit.Split(kit.Select("type,name,text", m.Config(FIELD))), TIME, HASH) })
kit.For(kit.Filters(kit.Split(kit.Join(key)), ""), func(k string) { kit.If(m.Option(k), func(v string) { res = append(res, k, v) }) })
return
}
func (m *Message) OptionSplit(key ...string) (res []string) {
for _, k := range kit.Split(kit.Join(key)) {
res = append(res, m.Option(k))
}
kit.For(kit.Split(kit.Join(key)), func(k string) { res = append(res, m.Option(k)) })
return res
}
func (m *Message) OptionCB(key string, cb ...Any) Any {
if len(cb) > 0 {
return m.Optionv(kit.Keycb(kit.Select(m.CommandKey(), key)), cb...)
}
kit.If(len(cb) > 0, func() { m.Optionv(kit.Keycb(kit.Select(m.CommandKey(), key)), cb...) })
return m.Optionv(kit.Keycb(kit.Select(m.CommandKey(), key)))
}
func (m *Message) FieldsIsDetail() bool {
if len(m.meta[MSG_APPEND]) == 2 && m.meta[MSG_APPEND][0] == KEY && m.meta[MSG_APPEND][1] == VALUE {
return true
}
if m.OptionFields() == FIELDS_DETAIL {
return true
}
return false
return len(m.meta[MSG_APPEND]) == 2 && m.meta[MSG_APPEND][0] == KEY && m.meta[MSG_APPEND][1] == VALUE || m.OptionFields() == FIELDS_DETAIL
}
func (m *Message) Fields(length int, fields ...string) string {
return m.Option(MSG_FIELDS, kit.Select(kit.Select(FIELDS_DETAIL, fields, length), m.Option(MSG_FIELDS)))
return m.OptionDefault(MSG_FIELDS, kit.Select(FIELDS_DETAIL, fields, length))
}
func (m *Message) Action(arg ...Any) *Message {
for i, v := range arg {
switch v.(type) {
case string:
default:
arg[i] = kit.Format(v)
}
}
m.Option(MSG_ACTION, kit.Format(arg))
return m
kit.For(arg, func(i int, v Any) { arg[i] = kit.Format(v) })
return m.Options(MSG_ACTION, kit.Format(arg))
}
func (m *Message) Status(arg ...Any) *Message {
list, args := kit.List(), kit.Simple(arg)
@ -94,8 +54,7 @@ func (m *Message) Status(arg ...Any) *Message {
}
list = append(list, kit.Dict(NAME, args[i], VALUE, args[i+1]))
}
m.Option(MSG_STATUS, kit.Format(list))
return m
return m.Options(MSG_STATUS, kit.Format(list))
}
func (m *Message) StatusTime(arg ...Any) *Message {
return m.Status(TIME, m.Time(), arg, kit.MDB_COST, m.FormatCost())

120
render.go
View File

@ -7,15 +7,13 @@ import (
kit "shylinux.com/x/toolkits"
)
func AddRender(key string, render func(*Message, ...Any) string) {
Info.render[key] = render
}
func AddRender(key string, render func(*Message, ...Any) string) { Info.render[key] = render }
func RenderAction(key ...string) Actions {
return Actions{CTX_INIT: {Hand: func(m *Message, arg ...string) {
cmd := m.CommandKey()
for _, key := range key {
kit.For(key, func(key string) {
AddRender(key, func(m *Message, arg ...Any) string { return m.Cmd(cmd, key, arg).Result() })
}
})
}}}
}
func Render(m *Message, cmd string, args ...Any) string {
@ -28,25 +26,15 @@ func Render(m *Message, cmd string, args ...Any) string {
for _, k := range args {
switch k := k.(type) {
case []string:
for _, k := range k {
list = append(list, Render(m, RENDER_BUTTON, k))
}
kit.For(k, func(k string) { list = append(list, Render(m, RENDER_BUTTON, k)) })
case string:
if strings.HasPrefix(k, "<input") {
list = append(list, k)
break
}
for _, k := range kit.Split(k) {
list = append(list, kit.Format(`<input type="button" name="%s" value="%s">`,
// k, kit.Select(k, kit.Value(m._cmd.Meta, kit.Keys("_trans", k)), m.Option(MSG_LANGUAGE) != "en")))
k, k))
}
kit.For(kit.Split(k), func(k string) { list = append(list, kit.Format(`<input type="button" name="%s" value="%s">`, k, k)) })
case Map:
for k := range k {
list = append(list, kit.Format(`<input type="button" name="%s" value="%s">`,
k, k))
// k, kit.Select(k, v, m.Option(MSG_LANGUAGE) != "en")))
}
kit.For(k, func(k string) { list = append(list, kit.Format(`<input type="button" name="%s" value="%s">`, k, k)) })
default:
list = append(list, Render(m, RENDER_BUTTON, kit.Format(k)))
}
@ -66,16 +54,14 @@ func Render(m *Message, cmd string, args ...Any) string {
if len(arg) == 1 {
return kit.Format(`<%s>%s</%s>`, cmd, arg[0], cmd)
}
return kit.Format(`<%s style="%s">%s</%s>`, cmd, kit.JoinKV(":", ";", arg[1:]...), arg[0], cmd)
return kit.Format(`<%s style="%s">%s</%s>`, cmd, kit.JoinKV(DF, ";", arg[1:]...), arg[0], cmd)
}
}
func (m *Message) Render(cmd string, arg ...Any) *Message {
switch cmd {
case RENDER_TEMPLATE:
if len(arg) == 1 {
arg = append(arg, m)
}
kit.If(len(arg) == 1, func() { arg = append(arg, m) })
if res, err := kit.Render(arg[0].(string), arg[1]); m.Assert(err) {
m.Echo(string(res))
}
@ -117,36 +103,12 @@ func (m *Message) RenderVoid(arg ...Any) *Message {
return m.Render(RENDER_VOID, arg...)
}
func (m *Message) IsCliUA() bool {
if m.Option(MSG_USERUA) == "" || !strings.HasPrefix(m.Option(MSG_USERUA), "Mozilla") {
return true
}
return false
}
func (m *Message) IsMobileUA() bool {
return strings.Contains(m.Option(MSG_USERUA), "Mobile")
}
func (m *Message) MergePodCmd(pod, cmd string, arg ...Any) string {
ls := []string{"chat"}
kit.If(kit.Keys(m.Option(MSG_USERPOD), pod), func(p string) { ls = append(ls, POD, p) })
if cmd == "" {
if _, ok := Info.Index[m.CommandKey()]; ok {
cmd = m.CommandKey()
} else {
cmd = m.PrefixKey()
}
}
ls = append(ls, CMD, cmd)
return kit.MergeURL2(strings.Split(kit.Select(Info.Domain, m.Option(MSG_USERWEB)), QS)[0], PS+kit.Join(ls, PS), arg...)
}
func (m *Message) PushSearch(arg ...Any) {
data := kit.Dict(arg...)
for i := 0; i < len(arg); i += 2 {
switch k := arg[i].(type) {
case string:
if i+1 < len(arg) {
data[k] = arg[i+1]
}
kit.If(i+1 < len(arg), func() { data[k] = arg[i+1] })
}
}
for _, k := range kit.Split(m.OptionFields()) {
@ -170,7 +132,6 @@ func (m *Message) PushAction(arg ...Any) *Message {
}
return m.Set(MSG_APPEND, ACTION).Tables(func(value Maps) { m.PushButton(arg...) })
}
func (m *Message) PushButton(arg ...Any) *Message {
if !m.IsCliUA() {
if m.FieldsIsDetail() {
@ -188,68 +149,37 @@ func (m *Message) PushButton(arg ...Any) *Message {
return m
}
func (m *Message) PushAnchor(arg ...string) {
if !m.IsCliUA() {
m.Push(LINK, Render(m, RENDER_ANCHOR, arg))
}
kit.If(!m.IsCliUA(), func() { m.Push(LINK, Render(m, RENDER_ANCHOR, arg)) })
}
func (m *Message) PushQRCode(key, src string) {
if !m.IsCliUA() {
m.Push(key, Render(m, RENDER_QRCODE, src))
}
kit.If(!m.IsCliUA(), func() { m.Push(key, Render(m, RENDER_QRCODE, src)) })
}
func (m *Message) PushImages(key, src string) {
if !m.IsCliUA() {
m.Push(key, Render(m, RENDER_IMAGES, src))
}
kit.If(!m.IsCliUA(), func() { m.Push(key, Render(m, RENDER_IMAGES, src)) })
}
func (m *Message) PushVideos(key, src string) {
if !m.IsCliUA() {
m.Push(key, Render(m, RENDER_VIDEOS, src))
}
kit.If(!m.IsCliUA(), func() { m.Push(key, Render(m, RENDER_VIDEOS, src)) })
}
func (m *Message) PushAudios(key, src string) {
if !m.IsCliUA() {
m.Push(key, Render(m, RENDER_AUDIOS, src))
}
kit.If(!m.IsCliUA(), func() { m.Push(key, Render(m, RENDER_AUDIOS, src)) })
}
func (m *Message) PushIFrame(key, src string) {
if !m.IsCliUA() {
m.Push(key, Render(m, RENDER_IFRAME, src))
}
kit.If(!m.IsCliUA(), func() { m.Push(key, Render(m, RENDER_IFRAME, src)) })
}
func (m *Message) PushScript(arg ...string) {
if !m.IsCliUA() {
m.Push(SCRIPT, Render(m, RENDER_SCRIPT, arg))
}
kit.If(!m.IsCliUA(), func() { m.Push(SCRIPT, Render(m, RENDER_SCRIPT, arg)) })
}
func (m *Message) PushDownload(key string, arg ...string) *Message {
if !m.IsCliUA() {
m.Push(key, Render(m, RENDER_DOWNLOAD, arg))
}
return m
func (m *Message) PushDownload(key string, arg ...string) {
kit.If(!m.IsCliUA(), func() { m.Push(key, Render(m, RENDER_DOWNLOAD, arg)) })
}
func (m *Message) EchoButton(arg ...Any) *Message {
return m.Echo(Render(m, RENDER_BUTTON, arg...))
}
func (m *Message) EchoAnchor(arg ...string) *Message {
return m.Echo(Render(m, RENDER_ANCHOR, arg))
}
func (m *Message) EchoQRCode(src string) *Message {
return m.Echo(Render(m, RENDER_QRCODE, src))
}
func (m *Message) EchoImages(src string) *Message {
return m.Echo(Render(m, RENDER_IMAGES, src))
}
func (m *Message) EchoVideos(src string) *Message {
return m.Echo(Render(m, RENDER_VIDEOS, src))
}
func (m *Message) EchoIFrame(src string) *Message {
return m.Echo(Render(m, RENDER_IFRAME, src))
}
func (m *Message) EchoScript(arg ...string) *Message {
return m.Echo(Render(m, RENDER_SCRIPT, arg))
}
func (m *Message) EchoButton(arg ...Any) *Message { return m.Echo(Render(m, RENDER_BUTTON, arg...)) }
func (m *Message) EchoAnchor(arg ...string) *Message { return m.Echo(Render(m, RENDER_ANCHOR, arg)) }
func (m *Message) EchoQRCode(src string) *Message { return m.Echo(Render(m, RENDER_QRCODE, src)) }
func (m *Message) EchoImages(src string) *Message { return m.Echo(Render(m, RENDER_IMAGES, src)) }
func (m *Message) EchoVideos(src string) *Message { return m.Echo(Render(m, RENDER_VIDEOS, src)) }
func (m *Message) EchoIFrame(src string) *Message { return m.Echo(Render(m, RENDER_IFRAME, src)) }
func (m *Message) EchoScript(arg ...string) *Message { return m.Echo(Render(m, RENDER_SCRIPT, arg)) }
func (m *Message) EchoDownload(arg ...string) *Message {
return m.Echo(Render(m, RENDER_DOWNLOAD, arg))
}

84
type.go
View File

@ -2,7 +2,6 @@ package ice
import (
"encoding/json"
"fmt"
"io"
"net/http"
"strings"
@ -180,24 +179,18 @@ func (c *Context) Merge(s *Context) *Context {
}
func (c *Context) Begin(m *Message, arg ...string) *Context {
kit.If(c.Caches == nil, func() { c.Caches = Caches{} })
c.Caches[CTX_STREAM] = &Cache{Name: CTX_STREAM, Value: ""}
c.Caches[CTX_STATUS] = &Cache{Name: CTX_STATUS, Value: CTX_BEGIN}
c.Caches[CTX_FOLLOW] = &Cache{Name: CTX_FOLLOW, Value: c.Name}
kit.If(c.context != nil && c.context != Index, func() { c.Cap(CTX_FOLLOW, kit.Keys(c.context.Cap(CTX_FOLLOW), c.Name)) })
kit.If(c.server != nil, func() { c.server.Begin(m, arg...) })
return c.Merge(c)
}
func (c *Context) Start(m *Message, arg ...string) bool {
m.Log(c.Cap(CTX_STATUS, CTX_START), c.Cap(CTX_FOLLOW))
kit.If(c.server != nil, func() {
m.Go(func() { c.server.Start(m, arg...) }, m.Prefix())
})
return true
func (c *Context) Start(m *Message, arg ...string) {
m.Log(CTX_START, c.Cap(CTX_FOLLOW))
kit.If(c.server != nil, func() { m.Go(func() { c.server.Start(m, arg...) }, m.Prefix()) })
}
func (c *Context) Close(m *Message, arg ...string) bool {
m.Log(c.Cap(CTX_STATUS, CTX_CLOSE), c.Cap(CTX_FOLLOW))
func (c *Context) Close(m *Message, arg ...string) {
m.Log(CTX_CLOSE, c.Cap(CTX_FOLLOW))
kit.If(c.server != nil, func() { c.server.Close(m, arg...) })
return true
}
type Message struct {
@ -225,26 +218,14 @@ type Message struct {
I io.Reader
}
func (m *Message) Time(arg ...Any) string {
func (m *Message) Time(arg ...string) string {
t := m.time
if len(arg) > 0 {
switch arg := arg[0].(type) {
case string:
if d, e := time.ParseDuration(arg); e == nil {
t, arg = t.Add(d), arg[1:]
}
if d, e := time.ParseDuration(arg[0]); e == nil {
t, arg = t.Add(d), arg[1:]
}
}
f := MOD_TIME
if len(arg) > 0 {
switch p := arg[0].(type) {
case string:
if f = p; len(arg) > 1 {
f = fmt.Sprintf(f, arg[1:]...)
}
}
}
return t.Format(f)
return t.Format(kit.Select(MOD_TIME, arg, 0))
}
func (m *Message) Target() *Context { return m.target }
func (m *Message) Source() *Context { return m.source }
@ -348,22 +329,10 @@ func (m *Message) Search(key string, cb Any) *Message {
}
switch cb := cb.(type) {
case func(key string, cmd *Command):
if key == "" {
for k, v := range p.Commands {
cb(k, v)
}
break
}
if cmd, ok := p.Commands[key]; ok {
cb(key, cmd)
}
case func(p *Context, s *Context, key string, cmd *Command):
if key == "" {
for k, v := range p.Commands {
cb(p.context, p, k, v)
}
break
}
for _, p := range []*Context{p, m.target, m.source} {
for s := p; s != nil; s = s.context {
if cmd, ok := s.Commands[key]; ok {
@ -373,12 +342,6 @@ func (m *Message) Search(key string, cb Any) *Message {
}
}
case func(p *Context, s *Context, key string, conf *Config):
if key == "" {
for k, v := range p.Configs {
cb(p.context, p, k, v)
}
break
}
for _, p := range []*Context{p, m.target, m.source} {
for s := p; s != nil; s = s.context {
if cmd, ok := s.Configs[key]; ok {
@ -387,8 +350,6 @@ func (m *Message) Search(key string, cb Any) *Message {
}
}
}
case func(p *Context, s *Context, key string):
cb(p.context, p, key)
case func(p *Context, s *Context):
cb(p.context, p)
default:
@ -397,17 +358,13 @@ func (m *Message) Search(key string, cb Any) *Message {
return m
}
func (m *Message) Cmd(arg ...Any) *Message { return m._command(arg...) }
func (m *Message) Cmds(arg ...Any) *Message { return m.Go(func() { m._command(arg...) }) }
func (m *Message) Cmd(arg ...Any) *Message { return m._command(arg...) }
func (m *Message) Cmdx(arg ...Any) string {
res := kit.Select("", m._command(arg...).meta[MSG_RESULT], 0)
return kit.Select("", res, res != ErrWarn)
}
func (m *Message) Cmdy(arg ...Any) *Message { return m.Copy(m._command(arg...)) }
func (m *Message) Confv(arg ...Any) (val Any) {
if m.Spawn().Warn(Info.Important && m.Option("_lock") == "") {
m.Warn(true, "what unsafe lock", m.PrefixKey(), m.FormatStack(1, 100))
}
run := func(conf *Config) {
if len(arg) == 1 {
val = conf.Value
@ -433,24 +390,3 @@ func (m *Message) Confv(arg ...Any) (val Any) {
return
}
func (m *Message) Conf(arg ...Any) string { return kit.Format(m.Confv(arg...)) }
func (m *Message) Capi(key string, val ...Any) int {
kit.If(len(val) > 0, func() { m.Cap(key, kit.Int(m.Cap(key))+kit.Int(val[0])) })
return kit.Int(m.Cap(key))
}
func (m *Message) Capv(arg ...Any) Any {
key := ""
switch val := arg[0].(type) {
case string:
key, arg = val, arg[1:]
}
for _, s := range []*Context{m.target} {
for c := s; c != nil; c = c.context {
if caps, ok := c.Caches[key]; ok {
kit.If(len(arg) > 0, func() { caps.Value = kit.Format(arg[0]) })
return caps.Value
}
}
}
return nil
}
func (m *Message) Cap(arg ...Any) string { return kit.Format(m.Capv(arg...)) }