From a7fa8f241cc6f0257cfd7b65ab913913bc464af1 Mon Sep 17 00:00:00 2001 From: harveyshao Date: Tue, 17 Aug 2021 21:30:14 +0800 Subject: [PATCH] add chat.room --- base/web/share.go | 2 +- base/web/space.go | 126 +++++++++++++++++++++------------------------- core/chat/room.go | 70 ++++++++++++++++++++++++++ 3 files changed, 127 insertions(+), 71 deletions(-) create mode 100644 core/chat/room.go diff --git a/base/web/share.go b/base/web/share.go index 2c488dec..d09eba7e 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) + } + }}, + }}) +}