simplify & handle Mail better

This commit is contained in:
wish
2023-10-31 00:21:05 +11:00
parent ffcf511c20
commit f9280f483f
4 changed files with 32 additions and 92 deletions

View File

@@ -3,15 +3,14 @@ package mhfpacket
import ( import (
"errors" "errors"
"erupe-ce/network/clientctx"
"erupe-ce/network"
"erupe-ce/common/byteframe" "erupe-ce/common/byteframe"
"erupe-ce/network"
"erupe-ce/network/clientctx"
) )
// MsgMhfListMail represents the MSG_MHF_LIST_MAIL // MsgMhfListMail represents the MSG_MHF_LIST_MAIL
type MsgMhfListMail struct { type MsgMhfListMail struct {
AckHandle uint32 AckHandle uint32
Unk0 uint32
} }
// Opcode returns the ID associated with this packet type. // 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 // Parse parses the packet from binary
func (m *MsgMhfListMail) Parse(bf *byteframe.ByteFrame, ctx *clientctx.ClientContext) error { func (m *MsgMhfListMail) Parse(bf *byteframe.ByteFrame, ctx *clientctx.ClientContext) error {
m.AckHandle = bf.ReadUint32() m.AckHandle = bf.ReadUint32()
m.Unk0 = bf.ReadUint32() bf.ReadUint16() // Zeroed
bf.ReadUint16() // Zeroed
return nil return nil
} }

View File

