diff --git a/server/internal/masterdata/webviewpanelmission.go b/server/internal/masterdata/webviewpanelmission.go new file mode 100644 index 0000000..ced0812 --- /dev/null +++ b/server/internal/masterdata/webviewpanelmission.go @@ -0,0 +1,26 @@ +package masterdata + +import ( + "log" + "sort" + + "lunar-tear/server/internal/utils" +) + +type WebviewPanelMissionCatalog struct { + PageIds []int32 // every WebviewPanelMissionPageId, sorted ascending +} + +func LoadWebviewPanelMissionCatalog() *WebviewPanelMissionCatalog { + rows, err := utils.ReadTable[EntityMWebviewPanelMissionPage]("m_webview_panel_mission_page") + if err != nil { + log.Printf("load webview panel mission page table: %v", err) + return &WebviewPanelMissionCatalog{} + } + ids := make([]int32, 0, len(rows)) + for _, r := range rows { + ids = append(ids, r.WebviewPanelMissionPageId) + } + sort.Slice(ids, func(i, j int) bool { return ids[i] < ids[j] }) + return &WebviewPanelMissionCatalog{PageIds: ids} +} diff --git a/server/internal/service/octo.go b/server/internal/service/octo.go index 8b8e43e..42cfd83 100644 --- a/server/internal/service/octo.go +++ b/server/internal/service/octo.go @@ -44,6 +44,30 @@ const informationPage = ` ` +const panelMissionPage = ` + + + + +Panel Missions + + + +

PANEL MISSIONS

+
Card Stories
+
+

All panel missions are cleared.

+

Their Card Stories are available in Library › Extra Stories.

+ +` + // resourcesURLOriginal is the base URL embedded in list.bin; must be replaced with same-length (43 bytes) when rewriting. const resourcesURLOriginal = "https://resources.app.nierreincarnation.com" @@ -456,6 +480,13 @@ func (s *OctoHTTPServer) handleWebAPI(w http.ResponseWriter, r *http.Request, pa return } + if strings.Contains(path, "panelmission") { + w.Header().Set("Content-Type", "text/html; charset=utf-8") + w.WriteHeader(200) + w.Write([]byte(panelMissionPage)) + return + } + w.Header().Set("Content-Type", "text/html; charset=utf-8") w.WriteHeader(200) w.Write([]byte(``)) diff --git a/server/internal/userdata/proj_webview.go b/server/internal/userdata/proj_webview.go new file mode 100644 index 0000000..800d162 --- /dev/null +++ b/server/internal/userdata/proj_webview.go @@ -0,0 +1,28 @@ +package userdata + +import ( + "sync" + + "lunar-tear/server/internal/masterdata" + "lunar-tear/server/internal/store" + "lunar-tear/server/internal/utils" +) + +var webviewPanelMissionCatalog = sync.OnceValue(masterdata.LoadWebviewPanelMissionCatalog) + +func init() { + register("IUserWebviewPanelMission", func(user store.UserState) string { + pageIds := webviewPanelMissionCatalog().PageIds + records := make([]map[string]any, 0, len(pageIds)) + for _, pageId := range pageIds { + records = append(records, map[string]any{ + "userId": user.UserId, + "webviewPanelMissionPageId": pageId, + "rewardReceiveDatetime": user.GameStartDatetime, + "latestVersion": user.GameStartDatetime, + }) + } + s, _ := utils.EncodeJSONMaps(records...) + return s + }) +} diff --git a/server/internal/userdata/state_projection.go b/server/internal/userdata/state_projection.go index d398769..66c5aac 100644 --- a/server/internal/userdata/state_projection.go +++ b/server/internal/userdata/state_projection.go @@ -102,6 +102,7 @@ func FullClientTableMap(user store.UserState) map[string]string { "IUserBigHuntWeeklyStatus": projectTable("IUserBigHuntWeeklyStatus", user), "IUserFacebook": projectTable("IUserFacebook", user), "IUserApple": projectTable("IUserApple", user), + "IUserWebviewPanelMission": projectTable("IUserWebviewPanelMission", user), } }