1
0
mirror of https://shylinux.com/x/icebergs synced 2025-04-26 01:24:05 +08:00
This commit is contained in:
shylinux 2021-08-17 22:06:55 +08:00
commit ab25d2d6c4
3 changed files with 127 additions and 71 deletions

View File

@ -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]) {

View File

@ -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)
})
}
}},
}})
}

70
core/chat/room.go Normal file
View File

@ -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)
}
}},
}})
}