Skip to content

Commit c9a1929

Browse files
Implement remaining Memoirs preset management RPCs
1 parent fb111cf commit c9a1929

10 files changed

Lines changed: 170 additions & 1 deletion

File tree

server/internal/service/parts.go

Lines changed: 99 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -270,3 +270,102 @@ func (s *PartsServiceServer) ReplacePreset(ctx context.Context, req *pb.PartsRep
270270

271271
return &pb.PartsReplacePresetResponse{}, nil
272272
}
273+
274+
func (s *PartsServiceServer) UpdatePresetName(ctx context.Context, req *pb.PartsUpdatePresetNameRequest) (*pb.PartsUpdatePresetNameResponse, error) {
275+
log.Printf("[PartsService] UpdatePresetName: preset=%d name=%q", req.UserPartsPresetNumber, req.Name)
276+
277+
userId := CurrentUserId(ctx, s.users, s.sessions)
278+
nowMillis := gametime.NowMillis()
279+
280+
_, err := s.users.UpdateUser(userId, func(user *store.UserState) {
281+
preset := user.PartsPresets[req.UserPartsPresetNumber]
282+
preset.UserPartsPresetNumber = req.UserPartsPresetNumber
283+
preset.Name = req.Name
284+
preset.LatestVersion = nowMillis
285+
user.PartsPresets[req.UserPartsPresetNumber] = preset
286+
})
287+
if err != nil {
288+
return nil, fmt.Errorf("parts update preset name: %w", err)
289+
}
290+
291+
return &pb.PartsUpdatePresetNameResponse{}, nil
292+
}
293+
294+
func (s *PartsServiceServer) UpdatePresetTagNumber(ctx context.Context, req *pb.PartsUpdatePresetTagNumberRequest) (*pb.PartsUpdatePresetTagNumberResponse, error) {
295+
log.Printf("[PartsService] UpdatePresetTagNumber: preset=%d tag=%d", req.UserPartsPresetNumber, req.UserPartsPresetTagNumber)
296+
297+
userId := CurrentUserId(ctx, s.users, s.sessions)
298+
nowMillis := gametime.NowMillis()
299+
300+
_, err := s.users.UpdateUser(userId, func(user *store.UserState) {
301+
preset := user.PartsPresets[req.UserPartsPresetNumber]
302+
preset.UserPartsPresetNumber = req.UserPartsPresetNumber
303+
preset.UserPartsPresetTagNumber = req.UserPartsPresetTagNumber
304+
preset.LatestVersion = nowMillis
305+
user.PartsPresets[req.UserPartsPresetNumber] = preset
306+
})
307+
if err != nil {
308+
return nil, fmt.Errorf("parts update preset tag number: %w", err)
309+
}
310+
311+
return &pb.PartsUpdatePresetTagNumberResponse{}, nil
312+
}
313+
314+
func (s *PartsServiceServer) UpdatePresetTagName(ctx context.Context, req *pb.PartsUpdatePresetTagNameRequest) (*pb.PartsUpdatePresetTagNameResponse, error) {
315+
log.Printf("[PartsService] UpdatePresetTagName: tag=%d name=%q", req.UserPartsPresetTagNumber, req.Name)
316+
317+
userId := CurrentUserId(ctx, s.users, s.sessions)
318+
nowMillis := gametime.NowMillis()
319+
320+
_, err := s.users.UpdateUser(userId, func(user *store.UserState) {
321+
tag := user.PartsPresetTags[req.UserPartsPresetTagNumber]
322+
tag.UserPartsPresetTagNumber = req.UserPartsPresetTagNumber
323+
tag.Name = req.Name
324+
tag.LatestVersion = nowMillis
325+
user.PartsPresetTags[req.UserPartsPresetTagNumber] = tag
326+
})
327+
if err != nil {
328+
return nil, fmt.Errorf("parts update preset tag name: %w", err)
329+
}
330+
331+
return &pb.PartsUpdatePresetTagNameResponse{}, nil
332+
}
333+
334+
func (s *PartsServiceServer) CopyPreset(ctx context.Context, req *pb.PartsCopyPresetRequest) (*pb.PartsCopyPresetResponse, error) {
335+
log.Printf("[PartsService] CopyPreset: from=%d to=%d", req.FromUserPartsPresetNumber, req.ToUserPartsPresetNumber)
336+
337+
userId := CurrentUserId(ctx, s.users, s.sessions)
338+
nowMillis := gametime.NowMillis()
339+
340+
_, err := s.users.UpdateUser(userId, func(user *store.UserState) {
341+
from, ok := user.PartsPresets[req.FromUserPartsPresetNumber]
342+
if !ok {
343+
log.Printf("[PartsService] CopyPreset: source preset=%d not found, skipping", req.FromUserPartsPresetNumber)
344+
return
345+
}
346+
to := from
347+
to.UserPartsPresetNumber = req.ToUserPartsPresetNumber
348+
to.LatestVersion = nowMillis
349+
user.PartsPresets[req.ToUserPartsPresetNumber] = to
350+
})
351+
if err != nil {
352+
return nil, fmt.Errorf("parts copy preset: %w", err)
353+
}
354+
355+
return &pb.PartsCopyPresetResponse{}, nil
356+
}
357+
358+
func (s *PartsServiceServer) RemovePreset(ctx context.Context, req *pb.PartsRemovePresetRequest) (*pb.PartsRemovePresetResponse, error) {
359+
log.Printf("[PartsService] RemovePreset: preset=%d", req.UserPartsPresetNumber)
360+
361+
userId := CurrentUserId(ctx, s.users, s.sessions)
362+
363+
_, err := s.users.UpdateUser(userId, func(user *store.UserState) {
364+
delete(user.PartsPresets, req.UserPartsPresetNumber)
365+
})
366+
if err != nil {
367+
return nil, fmt.Errorf("parts remove preset: %w", err)
368+
}
369+
370+
return &pb.PartsRemovePresetResponse{}, nil
371+
}

