1
0
mirror of https://shylinux.com/x/icebergs synced 2025-06-27 02:37:31 +08:00
This commit is contained in:
IT 老营长 @云轩领航-创始人 2024-02-29 20:14:28 +08:00
parent d7116def5b
commit d89e143cb8
8 changed files with 61 additions and 23 deletions

View File

@ -63,6 +63,7 @@ const (
) )
const ( const (
AUTH = "auth" AUTH = "auth"
ACCESS = "access"
PUBLIC = "public" PUBLIC = "public"
PRIVATE = "private" PRIVATE = "private"
CONFIRM = "confirm" CONFIRM = "confirm"

View File

@ -25,10 +25,7 @@ import (
func _dream_list(m *ice.Message, simple bool) *ice.Message { func _dream_list(m *ice.Message, simple bool) *ice.Message {
list := m.CmdMap(SPACE, mdb.NAME) list := m.CmdMap(SPACE, mdb.NAME)
mdb.HashSelects(m.Spawn()).Table(func(value ice.Maps, index int, head []string) { mdb.HashSelects(m.Spawn()).Table(func(value ice.Maps, index int, head []string) {
if value["access"] == "private" { if value[aaa.ACCESS] == aaa.PRIVATE && (m.Option(ice.FROM_SPACE) != "" || !aaa.IsTechOrRoot(m)) {
// return
}
if value["access"] == "private" && !aaa.IsTechOrRoot(m) {
return return
} }
m.Push("", value, kit.Slice(head, 0, -1)) m.Push("", value, kit.Slice(head, 0, -1))
@ -294,6 +291,7 @@ func init() {
m.OptionDefault(mdb.ICONS, nfs.USR_ICONS_CONTEXTS) m.OptionDefault(mdb.ICONS, nfs.USR_ICONS_CONTEXTS)
if mdb.HashCreate(m); ice.Info.Important == true { if mdb.HashCreate(m); ice.Info.Important == true {
_dream_start(m, m.Option(mdb.NAME)) _dream_start(m, m.Option(mdb.NAME))
StreamPushRefreshConfirm(m, m.Trans("refresh for new space ", "刷新列表查看新空间 ")+m.Option(mdb.NAME))
} }
}}, }},
DOWNLOAD: {Name: "download path link", Hand: func(m *ice.Message, arg ...string) { DOWNLOAD: {Name: "download path link", Hand: func(m *ice.Message, arg ...string) {
@ -427,7 +425,9 @@ func init() {
} }
}}, }},
"settings": {Name: "settings restart=manual,always access=public,private", Help: "设置", Hand: func(m *ice.Message, arg ...string) { "settings": {Name: "settings restart=manual,always access=public,private", Help: "设置", Hand: func(m *ice.Message, arg ...string) {
mdb.HashModify(m, m.OptionSimple(mdb.NAME, "restart", "access")) kit.If(m.Option(cli.RESTART) == "manual", func() { m.Option(cli.RESTART, "") })
kit.If(m.Option(aaa.ACCESS) == aaa.PUBLIC, func() { m.Option(aaa.ACCESS, "") })
mdb.HashModify(m, m.OptionSimple(mdb.NAME, cli.RESTART, aaa.ACCESS))
}}, }},
STATS_TABLES: {Hand: func(m *ice.Message, arg ...string) { STATS_TABLES: {Hand: func(m *ice.Message, arg ...string) {
if msg := _dream_list(m.Spawn(), true); msg.Length() > 0 { if msg := _dream_list(m.Spawn(), true); msg.Length() > 0 {

View File

@ -77,6 +77,7 @@ const (
LAYOUT = "layout" LAYOUT = "layout"
RESIZE = "resize" RESIZE = "resize"
REFRESH = "refresh" REFRESH = "refresh"
CONFIRM = "confirm"
FILTER = "filter" FILTER = "filter"
DANGER = "danger" DANGER = "danger"

View File

@ -131,6 +131,7 @@ func init() {
mdb.TYPE, aaa.TECH, mdb.ICONS, nfs.USR_ICONS_ICEBERGS, mdb.TYPE, aaa.TECH, mdb.ICONS, nfs.USR_ICONS_ICEBERGS,
TARGET, kit.Keys(ice.OPS, m.Option(DOMAIN), m.Option(mdb.NAME)), TARGET, kit.Keys(ice.OPS, m.Option(DOMAIN), m.Option(mdb.NAME)),
) )
StreamPushRefreshConfirm(m, m.Trans("refresh for new space ", "刷新列表查看新空间 ")+kit.Keys(m.Option(DOMAIN), m.Option(mdb.NAME)))
}}, }},
}, ctx.ConfAction(mdb.FIELD, "time,domain,status,type,name,text,icons,repos,binary,module,version", ctx.TOOLS, kit.Simple(SPIDE, STATUS, VERSION))), Hand: func(m *ice.Message, arg ...string) { }, ctx.ConfAction(mdb.FIELD, "time,domain,status,type,name,text,icons,repos,binary,module,version", ctx.TOOLS, kit.Simple(SPIDE, STATUS, VERSION))), Hand: func(m *ice.Message, arg ...string) {
if kit.HasPrefixList(arg, ctx.ACTION) { if kit.HasPrefixList(arg, ctx.ACTION) {

View File

@ -92,6 +92,7 @@ func _space_fork(m *ice.Message) {
gdb.Event(m, SPACE_LOGIN, args) gdb.Event(m, SPACE_LOGIN, args)
defer gdb.Event(m, SPACE_LOGIN_CLOSE, args) defer gdb.Event(m, SPACE_LOGIN_CLOSE, args)
case PORTAL: case PORTAL:
defer gdb.EventDeferEvent(m, PORTAL_OPEN, args)(PORTAL_CLOSE, args)
m.Go(func() { m.Cmd(SPACE, name, cli.PWD, name) }) m.Go(func() { m.Cmd(SPACE, name, cli.PWD, name) })
case WORKER: case WORKER:
defer gdb.EventDeferEvent(m, DREAM_OPEN, args)(DREAM_CLOSE, args) defer gdb.EventDeferEvent(m, DREAM_OPEN, args)(DREAM_CLOSE, args)
@ -267,6 +268,8 @@ const (
SPACE_GRANT = "space.grant" SPACE_GRANT = "space.grant"
SPACE_OPEN = "space.open" SPACE_OPEN = "space.open"
SPACE_CLOSE = "space.close" SPACE_CLOSE = "space.close"
PORTAL_OPEN = "portal.open"
PORTAL_CLOSE = "portal.close"
) )
const SPACE = "space" const SPACE = "space"

View File

@ -1,39 +1,69 @@
package web package web
import ( import (
"strings"
ice "shylinux.com/x/icebergs" ice "shylinux.com/x/icebergs"
"shylinux.com/x/icebergs/base/cli" "shylinux.com/x/icebergs/base/cli"
"shylinux.com/x/icebergs/base/ctx" "shylinux.com/x/icebergs/base/ctx"
"shylinux.com/x/icebergs/base/gdb"
"shylinux.com/x/icebergs/base/mdb" "shylinux.com/x/icebergs/base/mdb"
"shylinux.com/x/icebergs/base/web/html"
kit "shylinux.com/x/toolkits" kit "shylinux.com/x/toolkits"
) )
func _stream_subkey(m *ice.Message, arg ...string) *ice.Message {
kit.If(len(arg) == 0, func() { arg = append(arg, kit.Hashs(kit.Fields(m.Option(ice.MSG_SPACE), m.Option(ice.MSG_INDEX)))) })
return m.Options(mdb.SUBKEY, kit.Keys(mdb.HASH, arg[0]), ice.MSG_FIELDS, mdb.Config(m, mdb.FIELDS))
}
const STREAM = "stream" const STREAM = "stream"
func init() { func init() {
Index.MergeCommands(ice.Commands{ Index.MergeCommands(ice.Commands{
STREAM: {Name: "stream hash daemon auto", Help: "在线", Actions: ice.MergeActions(ice.Actions{ STREAM: {Name: "stream hash daemon auto", Help: "推送流", Actions: ice.MergeActions(ice.Actions{
ONLINE: {Hand: func(m *ice.Message, arg ...string) { ONLINE: {Hand: func(m *ice.Message, arg ...string) {
mdb.HashCreate(m, SPACE, m.Option(ice.MSG_SPACE), ctx.INDEX, m.Option(ice.MSG_INDEX), mdb.HashCreate(m, SPACE, m.Option(ice.MSG_SPACE), ctx.INDEX, m.Option(ice.MSG_INDEX), mdb.SHORT, cli.DAEMON, mdb.FIELD, mdb.Config(m, mdb.FIELDS))
mdb.SHORT, cli.DAEMON, mdb.FIELD, mdb.Config(m, mdb.FIELDS)) mdb.HashCreate(_stream_subkey(m), ParseUA(m))
m.Option(mdb.SUBKEY, kit.Keys(mdb.HASH, kit.Hashs(kit.Fields(m.Option(ice.MSG_SPACE), m.Option(ice.MSG_INDEX))))) mdb.HashSelect(m)
mdb.HashCreate(m, ParseUA(m))
mdb.HashSelect(m.Options(ice.MSG_FIELDS, mdb.Config(m, mdb.FIELDS)))
}}, }},
"push": {Hand: func(m *ice.Message, arg ...string) { "push": {Hand: func(m *ice.Message, arg ...string) {
m.Option(mdb.SUBKEY, kit.Keys(mdb.HASH, kit.Hashs(kit.Fields(m.Option(ice.MSG_SPACE), m.Option(ice.MSG_INDEX))))) mdb.HashSelect(_stream_subkey(m)).Table(func(value ice.Maps) {
mdb.HashSelect(m).Table(func(value ice.Maps) { m.Cmd(SPACE, value[cli.DAEMON], arg) }) if value[cli.DAEMON] != m.Option(ice.MSG_DAEMON) {
m.Options(mdb.SUBKEY, "").Cmd(SPACE, value[cli.DAEMON], arg)
}
})
}}, }},
}, mdb.HashAction( PORTAL_CLOSE: {Hand: func(m *ice.Message, arg ...string) {
mdb.HashSelect(m).Table(func(value ice.Maps) {
mdb.HashSelect(_stream_subkey(m, value[mdb.HASH]).Spawn()).Table(func(value ice.Maps) {
if strings.HasPrefix(value[cli.DAEMON], m.Option(mdb.NAME)) {
mdb.HashRemove(m, mdb.HASH, kit.Hashs(value[cli.DAEMON]))
}
})
})
}},
}, gdb.EventsAction(PORTAL_CLOSE), mdb.ClearOnExitHashAction(), mdb.HashAction(
mdb.SHORT, "space,index", mdb.FIELD, "time,hash,space,index", mdb.SHORT, "space,index", mdb.FIELD, "time,hash,space,index",
mdb.FIELDS, "time,daemon,userrole,username,usernick,avatar,icons,agent,system,ip,ua", mdb.FIELDS, "time,daemon,userrole,username,usernick,avatar,icons,agent,system,ip,ua",
)), Hand: func(m *ice.Message, arg ...string) { )), Hand: func(m *ice.Message, arg ...string) {
if len(arg) == 0 { if len(arg) == 0 {
mdb.HashSelect(m) mdb.HashSelect(m)
} else { } else {
m.Option(mdb.SUBKEY, kit.Keys(mdb.HASH, arg[0])) mdb.HashSelect(_stream_subkey(m, arg[0]), arg[1:]...)
mdb.HashSelect(m.Options(ice.MSG_FIELDS, mdb.Config(m, mdb.FIELDS)), arg[1:]...)
} }
}}, }},
}) })
} }
func StreamPush(m *ice.Message, arg ...string) {
if ice.Info.NodeType == WORKER {
m.Option(ice.MSG_SPACE, m.Option(ice.MSG_USERPOD))
} else {
m.Option(ice.MSG_SPACE, "")
}
m.Option(ice.MSG_INDEX, m.ShortKey())
AdminCmd(m, STREAM, "push", arg)
}
func StreamPushRefreshConfirm(m *ice.Message, arg ...string) {
StreamPush(m.Spawn(ice.Maps{"space.noecho": "true"}), kit.Simple(html.REFRESH, html.CONFIRM, arg)...)
}

View File

@ -33,20 +33,20 @@ func init() {
mdb.ZoneInsert(m, append(arg, "direct", tcp.SEND, aaa.USERNAME, m.Option(ice.MSG_USERNAME), aaa.USERNICK, m.Option(ice.MSG_USERNICK), aaa.AVATAR, m.Option(ice.MSG_AVATAR))) mdb.ZoneInsert(m, append(arg, "direct", tcp.SEND, aaa.USERNAME, m.Option(ice.MSG_USERNAME), aaa.USERNICK, m.Option(ice.MSG_USERNICK), aaa.AVATAR, m.Option(ice.MSG_AVATAR)))
kit.If(mdb.HashSelectField(m, arg[0], web.TARGET), func(p string) { m.Cmd(web.SPACE, p, MESSAGE, tcp.RECV, arg[1:]) }) kit.If(mdb.HashSelectField(m, arg[0], web.TARGET), func(p string) { m.Cmd(web.SPACE, p, MESSAGE, tcp.RECV, arg[1:]) })
mdb.HashSelectUpdate(m, arg[0], func(value ice.Map) { kit.Value(value, mdb.TIME, m.Time()) }) mdb.HashSelectUpdate(m, arg[0], func(value ice.Map) { kit.Value(value, mdb.TIME, m.Time()) })
web.StreamPushRefreshConfirm(m, m.Trans("refresh for new message ", "刷新列表查看新消息 "))
}}, }},
tcp.RECV: {Role: aaa.VOID, Hand: func(m *ice.Message, arg ...string) { tcp.RECV: {Role: aaa.VOID, Hand: func(m *ice.Message, arg ...string) {
mdb.ZoneInsert(m, kit.Simple(mdb.ZONE, m.Option(ice.FROM_SPACE), arg, "direct", tcp.RECV, aaa.USERNAME, m.Option(ice.MSG_USERNAME), aaa.USERNICK, m.Option(ice.MSG_USERNICK), aaa.AVATAR, m.Option(ice.MSG_AVATAR))) mdb.ZoneInsert(m, kit.Simple(mdb.ZONE, m.Option(ice.FROM_SPACE), arg, "direct", tcp.RECV, aaa.USERNAME, m.Option(ice.MSG_USERNAME), aaa.USERNICK, m.Option(ice.MSG_USERNICK), aaa.AVATAR, m.Option(ice.MSG_AVATAR)))
mdb.HashSelectUpdate(m, m.Option(ice.FROM_SPACE), func(value ice.Map) { kit.Value(value, web.TARGET, m.Option(ice.FROM_SPACE)) }) mdb.HashSelectUpdate(m, m.Option(ice.FROM_SPACE), func(value ice.Map) { kit.Value(value, web.TARGET, m.Option(ice.FROM_SPACE)) })
mdb.HashSelectUpdate(m, m.Option(ice.FROM_SPACE), func(value ice.Map) { kit.Value(value, mdb.TIME, m.Time()) }) mdb.HashSelectUpdate(m, m.Option(ice.FROM_SPACE), func(value ice.Map) { kit.Value(value, mdb.TIME, m.Time()) })
web.StreamPushRefreshConfirm(m, m.Trans("refresh for new message ", "刷新列表查看新消息 "))
}}, }},
web.DREAM_CREATE: {Hand: func(m *ice.Message, arg ...string) { web.DREAM_CREATE: {Hand: func(m *ice.Message, arg ...string) {
if ice.Info.Important { if ice.Info.Important {
messageInsert(m, web.DREAM, mdb.TYPE, "plug", ctx.INDEX, IFRAME, ctx.ARGS, web.S(m.Option(mdb.NAME))) messageInsert(m, web.DREAM, mdb.TYPE, "plug", ctx.INDEX, IFRAME, ctx.ARGS, web.S(m.Option(mdb.NAME)))
} }
}}, }},
web.OPEN: {Hand: func(m *ice.Message, arg ...string) { web.OPEN: {Hand: func(m *ice.Message, arg ...string) { m.ProcessOpen(m.MergePod(m.Option(web.TARGET))) }},
m.ProcessOpen(m.MergePod(m.Option(web.TARGET)))
}},
ctx.COMMAND: {Hand: func(m *ice.Message, arg ...string) { ctx.COMMAND: {Hand: func(m *ice.Message, arg ...string) {
if m.Option("direct") == "recv" { if m.Option("direct") == "recv" {
m.Cmdy(web.Space(m, m.Option(web.TARGET)), ctx.COMMAND, arg[0]).ProcessField(ctx.ACTION, ctx.RUN, m.Option(web.TARGET), arg[0]) m.Cmdy(web.Space(m, m.Option(web.TARGET)), ctx.COMMAND, arg[0]).ProcessField(ctx.ACTION, ctx.RUN, m.Option(web.TARGET), arg[0])
@ -54,9 +54,7 @@ func init() {
m.Cmdy(ctx.COMMAND, arg[0]).ProcessField(ctx.ACTION, ctx.RUN, "", arg[0]) m.Cmdy(ctx.COMMAND, arg[0]).ProcessField(ctx.ACTION, ctx.RUN, "", arg[0])
} }
}}, }},
ctx.RUN: {Hand: func(m *ice.Message, arg ...string) { ctx.RUN: {Hand: func(m *ice.Message, arg ...string) { m.Cmdy(web.Space(m, arg[0]), arg[1], arg[2:]) }},
m.Cmdy(web.Space(m, arg[0]), arg[1], arg[2:])
}},
}, web.DreamAction(), web.DreamTablesAction(), mdb.ZoneAction( }, web.DreamAction(), web.DreamTablesAction(), mdb.ZoneAction(
mdb.SHORT, mdb.ZONE, mdb.FIELD, "time,hash,type,zone,icons,title,count,target", mdb.SHORT, mdb.ZONE, mdb.FIELD, "time,hash,type,zone,icons,title,count,target",
mdb.FIELDS, "time,id,type,name,text,space,index,args,style,display,username,usernick,avatar,direct", mdb.FIELDS, "time,id,type,name,text,space,index,args,style,display,username,usernick,avatar,direct",

View File

@ -4,7 +4,7 @@ Volcanos(chat.ONIMPORT, {
can.ui = can.onappend.layout(can), can.onimport._project(can, msg) can.ui = can.onappend.layout(can), can.onimport._project(can, msg)
can.onimport._online(can) can.onimport._online(can)
}, },
_project: function(can, msg) { var select, current = can.db.hash[0]||ice.DEV _project: function(can, msg) { var select, current = can.db.hash[0]||can.sup.db.current||ice.DEV
can.page.insertBefore(can, [{view: wiki.TITLE, list: [ can.page.insertBefore(can, [{view: wiki.TITLE, list: [
{icon: "bi bi-three-dots", onclick: function() { can._legend.onclick(event) }}, {icon: "bi bi-three-dots", onclick: function() { can._legend.onclick(event) }},
{text: "message"||can.ConfIndex(), onclick: function(event) { can._legend.onclick(event) }}, {text: "message"||can.ConfIndex(), onclick: function(event) { can._legend.onclick(event) }},
@ -17,6 +17,7 @@ Volcanos(chat.ONIMPORT, {
{view: wiki.CONTENT, list: [{text: value.target||"[未知消息]"}]}, {view: wiki.CONTENT, list: [{text: value.target||"[未知消息]"}]},
]}, ]},
], onclick: function(event) { can.isCmdMode() && can.misc.SearchHash(can, value.zone), can.onimport._switch(can, false) ], onclick: function(event) { can.isCmdMode() && can.misc.SearchHash(can, value.zone), can.onimport._switch(can, false)
can.sup.db.current = value.zone
can.db.zone = value, can.db.hash = value.hash, can.onmotion.select(can, can.ui.project, html.DIV_ITEM, _target) can.db.zone = value, can.db.hash = value.hash, can.onmotion.select(can, can.ui.project, html.DIV_ITEM, _target)
if (can.onmotion.cache(can, function(save, load) { if (can.onmotion.cache(can, function(save, load) {
can.ui.message && save({title: can.ui.title, message: can.ui.message, scroll: can.ui.message.scrollTop}) can.ui.message && save({title: can.ui.title, message: can.ui.message, scroll: can.ui.message.scrollTop})
@ -89,6 +90,9 @@ Volcanos(chat.ONIMPORT, {
can.ui.title && can.page.style(can, can.ui.message, html.HEIGHT, can.ui.content.offsetHeight-can.ui.title.offsetHeight) can.ui.title && can.page.style(can, can.ui.message, html.HEIGHT, can.ui.content.offsetHeight-can.ui.title.offsetHeight)
}, },
}, [""]) }, [""])
Volcanos(chat.ONDAEMON, {
refresh: function(can, msg, sub, arg) { can.base.isFunc(sub.Update) && sub.Update(), can.user.toast(can, "new message") },
})
Volcanos(chat.ONEXPORT, { Volcanos(chat.ONEXPORT, {
plugHeight: function(can, value) { var height = can.base.Min(can.ui.content.offsetHeight-240, 240) plugHeight: function(can, value) { var height = can.base.Min(can.ui.content.offsetHeight-240, 240)
return can.base.Max(html.STORY_HEIGHT, height, height/(can.base.isIn(value.index, html.IFRAME)? 1: 2)) return can.base.Max(html.STORY_HEIGHT, height, height/(can.base.isIn(value.index, html.IFRAME)? 1: 2))