package ice import ( "fmt" "net/url" "path" "strings" kit "github.com/shylinux/toolkits" ) func (m *Message) Prefix(arg ...string) string { return kit.Keys(m.Cap(CTX_FOLLOW), arg) } func (m *Message) Save(arg ...string) *Message { if len(arg) == 0 { for k := range m.target.Configs { arg = append(arg, k) } } list := []string{} for _, k := range arg { list = append(list, m.Prefix(k)) } m.Cmd("ctx.config", "save", m.Prefix("json"), list) return m } func (m *Message) Load(arg ...string) *Message { list := []string{} for _, k := range arg { list = append(list, m.Prefix(k)) } m.Cmd("ctx.config", "load", m.Prefix("json"), list) return m } func (m *Message) Watch(key string, arg ...string) *Message { if len(arg) == 0 { arg = append(arg, m.Prefix("auto")) } m.Cmd("gdb.event", "action", "listen", "event", key, kit.SSH_CMD, strings.Join(arg, " ")) return m } func (m *Message) Event(key string, arg ...string) *Message { m.Cmd("gdb.event", "action", "action", "event", key, arg) return m } func (m *Message) Right(arg ...interface{}) bool { return m.Option(MSG_USERROLE) == "root" || !m.Warn(m.Cmdx("aaa.role", "right", m.Option(MSG_USERROLE), strings.ReplaceAll(kit.Keys(arg...), "/", ".")) != "ok", ErrNotRight, m.Option(MSG_USERROLE), " of ", strings.Join(kit.Simple(arg), "."), " at ", kit.FileLine(2, 3)) } func (m *Message) Space(arg interface{}) []string { if arg == nil || arg == "" || kit.Format(arg) == m.Conf("cli.runtime", "node.name") { return nil } return []string{"web.space", kit.Format(arg)} } func (m *Message) ShowPlugin(pod, ctx, cmd string, arg ...string) { m.Cmdy("web.space", pod, "context", ctx, "command", cmd) m.Option(MSG_PROCESS, PROCESS_FIELD) m.Option(FIELD_PREFIX, arg) } func (m *Message) PushPodCmd(cmd string, arg ...string) { m.Table(func(index int, value map[string]string, head []string) { m.Push(kit.SSH_POD, m.Option(MSG_USERPOD)) }) m.Cmd("web.space").Table(func(index int, value map[string]string, head []string) { switch value[kit.MDB_TYPE] { case "worker", "server": if value[kit.MDB_NAME] == Info.HostName { break } m.Cmd("web.space", value[kit.MDB_NAME], m.Prefix(cmd), arg).Table(func(index int, val map[string]string, head []string) { val[kit.SSH_POD] = kit.Keys(value[kit.MDB_NAME], val[kit.SSH_POD]) m.Push("", val, head) }) } }) } func (m *Message) PushSearch(args ...interface{}) { data := kit.Dict(args...) for _, k := range kit.Split(m.Option("fields")) { switch k { case kit.SSH_POD: // m.Push(k, kit.Select(m.Option(MSG_USERPOD), data[kit.SSH_POD])) case kit.SSH_CTX: m.Push(k, m.Prefix()) case kit.SSH_CMD: m.Push(k, data[kit.SSH_CMD]) case kit.MDB_TIME: m.Push(k, kit.Select(m.Time(), data[k])) default: m.Push(k, kit.Select("", data[k])) } } } func (m *Message) PushSearchWeb(cmd string, name string) { msg := m.Spawn() msg.Option("fields", "type,name,text") msg.Cmd("mdb.select", m.Prefix(cmd), "", kit.MDB_HASH).Table(func(index int, value map[string]string, head []string) { text := kit.MergeURL(value[kit.MDB_TEXT], value[kit.MDB_NAME], name) if value[kit.MDB_NAME] == "" { text = kit.MergeURL(value[kit.MDB_TEXT] + url.QueryEscape(name)) } m.PushSearch(kit.SSH_CMD, cmd, kit.MDB_TYPE, kit.Select("", value[kit.MDB_TYPE]), kit.MDB_NAME, name, kit.MDB_TEXT, text) }) } func (m *Message) IsTermUA() bool { return m.Option(MSG_USERUA) == "" || strings.Contains(m.Option(MSG_USERUA), "curl") } func Render(m *Message, cmd string, args ...interface{}) string { if m.IsTermUA() { switch arg := kit.Simple(args...); cmd { case RENDER_QRCODE: // text [size] return m.Cmdx("cli.qrcode", arg[0]) } return "" } switch arg := kit.Simple(args...); cmd { case RENDER_DOWNLOAD: // [name] file if arg[0] == "" { return "" } if len(arg) == 1 { arg[0] = kit.MergeURL2(m.Option(MSG_USERWEB), path.Join(kit.Select("", "/share/local", !strings.HasPrefix(arg[0], "/")), arg[0]), kit.SSH_POD, m.Option(MSG_USERPOD)) } else { arg[1] = kit.MergeURL2(m.Option(MSG_USERWEB), path.Join(kit.Select("", "/share/local", !strings.HasPrefix(arg[1], "/")), arg[1]), kit.SSH_POD, m.Option(MSG_USERPOD)) } return fmt.Sprintf(`%s`, kit.Select(arg[0], arg, 1), path.Base(arg[0]), arg[0]) case RENDER_ANCHOR: // [name] link return fmt.Sprintf(`%s`, kit.Select(arg[0], arg, 1), arg[0]) case RENDER_BUTTON: // name... list := []string{} for _, k := range kit.Split(strings.Join(arg, ",")) { list = append(list, fmt.Sprintf(``, k, kit.Select(k, kit.Value(m._cmd.Meta, kit.Keys("trans", k))))) } return strings.Join(list, "") case RENDER_IMAGES: // src [size] return fmt.Sprintf(``, arg[0], kit.Select("120", arg, 1)) case RENDER_VIDEOS: // src [size] return fmt.Sprintf(`