mirror of Walter-Sparrow / lunar-tear
0
fork

Configure Feed

Select the types of activity you want to include in your feed.

Fx equipment duplication and add CopyDeck/RemoveDeck

+111 -16
+2
server/cmd/dev/main.go
··· 40 40 // lunar-tear (grpc) flags 41 41 grpcListen := flag.String("grpc.listen", "0.0.0.0:8003", "lunar-tear gRPC listen address (host:port)") 42 42 grpcPublicAddr := flag.String("grpc.public-addr", "10.0.2.2:8003", "lunar-tear externally-reachable address") 43 + grpcDB := flag.String("grpc.db", "db/game.db", "lunar-tear SQLite database path") 43 44 grpcOctoURL := flag.String("grpc.octo-url", "", "Octo CDN base URL passed to lunar-tear (default: derived from cdn.public-addr)") 44 45 grpcAuthURL := flag.String("grpc.auth-url", "", "auth server base URL passed to lunar-tear (default: derived from auth.listen)") 45 46 ··· 87 88 cmd: exec.CommandContext(ctx, "go", "run", "./cmd/lunar-tear", 88 89 "--listen", *grpcListen, 89 90 "--public-addr", *grpcPublicAddr, 91 + "--db", *grpcDB, 90 92 "--octo-url", *grpcOctoURL, 91 93 "--auth-url", *grpcAuthURL, 92 94 ),
+40
server/internal/service/deck.go
··· 213 213 214 214 return &pb.ReplaceMultiDeckResponse{}, nil 215 215 } 216 + 217 + func (s *DeckServiceServer) RemoveDeck(ctx context.Context, req *pb.RemoveDeckRequest) (*pb.RemoveDeckResponse, error) { 218 + log.Printf("[DeckService] RemoveDeck: deckType=%d deckNumber=%d", req.DeckType, req.UserDeckNumber) 219 + userId := CurrentUserId(ctx, s.users, s.sessions) 220 + 221 + s.users.UpdateUser(userId, func(user *store.UserState) { 222 + store.RemoveDeckData(user, model.DeckType(req.DeckType), req.UserDeckNumber) 223 + }) 224 + 225 + return &pb.RemoveDeckResponse{}, nil 226 + } 227 + 228 + func (s *DeckServiceServer) CopyDeck(ctx context.Context, req *pb.CopyDeckRequest) (*pb.CopyDeckResponse, error) { 229 + log.Printf("[DeckService] CopyDeck: from deckType=%d deckNumber=%d -> to deckType=%d deckNumber=%d", 230 + req.FromDeckType, req.FromUserDeckNumber, req.ToDeckType, req.ToUserDeckNumber) 231 + userId := CurrentUserId(ctx, s.users, s.sessions) 232 + 233 + var resultType int32 234 + s.users.UpdateUser(userId, func(user *store.UserState) { 235 + slots := store.ReadDeckSlots(user, model.DeckType(req.FromDeckType), req.FromUserDeckNumber) 236 + if slots == nil { 237 + return 238 + } 239 + 240 + nowMillis := gametime.NowMillis() 241 + fromKey := store.DeckKey{DeckType: model.DeckType(req.FromDeckType), UserDeckNumber: req.FromUserDeckNumber} 242 + srcName := user.Decks[fromKey].Name 243 + 244 + store.ApplyDeckReplacement(user, model.DeckType(req.ToDeckType), req.ToUserDeckNumber, slots, nowMillis) 245 + 246 + toKey := store.DeckKey{DeckType: model.DeckType(req.ToDeckType), UserDeckNumber: req.ToUserDeckNumber} 247 + deck := user.Decks[toKey] 248 + deck.Name = srcName 249 + user.Decks[toKey] = deck 250 + 251 + resultType = 1 252 + }) 253 + 254 + return &pb.CopyDeckResponse{ResultType: resultType}, nil 255 + }
+69 -16
server/internal/store/helpers.go
··· 330 330 deck.Power = 100 331 331 } 332 332 333 - uuidPtrs := []*string{&deck.UserDeckCharacterUuid01, &deck.UserDeckCharacterUuid02, &deck.UserDeckCharacterUuid03} 334 - for i, uuidPtr := range uuidPtrs { 333 + for _, oldUuid := range []string{deck.UserDeckCharacterUuid01, deck.UserDeckCharacterUuid02, deck.UserDeckCharacterUuid03} { 334 + if oldUuid == "" { 335 + continue 336 + } 337 + delete(user.DeckCharacters, oldUuid) 338 + delete(user.DeckSubWeapons, oldUuid) 339 + delete(user.DeckParts, oldUuid) 340 + } 341 + 342 + var newUuids [3]string 343 + for i := range 3 { 335 344 if i >= len(slots) || slots[i].UserCostumeUuid == "" { 336 - *uuidPtr = "" 337 345 continue 338 346 } 339 347 slot := slots[i] 340 - dcUuid := *uuidPtr 341 - if dcUuid == "" { 342 - dcUuid = uuid.New().String() 348 + dcUuid := uuid.New().String() 349 + user.DeckCharacters[dcUuid] = DeckCharacterState{ 350 + UserDeckCharacterUuid: dcUuid, 351 + UserCostumeUuid: slot.UserCostumeUuid, 352 + MainUserWeaponUuid: slot.MainUserWeaponUuid, 353 + UserCompanionUuid: slot.UserCompanionUuid, 354 + UserThoughtUuid: slot.UserThoughtUuid, 355 + DressupCostumeId: slot.DressupCostumeId, 356 + LatestVersion: nowMillis, 343 357 } 344 - dc := user.DeckCharacters[dcUuid] 345 - dc.UserDeckCharacterUuid = dcUuid 346 - dc.UserCostumeUuid = slot.UserCostumeUuid 347 - dc.MainUserWeaponUuid = slot.MainUserWeaponUuid 348 - dc.UserCompanionUuid = slot.UserCompanionUuid 349 - dc.UserThoughtUuid = slot.UserThoughtUuid 350 - dc.DressupCostumeId = slot.DressupCostumeId 351 - dc.LatestVersion = nowMillis 352 - user.DeckCharacters[dcUuid] = dc 353 358 user.DeckSubWeapons[dcUuid] = slot.SubWeaponUuids 354 359 user.DeckParts[dcUuid] = slot.PartsUuids 355 - *uuidPtr = dcUuid 360 + newUuids[i] = dcUuid 356 361 } 357 362 363 + deck.UserDeckCharacterUuid01 = newUuids[0] 364 + deck.UserDeckCharacterUuid02 = newUuids[1] 365 + deck.UserDeckCharacterUuid03 = newUuids[2] 358 366 deck.LatestVersion = nowMillis 359 367 user.Decks[deckKey] = deck 360 368 } 369 + 370 + func RemoveDeckData(user *UserState, deckType model.DeckType, userDeckNumber int32) { 371 + deckKey := DeckKey{DeckType: deckType, UserDeckNumber: userDeckNumber} 372 + deck, ok := user.Decks[deckKey] 373 + if !ok { 374 + return 375 + } 376 + for _, dcUuid := range []string{deck.UserDeckCharacterUuid01, deck.UserDeckCharacterUuid02, deck.UserDeckCharacterUuid03} { 377 + if dcUuid == "" { 378 + continue 379 + } 380 + delete(user.DeckCharacters, dcUuid) 381 + delete(user.DeckSubWeapons, dcUuid) 382 + delete(user.DeckParts, dcUuid) 383 + } 384 + delete(user.Decks, deckKey) 385 + } 386 + 387 + func ReadDeckSlots(user *UserState, deckType model.DeckType, userDeckNumber int32) []DeckCharacterInput { 388 + deckKey := DeckKey{DeckType: deckType, UserDeckNumber: userDeckNumber} 389 + deck, ok := user.Decks[deckKey] 390 + if !ok { 391 + return nil 392 + } 393 + slots := make([]DeckCharacterInput, 3) 394 + for i, dcUuid := range []string{deck.UserDeckCharacterUuid01, deck.UserDeckCharacterUuid02, deck.UserDeckCharacterUuid03} { 395 + if dcUuid == "" { 396 + continue 397 + } 398 + dc, ok := user.DeckCharacters[dcUuid] 399 + if !ok { 400 + continue 401 + } 402 + slots[i] = DeckCharacterInput{ 403 + UserCostumeUuid: dc.UserCostumeUuid, 404 + MainUserWeaponUuid: dc.MainUserWeaponUuid, 405 + SubWeaponUuids: user.DeckSubWeapons[dcUuid], 406 + PartsUuids: user.DeckParts[dcUuid], 407 + UserCompanionUuid: dc.UserCompanionUuid, 408 + UserThoughtUuid: dc.UserThoughtUuid, 409 + DressupCostumeId: dc.DressupCostumeId, 410 + } 411 + } 412 + return slots 413 + }