@@ -11,10 +11,11 @@ import (
type OperateMailOperation uint8 type OperateMailOperation uint8
const ( const (
OPERATE_MAIL_DELETE = 0x01 OperateMailDelete = iota + 1
OPERATE_MAIL_LOCK = 0x02 OperateMailLock
OPERATE_MAIL_UNLOCK = 0x03 OperateMailUnlock
OPERATE_MAIL_ACQUIRE_ITEM = 0x05 OpreateMailNull
OperateMailAcquireItem
) )
// MsgMhfOprtMail represents the MSG_MHF_OPRT_MAIL // MsgMhfOprtMail represents the MSG_MHF_OPRT_MAIL
@@ -23,7 +24,6 @@ type MsgMhfOprtMail struct {
AccIndex uint8 AccIndex uint8
Index uint8 Index uint8
Operation OperateMailOperation Operation OperateMailOperation
Unk0 uint8
Data []byte Data []byte
Amount uint16 Amount uint16
ItemID uint16 ItemID uint16
@@ -40,8 +40,8 @@ func (m *MsgMhfOprtMail) Parse(bf *byteframe.ByteFrame, ctx *clientctx.ClientCon
m.AccIndex = bf.ReadUint8() m.AccIndex = bf.ReadUint8()
m.Index = bf.ReadUint8() m.Index = bf.ReadUint8()
m.Operation = OperateMailOperation(bf.ReadUint8()) m.Operation = OperateMailOperation(bf.ReadUint8())
m.Unk0 = bf.ReadUint8() bf.ReadUint8() // Zeroed
if m.Operation == OPERATE_MAIL_ACQUIRE_ITEM { if m.Operation == OperateMailAcquireItem {
m.Amount = bf.ReadUint16() m.Amount = bf.ReadUint16()
m.ItemID = bf.ReadUint16() m.ItemID = bf.ReadUint16()
} }

View File

@@ -15,7 +15,7 @@ type MsgMhfSendMail struct {
RecipientID uint32 RecipientID uint32
SubjectLength uint16 SubjectLength uint16
BodyLength uint16 BodyLength uint16
Quantity uint32 Quantity uint16
ItemID uint16 ItemID uint16
Subject string Subject string
Body string Body string
@@ -32,7 +32,8 @@ func (m *MsgMhfSendMail) Parse(bf *byteframe.ByteFrame, ctx *clientctx.ClientCon
m.RecipientID = bf.ReadUint32() m.RecipientID = bf.ReadUint32()
m.SubjectLength = bf.ReadUint16() m.SubjectLength = bf.ReadUint16()
m.BodyLength = bf.ReadUint16() m.BodyLength = bf.ReadUint16()
m.Quantity = bf.ReadUint32() bf.ReadUint16() // Zeroed
m.Quantity = bf.ReadUint16()
m.ItemID = bf.ReadUint16() m.ItemID = bf.ReadUint16()
m.Subject = stringsupport.SJISToUTF8(bf.ReadNullTerminatedBytes()) m.Subject = stringsupport.SJISToUTF8(bf.ReadNullTerminatedBytes())
m.Body = stringsupport.SJISToUTF8(bf.ReadNullTerminatedBytes()) m.Body = stringsupport.SJISToUTF8(bf.ReadNullTerminatedBytes())

View File

@@ -79,57 +79,6 @@ func (m *Mail) MarkRead(s *Session) error {
return nil 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) { func GetMailListForCharacter(s *Session, charID uint32) ([]Mail, error) {
rows, err := s.server.db.Queryx(` rows, err := s.server.db.Queryx(`
SELECT SELECT
@@ -256,26 +205,21 @@ func handleMsgMhfReadMail(s *Session, p mhfpacket.MHFPacket) {
pkt := p.(*mhfpacket.MsgMhfReadMail) pkt := p.(*mhfpacket.MsgMhfReadMail)
mailId := s.mailList[pkt.AccIndex] mailId := s.mailList[pkt.AccIndex]
if mailId == 0 { if mailId == 0 {
doAckBufFail(s, pkt.AckHandle, make([]byte, 4)) doAckBufSucceed(s, pkt.AckHandle, []byte{0})
panic("attempting to read mail that doesn't exist in session map") return
} }
mail, err := GetMailByID(s, mailId) mail, err := GetMailByID(s, mailId)
if err != nil { if err != nil {
doAckBufFail(s, pkt.AckHandle, make([]byte, 4)) doAckBufSucceed(s, pkt.AckHandle, []byte{0})
panic(err) return
} }
_ = mail.MarkRead(s) s.server.db.Exec(`UPDATE mail SET read = true WHERE id = $1`, mail.ID)
bf := byteframe.NewByteFrame() bf := byteframe.NewByteFrame()
body := stringsupport.UTF8ToSJIS(mail.Body) body := stringsupport.UTF8ToSJIS(mail.Body)
bf.WriteNullTerminatedBytes(body) bf.WriteNullTerminatedBytes(body)
doAckBufSucceed(s, pkt.AckHandle, bf.Data()) doAckBufSucceed(s, pkt.AckHandle, bf.Data())
} }
@@ -283,10 +227,9 @@ func handleMsgMhfListMail(s *Session, p mhfpacket.MHFPacket) {
pkt := p.(*mhfpacket.MsgMhfListMail) pkt := p.(*mhfpacket.MsgMhfListMail)
mail, err := GetMailListForCharacter(s, s.charID) mail, err := GetMailListForCharacter(s, s.charID)
if err != nil { if err != nil {
doAckBufFail(s, pkt.AckHandle, make([]byte, 4)) doAckBufSucceed(s, pkt.AckHandle, []byte{0})
panic(err) return
} }
if s.mailList == nil { if s.mailList == nil {
@@ -354,24 +297,20 @@ func handleMsgMhfOprtMail(s *Session, p mhfpacket.MHFPacket) {
mail, err := GetMailByID(s, s.mailList[pkt.AccIndex]) mail, err := GetMailByID(s, s.mailList[pkt.AccIndex])
if err != nil { if err != nil {
panic(err) doAckSimpleSucceed(s, pkt.AckHandle, make([]byte, 4))
return
} }
switch pkt.Operation { switch pkt.Operation {
case mhfpacket.OPERATE_MAIL_DELETE: case mhfpacket.OperateMailDelete:
err = mail.MarkDeleted(s) s.server.db.Exec(`UPDATE mail SET deleted = true WHERE id = $1`, mail.ID)
case mhfpacket.OPERATE_MAIL_LOCK: case mhfpacket.OperateMailLock:
err = mail.MarkLocked(s, true) s.server.db.Exec(`UPDATE mail SET locked = TRUE WHERE id = $1`, mail.ID)
case mhfpacket.OPERATE_MAIL_UNLOCK: case mhfpacket.OperateMailUnlock:
err = mail.MarkLocked(s, false) s.server.db.Exec(`UPDATE mail SET locked = FALSE WHERE id = $1`, mail.ID)
case mhfpacket.OPERATE_MAIL_ACQUIRE_ITEM: case mhfpacket.OperateMailAcquireItem:
err = mail.MarkAcquired(s) 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)) doAckSimpleSucceed(s, pkt.AckHandle, make([]byte, 4))
} }