Browse Source

:art: The User Guide is no longer opened repeatedly when multiple windows exist https://github.com/siyuan-note/siyuan/issues/11588

Daniel 1 year ago
parent
commit
7b4d297ade
3 changed files with 51 additions and 23 deletions
  1. 31 0
      kernel/api/notebook.go
  2. 0 23
      kernel/model/mount.go
  3. 20 0
      kernel/util/websocket.go

+ 31 - 0
kernel/api/notebook.go

@@ -19,10 +19,12 @@ package api
 import (
 	"net/http"
 	"strings"
+	"time"
 
 	"github.com/88250/gulu"
 	"github.com/gin-gonic/gin"
 	"github.com/siyuan-note/siyuan/kernel/model"
+	"github.com/siyuan-note/siyuan/kernel/treenode"
 	"github.com/siyuan-note/siyuan/kernel/util"
 )
 
@@ -222,6 +224,35 @@ func openNotebook(c *gin.Context) {
 	}
 	evt.Callback = arg["callback"]
 	util.PushEvent(evt)
+
+	if isUserGuide {
+		appArg := arg["app"]
+		app := ""
+		if nil != appArg {
+			app = appArg.(string)
+		}
+
+		go func() {
+			var startID string
+			i := 0
+			for ; i < 70; i++ {
+				time.Sleep(100 * time.Millisecond)
+				guideStartID := map[string]string{
+					"20210808180117-czj9bvb": "20200812220555-lj3enxa",
+					"20211226090932-5lcq56f": "20211226115423-d5z1joq",
+					"20210808180117-6v0mkxr": "20200923234011-ieuun1p",
+					"20240530133126-axarxgx": "20240530101000-4qitucx",
+				}
+				startID = guideStartID[notebook]
+				if nil != treenode.GetBlockTree(startID) {
+					util.BroadcastByTypeAndApp("main", app, "openFileById", 0, "", map[string]interface{}{
+						"id": startID,
+					})
+					break
+				}
+			}
+		}()
+	}
 }
 
 func closeNotebook(c *gin.Context) {

+ 0 - 23
kernel/model/mount.go

@@ -250,29 +250,6 @@ func Mount(boxID string) (alreadyMount bool, err error) {
 	treenode.SaveBlockTree(false)
 	util.ClearPushProgress(100)
 
-	if isUserGuide {
-		go func() {
-			var startID string
-			i := 0
-			for ; i < 70; i++ {
-				time.Sleep(100 * time.Millisecond)
-				guideStartID := map[string]string{
-					"20210808180117-czj9bvb": "20200812220555-lj3enxa",
-					"20211226090932-5lcq56f": "20211226115423-d5z1joq",
-					"20210808180117-6v0mkxr": "20200923234011-ieuun1p",
-					"20240530133126-axarxgx": "20240530101000-4qitucx",
-				}
-				startID = guideStartID[boxID]
-				if nil != treenode.GetBlockTree(startID) {
-					util.BroadcastByType("main", "openFileById", 0, "", map[string]interface{}{
-						"id": startID,
-					})
-					break
-				}
-			}
-		}()
-	}
-
 	if reMountGuide {
 		return true, nil
 	}

+ 20 - 0
kernel/util/websocket.go

@@ -32,6 +32,26 @@ var (
 	sessions = sync.Map{} // {appId, {sessionId, session}}
 )
 
+func BroadcastByTypeAndApp(typ, app, cmd string, code int, msg string, data interface{}) {
+	appSessions, ok := sessions.Load(app)
+	if !ok {
+		return
+	}
+
+	appSessions.(*sync.Map).Range(func(key, value interface{}) bool {
+		session := value.(*melody.Session)
+		if t, ok := session.Get("type"); ok && typ == t {
+			event := NewResult()
+			event.Cmd = cmd
+			event.Code = code
+			event.Msg = msg
+			event.Data = data
+			session.Write(event.Bytes())
+		}
+		return true
+	})
+}
+
 // BroadcastByType 广播所有实例上 typ 类型的会话。
 func BroadcastByType(typ, cmd string, code int, msg string, data interface{}) {
 	typeSessions := SessionsByType(typ)