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:
+220
-10
@@ -1,18 +1,228 @@
|
||||
package startup
|
||||
|
||||
import (
|
||||
"honoka-chan/internal/model/user"
|
||||
ghomemodel "honoka-chan/internal/model/ghome"
|
||||
loginmodel "honoka-chan/internal/model/login"
|
||||
unitmodel "honoka-chan/internal/model/unit"
|
||||
usermodel "honoka-chan/internal/model/user"
|
||||
"honoka-chan/pkg/db"
|
||||
"log"
|
||||
"time"
|
||||
|
||||
"xorm.io/xorm"
|
||||
)
|
||||
|
||||
func CreateTable() {
|
||||
var (
|
||||
userEng *xorm.Session
|
||||
)
|
||||
|
||||
func CreateTables() {
|
||||
// db.UserEng.ShowSQL(true)
|
||||
db.UserEng.Sync2(new(user.Users))
|
||||
db.UserEng.Sync2(new(user.UserKey))
|
||||
db.UserEng.Sync2(new(user.UserPref))
|
||||
db.UserEng.Sync2(new(user.UserAccessoryWear))
|
||||
db.UserEng.Sync2(new(user.UserDeck))
|
||||
db.UserEng.Sync2(new(user.UserUnit))
|
||||
db.UserEng.Sync2(new(user.UserDeckUnit))
|
||||
db.UserEng.Sync2(new(user.UserUnitSkillEquip))
|
||||
db.UserEng.Sync2(new(ghomemodel.DeviceKey))
|
||||
db.UserEng.Sync2(new(loginmodel.AuthKey))
|
||||
db.UserEng.Sync2(new(usermodel.UserAccessoryWear))
|
||||
db.UserEng.Sync2(new(usermodel.UserDeck))
|
||||
db.UserEng.Sync2(new(usermodel.UserDeckUnit))
|
||||
db.UserEng.Sync2(new(usermodel.UserKey))
|
||||
db.UserEng.Sync2(new(usermodel.UserLiveGoal))
|
||||
db.UserEng.Sync2(new(usermodel.UserLiveInProgress))
|
||||
db.UserEng.Sync2(new(usermodel.UserLiveRecord))
|
||||
db.UserEng.Sync2(new(usermodel.UserPref))
|
||||
db.UserEng.Sync2(new(usermodel.Users))
|
||||
db.UserEng.Sync2(new(usermodel.UserUnit))
|
||||
db.UserEng.Sync2(new(usermodel.UserUnitSkillEquip))
|
||||
}
|
||||
|
||||
func LoadUnitData() {
|
||||
userEng = db.UserEng.NewSession()
|
||||
defer userEng.Close()
|
||||
|
||||
err := userEng.Begin()
|
||||
CheckErr(err)
|
||||
|
||||
commonUnitExist, err := userEng.IsTableExist(new(unitmodel.CommonUnitData))
|
||||
CheckErr(err)
|
||||
userUnitExist, err := userEng.IsTableExist(new(usermodel.UserUnitData))
|
||||
CheckErr(err)
|
||||
|
||||
if !commonUnitExist || !userUnitExist {
|
||||
log.Println("卡片数据不存在,正在同步...")
|
||||
|
||||
userEng.DropTable(new(unitmodel.CommonUnitData))
|
||||
userEng.CreateTable(new(unitmodel.CommonUnitData))
|
||||
userEng.DropTable(new(usermodel.UserUnitData))
|
||||
userEng.CreateTable(new(usermodel.UserUnitData))
|
||||
|
||||
var unitData []unitmodel.UnitM
|
||||
err = db.MainEng.Table(new(unitmodel.UnitM)).OrderBy("unit_id ASC").Find(&unitData)
|
||||
CheckErr(err)
|
||||
|
||||
checked := false
|
||||
for _, u := range unitData {
|
||||
// 判断卡片最大等级
|
||||
var unitMaxLevel, nextExp, sumExp int
|
||||
_, err = db.MainEng.Table("unit_level_up_pattern_m").
|
||||
Where("unit_level_up_pattern_id = ?", u.UnitLevelUpPatternId).
|
||||
Select("MAX(unit_level),next_exp").Get(&unitMaxLevel, &nextExp)
|
||||
CheckErr(err)
|
||||
|
||||
// 计算突破前的经验总和
|
||||
_, err = db.MainEng.Table("unit_level_up_pattern_m").
|
||||
Where("unit_level_up_pattern_id = ?", u.UnitLevelUpPatternId).
|
||||
Where("unit_level = ?", unitMaxLevel-1).Cols("next_exp").Get(&sumExp)
|
||||
CheckErr(err)
|
||||
|
||||
// 计算突破前的属性
|
||||
var smileMax, pureMax, coolMax int
|
||||
smileMax = u.SmileMax
|
||||
pureMax = u.PureMax
|
||||
coolMax = u.CoolMax
|
||||
|
||||
// 如果 nexpExp 不为零,则说明卡片等级没有达到上限
|
||||
if nextExp != 0 {
|
||||
// 计算突破后的经验总和
|
||||
_, err = db.MainEng.Table("unit_level_limit_pattern_m").
|
||||
Where("unit_level_limit_id = 1 AND unit_level = 349").
|
||||
Cols("next_exp").Get(&sumExp)
|
||||
CheckErr(err)
|
||||
|
||||
// 突破后最大等级
|
||||
unitMaxLevel = 350
|
||||
|
||||
// 计算突破后的属性
|
||||
smileMax += 6000
|
||||
pureMax += 6000
|
||||
coolMax += 6000
|
||||
}
|
||||
|
||||
// 计算绊值、技能等级、技能经验
|
||||
var maxLove, skillLevel, skillExp, removableSkillCapacity, levelLimitID int
|
||||
switch u.Rarity {
|
||||
case 1:
|
||||
maxLove = 50
|
||||
skillExp = 0
|
||||
skillLevel = 0
|
||||
removableSkillCapacity = 0
|
||||
levelLimitID = 0
|
||||
case 2:
|
||||
maxLove = 200
|
||||
skillExp = 490
|
||||
skillLevel = 8
|
||||
removableSkillCapacity = 1
|
||||
levelLimitID = 0
|
||||
case 3:
|
||||
maxLove = 500
|
||||
skillExp = 4900
|
||||
skillLevel = 8
|
||||
removableSkillCapacity = 2
|
||||
levelLimitID = 0
|
||||
case 4:
|
||||
maxLove = 1000
|
||||
skillExp = 29900
|
||||
skillLevel = 8
|
||||
removableSkillCapacity = 8
|
||||
levelLimitID = 1
|
||||
case 5:
|
||||
maxLove = 750
|
||||
skillExp = 12700
|
||||
skillLevel = 8
|
||||
removableSkillCapacity = 3
|
||||
levelLimitID = 0
|
||||
}
|
||||
|
||||
// 针对技能卡等应援卡片
|
||||
if smileMax == 1 {
|
||||
maxLove = 0
|
||||
skillExp = 0
|
||||
skillLevel = 0
|
||||
removableSkillCapacity = 0
|
||||
}
|
||||
|
||||
// 检查是否签名卡
|
||||
var isSigned bool
|
||||
exist, err := db.MainEng.Table("unit_sign_asset_m").Where("unit_id = ?", u.UnitId).Exist()
|
||||
CheckErr(err)
|
||||
if exist {
|
||||
isSigned = true
|
||||
}
|
||||
|
||||
// 生成公共卡片
|
||||
unitCommon := unitmodel.CommonUnitData{
|
||||
UnitNumber: u.UnitNumber,
|
||||
UnitID: u.UnitId,
|
||||
UnitTypeID: u.UnitTypeId,
|
||||
Name: *u.NameEn,
|
||||
Eponym: u.EponymEn,
|
||||
Rarity: u.Rarity,
|
||||
Attribute: u.AttributeId,
|
||||
Smile: smileMax,
|
||||
Cute: pureMax,
|
||||
Cool: coolMax,
|
||||
Exp: sumExp,
|
||||
Level: unitMaxLevel,
|
||||
MaxLevel: unitMaxLevel,
|
||||
LevelLimitID: levelLimitID,
|
||||
Rank: u.RankMin,
|
||||
MaxRank: u.RankMax,
|
||||
Love: maxLove,
|
||||
MaxLove: maxLove,
|
||||
UnitSkillExp: skillExp,
|
||||
UnitSkillLevel: skillLevel,
|
||||
MaxHp: u.HpMax,
|
||||
UnitRemovableSkillCapacity: removableSkillCapacity,
|
||||
IsRankMax: true,
|
||||
IsLoveMax: true,
|
||||
IsLevelMax: true,
|
||||
IsSigned: isSigned,
|
||||
IsSkillLevelMax: true,
|
||||
IsRemovableSkillCapacityMax: true,
|
||||
InsertDate: time.Now().Unix(),
|
||||
}
|
||||
|
||||
_, err = userEng.Insert(&unitCommon)
|
||||
CheckErr(err)
|
||||
|
||||
var userID []int
|
||||
err = db.UserEng.Table(new(usermodel.Users)).Cols("user_id").Find(&userID)
|
||||
CheckErr(err)
|
||||
|
||||
for _, id := range userID {
|
||||
userUnit := usermodel.UserUnitData{
|
||||
UnitID: u.UnitId,
|
||||
FavoriteFlag: false,
|
||||
DisplayRank: u.RankMax,
|
||||
UserID: id,
|
||||
InsertDate: time.Now().Unix(),
|
||||
UpdateDate: time.Now().Unix(),
|
||||
}
|
||||
|
||||
// 检查表里是否已经有数据
|
||||
if !checked {
|
||||
ct, err := userEng.Table(new(usermodel.UserUnitData)).Count()
|
||||
CheckErr(err)
|
||||
|
||||
if ct == 0 {
|
||||
userUnit.UnitOwningUserID = 38383
|
||||
}
|
||||
|
||||
checked = true
|
||||
}
|
||||
|
||||
_, err = userEng.Insert(&userUnit)
|
||||
CheckErr(err)
|
||||
}
|
||||
}
|
||||
|
||||
err = userEng.Commit()
|
||||
CheckErr(err)
|
||||
|
||||
log.Println("同步完成!")
|
||||
}
|
||||
}
|
||||
|
||||
func CheckErr(err error) {
|
||||
if err != nil {
|
||||
userEng.Rollback()
|
||||
log.Fatalln("同步失败:", err.Error())
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
package startup
|
||||
|
||||
func StartUp() {
|
||||
CreateTable()
|
||||
InitUserData(0)
|
||||
CreateTables()
|
||||
LoadUnitData()
|
||||
}
|
||||
|
||||
@@ -1,142 +0,0 @@
|
||||
package startup
|
||||
|
||||
import (
|
||||
"fmt"
|
||||
"honoka-chan/internal/model/user"
|
||||
"honoka-chan/internal/schema/api/profile"
|
||||
"honoka-chan/internal/schema/api/unit"
|
||||
"honoka-chan/internal/utils"
|
||||
"honoka-chan/pkg/db"
|
||||
"strconv"
|
||||
"time"
|
||||
)
|
||||
|
||||
func InitUserData(userId int) {
|
||||
userList := []user.Users{}
|
||||
if userId != 0 {
|
||||
err := db.UserEng.Table("users").Where("user_id = ?", userId).Find(&userList)
|
||||
utils.CheckErr(err)
|
||||
} else {
|
||||
err := db.UserEng.Table("users").Asc("id").Find(&userList)
|
||||
utils.CheckErr(err)
|
||||
}
|
||||
|
||||
// 同步用户表
|
||||
// db.UserEng.ShowSQL(true)
|
||||
// db.UserEng.Table("user_info_m").Sync2(new(user.UserInfo))
|
||||
// db.UserEng.Table("user_pref").Sync2(new(UserPref))
|
||||
|
||||
// 开始会话
|
||||
session := db.UserEng.NewSession()
|
||||
defer session.Close()
|
||||
|
||||
if err := session.Begin(); err != nil {
|
||||
panic(err)
|
||||
}
|
||||
|
||||
for _, u := range userList {
|
||||
// 检查用户配置
|
||||
exists, err := db.UserEng.Table("user_pref").Where("user_id = ?", u.UserID).Exist()
|
||||
utils.CheckErr(err)
|
||||
|
||||
if !exists {
|
||||
// 默认中心成员()
|
||||
var oId int
|
||||
_, err = db.MainEng.Table("common_unit_m").Cols("unit_owning_user_id").Where("unit_id = ?", 31).Get(&oId)
|
||||
utils.CheckErr(err)
|
||||
fmt.Println("Center UnitOwningUserId:", oId)
|
||||
userPref := user.UserPref{
|
||||
UserID: u.UserID,
|
||||
AwardID: 1, // 音乃木坂学生
|
||||
BackgroundID: 1, // 初始背景
|
||||
UnitOwningUserID: oId,
|
||||
UserName: "音乃木坂学生",
|
||||
UserLevel: 1,
|
||||
UserDesc: "你好。",
|
||||
InviteCode: strconv.Itoa(u.UserID),
|
||||
UpdateTime: time.Now().Unix(),
|
||||
}
|
||||
_, err = session.Table("user_pref").Insert(&userPref)
|
||||
utils.CheckErr(err)
|
||||
// fmt.Println("UserPref Id", userPref.Id)
|
||||
}
|
||||
|
||||
// 检查用户信息
|
||||
exists, err = db.UserEng.Table("user_info_m").Where("user_id = ?", u.UserID).Exist()
|
||||
|
||||
// 检查用户卡组配置
|
||||
exists, err = db.UserEng.Table("user_deck").Where("user_id = ?", u.UserID).Asc("deck_id").Exist()
|
||||
utils.CheckErr(err)
|
||||
// fmt.Println("UserDeck exists:", exists)
|
||||
|
||||
if !exists {
|
||||
userDeck := unit.UserDeckData{
|
||||
DeckID: 1,
|
||||
MainFlag: 1,
|
||||
DeckName: "队伍A",
|
||||
UserID: u.UserID,
|
||||
InsertDate: time.Now().Unix(),
|
||||
}
|
||||
|
||||
// 默认队伍
|
||||
_, err = session.Table("user_deck").Insert(&userDeck)
|
||||
if err != nil {
|
||||
session.Rollback()
|
||||
panic(err)
|
||||
}
|
||||
userDeckId := userDeck.ID
|
||||
// fmt.Println("New UserDeck:", userDeckId)
|
||||
|
||||
// 默认卡组
|
||||
unitIds := []int{}
|
||||
err = db.MainEng.Table("unit_m").Cols("unit_id").Where("album_series_id = ?", 615).Find(&unitIds)
|
||||
if err != nil {
|
||||
session.Rollback()
|
||||
panic(err)
|
||||
}
|
||||
|
||||
unitData := []profile.UnitData{}
|
||||
err = db.MainEng.Table("common_unit_m").In("unit_id", unitIds).Find(&unitData)
|
||||
if err != nil {
|
||||
session.Rollback()
|
||||
panic(err)
|
||||
}
|
||||
// fmt.Println(unitData)
|
||||
|
||||
position := 1
|
||||
for _, u := range unitData {
|
||||
unitDeckData := unit.UnitDeckData{
|
||||
UserDeckID: userDeckId,
|
||||
UnitOwningUserID: u.UnitOwningUserID,
|
||||
UnitID: u.UnitID,
|
||||
Position: position,
|
||||
Level: 100,
|
||||
LevelLimitID: 1,
|
||||
DisplayRank: 2,
|
||||
Love: 1000,
|
||||
UnitSkillLevel: 8,
|
||||
IsRankMax: true,
|
||||
IsLoveMax: true,
|
||||
IsLevelMax: true,
|
||||
IsSigned: u.IsSigned,
|
||||
BeforeLove: 1000,
|
||||
MaxLove: 1000,
|
||||
InsertData: time.Now().Unix(),
|
||||
}
|
||||
_, err = session.Table("user_deck_unit").Insert(&unitDeckData)
|
||||
if err != nil {
|
||||
session.Rollback()
|
||||
panic(err)
|
||||
}
|
||||
// fmt.Println("New DeckUnit:", unitDeckData.Id)
|
||||
|
||||
position++
|
||||
}
|
||||
|
||||
// 结束会话
|
||||
if err = session.Commit(); err != nil {
|
||||
panic(err)
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user