fix(channelserver): add error logging to silently ignored repo calls

19 repository calls across 8 handler files were silently discarding
errors with `_ =`, making database failures invisible. Add structured
logging at appropriate levels: Error for write operations where data
loss may occur (guild saves, member updates), Warn for read operations
where handlers continue with zero-value defaults (application checks,
warehouse loads, item box queries). No control flow changes.
This commit is contained in:
Houmgaor
2026-02-21 17:37:29 +01:00
parent 6fbd294575
commit 8fe6f60813
8 changed files with 72 additions and 23 deletions

View File

@@ -338,7 +338,11 @@ func handleMsgMhfStateFestaU(s *Session, p mhfpacket.MHFPacket) {
guild, err := s.server.guildRepo.GetByCharID(s.charID)
applicant := false
if guild != nil {
applicant, _ = s.server.guildRepo.HasApplication(guild.ID, s.charID)
var appErr error
applicant, appErr = s.server.guildRepo.HasApplication(guild.ID, s.charID)
if appErr != nil {
s.logger.Warn("Failed to check guild application status", zap.Error(appErr))
}
}
if err != nil || guild == nil || applicant {
doAckSimpleFail(s, pkt.AckHandle, make([]byte, 4))
@@ -367,7 +371,11 @@ func handleMsgMhfStateFestaG(s *Session, p mhfpacket.MHFPacket) {
guild, err := s.server.guildRepo.GetByCharID(s.charID)
applicant := false
if guild != nil {
applicant, _ = s.server.guildRepo.HasApplication(guild.ID, s.charID)
var appErr error
applicant, appErr = s.server.guildRepo.HasApplication(guild.ID, s.charID)
if appErr != nil {
s.logger.Warn("Failed to check guild application status", zap.Error(appErr))
}
}
resp := byteframe.NewByteFrame()
if err != nil || guild == nil || applicant {

View File

@@ -59,7 +59,11 @@ func handleMsgMhfUpdateGuildMessageBoard(s *Session, p mhfpacket.MHFPacket) {
guild, err := s.server.guildRepo.GetByCharID(s.charID)
applicant := false
if guild != nil {
applicant, _ = s.server.guildRepo.HasApplication(guild.ID, s.charID)
var appErr error
applicant, appErr = s.server.guildRepo.HasApplication(guild.ID, s.charID)
if appErr != nil {
s.logger.Warn("Failed to check guild application status", zap.Error(appErr))
}
}
if err != nil || guild == nil || applicant {
doAckSimpleSucceed(s, pkt.AckHandle, make([]byte, 4))

View File

@@ -51,13 +51,19 @@ func handleMsgMhfOperateGuild(s *Session, p mhfpacket.MHFPacket) {
guild.LeaderCharID = guildMembers[i].CharID
guildMembers[0].OrderIndex = guildMembers[i].OrderIndex
guildMembers[i].OrderIndex = 1
_ = s.server.guildRepo.SaveMember(guildMembers[0])
_ = s.server.guildRepo.SaveMember(guildMembers[i])
if err := s.server.guildRepo.SaveMember(guildMembers[0]); err != nil {
s.logger.Error("Failed to save former leader member data", zap.Error(err))
}
if err := s.server.guildRepo.SaveMember(guildMembers[i]); err != nil {
s.logger.Error("Failed to save new leader member data", zap.Error(err))
}
bf.WriteUint32(guildMembers[i].CharID)
break
}
}
_ = s.server.guildRepo.Save(guild)
if err := s.server.guildRepo.Save(guild); err != nil {
s.logger.Error("Failed to save guild after leadership resign", zap.Error(err))
}
}
case mhfpacket.OperateGuildApply:
err = s.server.guildRepo.CreateApplication(guild.ID, s.charID, s.charID, GuildApplicationTypeApplied)
@@ -76,9 +82,11 @@ func handleMsgMhfOperateGuild(s *Session, p mhfpacket.MHFPacket) {
if err != nil {
response = 0
} else {
_ = s.server.mailRepo.SendMail(0, s.charID, "Withdrawal",
if err := s.server.mailRepo.SendMail(0, s.charID, "Withdrawal",
fmt.Sprintf("You have withdrawn from 「%s」.", guild.Name),
0, 0, false, true)
0, 0, false, true); err != nil {
s.logger.Warn("Failed to send guild withdrawal notification", zap.Error(err))
}
}
bf.WriteUint32(uint32(response))
case mhfpacket.OperateGuildDonateRank:
@@ -101,7 +109,9 @@ func handleMsgMhfOperateGuild(s *Session, p mhfpacket.MHFPacket) {
return
}
guild.Comment, _ = stringsupport.SJISToUTF8(pkt.Data2.ReadNullTerminatedBytes())
_ = s.server.guildRepo.Save(guild)
if err := s.server.guildRepo.Save(guild); err != nil {
s.logger.Error("Failed to save guild comment", zap.Error(err))
}
case mhfpacket.OperateGuildUpdateMotto:
if !characterGuildInfo.IsLeader && !characterGuildInfo.IsSubLeader() {
doAckSimpleFail(s, pkt.AckHandle, make([]byte, 4))
@@ -110,7 +120,9 @@ func handleMsgMhfOperateGuild(s *Session, p mhfpacket.MHFPacket) {
_ = pkt.Data1.ReadUint16()
guild.SubMotto = pkt.Data1.ReadUint8()
guild.MainMotto = pkt.Data1.ReadUint8()
_ = s.server.guildRepo.Save(guild)
if err := s.server.guildRepo.Save(guild); err != nil {
s.logger.Error("Failed to save guild motto", zap.Error(err))
}
case mhfpacket.OperateGuildRenamePugi1:
handleRenamePugi(s, pkt.Data2, guild, 1)
case mhfpacket.OperateGuildRenamePugi2:
@@ -165,7 +177,9 @@ func handleRenamePugi(s *Session, bf *byteframe.ByteFrame, guild *Guild, num int
default:
guild.PugiName3 = name
}
_ = s.server.guildRepo.Save(guild)
if err := s.server.guildRepo.Save(guild); err != nil {
s.logger.Error("Failed to save guild pugi name", zap.Error(err))
}
}
func handleChangePugi(s *Session, outfit uint8, guild *Guild, num int) {
@@ -177,7 +191,9 @@ func handleChangePugi(s *Session, outfit uint8, guild *Guild, num int) {
case 3:
guild.PugiOutfit3 = outfit
}
_ = s.server.guildRepo.Save(guild)
if err := s.server.guildRepo.Save(guild); err != nil {
s.logger.Error("Failed to save guild pugi outfit", zap.Error(err))
}
}
func handleDonateRP(s *Session, amount uint16, guild *Guild, _type int) []byte {
@@ -299,7 +315,9 @@ func handleMsgMhfOperateGuildMember(s *Session, p mhfpacket.MHFPacket) {
if err != nil {
doAckSimpleFail(s, pkt.AckHandle, make([]byte, 4))
} else {
_ = s.server.mailRepo.SendMail(mail.SenderID, mail.RecipientID, mail.Subject, mail.Body, 0, 0, false, true)
if err := s.server.mailRepo.SendMail(mail.SenderID, mail.RecipientID, mail.Subject, mail.Body, 0, 0, false, true); err != nil {
s.logger.Warn("Failed to send guild member operation mail", zap.Error(err))
}
if s.server.Registry != nil {
s.server.Registry.NotifyMailToCharID(pkt.CharID, s, &mail)
} else {

View File

@@ -148,7 +148,9 @@ func handleMsgMhfAnswerGuildScout(s *Session, p mhfpacket.MHFPacket) {
bf.WriteUint32(guild.ID)
doAckBufSucceed(s, pkt.AckHandle, bf.Data())
for _, m := range msgs {
_ = s.server.mailRepo.SendMail(m.senderID, m.recipientID, m.subject, m.body, 0, 0, false, true)
if err := s.server.mailRepo.SendMail(m.senderID, m.recipientID, m.subject, m.body, 0, 0, false, true); err != nil {
s.logger.Warn("Failed to send guild scout response mail", zap.Error(err))
}
}
}
}

View File

@@ -402,12 +402,14 @@ func addWarehouseItem(s *Session, item mhfitem.MHFItemStack) {
func warehouseGetItems(s *Session, index uint8) []mhfitem.MHFItemStack {
initializeWarehouse(s)
var data []byte
var items []mhfitem.MHFItemStack
if index > 10 {
return items
}
data, _ = s.server.houseRepo.GetWarehouseItemData(s.charID, index)
data, err := s.server.houseRepo.GetWarehouseItemData(s.charID, index)
if err != nil {
s.logger.Warn("Failed to load warehouse item data", zap.Error(err))
}
if len(data) > 0 {
box := byteframe.NewByteFrameFromBytes(data)
numStacks := box.ReadUint16()
@@ -420,12 +422,14 @@ func warehouseGetItems(s *Session, index uint8) []mhfitem.MHFItemStack {
}
func warehouseGetEquipment(s *Session, index uint8) []mhfitem.MHFEquipment {
var data []byte
var equipment []mhfitem.MHFEquipment
if index > 10 {
return equipment
}
data, _ = s.server.houseRepo.GetWarehouseEquipData(s.charID, index)
data, err := s.server.houseRepo.GetWarehouseEquipData(s.charID, index)
if err != nil {
s.logger.Warn("Failed to load warehouse equipment data", zap.Error(err))
}
if len(data) > 0 {
box := byteframe.NewByteFrameFromBytes(data)
numStacks := box.ReadUint16()

View File

@@ -188,9 +188,11 @@ func handleMsgMhfEnumerateOrder(s *Session, p mhfpacket.MHFPacket) {
func handleMsgMhfGetExtraInfo(s *Session, p mhfpacket.MHFPacket) {}
func userGetItems(s *Session) []mhfitem.MHFItemStack {
var data []byte
var items []mhfitem.MHFItemStack
data, _ = s.server.userRepo.GetItemBox(s.userID)
data, err := s.server.userRepo.GetItemBox(s.userID)
if err != nil {
s.logger.Warn("Failed to load user item box", zap.Error(err))
}
if len(data) > 0 {
box := byteframe.NewByteFrameFromBytes(data)
numStacks := box.ReadUint16()
@@ -247,7 +249,10 @@ func handleMsgMhfCheckWeeklyStamp(s *Session, p mhfpacket.MHFPacket) {
updated = 1
}
total, redeemed, _ = s.server.stampRepo.GetTotals(s.charID, pkt.StampType)
total, redeemed, err = s.server.stampRepo.GetTotals(s.charID, pkt.StampType)
if err != nil {
s.logger.Warn("Failed to get stamp totals", zap.Error(err))
}
bf := byteframe.NewByteFrame()
bf.WriteUint16(total)
bf.WriteUint16(redeemed)

View File

@@ -212,7 +212,11 @@ func handleMsgMhfReadMercenaryW(s *Session, p mhfpacket.MHFPacket) {
var cid uint32
var name string
if pactID > 0 {
cid, name, _ = s.server.charRepo.FindByRastaID(pactID)
var findErr error
cid, name, findErr = s.server.charRepo.FindByRastaID(pactID)
if findErr != nil {
s.logger.Warn("Failed to find character by rasta ID", zap.Error(findErr))
}
bf.WriteUint8(1) // numLends
bf.WriteUint32(uint32(pactID))
bf.WriteUint32(cid)

View File

@@ -202,7 +202,11 @@ func handleMsgMhfEnumerateRengokuRanking(s *Session, p mhfpacket.MHFPacket) {
guild, _ := s.server.guildRepo.GetByCharID(s.charID)
var isApplicant bool
if guild != nil {
isApplicant, _ = s.server.guildRepo.HasApplication(guild.ID, s.charID)
var appErr error
isApplicant, appErr = s.server.guildRepo.HasApplication(guild.ID, s.charID)
if appErr != nil {
s.logger.Warn("Failed to check guild application status", zap.Error(appErr))
}
}
if isApplicant {
guild = nil