server/internal/store/clone.go

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,7 @@ func CloneUserState(u UserState) UserState {
3131
out.Parts = maps.Clone(u.Parts)
3232
out.PartsGroupNotes = maps.Clone(u.PartsGroupNotes)
3333
out.PartsPresets = maps.Clone(u.PartsPresets)
34+
out.PartsPresetTags = maps.Clone(u.PartsPresetTags)
3435
out.PartsStatusSubs = maps.Clone(u.PartsStatusSubs)
3536
out.ImportantItems = maps.Clone(u.ImportantItems)
3637
out.CostumeActiveSkills = maps.Clone(u.CostumeActiveSkills)

server/internal/store/seed.go

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -130,6 +130,7 @@ func SeedUserState(userId int64, uuid string, nowMillis int64, platform model.Cl
130130
Parts: make(map[string]PartsState),
131131
PartsGroupNotes: make(map[int32]PartsGroupNoteState),
132132
PartsPresets: make(map[int32]PartsPresetState),
133+
PartsPresetTags: make(map[int32]PartsPresetTagState),
133134
PartsStatusSubs: make(map[PartsStatusSubKey]PartsStatusSubState),
134135
ImportantItems: make(map[int32]int32),
135136
CostumeActiveSkills: make(map[string]CostumeActiveSkillState),

server/internal/store/sqlite/load.go

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -61,6 +61,7 @@ func initMaps(u *store.UserState) {
6161
u.Parts = make(map[string]store.PartsState)
6262
u.PartsGroupNotes = make(map[int32]store.PartsGroupNoteState)
6363
u.PartsPresets = make(map[int32]store.PartsPresetState)
64+
u.PartsPresetTags = make(map[int32]store.PartsPresetTagState)
6465
u.PartsStatusSubs = make(map[store.PartsStatusSubKey]store.PartsStatusSubState)
6566
u.DeckTypeNotes = make(map[model.DeckType]store.DeckTypeNoteState)
6667
u.ConsumableItems = make(map[int32]int32)
@@ -492,6 +493,14 @@ func loadMapTables(db *sql.DB, uid int64, u *store.UserState) {
492493
u.PartsPresets[v.UserPartsPresetNumber] = v
493494
})
494495

496+
queryRows(db, `SELECT user_parts_preset_tag_number, name, latest_version
497+
FROM user_parts_preset_tags WHERE user_id=?`, uid,
498+
func(rows *sql.Rows) {
499+
var v store.PartsPresetTagState
500+
rows.Scan(&v.UserPartsPresetTagNumber, &v.Name, &v.LatestVersion)
501+
u.PartsPresetTags[v.UserPartsPresetTagNumber] = v
502+
})
503+
495504
queryRows(db, `SELECT user_parts_uuid, status_index, parts_status_sub_lottery_id, level,
496505
status_kind_type, status_calculation_type, status_change_value, latest_version
497506
FROM user_parts_status_subs WHERE user_id=?`, uid,

server/internal/store/sqlite/save.go

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -312,6 +312,12 @@ func writeUserState(tx *sql.Tx, uid int64, u *store.UserState) error {
312312
return err
313313
}
314314
}
315+
for _, v := range u.PartsPresetTags {
316+
if err := exec(`INSERT INTO user_parts_preset_tags (user_id, user_parts_preset_tag_number, name, latest_version) VALUES (?,?,?,?)`,
317+
uid, v.UserPartsPresetTagNumber, v.Name, v.LatestVersion); err != nil {
318+
return err
319+
}
320+
}
315321
for _, v := range u.PartsStatusSubs {
316322
if err := exec(`INSERT INTO user_parts_status_subs (user_id, user_parts_uuid, status_index, parts_status_sub_lottery_id, level, status_kind_type, status_calculation_type, status_change_value, latest_version) VALUES (?,?,?,?,?,?,?,?,?)`,
317323
uid, v.UserPartsUuid, v.StatusIndex, v.PartsStatusSubLotteryId, v.Level, v.StatusKindType, v.StatusCalculationType, v.StatusChangeValue, v.LatestVersion); err != nil {
@@ -862,6 +868,10 @@ func diffAndSave(tx *sql.Tx, uid int64, before, after *store.UserState) error {
862868
func(v store.PartsPresetState) []any {
863869
return []any{v.UserPartsPresetNumber, v.UserPartsUuid01, v.UserPartsUuid02, v.UserPartsUuid03, v.Name, v.UserPartsPresetTagNumber, v.LatestVersion}
864870
}, "user_parts_preset_number, user_parts_uuid01, user_parts_uuid02, user_parts_uuid03, name, user_parts_preset_tag_number, latest_version")
871+
diffMapInt32(tx, uid, before.PartsPresetTags, after.PartsPresetTags, "user_parts_preset_tags", "user_parts_preset_tag_number",
872+
func(v store.PartsPresetTagState) []any {
873+
return []any{v.UserPartsPresetTagNumber, v.Name, v.LatestVersion}
874+
}, "user_parts_preset_tag_number, name, latest_version")
865875

866876
for k, v := range after.PartsStatusSubs {
867877
if old, ok := before.PartsStatusSubs[k]; !ok || old != v {

server/internal/store/sqlite/user.go

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -119,6 +119,7 @@ func (s *SQLiteStore) ImportUser(u *store.UserState) error {
119119
"user_decks",
120120
"user_deck_characters",
121121
"user_parts_status_subs",
122+
"user_parts_preset_tags",
122123
"user_parts_presets",
123124
"user_parts_group_notes",
124125
"user_parts",

server/internal/store/types.go

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -82,6 +82,7 @@ type UserState struct {
8282
Parts map[string]PartsState
8383
PartsGroupNotes map[int32]PartsGroupNoteState
8484
PartsPresets map[int32]PartsPresetState
85+
PartsPresetTags map[int32]PartsPresetTagState
8586
PartsStatusSubs map[PartsStatusSubKey]PartsStatusSubState
8687
ImportantItems map[int32]int32
8788
CostumeActiveSkills map[string]CostumeActiveSkillState
@@ -206,6 +207,9 @@ func (u *UserState) EnsureMaps() {
206207
if u.PartsPresets == nil {
207208
u.PartsPresets = make(map[int32]PartsPresetState)
208209
}
210+
if u.PartsPresetTags == nil {
211+
u.PartsPresetTags = make(map[int32]PartsPresetTagState)
212+
}
209213
if u.PartsStatusSubs == nil {
210214
u.PartsStatusSubs = make(map[PartsStatusSubKey]PartsStatusSubState)
211215
}
@@ -890,6 +894,12 @@ type PartsPresetState struct {
890894
LatestVersion int64
891895
}
892896

897+
type PartsPresetTagState struct {
898+
UserPartsPresetTagNumber int32
899+
Name string
900+
LatestVersion int64
901+
}
902+
893903
type PartsStatusSubKey struct {
894904
UserPartsUuid string
895905
StatusIndex int32

server/internal/userdata/changed_tables.go

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -163,6 +163,9 @@ func ChangedTables(before, after *store.UserState) []string {
163163
if !mapsEqualStruct(before.PartsPresets, after.PartsPresets) {
164164
add("IUserPartsPreset")
165165
}
166+
if !mapsEqualStruct(before.PartsPresetTags, after.PartsPresetTags) {
167+
add("IUserPartsPresetTag")
168+
}
166169
if !mapsEqualStruct(before.PartsStatusSubs, after.PartsStatusSubs) {
167170
add("IUserPartsStatusSub")
168171
}
@@ -419,6 +422,8 @@ func keyFieldsForTable(table string) []string {
419422
return []string{"userId", "partsGroupId"}
420423
case "IUserPartsPreset":
421424
return []string{"userId", "userPartsPresetNumber"}
425+
case "IUserPartsPresetTag":
426+
return []string{"userId", "userPartsPresetTagNumber"}
422427
case "IUserCageOrnamentReward":
423428
return []string{"userId", "cageOrnamentId"}
424429
case "IUserAutoSaleSettingDetail":

server/internal/userdata/proj_inventory.go

Lines changed: 23 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -86,6 +86,10 @@ func init() {
8686
s, _ := utils.EncodeJSONMaps(sortedPartsPresetRecords(user)...)
8787
return s
8888
})
89+
register("IUserPartsPresetTag", func(user store.UserState) string {
90+
s, _ := utils.EncodeJSONMaps(sortedPartsPresetTagRecords(user)...)
91+
return s
92+
})
8993
register("IUserCostumeAwakenStatusUp", func(user store.UserState) string {
9094
s, _ := utils.EncodeJSONMaps(sortedCostumeAwakenStatusUpRecords(user)...)
9195
return s
@@ -122,7 +126,6 @@ func init() {
122126
"IUserCostumeLevelBonusReleaseStatus",
123127
"IUserCostumeLotteryEffectAbility",
124128
"IUserCostumeLotteryEffectStatusUp",
125-
"IUserPartsPresetTag",
126129
)
127130
}
128131

@@ -496,6 +499,25 @@ func sortedPartsPresetRecords(user store.UserState) []map[string]any {
496499
return records
497500
}
498501

502+
func sortedPartsPresetTagRecords(user store.UserState) []map[string]any {
503+
ids := make([]int, 0, len(user.PartsPresetTags))
504+
for id := range user.PartsPresetTags {
505+
ids = append(ids, int(id))
506+
}
507+
sort.Ints(ids)
508+
records := make([]map[string]any, 0, len(ids))
509+
for _, id := range ids {
510+
row := user.PartsPresetTags[int32(id)]
511+
records = append(records, map[string]any{
512+
"userId": user.UserId,
513+
"userPartsPresetTagNumber": row.UserPartsPresetTagNumber,
514+
"name": row.Name,
515+
"latestVersion": row.LatestVersion,
516+
})
517+
}
518+
return records
519+
}
520+
499521
func sortedPartsStatusSubRecords(user store.UserState) []map[string]any {
500522
keys := make([]store.PartsStatusSubKey, 0, len(user.PartsStatusSubs))
501523
for k := range user.PartsStatusSubs {
Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
-- +goose Up
2+
CREATE TABLE user_parts_preset_tags (
3+
user_id INTEGER NOT NULL REFERENCES users(user_id),
4+
user_parts_preset_tag_number INTEGER NOT NULL,
5+
name TEXT NOT NULL DEFAULT '',
6+
latest_version INTEGER NOT NULL DEFAULT 0,
7+
PRIMARY KEY (user_id, user_parts_preset_tag_number)
8+
);
9+
10+
-- +goose Down
11+
DROP TABLE IF EXISTS user_parts_preset_tags;

0 commit comments

Comments
 (0)