From f9280f483fa1042f5297a63b00a0731443e0af89 Mon Sep 17 00:00:00 2001 From: wish Date: Tue, 31 Oct 2023 00:21:05 +1100 Subject: [PATCH] simplify & handle Mail better --- network/mhfpacket/msg_mhf_list_mail.go | 10 +-- network/mhfpacket/msg_mhf_oprt_mail.go | 14 ++-- network/mhfpacket/msg_mhf_send_mail.go | 5 +- server/channelserver/handlers_mail.go | 95 +++++--------------------- 4 files changed, 32 insertions(+), 92 deletions(-) diff --git a/network/mhfpacket/msg_mhf_list_mail.go b/network/mhfpacket/msg_mhf_list_mail.go index 2dfb351e9..645baf548 100644 --- a/network/mhfpacket/msg_mhf_list_mail.go +++ b/network/mhfpacket/msg_mhf_list_mail.go @@ -1,17 +1,16 @@ package mhfpacket import ( - "errors" + "errors" - "erupe-ce/network/clientctx" - "erupe-ce/network" "erupe-ce/common/byteframe" + "erupe-ce/network" + "erupe-ce/network/clientctx" ) // MsgMhfListMail represents the MSG_MHF_LIST_MAIL type MsgMhfListMail struct { AckHandle uint32 - Unk0 uint32 } // Opcode returns the ID associated with this packet type. @@ -22,7 +21,8 @@ func (m *MsgMhfListMail) Opcode() network.PacketID { // Parse parses the packet from binary func (m *MsgMhfListMail) Parse(bf *byteframe.ByteFrame, ctx *clientctx.ClientContext) error { m.AckHandle = bf.ReadUint32() - m.Unk0 = bf.ReadUint32() + bf.ReadUint16() // Zeroed + bf.ReadUint16() // Zeroed return nil } diff --git a/network/mhfpacket/msg_mhf_oprt_mail.go b/network/mhfpacket/msg_mhf_oprt_mail.go index 2c9e06828..95ec561ee 100644 --- a/network/mhfpacket/msg_mhf_oprt_mail.go +++ b/network/mhfpacket/msg_mhf_oprt_mail.go @@ -11,10 +11,11 @@ import ( type OperateMailOperation uint8 const ( - OPERATE_MAIL_DELETE = 0x01 - OPERATE_MAIL_LOCK = 0x02 - OPERATE_MAIL_UNLOCK = 0x03 - OPERATE_MAIL_ACQUIRE_ITEM = 0x05 + OperateMailDelete = iota + 1 + OperateMailLock + OperateMailUnlock + OpreateMailNull + OperateMailAcquireItem ) // MsgMhfOprtMail represents the MSG_MHF_OPRT_MAIL @@ -23,7 +24,6 @@ type MsgMhfOprtMail struct { AccIndex uint8 Index uint8 Operation OperateMailOperation - Unk0 uint8 Data []byte Amount uint16 ItemID uint16 @@ -40,8 +40,8 @@ func (m *MsgMhfOprtMail) Parse(bf *byteframe.ByteFrame, ctx *clientctx.ClientCon m.AccIndex = bf.ReadUint8() m.Index = bf.ReadUint8() m.Operation = OperateMailOperation(bf.ReadUint8()) - m.Unk0 = bf.ReadUint8() - if m.Operation == OPERATE_MAIL_ACQUIRE_ITEM { + bf.ReadUint8() // Zeroed + if m.Operation == OperateMailAcquireItem { m.Amount = bf.ReadUint16() m.ItemID = bf.ReadUint16() } diff --git a/network/mhfpacket/msg_mhf_send_mail.go b/network/mhfpacket/msg_mhf_send_mail.go index e0f34ba54..2a21ef93b 100644 --- a/network/mhfpacket/msg_mhf_send_mail.go +++ b/network/mhfpacket/msg_mhf_send_mail.go @@ -15,7 +15,7 @@ type MsgMhfSendMail struct { RecipientID uint32 SubjectLength uint16 BodyLength uint16 - Quantity uint32 + Quantity uint16 ItemID uint16 Subject string Body string @@ -32,7 +32,8 @@ func (m *MsgMhfSendMail) Parse(bf *byteframe.ByteFrame, ctx *clientctx.ClientCon m.RecipientID = bf.ReadUint32() m.SubjectLength = bf.ReadUint16() m.BodyLength = bf.ReadUint16() - m.Quantity = bf.ReadUint32() + bf.ReadUint16() // Zeroed + m.Quantity = bf.ReadUint16() m.ItemID = bf.ReadUint16() m.Subject = stringsupport.SJISToUTF8(bf.ReadNullTerminatedBytes()) m.Body = stringsupport.SJISToUTF8(bf.ReadNullTerminatedBytes()) diff --git a/server/channelserver/handlers_mail.go b/server/channelserver/handlers_mail.go index 7e9784ee3..a596d927b 100644 --- a/server/channelserver/handlers_mail.go +++ b/server/channelserver/handlers_mail.go @@ -79,57 +79,6 @@ func (m *Mail) MarkRead(s *Session) error { return nil } -func (m *Mail) MarkDeleted(s *Session) error { - _, err := s.server.db.Exec(` - UPDATE mail SET deleted = true WHERE id = $1 - `, m.ID) - - if err != nil { - s.logger.Error( - "failed to mark mail as deleted", - zap.Error(err), - zap.Int("mailID", m.ID), - ) - return err - } - - return nil -} - -func (m *Mail) MarkAcquired(s *Session) error { - _, err := s.server.db.Exec(` - UPDATE mail SET attached_item_received = true WHERE id = $1 - `, m.ID) - - if err != nil { - s.logger.Error( - "failed to mark mail item as claimed", - zap.Error(err), - zap.Int("mailID", m.ID), - ) - return err - } - - return nil -} - -func (m *Mail) MarkLocked(s *Session, locked bool) error { - _, err := s.server.db.Exec(` - UPDATE mail SET locked = $1 WHERE id = $2 - `, locked, m.ID) - - if err != nil { - s.logger.Error( - "failed to mark mail as locked", - zap.Error(err), - zap.Int("mailID", m.ID), - ) - return err - } - - return nil -} - func GetMailListForCharacter(s *Session, charID uint32) ([]Mail, error) { rows, err := s.server.db.Queryx(` SELECT @@ -256,26 +205,21 @@ func handleMsgMhfReadMail(s *Session, p mhfpacket.MHFPacket) { pkt := p.(*mhfpacket.MsgMhfReadMail) mailId := s.mailList[pkt.AccIndex] - if mailId == 0 { - doAckBufFail(s, pkt.AckHandle, make([]byte, 4)) - panic("attempting to read mail that doesn't exist in session map") + doAckBufSucceed(s, pkt.AckHandle, []byte{0}) + return } mail, err := GetMailByID(s, mailId) - if err != nil { - doAckBufFail(s, pkt.AckHandle, make([]byte, 4)) - panic(err) + doAckBufSucceed(s, pkt.AckHandle, []byte{0}) + return } - _ = mail.MarkRead(s) - + s.server.db.Exec(`UPDATE mail SET read = true WHERE id = $1`, mail.ID) bf := byteframe.NewByteFrame() - body := stringsupport.UTF8ToSJIS(mail.Body) bf.WriteNullTerminatedBytes(body) - doAckBufSucceed(s, pkt.AckHandle, bf.Data()) } @@ -283,10 +227,9 @@ func handleMsgMhfListMail(s *Session, p mhfpacket.MHFPacket) { pkt := p.(*mhfpacket.MsgMhfListMail) mail, err := GetMailListForCharacter(s, s.charID) - if err != nil { - doAckBufFail(s, pkt.AckHandle, make([]byte, 4)) - panic(err) + doAckBufSucceed(s, pkt.AckHandle, []byte{0}) + return } if s.mailList == nil { @@ -354,24 +297,20 @@ func handleMsgMhfOprtMail(s *Session, p mhfpacket.MHFPacket) { mail, err := GetMailByID(s, s.mailList[pkt.AccIndex]) if err != nil { - panic(err) + doAckSimpleSucceed(s, pkt.AckHandle, make([]byte, 4)) + return } switch pkt.Operation { - case mhfpacket.OPERATE_MAIL_DELETE: - err = mail.MarkDeleted(s) - case mhfpacket.OPERATE_MAIL_LOCK: - err = mail.MarkLocked(s, true) - case mhfpacket.OPERATE_MAIL_UNLOCK: - err = mail.MarkLocked(s, false) - case mhfpacket.OPERATE_MAIL_ACQUIRE_ITEM: - err = mail.MarkAcquired(s) + case mhfpacket.OperateMailDelete: + s.server.db.Exec(`UPDATE mail SET deleted = true WHERE id = $1`, mail.ID) + case mhfpacket.OperateMailLock: + s.server.db.Exec(`UPDATE mail SET locked = TRUE WHERE id = $1`, mail.ID) + case mhfpacket.OperateMailUnlock: + s.server.db.Exec(`UPDATE mail SET locked = FALSE WHERE id = $1`, mail.ID) + case mhfpacket.OperateMailAcquireItem: + s.server.db.Exec(`UPDATE mail SET attached_item_received = TRUE WHERE id = $1`, mail.ID) } - - if err != nil { - panic(err) - } - doAckSimpleSucceed(s, pkt.AckHandle, make([]byte, 4)) }