From d5bb0ac33761044e9c1325c69ebb5ea56f10112f Mon Sep 17 00:00:00 2001 From: stratic-dev Date: Fri, 18 Oct 2024 00:14:16 +0100 Subject: [PATCH] character service to /internal --- .../service/character.go | 93 ++++++++++++++----- server/channelserver/handlers.go | 3 +- server/channelserver/handlers_data.go | 46 ++------- server/channelserver/handlers_distitem.go | 3 +- server/channelserver/handlers_guild.go | 2 +- server/channelserver/handlers_tower.go | 3 +- server/channelserver/sys_session.go | 16 +++- 7 files changed, 98 insertions(+), 68 deletions(-) rename server/channelserver/handlers_character.go => internal/service/character.go (77%) diff --git a/server/channelserver/handlers_character.go b/internal/service/character.go similarity index 77% rename from server/channelserver/handlers_character.go rename to internal/service/character.go index bbab5d125..0c226366e 100644 --- a/server/channelserver/handlers_character.go +++ b/internal/service/character.go @@ -1,18 +1,16 @@ -package channelserver +package service import ( "encoding/binary" "errors" "erupe-ce/config" + "erupe-ce/server/channelserver/compression/nullcomp" "erupe-ce/utils/bfutil" "erupe-ce/utils/db" + "erupe-ce/utils/logger" "erupe-ce/utils/stringsupport" "fmt" - "erupe-ce/network/mhfpacket" - "erupe-ce/server/channelserver/compression/nullcomp" - - "github.com/jmoiron/sqlx" "go.uber.org/zap" ) @@ -121,20 +119,21 @@ func getPointers() map[SavePointer]int { return pointers } -func GetCharacterSaveData(s *Session, charID uint32) (*CharacterSaveData, error) { +func GetCharacterSaveData(charID uint32) (*CharacterSaveData, error) { db, err := db.GetDB() + logger := logger.Get() if err != nil { - s.Logger.Fatal(fmt.Sprintf("Failed to get database instance: %s", err)) + logger.Fatal(fmt.Sprintf("Failed to get database instance: %s", err)) } result, err := db.Query("SELECT id, savedata, is_new_character, name FROM characters WHERE id = $1", charID) if err != nil { - s.Logger.Error("Failed to get savedata", zap.Error(err), zap.Uint32("charID", charID)) + logger.Error("Failed to get savedata", zap.Error(err), zap.Uint32("charID", charID)) return nil, err } defer result.Close() if !result.Next() { err = errors.New("no savedata found") - s.Logger.Error("No savedata found", zap.Uint32("charID", charID)) + logger.Error("No savedata found", zap.Uint32("charID", charID)) return nil, err } @@ -143,7 +142,7 @@ func GetCharacterSaveData(s *Session, charID uint32) (*CharacterSaveData, error) } err = result.Scan(&saveData.CharID, &saveData.compSave, &saveData.IsNewCharacter, &saveData.Name) if err != nil { - s.Logger.Error("Failed to scan savedata", zap.Error(err), zap.Uint32("charID", charID)) + logger.Error("Failed to scan savedata", zap.Error(err), zap.Uint32("charID", charID)) return nil, err } @@ -153,24 +152,33 @@ func GetCharacterSaveData(s *Session, charID uint32) (*CharacterSaveData, error) err = saveData.Decompress() if err != nil { - s.Logger.Error("Failed to decompress savedata", zap.Error(err)) + logger.Error("Failed to decompress savedata", zap.Error(err)) return nil, err } - saveData.updateStructWithSaveData() + saveData.UpdateStructWithSaveData() return saveData, nil } -func (save *CharacterSaveData) Save(s *Session) { +type SessionCharacter interface { + Setkqf(data []byte) + Getkqf() []byte + GetkqfOverride() bool + GetCharID() uint32 +} + +func (save *CharacterSaveData) Save(s SessionCharacter) { db, err := db.GetDB() + logger := logger.Get() + if err != nil { - s.Logger.Fatal(fmt.Sprintf("Failed to get database instance: %s", err)) + logger.Fatal(fmt.Sprintf("Failed to get database instance: %s", err)) } - if !s.kqfOverride { - s.kqf = save.KQF + if !s.GetkqfOverride() { + s.Setkqf(save.KQF) } else { - save.KQF = s.kqf + save.KQF = s.Getkqf() } save.updateSaveDataWithStruct() @@ -178,7 +186,7 @@ func (save *CharacterSaveData) Save(s *Session) { if config.GetConfig().ClientID >= config.G1 { err := save.Compress() if err != nil { - s.Logger.Error("Failed to compress savedata", zap.Error(err)) + logger.Error("Failed to compress savedata", zap.Error(err)) return } } else { @@ -189,11 +197,11 @@ func (save *CharacterSaveData) Save(s *Session) { _, err = db.Exec(`UPDATE characters SET savedata=$1, is_new_character=false, hr=$2, gr=$3, is_female=$4, weapon_type=$5, weapon_id=$6 WHERE id=$7 `, save.compSave, save.HR, save.GR, save.Gender, save.WeaponType, save.WeaponID, save.CharID) if err != nil { - s.Logger.Error("Failed to update savedata", zap.Error(err), zap.Uint32("charID", save.CharID)) + logger.Error("Failed to update savedata", zap.Error(err), zap.Uint32("charID", save.CharID)) } db.Exec(`UPDATE user_binary SET house_tier=$1, house_data=$2, bookshelf=$3, gallery=$4, tore=$5, garden=$6 WHERE id=$7 - `, save.HouseTier, save.HouseData, save.BookshelfData, save.GalleryData, save.ToreData, save.GardenData, s.CharID) + `, save.HouseTier, save.HouseData, save.BookshelfData, save.GalleryData, save.ToreData, save.GardenData, s.GetCharID()) } func (save *CharacterSaveData) Compress() error { @@ -227,7 +235,7 @@ func (save *CharacterSaveData) updateSaveDataWithStruct() { } // This will update the save struct with the values stored in the character save -func (save *CharacterSaveData) updateStructWithSaveData() { +func (save *CharacterSaveData) UpdateStructWithSaveData() { save.Name = stringsupport.SJISToUTF8(bfutil.UpToNull(save.decompSave[88:100])) if save.decompSave[save.Pointers[pGender]] == 1 { save.Gender = true @@ -258,8 +266,45 @@ func (save *CharacterSaveData) updateStructWithSaveData() { } return } +func grpToGR(n int) uint16 { + var gr int + a := []int{208750, 593400, 993400, 1400900, 2315900, 3340900, 4505900, 5850900, 7415900, 9230900, 11345900, 100000000} + b := []int{7850, 8000, 8150, 9150, 10250, 11650, 13450, 15650, 18150, 21150, 23950} + c := []int{51, 100, 150, 200, 300, 400, 500, 600, 700, 800, 900} -func handleMsgMhfSexChanger(s *Session, db *sqlx.DB, p mhfpacket.MHFPacket) { - pkt := p.(*mhfpacket.MsgMhfSexChanger) - s.DoAckSimpleSucceed(pkt.AckHandle, make([]byte, 4)) + for i := 0; i < len(a); i++ { + if n < a[i] { + if i == 0 { + for { + n -= 500 + if n <= 500 { + if n < 0 { + i-- + } + break + } else { + i++ + for j := 0; j < i; j++ { + n -= 150 + } + } + } + gr = i + 2 + } else { + n -= a[i-1] + gr = c[i-1] + gr += n / b[i-1] + } + break + } + } + return uint16(gr) +} + +func (save *CharacterSaveData) GetDecompSave() []byte { + return save.decompSave +} + +func (save *CharacterSaveData) SetDecompSave(decompSave []byte) { + save.decompSave = decompSave } diff --git a/server/channelserver/handlers.go b/server/channelserver/handlers.go index b149ae504..e6751966f 100644 --- a/server/channelserver/handlers.go +++ b/server/channelserver/handlers.go @@ -4,6 +4,7 @@ import ( "encoding/binary" "erupe-ce/config" "erupe-ce/internal/model" + "erupe-ce/internal/service" "erupe-ce/internal/system" "erupe-ce/utils/db" "erupe-ce/utils/gametime" @@ -221,7 +222,7 @@ func logoutPlayer(s *Session) { removeSessionFromSemaphore(s) removeSessionFromStage(s) - saveData, err := GetCharacterSaveData(s, s.CharID) + saveData, err := service.GetCharacterSaveData(s.CharID) if err != nil || saveData == nil { s.Logger.Error("Failed to get savedata") return diff --git a/server/channelserver/handlers_data.go b/server/channelserver/handlers_data.go index 093bbc50c..c9cf06a9a 100644 --- a/server/channelserver/handlers_data.go +++ b/server/channelserver/handlers_data.go @@ -12,6 +12,7 @@ import ( "path/filepath" "time" + "erupe-ce/internal/service" "erupe-ce/network/mhfpacket" "erupe-ce/server/channelserver/compression/deltacomp" "erupe-ce/server/channelserver/compression/nullcomp" @@ -24,7 +25,7 @@ import ( func handleMsgMhfSavedata(s *Session, db *sqlx.DB, p mhfpacket.MHFPacket) { pkt := p.(*mhfpacket.MsgMhfSavedata) - characterSaveData, err := GetCharacterSaveData(s, s.CharID) + characterSaveData, err := service.GetCharacterSaveData(s.GetCharID()) if err != nil { s.Logger.Error("failed to retrieve character save data from db", zap.Error(err), zap.Uint32("charID", s.CharID)) return @@ -41,7 +42,7 @@ func handleMsgMhfSavedata(s *Session, db *sqlx.DB, p mhfpacket.MHFPacket) { } // Perform diff. s.Logger.Info("Diffing...") - characterSaveData.decompSave = deltacomp.ApplyDataDiff(diff, characterSaveData.decompSave) + characterSaveData.SetDecompSave(deltacomp.ApplyDataDiff(diff, characterSaveData.GetDecompSave())) } else { dumpSaveData(s, pkt.RawDataPayload, "savedata") // Regular blob update. @@ -55,9 +56,9 @@ func handleMsgMhfSavedata(s *Session, db *sqlx.DB, p mhfpacket.MHFPacket) { dumpSaveData(s, saveData, "raw-savedata") } s.Logger.Info("Updating save with blob") - characterSaveData.decompSave = saveData + characterSaveData.SetDecompSave(saveData) } - characterSaveData.updateStructWithSaveData() + characterSaveData.UpdateStructWithSaveData() // Bypass name-checker if new if characterSaveData.IsNewCharacter == true { @@ -81,40 +82,9 @@ func handleMsgMhfSavedata(s *Session, db *sqlx.DB, p mhfpacket.MHFPacket) { } s.DoAckSimpleSucceed(pkt.AckHandle, make([]byte, 4)) } - -func grpToGR(n int) uint16 { - var gr int - a := []int{208750, 593400, 993400, 1400900, 2315900, 3340900, 4505900, 5850900, 7415900, 9230900, 11345900, 100000000} - b := []int{7850, 8000, 8150, 9150, 10250, 11650, 13450, 15650, 18150, 21150, 23950} - c := []int{51, 100, 150, 200, 300, 400, 500, 600, 700, 800, 900} - - for i := 0; i < len(a); i++ { - if n < a[i] { - if i == 0 { - for { - n -= 500 - if n <= 500 { - if n < 0 { - i-- - } - break - } else { - i++ - for j := 0; j < i; j++ { - n -= 150 - } - } - } - gr = i + 2 - } else { - n -= a[i-1] - gr = c[i-1] - gr += n / b[i-1] - } - break - } - } - return uint16(gr) +func handleMsgMhfSexChanger(s *Session, db *sqlx.DB, p mhfpacket.MHFPacket) { + pkt := p.(*mhfpacket.MsgMhfSexChanger) + s.DoAckSimpleSucceed(pkt.AckHandle, make([]byte, 4)) } func dumpSaveData(s *Session, data []byte, suffix string) { diff --git a/server/channelserver/handlers_distitem.go b/server/channelserver/handlers_distitem.go index 9b91cd17e..c33df1620 100644 --- a/server/channelserver/handlers_distitem.go +++ b/server/channelserver/handlers_distitem.go @@ -3,6 +3,7 @@ package channelserver import ( "erupe-ce/config" "erupe-ce/internal/model" + "erupe-ce/internal/service" "erupe-ce/network/mhfpacket" "erupe-ce/utils/byteframe" "erupe-ce/utils/db" @@ -161,7 +162,7 @@ func handleMsgMhfAcquireDistItem(s *Session, db *sqlx.DB, p mhfpacket.MHFPacket) case 21: db.Exec("UPDATE users u SET frontier_points=frontier_points+$1 WHERE u.id=(SELECT c.user_id FROM characters c WHERE c.id=$2)", item.Quantity, s.CharID) case 23: - saveData, err := GetCharacterSaveData(s, s.CharID) + saveData, err := service.GetCharacterSaveData(s.CharID) if err == nil { saveData.RP += uint16(item.Quantity) saveData.Save(s) diff --git a/server/channelserver/handlers_guild.go b/server/channelserver/handlers_guild.go index 663fdc59c..198c1af27 100644 --- a/server/channelserver/handlers_guild.go +++ b/server/channelserver/handlers_guild.go @@ -215,7 +215,7 @@ func handleDonateRP(s *Session, amount uint16, guild *service.Guild, _type int) } bf := byteframe.NewByteFrame() bf.WriteUint32(0) - saveData, err := GetCharacterSaveData(s, s.CharID) + saveData, err := service.GetCharacterSaveData(s.CharID) if err != nil { return bf.Data() } diff --git a/server/channelserver/handlers_tower.go b/server/channelserver/handlers_tower.go index 060a41e7b..1e45c0e38 100644 --- a/server/channelserver/handlers_tower.go +++ b/server/channelserver/handlers_tower.go @@ -3,6 +3,7 @@ package channelserver import ( "erupe-ce/config" "erupe-ce/internal/model" + "erupe-ce/internal/service" "fmt" "strings" @@ -284,7 +285,7 @@ func handleMsgMhfPostTenrouirai(s *Session, db *sqlx.DB, p mhfpacket.MHFPacket) bf := byteframe.NewByteFrame() - sd, err := GetCharacterSaveData(s, s.CharID) + sd, err := service.GetCharacterSaveData(s.CharID) if err == nil && sd != nil { sd.RP -= pkt.DonatedRP sd.Save(s) diff --git a/server/channelserver/sys_session.go b/server/channelserver/sys_session.go index 94685eaf6..3293f8022 100644 --- a/server/channelserver/sys_session.go +++ b/server/channelserver/sys_session.go @@ -373,8 +373,20 @@ func (s *Session) DoAckSimpleFail(ackHandle uint32, data []byte) { }) } func (s *Session) GetCharID() uint32 { - return s.CharID // Assuming `Session` has a field `CharID` + return s.CharID } func (s *Session) GetName() string { - return s.Name // Assuming `Session` has a field `CharID` + return s.Name +} + +func (s *Session) Getkqf() []byte { + return s.kqf +} + +func (s *Session) GetkqfOverride() bool { + return s.kqfOverride +} + +func (s *Session) Setkqf(kqf []byte) { + s.kqf = kqf }