1
0
forked from x/icebergs

opt chrome

This commit is contained in:
harveyshao 2022-12-14 23:00:21 +08:00
parent 7fcbb658a3
commit d1dba9db37
17 changed files with 115 additions and 220 deletions

View File

@ -121,7 +121,7 @@ func init() {
}}, }},
DOWNLOAD: {Name: "download type name*", Hand: func(m *ice.Message, arg ...string) { DOWNLOAD: {Name: "download type name*", Hand: func(m *ice.Message, arg ...string) {
if r, ok := m.Optionv(RESPONSE).(*http.Response); !m.Warn(!ok, ice.ErrNotValid, RESPONSE) { if r, ok := m.Optionv(RESPONSE).(*http.Response); !m.Warn(!ok, ice.ErrNotValid, RESPONSE) {
file, size := _cache_catch(m, _cache_download(m, r, path.Join(ice.VAR_TMP, kit.Hashs(mdb.UNIQ)), nil)) file, size := _cache_catch(m, _cache_download(m, r, path.Join(ice.VAR_TMP, kit.Hashs(mdb.UNIQ)), m.OptionCB("")))
_cache_save(m, m.Option(mdb.TYPE), m.Option(mdb.NAME), "", file, size) _cache_save(m, m.Option(mdb.TYPE), m.Option(mdb.NAME), "", file, size)
} }
}}, }},
@ -188,6 +188,9 @@ func Upload(m *ice.Message) []string {
return up return up
} }
} }
func Download(m *ice.Message, link string, cb func(count, total, value int)) *ice.Message {
return m.Cmdy("web.spide", ice.DEV, SPIDE_CACHE, http.MethodGet, link, cb)
}
func PushDisplay(m *ice.Message, mime, name, link string) { func PushDisplay(m *ice.Message, mime, name, link string) {
if strings.HasPrefix(mime, "image/") || kit.ExtIsImage(name) { if strings.HasPrefix(mime, "image/") || kit.ExtIsImage(name) {
m.PushImages(nfs.FILE, link) m.PushImages(nfs.FILE, link)

View File

@ -200,7 +200,7 @@ func _spide_save(m *ice.Message, format, file, uri string, res *http.Response) {
case SPIDE_SAVE: case SPIDE_SAVE:
_cache_download(m, res, file, m.OptionCB(SPIDE)) _cache_download(m, res, file, m.OptionCB(SPIDE))
case SPIDE_CACHE: case SPIDE_CACHE:
m.Cmdy(CACHE, DOWNLOAD, res.Header.Get(ContentType), uri, kit.Dict(RESPONSE, res)) m.Cmdy(CACHE, DOWNLOAD, res.Header.Get(ContentType), uri, kit.Dict(RESPONSE, res), m.OptionCB(SPIDE))
m.Echo(m.Append(mdb.HASH)) m.Echo(m.Append(mdb.HASH))
default: default:
var data ice.Any var data ice.Any

View File

@ -206,6 +206,7 @@ const ( // RENDER
RENDER_QRCODE = "_qrcode" RENDER_QRCODE = "_qrcode"
RENDER_IMAGES = "_images" RENDER_IMAGES = "_images"
RENDER_VIDEOS = "_videos" RENDER_VIDEOS = "_videos"
RENDER_AUDIOS = "_audios"
RENDER_IFRAME = "_iframe" RENDER_IFRAME = "_iframe"
RENDER_SCRIPT = "_script" RENDER_SCRIPT = "_script"

View File

@ -272,7 +272,8 @@ func (c *Context) _command(m *Message, cmd *Command, key string, arg ...string)
return c._action(m, cmd, key, arg[1], h, arg[2:]...) return c._action(m, cmd, key, arg[1], h, arg[2:]...)
} }
} }
if len(arg) > 0 && arg[0] != COMMAND { // if len(arg) > 0 && arg[0] != COMMAND {
if len(arg) > 0 {
if h, ok := cmd.Actions[arg[0]]; ok { if h, ok := cmd.Actions[arg[0]]; ok {
return c._action(m, cmd, key, arg[0], h, arg[1:]...) return c._action(m, cmd, key, arg[0], h, arg[1:]...)
} }

View File

@ -1,7 +1,6 @@
package chrome package chrome
import ( import (
"net/http"
"path" "path"
"shylinux.com/x/ice" "shylinux.com/x/ice"
@ -14,31 +13,30 @@ import (
type cache struct { type cache struct {
ice.Hash ice.Hash
daemon daemon
short string `data:"link"` short string `data:"link"`
field string `data:"show,count,total,value,hash,type,name,link"` field string `data:"show,count,total,value,hash,type,name,link"`
path string `data:"usr/local/image"` path string `data:"usr/local/image/"`
list string `name:"list hash auto prunes" help:"缓存"` list string `name:"list hash auto prunes" help:"缓存"`
} }
func (c cache) Create(m *ice.Message, arg ...string) *ice.Message { func (s cache) Create(m *ice.Message, arg ...string) *ice.Message {
if c.Hash.List(m, m.Option(mdb.LINK)); m.Length() > 0 { if s.Hash.List(m, m.Option(mdb.LINK)); m.Length() > 0 {
return m // 已经下载 return m
} }
// h = c.Hash.Create(m.Spawn(), m.OptionSimple("show,type,name,link")...).Result() m.Option(mdb.HASH, s.Hash.Create(m.Spawn(), m.OptionSimple("show,type,name,link")...))
// m.Option(mdb.HASH, h) web.Download(m.Message, m.Option(mdb.LINK), func(count, total, value int) {
msg := m.Cmd("web.spide", ice.DEV, web.SPIDE_CACHE, http.MethodGet, m.Option(mdb.LINK), func(count, total, value int) { s.Hash.Modify(m, kit.Simple(mdb.COUNT, count, mdb.TOTAL, total, mdb.VALUE, value)...)
c.Hash.Modify(m, kit.Simple(mdb.COUNT, count, mdb.TOTAL, total, mdb.VALUE, kit.Format(value))...)
}) })
m.Cmdy(nfs.LINK, path.Join(m.Config(nfs.PATH), m.Option(mdb.NAME)), msg.Append(nfs.FILE)) name := kit.Keys(path.Base(m.Append(nfs.FILE)), path.Base(m.Append(mdb.TYPE)))
m.Cmdy(nfs.LINK, path.Join(m.Config(nfs.PATH), name), m.Append(nfs.FILE))
s.Hash.Modify(m, mdb.NAME, name)
web.ToastSuccess(m.Message) web.ToastSuccess(m.Message)
return m return m
} }
func (c cache) Prunes(m *ice.Message, arg ...string) { func (s cache) Prunes(m *ice.Message, arg ...string) {
c.Hash.Prunes(m, mdb.VALUE, "100") s.Hash.Prunes(m, mdb.VALUE, "100")
} }
func (c cache) List(m *ice.Message, arg ...string) { func (s cache) List(m *ice.Message, arg ...string) {
c.Hash.List(m, arg...) s.Hash.List(m, arg...)
} }
func init() { ice.CodeCtxCmd(cache{}) } func init() { ice.CodeCtxCmd(cache{}) }

View File

@ -1,45 +0,0 @@
package chrome
import (
"shylinux.com/x/ice"
"shylinux.com/x/icebergs/base/mdb"
"shylinux.com/x/icebergs/core/wiki"
kit "shylinux.com/x/toolkits"
)
type change struct {
ice.Hash
daemon
short string `data:"property"`
list string `name:"list wid tid selector:text@key property:textarea@key auto export import" help:"编辑"`
}
func (c change) Inputs(m *ice.Message, arg ...string) {
switch arg[0] {
case SELECTOR:
m.Push(arg[0], wiki.VIDEO)
fallthrough
default:
c.Hash.Inputs(m, arg...)
}
}
func (c change) List(m *ice.Message, arg ...string) {
if len(arg) < 2 || arg[2] == "" {
c.send(m, kit.Slice(arg, 0, 2))
return
}
c.send(m.Spawn(), kit.Slice(arg, 0, 2), m.CommandKey(), kit.Slice(arg, 2)).Tables(func(value ice.Maps) {
m.Push(mdb.TEXT, kit.ReplaceAll(value[mdb.TEXT], "<", "&lt;", ">", "&gt;"))
})
if len(arg) > 3 {
c.Hash.Create(m, SELECTOR, arg[2], PROPERTY, arg[3])
}
}
const (
SELECTOR = "selector"
PROPERTY = "property"
)
func init() { ice.CodeCtxCmd(change{}) }

View File

@ -1,8 +1,6 @@
package chrome package chrome
import ( import "shylinux.com/x/ice"
"shylinux.com/x/ice"
)
type chrome struct { type chrome struct {
ice.Code ice.Code
@ -10,8 +8,7 @@ type chrome struct {
list string `name:"list path auto order build download" help:"源码"` list string `name:"list path auto order build download" help:"源码"`
} }
func (c chrome) List(m *ice.Message, arg ...string) { func (s chrome) List(m *ice.Message, arg ...string) {
c.Code.Source(m, "", arg...) s.Code.Source(m, "", arg...)
} }
func init() { ice.CodeCtxCmd(chrome{}) } func init() { ice.CodeCtxCmd(chrome{}) }

View File

@ -9,7 +9,15 @@ refer `
chapter "安装" chapter "安装"
field "浏览器" web.code.chrome.chrome field "浏览器" web.code.chrome.chrome
field "操作流" web.code.chrome.operate field "浏览器" web.code.chrome.daemon
field "蜘蛛侠" web.code.chrome.spide
field "缓存池" web.code.chrome.cache
field "相册簿" web.wiki.feel
return
field "工具箱" web.code.chrome.field
field "样式表" web.code.chrome.style
field "编辑器" web.code.chrome.change field "编辑器" web.code.chrome.change
chapter "应用" chapter "应用"
@ -17,13 +25,8 @@ field "同步流" web.code.chrome.sync
field "收藏夹" web.code.chrome.favor field "收藏夹" web.code.chrome.favor
field "定制化" web.code.chrome.page field "定制化" web.code.chrome.page
field "样式表" web.code.chrome.style
field "工具箱" web.code.chrome.field
field "播放器" web.code.chrome.video field "播放器" web.code.chrome.video
field "蜘蛛侠" web.code.chrome.spide
field "缓存池" web.code.chrome.cache
field "相册簿" web.wiki.feel
chapter "源码" chapter "源码"
field "源代码" web.code.inner args `usr/icebergs/misc/chrome/ chrome.go` field "源代码" web.code.inner args `usr/icebergs/misc/chrome/ chrome.go`

View File

@ -2,65 +2,36 @@ package chrome
import ( import (
"shylinux.com/x/ice" "shylinux.com/x/ice"
"shylinux.com/x/icebergs/base/mdb"
"shylinux.com/x/icebergs/base/web" "shylinux.com/x/icebergs/base/web"
"shylinux.com/x/icebergs/core/wiki"
kit "shylinux.com/x/toolkits" kit "shylinux.com/x/toolkits"
) )
type daemon struct {
reload string `name:"reload" help:"刷新"`
list string `name:"list wid tid url auto" help:"操作"`
}
func (s daemon) send(m *ice.Message, arg ...ice.Any) *ice.Message {
return m.Cmdy(web.SPACE, "chrome", "chrome", arg)
}
func (s daemon) Inputs(m *ice.Message, arg ...string) {
switch arg[0] {
case mdb.ZONE:
s.send(m.Spawn()).Tables(func(value ice.Maps) {
s.send(m.Spawn(), value[WID]).Tables(func(value ice.Maps) { m.Push(mdb.ZONE, kit.ParseURL(value[URL]).Host) })
}).Sort(mdb.ZONE)
}
}
func (s daemon) Spide(m *ice.Message, arg ...string) {
if len(arg) < 2 {
s.send(m, arg)
return
}
s.send(m, arg[:2], "spide").Tables(func(value ice.Maps) {
switch value[mdb.TYPE] {
case wiki.VIDEO:
m.PushVideos(mdb.SHOW, value[mdb.LINK])
case wiki.IMG:
m.PushImages(mdb.SHOW, value[mdb.LINK])
default:
m.Push(mdb.SHOW, "")
}
}).Cut("show,type,name,link")
}
func (s daemon) Reload(m *ice.Message, arg ...string) {
s.send(m, arg[:2], "user.reload", ice.TRUE).ProcessHold()
}
func (s daemon) List(m *ice.Message, arg ...string) {
switch len(arg) {
case 3:
s.send(m, arg[:2], "user.jumps", arg[2])
case 2:
s.Spide(m, arg...)
m.Action(s.Reload)
default:
s.send(m, arg)
}
m.StatusTimeCount()
}
const ( const (
WID = "wid" WID = "wid"
TID = "tid" TID = "tid"
URL = "url" URL = "url"
) )
type daemon struct {
list string `name:"list wid tid url auto" help:"后台"`
}
func (s daemon) send(m *ice.Message, arg ...ice.Any) *ice.Message {
return m.Cmdy(web.SPACE, "chrome", "chrome", arg)
}
func (s daemon) Inputs(m *ice.Message, arg ...string) {
switch arg[0] {
case web.DOMAIN:
s.send(m.Spawn()).Tables(func(value ice.Maps) {
s.send(m.Spawn(), value[WID]).Tables(func(value ice.Maps) { m.Push(arg[0], kit.ParseURL(value[URL]).Host) })
}).Sort(arg[0])
}
}
func (s daemon) List(m *ice.Message, arg ...string) {
if len(arg) < 2 || arg[0] == "" || arg[1] == "" {
s.send(m, arg).StatusTimeCount()
} else {
s.send(m, arg[:2], "user.jumps", arg[2])
}
}
func init() { ice.CodeCtxCmd(daemon{}) } func init() { ice.CodeCtxCmd(daemon{}) }

View File

@ -1,20 +0,0 @@
package chrome
import (
"shylinux.com/x/ice"
)
type favor struct {
ice.Zone
short string `data:"zone"`
field string `data:"time,id,type,name,link"`
insert string `name:"insert zone*=官网文档 type name=hi link=*hello"`
list string `name:"list zone id auto insert" help:"收藏"`
}
func (f favor) List(m *ice.Message, arg ...string) {
if f.Zone.List(m, arg...); len(arg) == 0 {
m.Action(f.Export, f.Import)
}
}
func init() { ice.CodeCtxCmd(favor{}) }

View File

@ -4,42 +4,39 @@ import (
"shylinux.com/x/ice" "shylinux.com/x/ice"
"shylinux.com/x/icebergs/base/ctx" "shylinux.com/x/icebergs/base/ctx"
"shylinux.com/x/icebergs/base/mdb" "shylinux.com/x/icebergs/base/mdb"
"shylinux.com/x/icebergs/base/tcp" "shylinux.com/x/icebergs/base/web"
kit "shylinux.com/x/toolkits" kit "shylinux.com/x/toolkits"
) )
type field struct { type field struct {
ice.Zone ice.Zone
daemon daemon
short string `data:"domain"`
short string `data:"zone"`
field string `data:"time,id,index,args,style,left,top,right,bottom,selection"` field string `data:"time,id,index,args,style,left,top,right,bottom,selection"`
insert string `name:"insert zone=golang.google.cn index=cli.system args=pwd"` insert string `name:"insert domain=golang.google.cn index=cli.system args=pwd"`
list string `name:"list zone id auto insert" help:"插件"` list string `name:"list domain id auto insert" help:"插件"`
} }
func (f field) Inputs(m *ice.Message, arg ...string) { func (s field) Inputs(m *ice.Message, arg ...string) {
f.daemon.Inputs(m, arg...) s.daemon.Inputs(m, arg...)
} }
func (f field) Command(m *ice.Message, arg ...string) { func (s field) Command(m *ice.Message, arg ...string) {
m.OptionFields("") s.Zone.List(m.Spawn(), kit.Simple(m.Option(web.DOMAIN), arg)...).Table(func(index int, value ice.Maps, head []string) {
f.Zone.List(m.Spawn(), kit.Simple(m.Option(tcp.HOST), arg)...).Table(func(index int, value ice.Maps, head []string) {
if len(arg) == 0 { if len(arg) == 0 {
m.Option(ice.MSG_OPTS, head) m.Options(ice.MSG_OPTS, head, kit.Simple(value))
m.Options(kit.Simple(value)) s.send(m, "1", m.Option(TID), m.CommandKey(), value[mdb.ID], value[ctx.ARGS])
f.send(m.Spawn(), "1", m.Option(TID), m.CommandKey(), value[mdb.ID], value[ctx.ARGS])
} else { } else {
m.OptionFields("")
m.Cmdy(ctx.COMMAND, value[mdb.INDEX]) m.Cmdy(ctx.COMMAND, value[mdb.INDEX])
} }
}) })
} }
func (f field) Run(m *ice.Message, arg ...string) { func (s field) Run(m *ice.Message, arg ...string) {
f.Zone.List(m.Spawn(), m.Option(tcp.HOST), arg[0]).Tables(func(value ice.Maps) { s.Zone.List(m.Spawn(), m.Option(web.DOMAIN), arg[0]).Tables(func(value ice.Maps) {
m.Cmdy(value[mdb.INDEX], arg[1:]) m.Cmdy(value[mdb.INDEX], arg[1:])
}) })
} }
func (f field) List(m *ice.Message, arg ...string) { func (s field) List(m *ice.Message, arg ...string) {
f.Zone.List(m, arg...) s.Zone.List(m, arg...)
} }
func init() { ice.CodeCtxCmd(field{}) } func init() { ice.CodeCtxCmd(field{}) }

View File

@ -2,26 +2,25 @@ package chrome
import ( import (
"shylinux.com/x/ice" "shylinux.com/x/ice"
"shylinux.com/x/icebergs/base/mdb" "shylinux.com/x/icebergs/base/web"
) )
type page struct { type page struct {
daemon daemon
style style
field field
list string `name:"list domain auto" help:"网页" http:"/page"`
list string `name:"list zone auto" help:"网页" http:"/page"`
} }
func (p page) Command(m *ice.Message, arg ...string) { func (s page) Command(m *ice.Message, arg ...string) {
m.Cmdy(p.style.Command, arg) if m.Cmdy(s.field, s.field.Command, arg); len(arg) == 0 {
m.Cmdy(p.field.Command, arg) m.Cmd(s.style, s.style.Command, arg)
} }
func (p page) Run(m *ice.Message, arg ...string) {
m.Cmdy(p.field.Run, arg)
} }
func (p page) List(m *ice.Message, arg ...string) { func (s page) Run(m *ice.Message, arg ...string) {
p.daemon.Inputs(m, mdb.ZONE) m.Cmdy(s.field, s.Run, arg)
}
func (s page) List(m *ice.Message, arg ...string) {
s.daemon.Inputs(m, web.DOMAIN)
} }
func init() { ice.CodeCtxCmd(page{}) } func init() { ice.CodeCtxCmd(page{}) }

View File

@ -2,12 +2,12 @@ package chrome
import ( import (
"shylinux.com/x/ice" "shylinux.com/x/ice"
"shylinux.com/x/icebergs/base/mdb"
"shylinux.com/x/icebergs/core/wiki"
) )
type spide struct { type spide struct {
cache cache
download string `name:"download" help:"下载"`
list string `name:"list wid tid url auto insert" help:"节点"` list string `name:"list wid tid url auto insert" help:"节点"`
} }
@ -15,9 +15,21 @@ func (s spide) Download(m *ice.Message, arg ...string) {
m.Cmdy(s.cache.Create, arg).ProcessHold() m.Cmdy(s.cache.Create, arg).ProcessHold()
} }
func (s spide) List(m *ice.Message, arg ...string) { func (s spide) List(m *ice.Message, arg ...string) {
if s.Spide(m, arg...); len(arg) > 1 { if len(arg) < 2 || arg[0] == "" || arg[1] == "" {
m.PushAction(s.Download) s.daemon.List(m, arg...)
return
} }
s.send(m, arg[:2], "spide").Tables(func(value ice.Maps) {
switch value[mdb.TYPE] {
case wiki.AUDIO:
m.PushAudios(mdb.SHOW, value[mdb.LINK])
case wiki.VIDEO:
m.PushVideos(mdb.SHOW, value[mdb.LINK])
case wiki.IMG:
m.PushImages(mdb.SHOW, value[mdb.LINK])
default:
m.Push(mdb.SHOW, "")
}
}).Cut("show,type,name,link").PushAction(s.Download)
} }
func init() { ice.CodeCtxCmd(spide{}) } func init() { ice.CodeCtxCmd(spide{}) }

View File

@ -2,29 +2,32 @@ package chrome
import ( import (
"shylinux.com/x/ice" "shylinux.com/x/ice"
"shylinux.com/x/icebergs/base/tcp" "shylinux.com/x/icebergs/base/web"
)
const (
SELECTOR = "selector"
PROPERTY = "property"
) )
type style struct { type style struct {
ice.Zone ice.Zone
daemon daemon
short string `data:"domain"`
short string `data:"zone"`
field string `data:"time,id,selector,property"` field string `data:"time,id,selector,property"`
insert string `name:"insert zone=golang.google.cn selector=. property:textarea"` insert string `name:"insert domain=golang.google.cn selector=. property:textarea"`
list string `name:"style zone id auto insert" help:"样式"` list string `name:"style domain id auto insert" help:"样式"`
} }
func (s style) Inputs(m *ice.Message, arg ...string) { func (s style) Inputs(m *ice.Message, arg ...string) {
s.daemon.Inputs(m, arg...) s.daemon.Inputs(m, arg...)
} }
func (s style) Command(m *ice.Message, arg ...string) { func (s style) Command(m *ice.Message, arg ...string) {
s.Zone.List(m, m.Option(tcp.HOST)).Tables(func(value ice.Maps) { s.Zone.List(m, m.Option(web.DOMAIN)).Tables(func(value ice.Maps) {
s.send(m, "1", m.Option(TID), m.CommandKey(), value[SELECTOR], value[PROPERTY]) s.send(m, "1", m.Option(TID), m.CommandKey(), value[SELECTOR], value[PROPERTY])
}) })
} }
func (s style) List(m *ice.Message, arg ...string) { func (s style) List(m *ice.Message, arg ...string) {
s.Zone.List(m, arg...) s.Zone.List(m, arg...)
} }
func init() { ice.CodeCtxCmd(style{}) } func init() { ice.CodeCtxCmd(style{}) }

View File

@ -3,13 +3,10 @@ package chrome
import ( import (
"shylinux.com/x/ice" "shylinux.com/x/ice"
"shylinux.com/x/icebergs/base/mdb" "shylinux.com/x/icebergs/base/mdb"
"shylinux.com/x/icebergs/base/web"
) )
type sync struct { type sync struct {
ice.Lists ice.Lists
favor `name:"favor zone=some type name link"`
field string `data:"time,id,type,name,link"` field string `data:"time,id,type,name,link"`
insert string `name:"insert type name link" http:"/sync"` insert string `name:"insert type name link" http:"/sync"`
list string `name:"list id auto" help:"同步流"` list string `name:"list id auto" help:"同步流"`
@ -18,7 +15,7 @@ type sync struct {
func (s sync) Inputs(m *ice.Message, arg ...string) { func (s sync) Inputs(m *ice.Message, arg ...string) {
switch arg[0] { switch arg[0] {
case mdb.ZONE: case mdb.ZONE:
m.Cmdy(s.favor.Inputs, arg) m.Cmdy(arg)
default: default:
m.Cmdy(s.Lists.Inputs, arg) m.Cmdy(s.Lists.Inputs, arg)
} }
@ -26,13 +23,7 @@ func (s sync) Inputs(m *ice.Message, arg ...string) {
func (s sync) Insert(m *ice.Message, arg ...string) { func (s sync) Insert(m *ice.Message, arg ...string) {
s.Lists.Insert(m, arg...) s.Lists.Insert(m, arg...)
} }
func (s sync) Favor(m *ice.Message, arg ...string) {
m.Cmdy(s.favor.Insert, m.OptionSimple("zone,type,name,link"))
web.ToastSuccess(m.Message)
}
func (s sync) List(m *ice.Message, arg ...string) { func (s sync) List(m *ice.Message, arg ...string) {
s.Lists.List(m, arg...) s.Lists.List(m, arg...)
m.PushAction(s.Favor)
} }
func init() { ice.CodeCtxCmd(sync{}) } func init() { ice.CodeCtxCmd(sync{}) }

View File

@ -1,21 +0,0 @@
package chrome
import (
"shylinux.com/x/ice"
"shylinux.com/x/icebergs/base/ctx"
)
type video struct {
daemon
play string `name:"play" help:"播放"`
next string `name:"next" help:"下一集"`
list string `name:"list tags='ul.stui-content__playlist.column10.clearfix li a' rate=1.5 skip=140 next=2520 auto play next" help:"操作"`
}
func (v video) List(m *ice.Message, arg ...string) {
ctx.DisplayStory(m.Message, "video.js")
m.Echo("hello world")
}
func init() { ice.CodeCtxCmd(video{}) }

View File

@ -192,6 +192,11 @@ func (m *Message) PushVideos(key, src string) {
m.Push(key, Render(m, RENDER_VIDEOS, src)) 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))
}
}
func (m *Message) PushIFrame(key, src string) { func (m *Message) PushIFrame(key, src string) {
if !m.IsCliUA() { if !m.IsCliUA() {
m.Push(key, Render(m, RENDER_IFRAME, src)) m.Push(key, Render(m, RENDER_IFRAME, src))