From 773429ce15a1ca2392a145b8832dc8bcd3e1900c Mon Sep 17 00:00:00 2001 From: Andrew Gutekanst Date: Mon, 3 Feb 2020 14:07:33 -0500 Subject: [PATCH] Make char savedata persistent --- migrations/000003_character_savedata.down.sql | 6 ++++++ migrations/000003_character_savedata.up.sql | 6 ++++++ network/mhfpacket/msg_mhf_loaddata.go | 9 +++++--- server/channelserver/handlers.go | 21 ++++++++++++++++--- 4 files changed, 36 insertions(+), 6 deletions(-) create mode 100644 migrations/000003_character_savedata.down.sql create mode 100644 migrations/000003_character_savedata.up.sql diff --git a/migrations/000003_character_savedata.down.sql b/migrations/000003_character_savedata.down.sql new file mode 100644 index 000000000..d8d1ca8c6 --- /dev/null +++ b/migrations/000003_character_savedata.down.sql @@ -0,0 +1,6 @@ +BEGIN; + +ALTER TABLE characters + DROP COLUMN savedata; + +END; \ No newline at end of file diff --git a/migrations/000003_character_savedata.up.sql b/migrations/000003_character_savedata.up.sql new file mode 100644 index 000000000..d0f39a223 --- /dev/null +++ b/migrations/000003_character_savedata.up.sql @@ -0,0 +1,6 @@ +BEGIN; + +ALTER TABLE characters + ADD COLUMN savedata bytea; + +END; \ No newline at end of file diff --git a/network/mhfpacket/msg_mhf_loaddata.go b/network/mhfpacket/msg_mhf_loaddata.go index f34ec6b96..0cb5499f2 100644 --- a/network/mhfpacket/msg_mhf_loaddata.go +++ b/network/mhfpacket/msg_mhf_loaddata.go @@ -6,7 +6,9 @@ import ( ) // MsgMhfLoaddata represents the MSG_MHF_LOADDATA -type MsgMhfLoaddata struct{} +type MsgMhfLoaddata struct { + AckHandle uint32 +} // Opcode returns the ID associated with this packet type. func (m *MsgMhfLoaddata) Opcode() network.PacketID { @@ -15,10 +17,11 @@ func (m *MsgMhfLoaddata) Opcode() network.PacketID { // Parse parses the packet from binary func (m *MsgMhfLoaddata) Parse(bf *byteframe.ByteFrame) error { - panic("Not implemented") + m.AckHandle = bf.ReadUint32() + return nil } // Build builds a binary packet from the current data. func (m *MsgMhfLoaddata) Build(bf *byteframe.ByteFrame) error { panic("Not implemented") -} \ No newline at end of file +} diff --git a/server/channelserver/handlers.go b/server/channelserver/handlers.go index a4226898c..eae2f1a4c 100644 --- a/server/channelserver/handlers.go +++ b/server/channelserver/handlers.go @@ -5,7 +5,6 @@ import ( "encoding/base64" "fmt" "io/ioutil" - "log" "strings" "time" @@ -633,12 +632,28 @@ func handleMsgMhfSavedata(s *Session, p mhfpacket.MHFPacket) { pkt := p.(*mhfpacket.MsgMhfSavedata) err := ioutil.WriteFile(fmt.Sprintf("savedata\\%d.bin", time.Now().Unix()), pkt.RawDataPayload, 0644) if err != nil { - log.Fatal(err) + s.logger.Fatal("Error dumping savedata", zap.Error(err)) } + + _, err = s.server.db.Exec("UPDATE characters SET is_new_character=false, savedata=$1 WHERE id=$2", pkt.RawDataPayload, s.charID) + if err != nil { + s.logger.Fatal("Failed to update savedata in db", zap.Error(err)) + } + s.QueueAck(pkt.AckHandle, []byte{0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}) } -func handleMsgMhfLoaddata(s *Session, p mhfpacket.MHFPacket) {} +func handleMsgMhfLoaddata(s *Session, p mhfpacket.MHFPacket) { + pkt := p.(*mhfpacket.MsgMhfLoaddata) + + var data []byte + err := s.server.db.QueryRow("SELECT savedata FROM characters WHERE id = $1", s.charID).Scan(&data) + if err != nil { + s.logger.Fatal("Failed to get savedata from db", zap.Error(err)) + } + + doSizedAckResp(s, pkt.AckHandle, data) +} func handleMsgMhfListMember(s *Session, p mhfpacket.MHFPacket) {}