From c5696ac9db661b27e1188058a5f33b0715dc991e Mon Sep 17 00:00:00 2001 From: harveyshao Date: Wed, 18 Aug 2021 10:34:24 +0800 Subject: [PATCH] opt some --- base/web/share.go | 2 +- base/web/space.go | 126 +++++++++++++++++++------------------------ core/chat/room.go | 70 ++++++++++++++++++++++++ core/code/autogen.go | 74 +++++++++++++++++++++---- go.mod | 2 +- 5 files changed, 193 insertions(+), 81 deletions(-) create mode 100644 core/chat/room.go diff --git a/base/web/share.go b/base/web/share.go index 09c4c961..eff923c6 100644 --- a/base/web/share.go +++ b/base/web/share.go @@ -19,7 +19,7 @@ import ( func _share_link(m *ice.Message, p string, arg ...interface{}) string { p = kit.Select("", "/share/local/", !strings.HasPrefix(p, "/")) + p - return tcp.ReplaceLocalhost(m, kit.MergeURL2(kit.Select(m.Conf(SHARE, kit.Keym("domain")), m.Option(ice.MSG_USERWEB)), p, arg...)) + return tcp.ReplaceLocalhost(m, kit.MergeURL2(kit.Select(m.Option(ice.MSG_USERWEB), m.Conf(SHARE, kit.Keym(kit.MDB_DOMAIN))), p, arg...)) } func _share_cache(m *ice.Message, arg ...string) { if pod := m.Option(cli.POD); m.PodCmd(CACHE, arg[0]) { diff --git a/base/web/space.go b/base/web/space.go index 15c65439..8a83a764 100644 --- a/base/web/space.go +++ b/base/web/space.go @@ -33,9 +33,7 @@ func _space_domain(m *ice.Message) string { return tcp.ReplaceLocalhost(m, link) } func _space_list(m *ice.Message, space string) { - if space == "" { - m.Fields(0, "time,type,name,text") - } + m.OptionFields(kit.Select(ice.MSG_DETAIL, "time,type,name,text", space == "")) m.Cmdy(mdb.SELECT, SPACE, "", mdb.HASH, kit.MDB_NAME, space) if space == "" { @@ -55,7 +53,7 @@ func _space_dial(m *ice.Message, dev, name string, arg ...string) { host := kit.Format(client[tcp.HOSTNAME]) proto := strings.Replace(kit.Format(client[tcp.PROTOCOL]), "http", "ws", 1) uri := kit.MergeURL(proto+"://"+host+"/space/", kit.MDB_TYPE, ice.Info.NodeType, - kit.MDB_NAME, name, "share", ice.Info.CtxShare, "river", ice.Info.CtxRiver, arg) + kit.MDB_NAME, name, SHARE, ice.Info.CtxShare, RIVER, ice.Info.CtxRiver, arg) if u, e := url.Parse(uri); m.Assert(e) { m.Go(func() { @@ -244,72 +242,60 @@ const ( const SPACE = "space" func init() { - Index.Merge(&ice.Context{ - Configs: map[string]*ice.Config{ - SPACE: {Name: SPACE, Help: "空间站", Value: kit.Data(kit.MDB_SHORT, kit.MDB_NAME, - "redial", kit.Dict("a", 3000, "b", 1000, "c", 1000, "r", ice.MOD_BUFS, "w", ice.MOD_BUFS), - "timeout", kit.Dict("c", "180s"), - )}, - }, - Commands: map[string]*ice.Command{ - SPACE: {Name: "space name cmd auto", Help: "空间站", Action: map[string]*ice.Action{ - tcp.DIAL: {Name: "dial dev name", Help: "连接", Hand: func(m *ice.Message, arg ...string) { - _space_dial(m, m.Option(SPIDE_DEV), kit.Select(ice.Info.NodeName, m.Option(kit.MDB_NAME))) - }}, - mdb.SEARCH: {Name: "search type name text", Help: "搜索", Hand: func(m *ice.Message, arg ...string) { - _space_search(m, arg[0], arg[1], kit.Select("", arg, 2)) - }}, - }, Hand: func(m *ice.Message, c *ice.Context, cmd string, arg ...string) { - if len(arg) < 2 { - _space_list(m, kit.Select("", arg, 0)) - return - } - _space_send(m, arg[0], arg[1:]...) + Index.Merge(&ice.Context{Configs: map[string]*ice.Config{ + SPACE: {Name: SPACE, Help: "空间站", Value: kit.Data(kit.MDB_SHORT, kit.MDB_NAME, + "redial", kit.Dict("a", 3000, "b", 1000, "c", 1000, "r", ice.MOD_BUFS, "w", ice.MOD_BUFS), + "timeout", kit.Dict("c", "180s"), + )}, + }, Commands: map[string]*ice.Command{ + SPACE: {Name: "space name cmd auto", Help: "空间站", Action: map[string]*ice.Action{ + tcp.DIAL: {Name: "dial dev name", Help: "连接", Hand: func(m *ice.Message, arg ...string) { + _space_dial(m, m.Option(SPIDE_DEV), kit.Select(ice.Info.NodeName, m.Option(kit.MDB_NAME))) }}, - - "/space/": {Name: "/space/ type name share river", Help: "空间站", Hand: func(m *ice.Message, c *ice.Context, cmd string, arg ...string) { - if s, e := websocket.Upgrade(m.W, m.R, nil, kit.Int(m.Conf(SPACE, "meta.buffer.r")), kit.Int(m.Conf(SPACE, "meta.buffer.w"))); m.Assert(e) { - name := kit.Select(s.RemoteAddr().String(), m.Option(kit.MDB_NAME)) - name = m.Option(kit.MDB_NAME, strings.Replace(name, ".", "_", -1)) - name = m.Option(kit.MDB_NAME, strings.Replace(name, ":", "-", -1)) - kind := kit.Select(WORKER, m.Option(kit.MDB_TYPE)) - share := m.Option("share") - river := m.Option("river") - - // 添加节点 - h := m.Rich(SPACE, nil, kit.Dict(SOCKET, s, "share", share, "river", river, - kit.MDB_TYPE, kind, kit.MDB_NAME, name, kit.MDB_TEXT, s.RemoteAddr().String(), - )) - - m.Go(func() { - defer m.Confv(SPACE, kit.Keys(kit.MDB_HASH, h), "") - - // 监听消息 - switch args := []string{kit.MDB_TYPE, kind, kit.MDB_NAME, name, "share", share, "river", river}; kind { - case WORKER: - m.Event(DREAM_START, args...) - defer m.Event(DREAM_STOP, args...) - default: - m.Event(SPACE_START, args...) - defer m.Event(SPACE_STOP, args...) - } - - switch kind { - case CHROME: - if m.Option(ice.MSG_USERNAME) != "" { - // break - } - - m.Go(func(msg *ice.Message) { - link := kit.MergeURL(_space_domain(msg), "grant", name) - msg.Sleep("100ms").Cmd(SPACE, name, "pwd", name, link, msg.Cmdx(cli.QRCODE, link)) - }) - } - - frame := m.Target().Server().(*Frame) - _space_handle(m, false, frame.send, s, name) - }) - } + mdb.SEARCH: {Name: "search type name text", Help: "搜索", Hand: func(m *ice.Message, arg ...string) { + _space_search(m, arg[0], arg[1], kit.Select("", arg, 2)) }}, - }}) + }, Hand: func(m *ice.Message, c *ice.Context, cmd string, arg ...string) { + if len(arg) < 2 { // 节点列表 + _space_list(m, kit.Select("", arg, 0)) + return + } + // 下发命令 + _space_send(m, arg[0], arg[1:]...) + }}, + + "/space/": {Name: "/space/ type name share river", Help: "空间站", Hand: func(m *ice.Message, c *ice.Context, cmd string, arg ...string) { + if s, e := websocket.Upgrade(m.W, m.R, nil, kit.Int(m.Conf(SPACE, "meta.buffer.r")), kit.Int(m.Conf(SPACE, "meta.buffer.w"))); m.Assert(e) { + name := kit.Select(s.RemoteAddr().String(), m.Option(kit.MDB_NAME)) + name = m.Option(kit.MDB_NAME, strings.Replace(name, ".", "_", -1)) + name = m.Option(kit.MDB_NAME, strings.Replace(name, ":", "-", -1)) + kind := kit.Select(WORKER, m.Option(kit.MDB_TYPE)) + + // 添加节点 + args := append([]string{kit.MDB_TYPE, kind, kit.MDB_NAME, name}, m.OptionSimple(SHARE, RIVER)...) + h := m.Rich(SPACE, nil, kit.Dict(SOCKET, s, kit.MDB_TEXT, s.RemoteAddr().String(), args)) + + m.Go(func() { + defer m.Confv(SPACE, kit.Keys(kit.MDB_HASH, h), "") + + switch kind { + case CHROME: // 交互节点 + m.Go(func(msg *ice.Message) { + link := kit.MergeURL(_space_domain(msg), "grant", name) + msg.Sleep("100ms").Cmd(SPACE, name, "pwd", name, link, msg.Cmdx(cli.QRCODE, link)) + }) + case WORKER: // 工作节点 + m.Event(DREAM_START, args...) + defer m.Event(DREAM_STOP, args...) + default: // 服务节点 + m.Event(SPACE_START, args...) + defer m.Event(SPACE_STOP, args...) + } + + frame := c.Server().(*Frame) + _space_handle(m, false, frame.send, s, name) + }) + } + }}, + }}) } diff --git a/core/chat/room.go b/core/chat/room.go new file mode 100644 index 00000000..075a80e5 --- /dev/null +++ b/core/chat/room.go @@ -0,0 +1,70 @@ +package chat + +import ( + ice "github.com/shylinux/icebergs" + "github.com/shylinux/icebergs/base/aaa" + "github.com/shylinux/icebergs/base/mdb" + "github.com/shylinux/icebergs/base/web" + kit "github.com/shylinux/toolkits" +) + +const ROOM = "room" +const JOIN = "join" + +func init() { + Index.Merge(&ice.Context{Configs: map[string]*ice.Config{ + ROOM: {Name: "room", Help: "room", Value: kit.Data( + kit.MDB_SHORT, "zone", + kit.MDB_FIELD, "time,id,type,name,text", + )}, + JOIN: {Name: "join", Help: "join", Value: kit.Data( + kit.MDB_SHORT, "zone", + kit.MDB_FIELD, "time,hash,username,socket", + )}, + }, Commands: map[string]*ice.Command{ + ROOM: {Name: "room zone id auto create insert join", Help: "room", Action: ice.MergeAction(map[string]*ice.Action{ + mdb.CREATE: {Name: "create zone", Help: "创建", Hand: func(m *ice.Message, arg ...string) { + m.Cmdy(mdb.INSERT, m.Prefix(ROOM), "", mdb.HASH, m.OptionSimple(kit.MDB_ZONE)) + m.Cmdy(mdb.INSERT, m.Prefix(JOIN), "", mdb.HASH, m.OptionSimple(kit.MDB_ZONE)) + }}, + mdb.INSERT: {Name: "insert zone type name text", Help: "发送", Hand: func(m *ice.Message, arg ...string) { + m.Cmdy(mdb.INSERT, m.Prefix(ROOM), "", mdb.ZONE, m.Option(kit.MDB_ZONE), arg[2:]) + m.Cmdy(JOIN, m.Option(kit.MDB_ZONE)).Table(func(index int, value map[string]string, head []string) { + m.Option(ice.MSG_DAEMON, value[web.SOCKET]) + m.Toast(m.Option("text"), m.Option("name")) + }) + }}, + + "join": {Name: "join", Help: "加入", Hand: func(m *ice.Message, arg ...string) { + m.Cmd(JOIN, mdb.INSERT, arg) + }}, + "exit": {Name: "exit", Help: "退出"}, + }, mdb.ZoneAction()), Hand: func(m *ice.Message, c *ice.Context, cmd string, arg ...string) { + m.Fields(len(arg), mdb.ZONE_FIELD, m.Conf(ROOM, kit.META_FIELD)) + m.Cmdy(mdb.SELECT, m.Prefix(ROOM), "", mdb.ZONE, arg) + }}, + JOIN: {Name: "join zone hash auto", Help: "join", Action: ice.MergeAction(map[string]*ice.Action{ + mdb.CREATE: {Name: "create zone", Help: "创建", Hand: func(m *ice.Message, arg ...string) { + m.Cmdy(mdb.INSERT, m.Prefix(ROOM), "", mdb.HASH, m.OptionSimple(kit.MDB_ZONE)) + m.Cmdy(mdb.INSERT, m.Prefix(JOIN), "", mdb.HASH, m.OptionSimple(kit.MDB_ZONE)) + }}, + mdb.INSERT: {Name: "insert zone username daemon", Hand: func(m *ice.Message, arg ...string) { + m.Conf(m.Prefix(JOIN), kit.Keys(kit.KeyHash(m.Option(kit.MDB_ZONE)), kit.Keym(kit.MDB_SHORT)), web.SOCKET) + m.Cmdy(mdb.INSERT, m.Prefix(JOIN), kit.KeyHash(m.Option(kit.MDB_ZONE)), mdb.HASH, + aaa.USERNAME, m.Option(ice.MSG_USERNAME), web.SOCKET, m.Option(ice.MSG_DAEMON), + ) + }}, + mdb.DELETE: {Name: "delete zone socket", Hand: func(m *ice.Message, arg ...string) { + m.Cmdy(mdb.DELETE, m.Prefix(JOIN), kit.KeyHash(m.Option(kit.MDB_ZONE)), mdb.HASH, m.OptionSimple(web.SOCKET)) + }}, + }), Hand: func(m *ice.Message, c *ice.Context, cmd string, arg ...string) { + m.Fields(len(arg), mdb.ZONE_FIELD, m.Conf(JOIN, kit.META_FIELD)) + if len(arg) == 0 { + m.Cmdy(mdb.SELECT, m.Prefix(JOIN), "", mdb.HASH) + } else { + m.Cmdy(mdb.SELECT, m.Prefix(JOIN), kit.KeyHash(arg[0]), mdb.HASH, arg[1:]) + m.PushAction(mdb.REMOVE) + } + }}, + }}) +} diff --git a/core/code/autogen.go b/core/code/autogen.go index ad77899d..67ad11c0 100644 --- a/core/code/autogen.go +++ b/core/code/autogen.go @@ -22,6 +22,35 @@ field "{{.Option "name"}}" web.code.{{.Option "name"}}.{{.Option "name"}} func _autogen_source(m *ice.Message, name string) { m.Cmd(nfs.PUSH, ice.SRC_MAIN_SHY, "\n", kit.SSH_SOURCE+` `+path.Join(name, kit.Keys(name, SHY)), "\n") } +func _autogen_modules(m *ice.Message, dir string, ctx string, from string) { + m.Cmd(nfs.DEFS, ice.GO_MOD, kit.Format(`module %s + +go 1.11 +`, path.Base(kit.Path("")))) + + m.Option(kit.MDB_NAME, ctx) + buf, _ := kit.Render(`package {{.Option "name"}} + +import ( + "github.com/shylinux/ice" +) + +type {{.Option "name"}} struct { + ice.Hash +} + +func (h {{.Option "name"}}) List(m *ice.Message, arg ...string) { + h.Hash.List(m, arg...) +} + +func init() { + ice.Cmd("web.code.{{.Option "name"}}", &{{.Option "name"}}{}, []*ice.Show{ + {Name: "list hash auto create", Help: "{{.Option "name"}}"}, + }) +} +`, m) + m.Cmd(nfs.SAVE, dir, string(buf)) +} func _autogen_module(m *ice.Message, dir string, ctx string, from string) (list []string) { m.Cmd(nfs.DEFS, ice.GO_MOD, kit.Format(`module %s @@ -51,22 +80,47 @@ go 1.11 m.Cmd(nfs.SAVE, dir, strings.Join(list, ice.NL)) return } -func _autogen_import(m *ice.Message, main string, ctx string, mod string) (list []string) { +func _autogen_imports(m *ice.Message, main string, ctx string, mod string) (list []string) { m.Cmd(nfs.DEFS, main, `package main -import ( - ice "github.com/shylinux/icebergs" - _ "github.com/shylinux/icebergs/base" - _ "github.com/shylinux/icebergs/core" - _ "github.com/shylinux/icebergs/misc" -) +import "github.com/shylinux/ice" func main() { print(ice.Run()) } `) + done := false m.Cmd(nfs.CAT, main, func(line string, index int) { + if done { + return + } if list = append(list, line); strings.HasPrefix(line, "import (") { list = append(list, kit.Format(` _ "%s/src/%s"`, mod, ctx), "") + done = true + } else if list = append(list, line); strings.HasPrefix(line, "import") { + list = append(list, "", kit.Format(`import _ "%s/src/%s"`, mod, ctx), "") + done = true + } + }) + + m.Cmd(nfs.SAVE, main, strings.Join(list, ice.NL)) + return +} +func _autogen_import(m *ice.Message, main string, ctx string, mod string) (list []string) { + m.Cmd(nfs.DEFS, main, `package main + +import "github.com/shylinux/ice" + +func main() { print(ice.Run()) } +`) + + done := false + m.Cmd(nfs.CAT, main, func(line string, index int) { + if done { + return + } + if list = append(list, line); strings.HasPrefix(line, "import (") { + list = append(list, kit.Format(` _ "%s/src/%s"`, mod, ctx), "") + done = true } }) @@ -135,8 +189,10 @@ func init() { } if p := path.Join(kit.SSH_SRC, m.Option(kit.MDB_NAME), kit.Keys(m.Option(kit.MDB_NAME), GO)); !kit.FileExists(p) { - _autogen_module(m, p, m.Option(kit.MDB_NAME), m.Option(kit.MDB_FROM)) - _autogen_import(m, m.Option(kit.MDB_MAIN), m.Option(kit.MDB_NAME), _autogen_mod(m, ice.GO_MOD)) + // _autogen_module(m, p, m.Option(kit.MDB_NAME), m.Option(kit.MDB_FROM)) + // _autogen_import(m, m.Option(kit.MDB_MAIN), m.Option(kit.MDB_NAME), _autogen_mod(m, ice.GO_MOD)) + _autogen_modules(m, p, m.Option(kit.MDB_NAME), m.Option(kit.MDB_FROM)) + _autogen_imports(m, m.Option(kit.MDB_MAIN), m.Option(kit.MDB_NAME), _autogen_mod(m, ice.GO_MOD)) } }}, mdb.INPUTS: {Name: "inputs", Help: "补全", Hand: func(m *ice.Message, arg ...string) { diff --git a/go.mod b/go.mod index 920d843d..65703132 100644 --- a/go.mod +++ b/go.mod @@ -6,7 +6,7 @@ require ( github.com/AaronO/go-git-http v0.0.0-20161214145340-1d9485b3a98f github.com/gorilla/websocket v1.4.2 github.com/kr/pty v1.1.8 - github.com/shylinux/toolkits v0.2.6 + github.com/shylinux/toolkits v0.2.7 github.com/skip2/go-qrcode v0.0.0-20200617195104-da1b6568686e golang.org/x/crypto v0.0.0-20210322153248-0c34fe9e7dc2 )