From 09f2d138c0d11de2a1888969b132c72e94f05dc0 Mon Sep 17 00:00:00 2001 From: wish Date: Sat, 4 Feb 2023 15:44:07 +1100 Subject: [PATCH] make various handlers not error fatally --- server/channelserver/handlers_guild.go | 56 ++++++++++--------- .../channelserver/handlers_guild_adventure.go | 16 +++--- .../channelserver/handlers_guild_alliance.go | 8 +-- server/channelserver/handlers_kouryou.go | 6 +- server/channelserver/handlers_mail.go | 15 +++-- 5 files changed, 57 insertions(+), 44 deletions(-) diff --git a/server/channelserver/handlers_guild.go b/server/channelserver/handlers_guild.go index ca1ddf973..de54263ff 100644 --- a/server/channelserver/handlers_guild.go +++ b/server/channelserver/handlers_guild.go @@ -1531,10 +1531,11 @@ func handleMsgMhfEnumerateGuildItem(s *Session, p mhfpacket.MHFPacket) { bf := byteframe.NewByteFrame() err := s.server.db.QueryRow("SELECT item_box FROM guilds WHERE id = $1", int(pkt.GuildId)).Scan(&boxContents) if err != nil { - s.logger.Fatal("Failed to get guild item box contents from db", zap.Error(err)) + s.logger.Error("Failed to get guild item box contents from db", zap.Error(err)) + bf.WriteBytes(make([]byte, 4)) } else { if len(boxContents) == 0 { - bf.WriteUint32(0x00) + bf.WriteBytes(make([]byte, 4)) } else { amount := len(boxContents) / 4 bf.WriteUint16(uint16(amount)) @@ -1564,7 +1565,9 @@ func handleMsgMhfUpdateGuildItem(s *Session, p mhfpacket.MHFPacket) { var oldItems []Item err := s.server.db.QueryRow("SELECT item_box FROM guilds WHERE id = $1", int(pkt.GuildId)).Scan(&boxContents) if err != nil { - s.logger.Fatal("Failed to get guild item box contents from db", zap.Error(err)) + s.logger.Error("Failed to get guild item box contents from db", zap.Error(err)) + doAckSimpleSucceed(s, pkt.AckHandle, make([]byte, 4)) + return } else { amount := len(boxContents) / 4 oldItems = make([]Item, amount) @@ -1612,7 +1615,7 @@ func handleMsgMhfUpdateGuildItem(s *Session, p mhfpacket.MHFPacket) { // Upload new item cache _, err = s.server.db.Exec("UPDATE guilds SET item_box = $1 WHERE id = $2", bf.Data(), int(pkt.GuildId)) if err != nil { - s.logger.Fatal("Failed to update guild item box contents in db", zap.Error(err)) + s.logger.Error("Failed to update guild item box contents in db", zap.Error(err)) } doAckSimpleSucceed(s, pkt.AckHandle, []byte{0x00, 0x00, 0x00, 0x00}) @@ -1737,7 +1740,8 @@ func handleMsgMhfLoadGuildCooking(s *Session, p mhfpacket.MHFPacket) { guild, _ := GetGuildInfoByCharacterId(s, s.charID) data, err := s.server.db.Queryx("SELECT id, meal_id, level, expires FROM guild_meals WHERE guild_id = $1", guild.ID) if err != nil { - s.logger.Fatal("Failed to get guild meals from db", zap.Error(err)) + s.logger.Error("Failed to get guild meals from db", zap.Error(err)) + doAckBufSucceed(s, pkt.AckHandle, make([]byte, 2)) } temp := byteframe.NewByteFrame() count := 0 @@ -1745,7 +1749,7 @@ func handleMsgMhfLoadGuildCooking(s *Session, p mhfpacket.MHFPacket) { mealData := &GuildMeal{} err = data.StructScan(&mealData) if err != nil { - s.logger.Fatal("Failed to scan meal data", zap.Error(err)) + continue } if mealData.Expires > uint32(Time_Current_Adjusted().Add(-60*time.Minute).Unix()) { count++ @@ -1767,12 +1771,12 @@ func handleMsgMhfRegistGuildCooking(s *Session, p mhfpacket.MHFPacket) { if pkt.OverwriteID != 0 { _, err := s.server.db.Exec("DELETE FROM guild_meals WHERE id = $1", pkt.OverwriteID) if err != nil { - s.logger.Fatal("Failed to delete meal in db", zap.Error(err)) + s.logger.Error("Failed to delete meal in db", zap.Error(err)) } } _, err := s.server.db.Exec("INSERT INTO guild_meals (guild_id, meal_id, level, expires) VALUES ($1, $2, $3, $4)", guild.ID, pkt.MealID, pkt.Success, Time_Current_Adjusted().Add(30*time.Minute).Unix()) if err != nil { - s.logger.Fatal("Failed to register meal in db", zap.Error(err)) + s.logger.Error("Failed to register meal in db", zap.Error(err)) } doAckSimpleSucceed(s, pkt.AckHandle, []byte{0x01, 0x00}) } @@ -1826,7 +1830,9 @@ func handleMsgMhfEnumerateGuildMessageBoard(s *Session, p mhfpacket.MHFPacket) { msgs, err := s.server.db.Queryx("SELECT post_type, stamp_id, title, body, author_id, (EXTRACT(epoch FROM created_at)::int) as created_at, liked_by FROM guild_posts WHERE guild_id = $1 AND post_type = $2 ORDER BY created_at DESC", guild.ID, int(pkt.BoardType)) if err != nil { - s.logger.Fatal("Failed to get guild messages from db", zap.Error(err)) + s.logger.Error("Failed to get guild messages from db", zap.Error(err)) + doAckBufSucceed(s, pkt.AckHandle, make([]byte, 4)) + return } bf := byteframe.NewByteFrame() @@ -1836,11 +1842,10 @@ func handleMsgMhfEnumerateGuildMessageBoard(s *Session, p mhfpacket.MHFPacket) { noMsgs = false postCount++ postData := &MessageBoardPost{} - err = msgs.StructScan(&postData) + msgs.StructScan(&postData) if err != nil { - s.logger.Fatal("Failed to get guild messages from db", zap.Error(err)) + continue } - bf.WriteUint32(postData.Type) bf.WriteUint32(postData.AuthorID) bf.WriteUint64(postData.Timestamp) @@ -1856,7 +1861,7 @@ func handleMsgMhfEnumerateGuildMessageBoard(s *Session, p mhfpacket.MHFPacket) { ps.Uint32(bf, postData.Body, true) } if noMsgs { - doAckBufSucceed(s, pkt.AckHandle, []byte{0x00, 0x00, 0x00, 0x00}) + doAckBufSucceed(s, pkt.AckHandle, make([]byte, 4)) } else { data := byteframe.NewByteFrame() data.WriteUint32(uint32(postCount)) @@ -1890,19 +1895,20 @@ func handleMsgMhfUpdateGuildMessageBoard(s *Session, p mhfpacket.MHFPacket) { bodyConv = stringsupport.SJISToUTF8(body) _, err := s.server.db.Exec("INSERT INTO guild_posts (guild_id, author_id, stamp_id, post_type, title, body) VALUES ($1, $2, $3, $4, $5, $6)", guild.ID, s.charID, int(stampId), int(postType), titleConv, bodyConv) if err != nil { - s.logger.Fatal("Failed to add new guild message to db", zap.Error(err)) + s.logger.Error("Failed to add new guild message to db", zap.Error(err)) } - // TODO: if there are too many messages, purge excess + /* TODO: if there are too many messages, purge excess _, err = s.server.db.Exec("") if err != nil { s.logger.Fatal("Failed to remove excess guild messages from db", zap.Error(err)) } + */ case 1: // Delete message postType := bf.ReadUint32() timestamp := bf.ReadUint64() _, err := s.server.db.Exec("DELETE FROM guild_posts WHERE post_type = $1 AND (EXTRACT(epoch FROM created_at)::int) = $2 AND guild_id = $3", int(postType), int(timestamp), guild.ID) if err != nil { - s.logger.Fatal("Failed to delete guild message from db", zap.Error(err)) + s.logger.Error("Failed to delete guild message from db", zap.Error(err)) } case 2: // Update message postType := bf.ReadUint32() @@ -1915,7 +1921,7 @@ func handleMsgMhfUpdateGuildMessageBoard(s *Session, p mhfpacket.MHFPacket) { bodyConv = stringsupport.SJISToUTF8(body) _, err := s.server.db.Exec("UPDATE guild_posts SET title = $1, body = $2 WHERE post_type = $3 AND (EXTRACT(epoch FROM created_at)::int) = $4 AND guild_id = $5", titleConv, bodyConv, int(postType), int(timestamp), guild.ID) if err != nil { - s.logger.Fatal("Failed to update guild message in db", zap.Error(err)) + s.logger.Error("Failed to update guild message in db", zap.Error(err)) } case 3: // Update stamp postType := bf.ReadUint32() @@ -1923,7 +1929,7 @@ func handleMsgMhfUpdateGuildMessageBoard(s *Session, p mhfpacket.MHFPacket) { stampId := bf.ReadUint32() _, err := s.server.db.Exec("UPDATE guild_posts SET stamp_id = $1 WHERE post_type = $2 AND (EXTRACT(epoch FROM created_at)::int) = $3 AND guild_id = $4", int(stampId), int(postType), int(timestamp), guild.ID) if err != nil { - s.logger.Fatal("Failed to update guild message stamp in db", zap.Error(err)) + s.logger.Error("Failed to update guild message stamp in db", zap.Error(err)) } case 4: // Like message postType := bf.ReadUint32() @@ -1932,19 +1938,19 @@ func handleMsgMhfUpdateGuildMessageBoard(s *Session, p mhfpacket.MHFPacket) { var likedBy string err := s.server.db.QueryRow("SELECT liked_by FROM guild_posts WHERE post_type = $1 AND (EXTRACT(epoch FROM created_at)::int) = $2 AND guild_id = $3", int(postType), int(timestamp), guild.ID).Scan(&likedBy) if err != nil { - s.logger.Fatal("Failed to get guild message like data from db", zap.Error(err)) + s.logger.Error("Failed to get guild message like data from db", zap.Error(err)) } else { if likeState { likedBy = stringsupport.CSVAdd(likedBy, int(s.charID)) _, err := s.server.db.Exec("UPDATE guild_posts SET liked_by = $1 WHERE post_type = $2 AND (EXTRACT(epoch FROM created_at)::int) = $3 AND guild_id = $4", likedBy, int(postType), int(timestamp), guild.ID) if err != nil { - s.logger.Fatal("Failed to like guild message in db", zap.Error(err)) + s.logger.Error("Failed to like guild message in db", zap.Error(err)) } } else { likedBy = stringsupport.CSVRemove(likedBy, int(s.charID)) _, err := s.server.db.Exec("UPDATE guild_posts SET liked_by = $1 WHERE post_type = $2 AND (EXTRACT(epoch FROM created_at)::int) = $3 AND guild_id = $4", likedBy, int(postType), int(timestamp), guild.ID) if err != nil { - s.logger.Fatal("Failed to unlike guild message in db", zap.Error(err)) + s.logger.Error("Failed to unlike guild message in db", zap.Error(err)) } } } @@ -1953,15 +1959,15 @@ func handleMsgMhfUpdateGuildMessageBoard(s *Session, p mhfpacket.MHFPacket) { var newPosts int err := s.server.db.QueryRow("SELECT (EXTRACT(epoch FROM guild_post_checked)::int) FROM characters WHERE id = $1", s.charID).Scan(&timeChecked) if err != nil { - s.logger.Fatal("Failed to get last guild post check timestamp from db", zap.Error(err)) + s.logger.Error("Failed to get last guild post check timestamp from db", zap.Error(err)) } else { _, err = s.server.db.Exec("UPDATE characters SET guild_post_checked = $1 WHERE id = $2", time.Now(), s.charID) if err != nil { - s.logger.Fatal("Failed to update guild post check timestamp in db", zap.Error(err)) + s.logger.Error("Failed to update guild post check timestamp in db", zap.Error(err)) } else { err = s.server.db.QueryRow("SELECT COUNT(*) FROM guild_posts WHERE guild_id = $1 AND (EXTRACT(epoch FROM created_at)::int) > $2 AND author_id != $3", guild.ID, timeChecked, s.charID).Scan(&newPosts) if err != nil { - s.logger.Fatal("Failed to check for new guild posts in db", zap.Error(err)) + s.logger.Error("Failed to check for new guild posts in db", zap.Error(err)) } else { if newPosts > 0 { doAckSimpleSucceed(s, pkt.AckHandle, []byte{0x00, 0x00, 0x00, 0x01}) @@ -1971,7 +1977,7 @@ func handleMsgMhfUpdateGuildMessageBoard(s *Session, p mhfpacket.MHFPacket) { } } } - doAckSimpleSucceed(s, pkt.AckHandle, []byte{0x00, 0x00, 0x00, 0x00}) + doAckSimpleSucceed(s, pkt.AckHandle, make([]byte, 4)) } func handleMsgMhfEntryRookieGuild(s *Session, p mhfpacket.MHFPacket) { diff --git a/server/channelserver/handlers_guild_adventure.go b/server/channelserver/handlers_guild_adventure.go index 45f836127..304b5721f 100644 --- a/server/channelserver/handlers_guild_adventure.go +++ b/server/channelserver/handlers_guild_adventure.go @@ -23,7 +23,9 @@ func handleMsgMhfLoadGuildAdventure(s *Session, p mhfpacket.MHFPacket) { guild, _ := GetGuildInfoByCharacterId(s, s.charID) data, err := s.server.db.Queryx("SELECT id, destination, charge, depart, return, collected_by FROM guild_adventures WHERE guild_id = $1", guild.ID) if err != nil { - s.logger.Fatal("Failed to get guild adventures from db", zap.Error(err)) + s.logger.Error("Failed to get guild adventures from db", zap.Error(err)) + doAckBufSucceed(s, pkt.AckHandle, make([]byte, 1)) + return } temp := byteframe.NewByteFrame() count := 0 @@ -32,7 +34,7 @@ func handleMsgMhfLoadGuildAdventure(s *Session, p mhfpacket.MHFPacket) { adventureData := &GuildAdventure{} err = data.StructScan(&adventureData) if err != nil { - s.logger.Fatal("Failed to scan adventure data", zap.Error(err)) + continue } temp.WriteUint32(adventureData.ID) temp.WriteUint32(adventureData.Destination) @@ -52,7 +54,7 @@ func handleMsgMhfRegistGuildAdventure(s *Session, p mhfpacket.MHFPacket) { guild, _ := GetGuildInfoByCharacterId(s, s.charID) _, err := s.server.db.Exec("INSERT INTO guild_adventures (guild_id, destination, depart, return) VALUES ($1, $2, $3, $4)", guild.ID, pkt.Destination, Time_Current_Adjusted().Unix(), Time_Current_Adjusted().Add(6*time.Hour).Unix()) if err != nil { - s.logger.Fatal("Failed to register guild adventure", zap.Error(err)) + s.logger.Error("Failed to register guild adventure", zap.Error(err)) } doAckSimpleSucceed(s, pkt.AckHandle, make([]byte, 4)) } @@ -62,12 +64,12 @@ func handleMsgMhfAcquireGuildAdventure(s *Session, p mhfpacket.MHFPacket) { var collectedBy string err := s.server.db.QueryRow("SELECT collected_by FROM guild_adventures WHERE id = $1", pkt.ID).Scan(&collectedBy) if err != nil { - s.logger.Fatal("Error parsing adventure collected by", zap.Error(err)) + s.logger.Error("Error parsing adventure collected by", zap.Error(err)) } else { collectedBy = stringsupport.CSVAdd(collectedBy, int(s.charID)) _, err := s.server.db.Exec("UPDATE guild_adventures SET collected_by = $1 WHERE id = $2", collectedBy, pkt.ID) if err != nil { - s.logger.Fatal("Failed to collect adventure in db", zap.Error(err)) + s.logger.Error("Failed to collect adventure in db", zap.Error(err)) } } doAckSimpleSucceed(s, pkt.AckHandle, make([]byte, 4)) @@ -77,7 +79,7 @@ func handleMsgMhfChargeGuildAdventure(s *Session, p mhfpacket.MHFPacket) { pkt := p.(*mhfpacket.MsgMhfChargeGuildAdventure) _, err := s.server.db.Exec("UPDATE guild_adventures SET charge = charge + $1 WHERE id = $2", pkt.Amount, pkt.ID) if err != nil { - s.logger.Fatal("Failed to charge guild adventure", zap.Error(err)) + s.logger.Error("Failed to charge guild adventure", zap.Error(err)) } doAckSimpleSucceed(s, pkt.AckHandle, make([]byte, 4)) } @@ -87,7 +89,7 @@ func handleMsgMhfRegistGuildAdventureDiva(s *Session, p mhfpacket.MHFPacket) { guild, _ := GetGuildInfoByCharacterId(s, s.charID) _, err := s.server.db.Exec("INSERT INTO guild_adventures (guild_id, destination, charge, depart, return) VALUES ($1, $2, $3, $4, $5)", guild.ID, pkt.Destination, pkt.Charge, Time_Current_Adjusted().Unix(), Time_Current_Adjusted().Add(1*time.Hour).Unix()) if err != nil { - s.logger.Fatal("Failed to register guild adventure", zap.Error(err)) + s.logger.Error("Failed to register guild adventure", zap.Error(err)) } doAckSimpleSucceed(s, pkt.AckHandle, make([]byte, 4)) } diff --git a/server/channelserver/handlers_guild_alliance.go b/server/channelserver/handlers_guild_alliance.go index 7e2a9a2ac..a77ea1ef3 100644 --- a/server/channelserver/handlers_guild_alliance.go +++ b/server/channelserver/handlers_guild_alliance.go @@ -106,7 +106,7 @@ func handleMsgMhfCreateJoint(s *Session, p mhfpacket.MHFPacket) { pkt := p.(*mhfpacket.MsgMhfCreateJoint) _, err := s.server.db.Exec("INSERT INTO guild_alliances (name, parent_id) VALUES ($1, $2)", pkt.Name, pkt.GuildID) if err != nil { - s.logger.Fatal("Failed to create guild alliance in db", zap.Error(err)) + s.logger.Error("Failed to create guild alliance in db", zap.Error(err)) } doAckSimpleSucceed(s, pkt.AckHandle, []byte{0x01, 0x01, 0x01, 0x01}) } @@ -116,11 +116,11 @@ func handleMsgMhfOperateJoint(s *Session, p mhfpacket.MHFPacket) { guild, err := GetGuildInfoByID(s, pkt.GuildID) if err != nil { - s.logger.Fatal("Failed to get guild info", zap.Error(err)) + s.logger.Error("Failed to get guild info", zap.Error(err)) } alliance, err := GetAllianceData(s, pkt.AllianceID) if err != nil { - s.logger.Fatal("Failed to get alliance info", zap.Error(err)) + s.logger.Error("Failed to get alliance info", zap.Error(err)) } switch pkt.Action { @@ -128,7 +128,7 @@ func handleMsgMhfOperateJoint(s *Session, p mhfpacket.MHFPacket) { if guild.LeaderCharID == s.charID && alliance.ParentGuildID == guild.ID { _, err = s.server.db.Exec("DELETE FROM guild_alliances WHERE id=$1", alliance.ID) if err != nil { - s.logger.Fatal("Failed to disband alliance", zap.Error(err)) + s.logger.Error("Failed to disband alliance", zap.Error(err)) } doAckSimpleSucceed(s, pkt.AckHandle, make([]byte, 4)) } else { diff --git a/server/channelserver/handlers_kouryou.go b/server/channelserver/handlers_kouryou.go index 57f26ea40..bff9292a6 100644 --- a/server/channelserver/handlers_kouryou.go +++ b/server/channelserver/handlers_kouryou.go @@ -12,7 +12,7 @@ func handleMsgMhfAddKouryouPoint(s *Session, p mhfpacket.MHFPacket) { var points int err := s.server.db.QueryRow("UPDATE characters SET kouryou_point=COALESCE(kouryou_point + $1, $1) WHERE id=$2 RETURNING kouryou_point", pkt.KouryouPoints, s.charID).Scan(&points) if err != nil { - s.logger.Fatal("Failed to update KouryouPoint in db", zap.Error(err)) + s.logger.Error("Failed to update KouryouPoint in db", zap.Error(err)) } resp := byteframe.NewByteFrame() resp.WriteUint32(uint32(points)) @@ -24,7 +24,7 @@ func handleMsgMhfGetKouryouPoint(s *Session, p mhfpacket.MHFPacket) { var points int err := s.server.db.QueryRow("SELECT COALESCE(kouryou_point, 0) FROM characters WHERE id = $1", s.charID).Scan(&points) if err != nil { - s.logger.Fatal("Failed to get kouryou_point savedata from db", zap.Error(err)) + s.logger.Error("Failed to get kouryou_point savedata from db", zap.Error(err)) } resp := byteframe.NewByteFrame() resp.WriteUint32(uint32(points)) @@ -37,7 +37,7 @@ func handleMsgMhfExchangeKouryouPoint(s *Session, p mhfpacket.MHFPacket) { pkt := p.(*mhfpacket.MsgMhfExchangeKouryouPoint) err := s.server.db.QueryRow("UPDATE characters SET kouryou_point=kouryou_point - $1 WHERE id=$2 RETURNING kouryou_point", pkt.KouryouPoints, s.charID).Scan(&points) if err != nil { - s.logger.Fatal("Failed to update platemyset savedata in db", zap.Error(err)) + s.logger.Error("Failed to update platemyset savedata in db", zap.Error(err)) } resp := byteframe.NewByteFrame() resp.WriteUint32(uint32(points)) diff --git a/server/channelserver/handlers_mail.go b/server/channelserver/handlers_mail.go index e31e90eed..1df4711c6 100644 --- a/server/channelserver/handlers_mail.go +++ b/server/channelserver/handlers_mail.go @@ -392,24 +392,29 @@ func handleMsgMhfSendMail(s *Session, p mhfpacket.MHFPacket) { if pkt.RecipientID == 0 { // Guild mail g, err := GetGuildInfoByCharacterId(s, s.charID) if err != nil { - s.logger.Fatal("Failed to get guild info for mail") + s.logger.Error("Failed to get guild info for mail") + doAckSimpleSucceed(s, pkt.AckHandle, make([]byte, 4)) + return } gm, err := GetGuildMembers(s, g.ID, false) if err != nil { - s.logger.Fatal("Failed to get guild members for mail") + s.logger.Error("Failed to get guild members for mail") + doAckSimpleSucceed(s, pkt.AckHandle, make([]byte, 4)) + return } for i := 0; i < len(gm); i++ { _, err := s.server.db.Exec(query, s.charID, gm[i].CharID, pkt.Subject, pkt.Body, 0, 0, false) if err != nil { - s.logger.Fatal("Failed to send mail") + s.logger.Error("Failed to send mail") + doAckSimpleSucceed(s, pkt.AckHandle, make([]byte, 4)) + return } } } else { _, err := s.server.db.Exec(query, s.charID, pkt.RecipientID, pkt.Subject, pkt.Body, pkt.ItemID, pkt.Quantity, false) if err != nil { - s.logger.Fatal("Failed to send mail") + s.logger.Error("Failed to send mail") } } - doAckSimpleSucceed(s, pkt.AckHandle, make([]byte, 4)) }