diff --git a/etc/init.shy b/etc/init.shy index cb6565d9..53804ae1 100644 --- a/etc/init.shy +++ b/etc/init.shy @@ -1,3 +1,4 @@ +config debug on ~aaa login root root ~web serve ./ ":9090" diff --git a/src/contexts/mdb/mdb.go b/src/contexts/mdb/mdb.go index 15cecf3c..a1c80fd6 100644 --- a/src/contexts/mdb/mdb.go +++ b/src/contexts/mdb/mdb.go @@ -206,55 +206,63 @@ var Index = &ctx.Context{Name: "mdb", Help: "数据中心", } // }}} }}, - "list": &ctx.Command{Name: "list add table field", Help: "执行查询语句", Hand: func(m *ctx.Message, c *ctx.Context, key string, arg ...string) { - mdb, ok := m.Target().Server.(*MDB) // {{{ - m.Assert(ok) - if len(arg) == 0 { - for _, k := range mdb.list_key { - m.Echo("%s: %v\n", k, mdb.list[k]) + "list": &ctx.Command{Name: "list add table field [where condition]", Help: "执行查询语句", + Formats: map[string]int{"where": 1}, + Hand: func(m *ctx.Message, c *ctx.Context, key string, arg ...string) { + mdb, ok := m.Target().Server.(*MDB) // {{{ + m.Assert(ok) + if len(arg) == 0 { + for _, k := range mdb.list_key { + m.Echo("%s: %v\n", k, mdb.list[k]) + } + return } - return - } - switch arg[0] { - case "add": - if mdb.list == nil { - mdb.list = make(map[string][]string) - } - mdb.list[m.Cap("count")] = arg[1:] - mdb.list_key = append(mdb.list_key, m.Cap("count")) - m.Capi("count", 1) - case "set": - mdb.list[arg[1]] = arg[2:] - default: - if table, ok := mdb.list[arg[0]]; ok { - msg := m.Spawn(m.Target()) + switch arg[0] { + case "add": + if mdb.list == nil { + mdb.list = make(map[string][]string) + } + mdb.list[m.Cap("count")] = append(mdb.list[m.Cap("count")], m.Option("where")) + mdb.list[m.Cap("count")] = append(mdb.list[m.Cap("count")], arg[1:]...) + mdb.list_key = append(mdb.list_key, m.Cap("count")) + m.Capi("count", 1) + case "set": + mdb.list[arg[1]] = []string{m.Option("where")} + mdb.list[arg[1]] = append(mdb.list[arg[1]], arg[2:]...) + default: + if table, ok := mdb.list[arg[0]]; ok { + msg := m.Spawn(m.Target()) - fields := strings.Join(table[1:], ",") - condition := "" - if len(arg) > 1 && len(arg[1]) > 0 { - condition = fmt.Sprintf("where %s", arg[1]) - } - other := "" - if len(arg) > 2 { - other = strings.Join(arg[2:], " ") - } + fields := strings.Join(table[2:], ",") + condition := "" + if len(arg) > 1 && len(arg[1]) > 0 { + condition = fmt.Sprintf("where %s", arg[1]) + } else if len(table[0]) > 0 { + condition = fmt.Sprintf("where %s", table[0]) + } - msg.Cmd("query", fmt.Sprintf("select %s from %s %s %s", fields, table[0], condition, other)) - for _, k := range msg.Meta["append"] { - m.Echo("\t%s", k) - } - m.Echo("\n") - for i := 0; i < len(msg.Meta[msg.Meta["append"][0]]); i++ { + other := "" + if len(arg) > 2 { + other = strings.Join(arg[2:], " ") + } + + msg.Cmd("query", fmt.Sprintf("select %s from %s %s %s", fields, table[1], condition, other)) + m.Echo("%s %s\n", table[1], condition) for _, k := range msg.Meta["append"] { - m.Echo("\t%s", msg.Meta[k][i]) + m.Echo("%s\t", k) } m.Echo("\n") + for i := 0; i < len(msg.Meta[msg.Meta["append"][0]]); i++ { + for _, k := range msg.Meta["append"] { + m.Echo("%s\t", msg.Meta[k][i]) + } + m.Echo("\n") + } } } - } - // }}} - }}, + // }}} + }}, }, Index: map[string]*ctx.Context{ "void": &ctx.Context{Name: "void", diff --git a/src/contexts/nfs/nfs.go b/src/contexts/nfs/nfs.go index 7cbe51d0..eb3c4fba 100644 --- a/src/contexts/nfs/nfs.go +++ b/src/contexts/nfs/nfs.go @@ -6,6 +6,7 @@ import ( // {{{ "bufio" "encoding/json" "fmt" + "github.com/nsf/termbox-go" "github.com/skip2/go-qrcode" "io" "net/url" @@ -23,19 +24,26 @@ type NFS struct { send map[int]*ctx.Message target *ctx.Context - in *os.File - out *os.File - buf []string + in *os.File + out *os.File + buf []string + cli *ctx.Message + x, y int + *ctx.Message *ctx.Context } func (nfs *NFS) print(str string, arg ...interface{}) bool { // {{{ switch { case nfs.io != nil: - fmt.Fprintf(nfs.io, str, arg...) + str := fmt.Sprintf(str, arg...) + nfs.y += strings.Count(str, "\n") + fmt.Fprintf(nfs.in, "%s", str) case nfs.out != nil: - fmt.Fprintf(nfs.out, str, arg...) + str := fmt.Sprintf(str, arg...) + nfs.y += strings.Count(str, "\n") + fmt.Fprintf(nfs.out, "%s", str) default: return false } @@ -43,6 +51,94 @@ func (nfs *NFS) print(str string, arg ...interface{}) bool { // {{{ } // }}} +func (nfs *NFS) clear(line string) { + termbox.SetCursor(nfs.x, nfs.y) + termbox.Flush() + nfs.print(" ") + + termbox.SetCursor(nfs.x, nfs.y) + termbox.Flush() + + nfs.print("%s%s", nfs.cli.Conf("PS1"), line) + +} +func (nfs *NFS) Read(p []byte) (n int, err error) { + if nfs.Cap("stream") != "stdio" { + return nfs.in.Read(p) + } + + his := len(nfs.buf) + buf := make([]rune, 0, 1024) + back := buf + + for { + switch ev := termbox.PollEvent(); ev.Type { + case termbox.EventKey: + switch ev.Key { + case termbox.KeyCtrlC: + termbox.Close() + os.Exit(1) + case termbox.KeyCtrlJ, termbox.KeyEnter: + buf = append(buf, '\n') + nfs.print("\n") + nfs.y++ + + b := []byte(string(buf[:len(buf)])) + n = len(b) + nfs.Log("fuck", nil, "%d %v", n, b) + copy(p, b) + return + case termbox.KeyCtrlP: + his = (his + len(nfs.buf) - 1) % len(nfs.buf) + b := nfs.buf[his] + buf = buf[:len(b)] + n := copy(buf, []rune(b)) + buf = buf[:n] + + nfs.clear(string(buf)) + case termbox.KeyCtrlN: + his = (his + len(nfs.buf) - 1) % len(nfs.buf) + b := nfs.buf[his] + buf = buf[:len(b)] + n := copy(buf, []rune(b)) + buf = buf[:n] + + nfs.clear(string(buf)) + case termbox.KeyCtrlH: + if len(buf) > 0 { + buf = buf[:len(buf)-1] + nfs.clear(string(buf)) + n-- + } + case termbox.KeyCtrlL: + termbox.Sync() + nfs.y = 0 + nfs.clear(string(buf)) + case termbox.KeyCtrlU: + nfs.clear("") + if len(buf) > 0 { + back = buf + } + buf = make([]rune, 0, 1024) + n = 0 + case termbox.KeyCtrlY: + buf = back + n = len(buf) + nfs.clear(string(buf)) + case termbox.KeySpace: + nfs.print(" ") + buf = append(buf, ' ') + n++ + default: + print(string(ev.Ch)) + buf = append(buf, ev.Ch) + n++ + } + } + } + return + +} func (nfs *NFS) Spawn(m *ctx.Message, c *ctx.Context, arg ...string) ctx.Server { // {{{ c.Caches = map[string]*ctx.Cache{ @@ -84,6 +180,7 @@ func (nfs *NFS) Begin(m *ctx.Message, arg ...string) ctx.Server { // {{{ // }}} func (nfs *NFS) Start(m *ctx.Message, arg ...string) bool { // {{{ + nfs.Message = m if socket, ok := m.Data["io"]; ok { nfs.io = socket.(io.ReadWriteCloser) nfs.Reader = bufio.NewReader(nfs.io) @@ -204,8 +301,12 @@ func (nfs *NFS) Start(m *ctx.Message, arg ...string) bool { // {{{ } cli := m.Reply() + nfs.cli = cli yac := m.Find(cli.Conf("yac")) - bio := bufio.NewScanner(nfs.in) + bio := bufio.NewScanner(nfs) + if m.Cap("stream") == "stdio" { + termbox.Init() + } nfs.Context.Master(nil) pos := 0 @@ -266,6 +367,9 @@ out: } else { m.Cap("status", "stop") } + if m.Cap("stream") == "stdio" { + termbox.Close() + } return false } diff --git a/src/contexts/web/web.go b/src/contexts/web/web.go index 9ba99e64..d0376e66 100644 --- a/src/contexts/web/web.go +++ b/src/contexts/web/web.go @@ -414,6 +414,7 @@ var Index = &ctx.Context{Name: "web", Help: "应用中心", method = m.Option("method") } + m.Echo("%s", uri) var body io.Reader index := strings.Index(uri, "?") switch method { @@ -523,6 +524,17 @@ var Index = &ctx.Context{Name: "web", Help: "应用中心", "/demo": &ctx.Command{Name: "/demo", Help: "应用示例", Hand: func(m *ctx.Message, c *ctx.Context, key string, arg ...string) { m.Add("append", "hi", "hello") }}, + "temp": &ctx.Command{Name: "temp", Help: "应用示例", Hand: func(m *ctx.Message, c *ctx.Context, key string, arg ...string) { + msg := m.Spawn(m.Target()) + question := []string{} + for i := 1; i < 21; i++ { + question = append(question, fmt.Sprintf("{\"type\":\"1001\",\"title\":{\"text\":\"第%d题\"}}", i)) + } + qs := "[" + strings.Join(question, ",") + "]" + + msg.Cmd("get", "method", "POST", "evaluating_add/", "questions", qs) + m.Add("append", "hi", "hello") + }}, }, }