1
0
forked from x/icebergs
icebergs/base/web/share.go
2020-05-21 20:53:22 +08:00

252 lines
8.7 KiB
Go

package web
import (
"os"
ice "github.com/shylinux/icebergs"
kit "github.com/shylinux/toolkits"
"fmt"
"path"
"strings"
)
func init() {
Index.Merge(&ice.Context{
Configs: map[string]*ice.Config{
ice.WEB_SHARE: {Name: "share", Help: "共享链", Value: kit.Data(
"index", "usr/volcanos/share.html",
"template", share_template,
"expire", "72h",
)},
},
Commands: map[string]*ice.Command{
ice.WEB_SHARE: {Name: "share share auto", Help: "共享链", Hand: func(m *ice.Message, c *ice.Context, cmd string, arg ...string) {
if len(arg) == 0 {
// 共享列表
m.Grows(ice.WEB_SHARE, nil, "", "", func(index int, value map[string]interface{}) {
m.Push("", value, []string{kit.MDB_TIME, "share", kit.MDB_TYPE, kit.MDB_NAME, kit.MDB_TEXT})
m.Push("value", fmt.Sprintf(m.Conf(ice.WEB_SHARE, "meta.template.link"), m.Conf(ice.WEB_SHARE, "meta.domain"), value["share"], value["share"]))
})
return
}
if len(arg) == 1 {
// 共享详情
if m.Richs(ice.WEB_SHARE, nil, arg[0], func(key string, value map[string]interface{}) {
m.Push("detail", value)
m.Push("key", "link")
m.Push("value", fmt.Sprintf(m.Conf(ice.WEB_SHARE, "meta.template.link"), m.Conf(ice.WEB_SHARE, "meta.domain"), key, key))
m.Push("key", "share")
m.Push("value", fmt.Sprintf(m.Conf(ice.WEB_SHARE, "meta.template.share"), m.Conf(ice.WEB_SHARE, "meta.domain"), key))
m.Push("key", "value")
m.Push("value", fmt.Sprintf(m.Conf(ice.WEB_SHARE, "meta.template.value"), m.Conf(ice.WEB_SHARE, "meta.domain"), key))
}) != nil {
return
}
}
switch arg[0] {
case "invite":
arg = []string{arg[0], m.Cmdx(ice.WEB_SHARE, "add", "invite", kit.Select("tech", arg, 1), kit.Select("miss", arg, 2))}
fallthrough
case "check":
m.Richs(ice.WEB_SHARE, nil, arg[1], func(key string, value map[string]interface{}) {
m.Render(ice.RENDER_QRCODE, kit.Format(kit.Dict(
kit.MDB_TYPE, "share", kit.MDB_NAME, value["type"], kit.MDB_TEXT, key,
)))
})
case "auth":
m.Richs(ice.WEB_SHARE, nil, arg[1], func(key string, value map[string]interface{}) {
switch value["type"] {
case "active":
m.Cmdy(ice.WEB_SPACE, value["name"], "sessid", m.Cmdx(ice.AAA_SESS, "create", arg[2]))
case "user":
m.Cmdy(ice.AAA_ROLE, arg[2], value["name"])
default:
m.Cmdy(ice.AAA_SESS, "auth", value["text"], arg[2])
}
})
case "add":
arg = arg[1:]
fallthrough
default:
if len(arg) == 2 {
arg = append(arg, "")
}
extra := kit.Dict(arg[3:])
// 创建共享
h := m.Rich(ice.WEB_SHARE, nil, kit.Dict(
kit.MDB_TIME, m.Time(m.Conf(ice.WEB_SHARE, "meta.expire")),
kit.MDB_TYPE, arg[0], kit.MDB_NAME, arg[1], kit.MDB_TEXT, arg[2],
"extra", extra,
))
// 创建列表
m.Grow(ice.WEB_SHARE, nil, kit.Dict(
kit.MDB_TYPE, arg[0], kit.MDB_NAME, arg[1], kit.MDB_TEXT, arg[2],
"share", h,
))
m.Log(ice.LOG_CREATE, "share: %s extra: %s", h, kit.Format(extra))
m.Echo(h)
}
}},
"/share/": {Name: "/share/", Help: "共享链", Hand: func(m *ice.Message, c *ice.Context, cmd string, arg ...string) {
switch arg[0] {
case "local":
m.Render(ice.RENDER_DOWNLOAD, m.Cmdx(arg[1], path.Join(arg[2:]...)))
return
}
m.Richs(ice.WEB_SHARE, nil, arg[0], func(key string, value map[string]interface{}) {
m.Log(ice.LOG_EXPORT, "%s: %v", arg, kit.Format(value))
if m.Option(ice.MSG_USERROLE) != ice.ROLE_ROOT && kit.Time(kit.Format(value[kit.MDB_TIME])) < kit.Time(m.Time()) {
m.Echo("invalid")
return
}
switch value["type"] {
case ice.TYPE_SPACE:
case ice.TYPE_STORY:
// 查询数据
msg := m.Cmd(ice.WEB_STORY, ice.STORY_INDEX, value["text"])
if msg.Append("text") == "" && kit.Value(value, "extra.pod") != "" {
msg = m.Cmd(ice.WEB_SPACE, kit.Value(value, "extra.pod"), ice.WEB_STORY, ice.STORY_INDEX, value["text"])
}
value = kit.Dict("type", msg.Append("scene"), "name", msg.Append("story"), "text", msg.Append("text"), "file", msg.Append("file"))
m.Log(ice.LOG_EXPORT, "%s: %v", arg, kit.Format(value))
}
switch kit.Select("", arg, 1) {
case "download", "下载":
if strings.HasPrefix(kit.Format(value["text"]), m.Conf(ice.WEB_CACHE, "meta.path")) {
m.Render(ice.RENDER_DOWNLOAD, value["text"], value["type"], value["name"])
} else {
m.Render("%s", value["text"])
}
return
case "detail", "详情":
m.Render(kit.Formats(value))
return
case "share", "共享码":
m.Render(ice.RENDER_QRCODE, kit.Format("%s/share/%s/?share=%s", m.Conf(ice.WEB_SHARE, "meta.domain"), key, key))
return
case "check", "安全码":
m.Render(ice.RENDER_QRCODE, kit.Format(kit.Dict(
kit.MDB_TYPE, "share", kit.MDB_NAME, value["type"], kit.MDB_TEXT, key,
)))
return
case "value", "数据值":
m.Render(ice.RENDER_QRCODE, kit.Format(value), kit.Select("256", arg, 2))
return
case "text":
m.Render(ice.RENDER_QRCODE, kit.Format(value["text"]))
return
}
switch value["type"] {
case ice.TYPE_RIVER:
// 共享群组
m.Render("redirect", "/", "share", key, "river", kit.Format(value["text"]))
case ice.TYPE_STORM:
// 共享应用
m.Render("redirect", "/", "share", key, "storm", kit.Format(value["text"]), "river", kit.Format(kit.Value(value, "extra.river")))
case ice.TYPE_ACTION:
if len(arg) == 1 {
// 跳转主页
m.Render("redirect", "/share", "share", arg[0], "title", kit.Format(value["name"]))
break
}
if arg[1] == "" {
// 返回主页
Render(m, ice.RENDER_DOWNLOAD, m.Conf(ice.WEB_SERVE, "meta.page.share"))
break
}
if len(arg) == 2 {
// 应用列表
value["count"] = kit.Int(value["count"]) + 1
kit.Fetch(kit.Value(value, "extra.tool"), func(index int, value map[string]interface{}) {
m.Push("river", arg[0])
m.Push("storm", arg[1])
m.Push("action", index)
m.Push("node", value["pod"])
m.Push("group", value["ctx"])
m.Push("index", value["cmd"])
m.Push("args", value["args"])
msg := m.Cmd(m.Space(value["pod"]), ice.CTX_COMMAND, value["ctx"], value["cmd"])
m.Push("name", value["cmd"])
m.Push("help", kit.Select(msg.Append("help"), kit.Format(value["help"])))
m.Push("inputs", msg.Append("list"))
m.Push("feature", msg.Append("meta"))
})
break
}
// 默认参数
meta := kit.Value(value, kit.Format("extra.tool.%s", arg[2])).(map[string]interface{})
if meta["single"] == "yes" && kit.Select("", arg, 3) != "action" {
arg = append(arg[:3], kit.Simple(kit.UnMarshal(kit.Format(meta["args"])))...)
for i := len(arg) - 1; i >= 0; i-- {
if arg[i] != "" {
break
}
arg = arg[:i]
}
}
// 执行命令
cmds := kit.Simple(m.Space(meta["pod"]), kit.Keys(meta["ctx"], meta["cmd"]), arg[3:])
m.Cmdy(cmds).Option("cmds", cmds)
m.Option("title", value["name"])
default:
// 查看数据
m.Option("type", value["type"])
m.Option("name", value["name"])
m.Option("text", value["text"])
m.Render(ice.RENDER_TEMPLATE, m.Conf(ice.WEB_SHARE, "meta.template.simple"))
m.Option(ice.MSG_OUTPUT, ice.RENDER_RESULT)
}
})
}},
"/plugin/github.com/": {Name: "/space/", Help: "空间站", Hand: func(m *ice.Message, c *ice.Context, cmd string, arg ...string) {
prefix := m.Conf(ice.WEB_SERVE, "meta.volcanos.require")
repos := path.Join(strings.Split(cmd, "/")[2:5]...)
if _, e := os.Stat(path.Join(prefix, repos)); e != nil {
m.Cmd(ice.CLI_SYSTEM, "git", "clone", "https://"+repos, path.Join(prefix, repos))
}
m.Render(ice.RENDER_DOWNLOAD, path.Join(prefix, repos, path.Join(arg[2:]...)))
}},
"/publish/": {Name: "/publish/", Help: "空间站", Hand: func(m *ice.Message, c *ice.Context, cmd string, arg ...string) {
if p := m.Option("pod"); p != "" {
m.Option("pod", "")
m.Cmdy(ice.WEB_SPACE, p, "web./publish/", arg)
m.Render(ice.RENDER_RESULT)
return
}
p := path.Join(kit.Simple(m.Conf(ice.WEB_SERVE, "meta.publish"), arg)...)
if m.W == nil {
m.Cmdy("nfs.cat", p)
return
}
m.Render(ice.RENDER_DOWNLOAD, p)
}},
"/local/": {Name: "/space/", Help: "空间站", Hand: func(m *ice.Message, c *ice.Context, cmd string, arg ...string) {
p := path.Join(cmd)
switch strings.TrimSuffix(path.Ext(p), ".") {
case "js":
m.Render(ice.RENDER_DOWNLOAD, p)
}
}},
}}, nil)
}