From 8ac1104d6f7c78595a1f17a15019cc9b3a632eaf Mon Sep 17 00:00:00 2001 From: Liang Ding Date: Fri, 21 Oct 2022 11:35:02 +0800 Subject: [PATCH] =?UTF-8?q?:art:=20`Alt+5`=20=E6=89=93=E5=BC=80=E5=B7=B2?= =?UTF-8?q?=E6=9C=89=E6=97=A5=E8=AE=B0=E6=97=B6=E4=B8=8D=E5=9C=A8=E5=86=85?= =?UTF-8?q?=E6=A0=B8=E4=BC=BA=E6=9C=8D=E5=AE=A2=E6=88=B7=E7=AB=AF=E4=B9=8B?= =?UTF-8?q?=E9=97=B4=E5=90=8C=E6=AD=A5=20Fix=20https://github.com/siyuan-n?= =?UTF-8?q?ote/siyuan/issues/5617?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- kernel/api/filetree.go | 15 +++++++++++++-- kernel/model/file.go | 7 ++++--- kernel/model/path.go | 4 ++-- kernel/util/result.go | 9 +++++---- kernel/util/websocket.go | 17 +++++++++++++++++ 5 files changed, 41 insertions(+), 11 deletions(-) diff --git a/kernel/api/filetree.go b/kernel/api/filetree.go index 996ed2ccd..3890a7119 100644 --- a/kernel/api/filetree.go +++ b/kernel/api/filetree.go @@ -405,7 +405,7 @@ func createDailyNote(c *gin.Context) { } notebook := arg["notebook"].(string) - p, err := model.CreateDailyNote(notebook) + p, existed, err := model.CreateDailyNote(notebook) if nil != err { if model.ErrBoxNotFound == err { ret.Code = 1 @@ -425,7 +425,18 @@ func createDailyNote(c *gin.Context) { return } - evt := util.NewCmdResult("createdailynote", 0, util.PushModeBroadcast, util.PushModeNone) + appArg := arg["app"] + app := "" + if nil != appArg { + app = appArg.(string) + } + pushMode := util.PushModeBroadcast + if existed && "" != app { + pushMode = util.PushModeBroadcastApp + } + evt := util.NewCmdResult("createdailynote", 0, pushMode, util.PushModeNone) + evt.AppId = app + name := path.Base(p) files, _, _ := model.ListDocTree(box.ID, path.Dir(p), model.Conf.FileTree.Sort) evt.Data = map[string]interface{}{ diff --git a/kernel/model/file.go b/kernel/model/file.go index 045208661..ec552f4c2 100644 --- a/kernel/model/file.go +++ b/kernel/model/file.go @@ -1012,7 +1012,7 @@ func CreateWithMarkdown(boxID, hPath, md string) (id string, err error) { WaitForWritingFiles() luteEngine := NewLute() dom := luteEngine.Md2BlockDOM(md) - id, err = createDocsByHPath(box.ID, hPath, dom) + id, _, err = createDocsByHPath(box.ID, hPath, dom) return } @@ -1311,7 +1311,7 @@ func RenameDoc(boxID, p, title string) (err error) { return } -func CreateDailyNote(boxID string) (p string, err error) { +func CreateDailyNote(boxID string) (p string, existed bool, err error) { box := Conf.Box(boxID) if nil == box { err = ErrBoxNotFound @@ -1333,11 +1333,12 @@ func CreateDailyNote(boxID string) (p string, err error) { existRoot := treenode.GetBlockTreeRootByHPath(box.ID, hPath) if nil != existRoot { + existed = true p = existRoot.Path return } - id, err := createDocsByHPath(box.ID, hPath, "") + id, existed, err := createDocsByHPath(box.ID, hPath, "") if nil != err { return } diff --git a/kernel/model/path.go b/kernel/model/path.go index d3039ff6e..e151a230b 100644 --- a/kernel/model/path.go +++ b/kernel/model/path.go @@ -33,9 +33,9 @@ import ( "github.com/siyuan-note/siyuan/kernel/util" ) -func createDocsByHPath(boxID, hPath, content string) (id string, err error) { +func createDocsByHPath(boxID, hPath, content string) (id string, existed bool, err error) { hPath = strings.TrimSuffix(hPath, ".sy") - if docExist := nil != treenode.GetBlockTreeRootByHPath(boxID, hPath); docExist { + if existed = nil != treenode.GetBlockTreeRootByHPath(boxID, hPath); existed { hPath += "-" + gulu.Rand.String(7) } pathBuilder := bytes.Buffer{} diff --git a/kernel/util/result.go b/kernel/util/result.go index 5ae083875..036525243 100644 --- a/kernel/util/result.go +++ b/kernel/util/result.go @@ -24,10 +24,11 @@ import ( type PushMode int const ( - PushModeBroadcast PushMode = 0 // 广播 - PushModeSingleSelf PushMode = 1 // 自我单播 - PushModeBroadcastExcludeSelf PushMode = 2 // 非自我广播 - PushModeBroadcastExcludeSelfApp PushMode = 4 // 非自我应用广播 + PushModeBroadcast PushMode = 0 // 所有应用所有会话广播 + PushModeSingleSelf PushMode = 1 // 自我应用会话单播 + PushModeBroadcastExcludeSelf PushMode = 2 // 非自我会话广播 + PushModeBroadcastExcludeSelfApp PushMode = 4 // 非自我应用所有会话广播 + PushModeBroadcastApp PushMode = 5 // 单个应用内所有会话广播 PushModeNone PushMode = 10 // 不进行 reload ) diff --git a/kernel/util/websocket.go b/kernel/util/websocket.go index f63dc017d..d833fb0ce 100644 --- a/kernel/util/websocket.go +++ b/kernel/util/websocket.go @@ -226,6 +226,8 @@ func PushEvent(event *Result) { broadcastOthers(msg, event.SessionId) case PushModeBroadcastExcludeSelfApp: broadcastOtherApps(msg, event.AppId) + case PushModeBroadcastApp: + broadcastApp(msg, event.AppId) case PushModeNone: } } @@ -275,6 +277,21 @@ func broadcastOtherApps(msg []byte, excludeApp string) { }) } +func broadcastApp(msg []byte, app string) { + sessions.Range(func(key, value interface{}) bool { + appSessions := value.(*sync.Map) + appSessions.Range(func(key, value interface{}) bool { + session := value.(*melody.Session) + if sessionApp, _ := session.Get("app"); sessionApp != app { + return true + } + session.Write(msg) + return true + }) + return true + }) +} + func broadcastOthers(msg []byte, excludeSID string) { sessions.Range(func(key, value interface{}) bool { appSessions := value.(*sync.Map)