Implement panel missions as static unlock-all
Build and Push Docker images to Docker Hub / build-and-push (push) Has been cancelled

This commit is contained in:
Ilya Groshev
2026-05-16 22:16:31 +03:00
parent 25cbe8635f
commit fa2a124d47
4 changed files with 86 additions and 0 deletions
@@ -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}
}
+31
View File
@@ -44,6 +44,30 @@ const informationPage = `<!DOCTYPE html>
</body>
</html>`
const panelMissionPage = `<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1">
<title>Panel Missions</title>
<style>
body { margin:0; padding:48px 20px; font-family:"Noto Sans",sans-serif;
background:#0a0a0f; color:#d4cfc6; text-align:center; }
h1 { font-size:1.3em; letter-spacing:.15em; color:#e8e0d0; margin-bottom:6px; }
.sub { font-size:.75em; color:#888; margin-bottom:28px; }
.sep { width:60px; border:none; border-top:1px solid #333; margin:24px auto; }
p { font-size:.85em; line-height:1.6; color:#999; max-width:340px; margin:0 auto; }
</style>
</head>
<body>
<h1>PANEL MISSIONS</h1>
<div class="sub">Card Stories</div>
<hr class="sep">
<p>All panel missions are cleared.</p>
<p>Their Card Stories are available in Library &rsaquo; Extra Stories.</p>
</body>
</html>`
// 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(`<!DOCTYPE html><html><body></body></html>`))
+28
View File
@@ -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
})
}
@@ -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),
}
}