Compare commits
4 Commits
feb8ec96ad
...
fix/bossra
| Author | SHA1 | Date | |
|---|---|---|---|
| 688d4b34df | |||
| 4393503245 | |||
| d6c75dcaad | |||
| 83c583c04d |
@@ -252,7 +252,10 @@ func (s *Service) CompleteRaid(sessionName string, rewards []PlayerReward) (*Bos
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// Reset slot to idle so it can accept new raids
|
// BossRoom 삭제 후 슬롯 리셋 — 다음 파티가 즉시 슬롯 재사용 가능
|
||||||
|
if err := s.repo.DeleteRoomBySessionName(sessionName); err != nil {
|
||||||
|
log.Printf("BossRoom 삭제 실패 (complete): %s: %v", sessionName, err)
|
||||||
|
}
|
||||||
if err := s.repo.ResetRoomSlot(sessionName); err != nil {
|
if err := s.repo.ResetRoomSlot(sessionName); err != nil {
|
||||||
log.Printf("슬롯 리셋 실패 (complete): %s: %v", sessionName, err)
|
log.Printf("슬롯 리셋 실패 (complete): %s: %v", sessionName, err)
|
||||||
}
|
}
|
||||||
@@ -276,15 +279,20 @@ func (s *Service) FailRaid(sessionName string) (*BossRoom, error) {
|
|||||||
return nil, fmt.Errorf("상태 업데이트 실패: %w", err)
|
return nil, fmt.Errorf("상태 업데이트 실패: %w", err)
|
||||||
}
|
}
|
||||||
|
|
||||||
// Reset slot to idle so it can accept new raids
|
// 응답용 room 조회 (삭제 전에 수행)
|
||||||
if err := s.repo.ResetRoomSlot(sessionName); err != nil {
|
|
||||||
log.Printf("슬롯 리셋 실패 (fail): %s: %v", sessionName, err)
|
|
||||||
}
|
|
||||||
|
|
||||||
room, err := s.repo.FindBySessionName(sessionName)
|
room, err := s.repo.FindBySessionName(sessionName)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, fmt.Errorf("방을 찾을 수 없습니다: %w", err)
|
return nil, fmt.Errorf("방을 찾을 수 없습니다: %w", err)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// BossRoom 삭제 후 슬롯 리셋 — 다음 파티가 즉시 슬롯 재사용 가능
|
||||||
|
if err := s.repo.DeleteRoomBySessionName(sessionName); err != nil {
|
||||||
|
log.Printf("BossRoom 삭제 실패 (fail): %s: %v", sessionName, err)
|
||||||
|
}
|
||||||
|
if err := s.repo.ResetRoomSlot(sessionName); err != nil {
|
||||||
|
log.Printf("슬롯 리셋 실패 (fail): %s: %v", sessionName, err)
|
||||||
|
}
|
||||||
|
|
||||||
return room, nil
|
return room, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -34,6 +34,8 @@ func (s *Service) SetUserResolver(fn func(username string) (uint, error)) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// resolveUsername converts a username to the user's on-chain pubKeyHex.
|
// resolveUsername converts a username to the user's on-chain pubKeyHex.
|
||||||
|
// If the user exists but has no wallet (e.g. legacy user or failed creation),
|
||||||
|
// a wallet is auto-created on the fly.
|
||||||
func (s *Service) resolveUsername(username string) (string, error) {
|
func (s *Service) resolveUsername(username string) (string, error) {
|
||||||
if s.userResolver == nil {
|
if s.userResolver == nil {
|
||||||
return "", fmt.Errorf("user resolver not configured")
|
return "", fmt.Errorf("user resolver not configured")
|
||||||
@@ -44,7 +46,17 @@ func (s *Service) resolveUsername(username string) (string, error) {
|
|||||||
}
|
}
|
||||||
uw, err := s.repo.FindByUserID(userID)
|
uw, err := s.repo.FindByUserID(userID)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return "", fmt.Errorf("wallet not found")
|
// 지갑이 없으면 자동 생성 시도
|
||||||
|
uw, err = s.CreateWallet(userID)
|
||||||
|
if err != nil {
|
||||||
|
// unique constraint 위반 — 다른 고루틴이 먼저 생성 완료
|
||||||
|
uw, err = s.repo.FindByUserID(userID)
|
||||||
|
if err != nil {
|
||||||
|
return "", fmt.Errorf("wallet auto-creation failed: %w", err)
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
log.Printf("INFO: auto-created wallet for userID=%d (username=%s)", userID, username)
|
||||||
|
}
|
||||||
}
|
}
|
||||||
return uw.PubKeyHex, nil
|
return uw.PubKeyHex, nil
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -167,9 +167,9 @@ func (s *Service) SaveGameDataByUsername(username string, data *GameDataRequest)
|
|||||||
|
|
||||||
// GrantExperience adds experience to a player and handles level ups + stat recalculation.
|
// GrantExperience adds experience to a player and handles level ups + stat recalculation.
|
||||||
func (s *Service) GrantExperience(userID uint, exp int) (*LevelUpResult, error) {
|
func (s *Service) GrantExperience(userID uint, exp int) (*LevelUpResult, error) {
|
||||||
profile, err := s.repo.FindByUserID(userID)
|
profile, err := s.GetProfile(userID)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, fmt.Errorf("프로필이 존재하지 않습니다")
|
return nil, fmt.Errorf("프로필 조회/생성 실패: %w", err)
|
||||||
}
|
}
|
||||||
|
|
||||||
result := ApplyExperience(profile.Level, profile.Experience, exp)
|
result := ApplyExperience(profile.Level, profile.Experience, exp)
|
||||||
|
|||||||
@@ -33,7 +33,7 @@ func New() *fiber.App {
|
|||||||
app.Use(middleware.SecurityHeaders)
|
app.Use(middleware.SecurityHeaders)
|
||||||
app.Use(cors.New(cors.Config{
|
app.Use(cors.New(cors.Config{
|
||||||
AllowOrigins: "https://a301.tolelom.xyz",
|
AllowOrigins: "https://a301.tolelom.xyz",
|
||||||
AllowHeaders: "Origin, Content-Type, Authorization, Idempotency-Key, X-API-Key",
|
AllowHeaders: "Origin, Content-Type, Authorization, Idempotency-Key, X-API-Key, X-Requested-With",
|
||||||
AllowMethods: "GET, POST, PUT, PATCH, DELETE",
|
AllowMethods: "GET, POST, PUT, PATCH, DELETE",
|
||||||
AllowCredentials: true,
|
AllowCredentials: true,
|
||||||
}))
|
}))
|
||||||
|
|||||||
Reference in New Issue
Block a user