Browse Source

Add provisioning API to sync appstate

Tulir Asokan 3 năm trước cách đây
mục cha
commit
d31910ab05
1 tập tin đã thay đổi với 45 bổ sung0 xóa
  1. 45 0
      provisioning.go

+ 45 - 0
provisioning.go

@@ -27,7 +27,9 @@ import (
 	"strings"
 	"time"
 
+	"github.com/gorilla/mux"
 	"github.com/gorilla/websocket"
+	"go.mau.fi/whatsmeow/appstate"
 
 	"go.mau.fi/whatsmeow"
 
@@ -52,6 +54,7 @@ func (prov *ProvisioningAPI) Init() {
 	r.HandleFunc("/delete_session", prov.DeleteSession).Methods(http.MethodPost)
 	r.HandleFunc("/disconnect", prov.Disconnect).Methods(http.MethodPost)
 	r.HandleFunc("/reconnect", prov.Reconnect).Methods(http.MethodPost)
+	r.HandleFunc("/sync/appstate/{name}", prov.SyncAppState).Methods(http.MethodPost)
 	prov.bridge.AS.Router.HandleFunc("/_matrix/app/com.beeper.asmux/ping", prov.BridgeStatePing).Methods(http.MethodPost)
 	prov.bridge.AS.Router.HandleFunc("/_matrix/app/com.beeper.bridge_state", prov.BridgeStatePing).Methods(http.MethodPost)
 
@@ -171,6 +174,48 @@ func (prov *ProvisioningAPI) Reconnect(w http.ResponseWriter, r *http.Request) {
 	}
 }
 
+func (prov *ProvisioningAPI) SyncAppState(w http.ResponseWriter, r *http.Request) {
+	user := r.Context().Value("user").(*User)
+	if user == nil || user.Client == nil {
+		jsonResponse(w, http.StatusNotFound, Error{
+			Error:   "User is not connected to WhatsApp",
+			ErrCode: "no session",
+		})
+		return
+	}
+
+	vars := mux.Vars(r)
+	nameStr := vars["name"]
+	if len(nameStr) == 0 {
+		jsonResponse(w, http.StatusBadRequest, Error{
+			Error:   "The `name` parameter is required",
+			ErrCode: "missing-name-param",
+		})
+		return
+	}
+	var name appstate.WAPatchName
+	for _, existingName := range appstate.AllPatchNames {
+		if nameStr == string(existingName) {
+			name = existingName
+		}
+	}
+	if len(name) == 0 {
+		jsonResponse(w, http.StatusBadRequest, Error{
+			Error:   fmt.Sprintf("'%s' is not a valid app state patch name", nameStr),
+			ErrCode: "invalid-name-param",
+		})
+		return
+	}
+	fullStr := r.URL.Query().Get("full")
+	fullSync := len(fullStr) > 0 && (fullStr == "1" || strings.ToLower(fullStr)[0] == 't')
+	err := user.Client.FetchAppState(name, fullSync, false)
+	if err != nil {
+		jsonResponse(w, http.StatusInternalServerError, Error{false, err.Error(), "sync-fail"})
+	} else {
+		jsonResponse(w, http.StatusOK, Response{true, fmt.Sprintf("Synced app state %s", name)})
+	}
+}
+
 func (prov *ProvisioningAPI) Ping(w http.ResponseWriter, r *http.Request) {
 	user := r.Context().Value("user").(*User)
 	wa := map[string]interface{}{