Implement more endpoints & overhaul [2/n]

Drop LevelDB and move all the things to SQLite.

Implemented endpoints:
/api <unit, accessoryMaterialAll>
/api <unit, accessoryTab>
/live/continue
/live/partyList
/unit/favoriteAccessory (WIP)
/unit/sale

Signed-off-by: Sean Du <do4suki@gmail.com>
This commit is contained in:
2026-04-28 11:44:56 +08:00
parent 1500821f3e
commit 150ce674ad
218 changed files with 2993 additions and 2160 deletions
+5 -5
View File
@@ -1,7 +1,7 @@
package unit
import (
"honoka-chan/internal/schema/api/unit"
unitapischema "honoka-chan/internal/schema/api/unit"
"honoka-chan/internal/session"
"time"
@@ -11,7 +11,7 @@ import (
func unitAccessoryAll(ctx *gin.Context) (res any, err error) {
ss := session.Get(ctx)
accessoryList := []unit.AccessoryList{}
accessoryList := []unitapischema.AccessoryList{}
err = ss.MainEng.Table("common_accessory_m").Find(&accessoryList)
if ss.CheckErr(err) {
return
@@ -23,13 +23,13 @@ func unitAccessoryAll(ctx *gin.Context) (res any, err error) {
accessoryList[k].RankUpCount = 4
accessoryList[k].FavoriteFlag = true
}
wearingInfo := []unit.WearingInfo{}
wearingInfo := []unitapischema.WearingInfo{}
err = ss.UserEng.Table("user_accessory_wear").Where("user_id = ?", ss.UserID).Find(&wearingInfo)
if ss.CheckErr(err) {
return
}
res = unit.AccessoryAllResp{
Result: unit.AccessoryAllData{
res = unitapischema.AccessoryAllResp{
Result: unitapischema.AccessoryAllData{
AccessoryList: accessoryList,
WearingInfo: wearingInfo,
EspecialCreateFlag: false,
@@ -0,0 +1,17 @@
package unit
import (
unitapischema "honoka-chan/internal/schema/api/unit"
"time"
)
func unitAccessoryMaterialAll() (res any, err error) {
res = unitapischema.AccessoryMaterialAllResp{
Result: unitapischema.AccessoryMaterialAllData{},
Status: 200,
CommandNum: false,
TimeStamp: time.Now().Unix(),
}
return res, err
}
+20
View File
@@ -0,0 +1,20 @@
package unit
import (
"encoding/json"
unitapischema "honoka-chan/internal/schema/api/unit"
honokautils "honoka-chan/pkg/utils"
"time"
)
func unitAccessoryTab() (res any, err error) {
data := honokautils.ReadAllText("assets/serverdata/accessoryTab.json")
resp := unitapischema.AccessoryTabResp{}
err = json.Unmarshal([]byte(data), &resp)
if err != nil {
return nil, err
}
resp.TimeStamp = time.Now().Unix()
return resp, err
}
+37 -11
View File
@@ -1,7 +1,8 @@
package unit
import (
"honoka-chan/internal/schema/api/unit"
unitmodel "honoka-chan/internal/model/unit"
unitapischema "honoka-chan/internal/schema/api/unit"
"honoka-chan/internal/session"
"time"
@@ -11,23 +12,48 @@ import (
func unitAll(ctx *gin.Context) (res any, err error) {
ss := session.Get(ctx)
unitsData := []unit.Active{}
err = ss.MainEng.Table("common_unit_m").Find(&unitsData)
unitMap := []unitmodel.UnitDataMap{}
err = ss.GetBasicUnitInfo().
Where("a.user_id = ?", ss.UserID).Find(&unitMap)
if ss.CheckErr(err) {
return
}
userUnits := []unit.Active{}
err = ss.UserEng.Table("user_unit").Where("user_id = ?", ss.UserID).Find(&userUnits)
if ss.CheckErr(err) {
return
unitsData := []unitapischema.Active{}
for _, u := range unitMap {
unitsData = append(unitsData, unitapischema.Active{
UnitOwningUserID: u.UnitOwningUserID,
UserID: ss.UserID,
UnitID: u.UnitID,
Exp: u.Exp,
NextExp: 0,
Level: u.Level,
MaxLevel: u.MaxLevel,
LevelLimitID: u.LevelLimitID,
Rank: u.Rank,
MaxRank: u.MaxRank,
Love: u.Love,
MaxLove: u.MaxLove,
UnitSkillExp: u.UnitSkillExp,
UnitSkillLevel: u.UnitSkillLevel,
MaxHp: u.MaxHp,
UnitRemovableSkillCapacity: u.UnitRemovableSkillCapacity,
FavoriteFlag: u.FavoriteFlag,
DisplayRank: u.DisplayRank,
IsRankMax: u.IsRankMax,
IsLoveMax: u.IsLoveMax,
IsLevelMax: u.IsLevelMax,
IsSigned: u.IsSigned,
IsSkillLevelMax: u.IsSkillLevelMax,
IsRemovableSkillCapacityMax: u.IsRemovableSkillCapacityMax,
InsertDate: "2023-03-20 03:58:55",
})
}
unitsData = append(unitsData, userUnits...)
res = unit.AllResp{
Result: unit.AllData{
res = unitapischema.AllResp{
Result: unitapischema.AllData{
Active: unitsData,
Waiting: []unit.Waiting{},
Waiting: []unitapischema.Waiting{},
},
Status: 200,
CommandNum: false,
+8 -8
View File
@@ -1,7 +1,7 @@
package unit
import (
"honoka-chan/internal/schema/api/unit"
unitapischema "honoka-chan/internal/schema/api/unit"
"honoka-chan/internal/session"
"time"
@@ -11,23 +11,23 @@ import (
func unitDeckInfo(ctx *gin.Context) (res any, err error) {
ss := session.Get(ctx)
userDeck := []unit.UserDeckData{}
userDeck := []unitapischema.UserDeckData{}
err = ss.UserEng.Table("user_deck").Where("user_id = ?", ss.UserID).Asc("deck_id").Find(&userDeck)
if ss.CheckErr(err) {
return
}
unitDeckInfo := []unit.DeckInfoData{}
unitDeckInfo := []unitapischema.DeckInfoData{}
for _, deck := range userDeck {
deckUnit := []unit.UnitDeckData{}
deckUnit := []unitapischema.UnitDeckData{}
err = ss.UserEng.Table("user_deck_unit").Where("user_deck_id = ?", deck.ID).Asc("position").Find(&deckUnit)
if ss.CheckErr(err) {
return
}
oUID := []unit.UnitOwningUserIds{}
oUID := []unitapischema.UnitOwningUserIds{}
for _, u := range deckUnit {
oUID = append(oUID, unit.UnitOwningUserIds{
oUID = append(oUID, unitapischema.UnitOwningUserIds{
Position: u.Position,
UnitOwningUserID: u.UnitOwningUserID,
})
@@ -37,14 +37,14 @@ func unitDeckInfo(ctx *gin.Context) (res any, err error) {
if deck.MainFlag == 1 {
mainFlag = true
}
unitDeckInfo = append(unitDeckInfo, unit.DeckInfoData{
unitDeckInfo = append(unitDeckInfo, unitapischema.DeckInfoData{
UnitDeckID: deck.DeckID,
MainFlag: mainFlag,
DeckName: deck.DeckName,
UnitOwningUserIds: oUID,
})
}
res = unit.DeckInfoResp{
res = unitapischema.DeckInfoResp{
Result: unitDeckInfo,
Status: 200,
CommandNum: false,
+10 -10
View File
@@ -1,7 +1,7 @@
package unit
import (
"honoka-chan/internal/schema/api/unit"
unitapischema "honoka-chan/internal/schema/api/unit"
"honoka-chan/internal/session"
"time"
@@ -11,7 +11,7 @@ import (
func unitRemovableSkillInfo(ctx *gin.Context) (res any, err error) {
ss := session.Get(ctx)
var skillEquipCount []unit.SkillEquipCount
var skillEquipCount []unitapischema.SkillEquipCount
err = ss.UserEng.Table("user_unit_skill_equip").Where("user_id = ?", ss.UserID).Select("unit_removable_skill_id,COUNT(*) AS ct").
GroupBy("unit_removable_skill_id").Find(&skillEquipCount)
if ss.CheckErr(err) {
@@ -24,12 +24,12 @@ func unitRemovableSkillInfo(ctx *gin.Context) (res any, err error) {
return
}
owingInfo := []unit.OwningInfo{}
owingInfo := []unitapischema.OwningInfo{}
for _, id := range rmSkillIds {
info := unit.OwningInfo{
info := unitapischema.OwningInfo{
UnitRemovableSkillID: id,
TotalAmount: 9,
EquippedAmount: 0,
TotalAmount: 999,
EquippedAmount: 0, // TODO: 计算实际数量
InsertDate: "2023-01-01 12:00:00",
}
for _, sk := range skillEquipCount {
@@ -49,21 +49,21 @@ func unitRemovableSkillInfo(ctx *gin.Context) (res any, err error) {
equipInfo := map[int]any{}
for _, v := range unitOwningIds {
detail := []unit.SkillEquipDetail{}
detail := []unitapischema.SkillEquipDetail{}
err = ss.UserEng.Table("user_unit_skill_equip").Where("user_id = ? AND unit_owning_user_id = ?", ss.UserID, v).
Cols("unit_removable_skill_id").Find(&detail)
if ss.CheckErr(err) {
return
}
equipInfo[v] = unit.SkillEquipList{
equipInfo[v] = unitapischema.SkillEquipList{
UnitOwningUserID: v,
Detail: detail,
}
}
res = unit.RemovableSkillInfoResp{
Result: unit.RemovableSkillInfoData{
res = unitapischema.RemovableSkillInfoResp{
Result: unitapischema.RemovableSkillInfoData{
OwningInfo: owingInfo,
EquipmentInfo: equipInfo,
}, // 宝石
+4 -4
View File
@@ -1,14 +1,14 @@
package unit
import (
"honoka-chan/internal/schema/api/unit"
unitapischema "honoka-chan/internal/schema/api/unit"
"time"
)
func unitSupporterAll() (res any, err error) {
res = unit.SupporterAllResp{
Result: unit.SupporterAllData{
UnitSupportList: []unit.SupporterList{},
res = unitapischema.SupporterAllResp{
Result: unitapischema.SupporterAllData{
UnitSupportList: []unitapischema.SupporterList{},
}, // 练习道具
Status: 200,
CommandNum: false,
+4
View File
@@ -10,6 +10,10 @@ func UnitApi(ctx *gin.Context, action string) (res any, err error) {
switch action {
case "accessoryAll":
res, err = unitAccessoryAll(ctx)
case "accessoryMaterialAll":
res, err = unitAccessoryMaterialAll()
case "accessoryTab":
res, err = unitAccessoryTab()
case "deckInfo":
res, err = unitDeckInfo(ctx)
case "removableSkillInfo":