1
0
mirror of https://shylinux.com/x/icebergs synced 2025-05-01 19:19:24 +08:00
This commit is contained in:
harveyshao 2021-08-18 10:34:24 +08:00
parent 3a70827cc2
commit c5696ac9db
5 changed files with 193 additions and 81 deletions

View File

@ -19,7 +19,7 @@ import (
func _share_link(m *ice.Message, p string, arg ...interface{}) string { func _share_link(m *ice.Message, p string, arg ...interface{}) string {
p = kit.Select("", "/share/local/", !strings.HasPrefix(p, "/")) + p 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) { func _share_cache(m *ice.Message, arg ...string) {
if pod := m.Option(cli.POD); m.PodCmd(CACHE, arg[0]) { 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) return tcp.ReplaceLocalhost(m, link)
} }
func _space_list(m *ice.Message, space string) { func _space_list(m *ice.Message, space string) {
if space == "" { m.OptionFields(kit.Select(ice.MSG_DETAIL, "time,type,name,text", space == ""))
m.Fields(0, "time,type,name,text")
}
m.Cmdy(mdb.SELECT, SPACE, "", mdb.HASH, kit.MDB_NAME, space) m.Cmdy(mdb.SELECT, SPACE, "", mdb.HASH, kit.MDB_NAME, space)
if space == "" { if space == "" {
@ -55,7 +53,7 @@ func _space_dial(m *ice.Message, dev, name string, arg ...string) {
host := kit.Format(client[tcp.HOSTNAME]) host := kit.Format(client[tcp.HOSTNAME])
proto := strings.Replace(kit.Format(client[tcp.PROTOCOL]), "http", "ws", 1) proto := strings.Replace(kit.Format(client[tcp.PROTOCOL]), "http", "ws", 1)
uri := kit.MergeURL(proto+"://"+host+"/space/", kit.MDB_TYPE, ice.Info.NodeType, 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) { if u, e := url.Parse(uri); m.Assert(e) {
m.Go(func() { m.Go(func() {
@ -244,72 +242,60 @@ const (
const SPACE = "space" const SPACE = "space"
func init() { func init() {
Index.Merge(&ice.Context{ Index.Merge(&ice.Context{Configs: map[string]*ice.Config{
Configs: map[string]*ice.Config{ SPACE: {Name: SPACE, Help: "空间站", Value: kit.Data(kit.MDB_SHORT, kit.MDB_NAME,
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),
"redial", kit.Dict("a", 3000, "b", 1000, "c", 1000, "r", ice.MOD_BUFS, "w", ice.MOD_BUFS), "timeout", kit.Dict("c", "180s"),
"timeout", kit.Dict("c", "180s"), )},
)}, }, Commands: map[string]*ice.Command{
}, SPACE: {Name: "space name cmd auto", Help: "空间站", Action: map[string]*ice.Action{
Commands: map[string]*ice.Command{ tcp.DIAL: {Name: "dial dev name", Help: "连接", Hand: func(m *ice.Message, arg ...string) {
SPACE: {Name: "space name cmd auto", Help: "空间站", Action: map[string]*ice.Action{ _space_dial(m, m.Option(SPIDE_DEV), kit.Select(ice.Info.NodeName, m.Option(kit.MDB_NAME)))
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:]...)
}}, }},
mdb.SEARCH: {Name: "search type name text", Help: "搜索", Hand: func(m *ice.Message, arg ...string) {
"/space/": {Name: "/space/ type name share river", Help: "空间站", Hand: func(m *ice.Message, c *ice.Context, cmd string, arg ...string) { _space_search(m, arg[0], arg[1], kit.Select("", arg, 2))
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)
})
}
}}, }},
}}) }, 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)
}
}},
}})
}

View File

@ -22,6 +22,35 @@ field "{{.Option "name"}}" web.code.{{.Option "name"}}.{{.Option "name"}}
func _autogen_source(m *ice.Message, name string) { 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") 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) { 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 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)) m.Cmd(nfs.SAVE, dir, strings.Join(list, ice.NL))
return 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 m.Cmd(nfs.DEFS, main, `package main
import ( import "github.com/shylinux/ice"
ice "github.com/shylinux/icebergs"
_ "github.com/shylinux/icebergs/base"
_ "github.com/shylinux/icebergs/core"
_ "github.com/shylinux/icebergs/misc"
)
func main() { print(ice.Run()) } func main() { print(ice.Run()) }
`) `)
done := false
m.Cmd(nfs.CAT, main, func(line string, index int) { m.Cmd(nfs.CAT, main, func(line string, index int) {
if done {
return
}
if list = append(list, line); strings.HasPrefix(line, "import (") { if list = append(list, line); strings.HasPrefix(line, "import (") {
list = append(list, kit.Format(` _ "%s/src/%s"`, mod, ctx), "") 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) { 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_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_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) { mdb.INPUTS: {Name: "inputs", Help: "补全", Hand: func(m *ice.Message, arg ...string) {

2
go.mod
View File

@ -6,7 +6,7 @@ require (
github.com/AaronO/go-git-http v0.0.0-20161214145340-1d9485b3a98f github.com/AaronO/go-git-http v0.0.0-20161214145340-1d9485b3a98f
github.com/gorilla/websocket v1.4.2 github.com/gorilla/websocket v1.4.2
github.com/kr/pty v1.1.8 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 github.com/skip2/go-qrcode v0.0.0-20200617195104-da1b6568686e
golang.org/x/crypto v0.0.0-20210322153248-0c34fe9e7dc2 golang.org/x/crypto v0.0.0-20210322153248-0c34fe9e7dc2
) )