diff --git a/schemas/patch-schema/fix-weekly-stamps.sql b/schemas/patch-schema/fix-weekly-stamps.sql new file mode 100644 index 000000000..30f551e5c --- /dev/null +++ b/schemas/patch-schema/fix-weekly-stamps.sql @@ -0,0 +1,6 @@ +BEGIN; + +ALTER TABLE IF EXISTS public.stamps RENAME hl_next TO hl_checked; +ALTER TABLE IF EXISTS public.stamps RENAME ex_next TO ex_checked; + +END; \ No newline at end of file diff --git a/server/channelserver/handlers.go b/server/channelserver/handlers.go index 7188d8bab..d301ad6c9 100644 --- a/server/channelserver/handlers.go +++ b/server/channelserver/handlers.go @@ -852,26 +852,29 @@ func handleMsgMhfGetCogInfo(s *Session, p mhfpacket.MHFPacket) {} func handleMsgMhfCheckWeeklyStamp(s *Session, p mhfpacket.MHFPacket) { pkt := p.(*mhfpacket.MsgMhfCheckWeeklyStamp) - weekCurrentStart := TimeWeekStart() - weekNextStart := TimeWeekNext() var total, redeemed, updated uint16 - var nextClaim time.Time - err := s.server.db.QueryRow(fmt.Sprintf("SELECT %s_next FROM stamps WHERE character_id=$1", pkt.StampType), s.charID).Scan(&nextClaim) + var lastCheck time.Time + err := s.server.db.QueryRow(fmt.Sprintf("SELECT %s_checked FROM stamps WHERE character_id=$1", pkt.StampType), s.charID).Scan(&lastCheck) if err != nil { - s.server.db.Exec("INSERT INTO stamps (character_id, hl_next, ex_next) VALUES ($1, $2, $2)", s.charID, weekNextStart) - nextClaim = weekNextStart + lastCheck = TimeAdjusted() + s.server.db.Exec("INSERT INTO stamps (character_id, hl_checked, ex_checked) VALUES ($1, $2, $2)", s.charID, TimeAdjusted()) + } else { + s.server.db.Exec(fmt.Sprintf(`UPDATE stamps SET %s_checked=$1 WHERE character_id=$2`, pkt.StampType), TimeAdjusted(), s.charID) } - if nextClaim.Before(weekCurrentStart) { - s.server.db.Exec(fmt.Sprintf("UPDATE stamps SET %s_total=%s_total+1, %s_next=$1 WHERE character_id=$2", pkt.StampType, pkt.StampType, pkt.StampType), weekNextStart, s.charID) + + if lastCheck.Before(TimeWeekStart()) { + s.server.db.Exec(fmt.Sprintf("UPDATE stamps SET %s_total=%s_total+1 WHERE character_id=$1", pkt.StampType, pkt.StampType), s.charID) updated = 1 } + s.server.db.QueryRow(fmt.Sprintf("SELECT %s_total, %s_redeemed FROM stamps WHERE character_id=$1", pkt.StampType, pkt.StampType), s.charID).Scan(&total, &redeemed) bf := byteframe.NewByteFrame() bf.WriteUint16(total) bf.WriteUint16(redeemed) bf.WriteUint16(updated) - bf.WriteUint32(0) // Unk - bf.WriteUint32(uint32(weekCurrentStart.Unix())) + bf.WriteUint16(0) + bf.WriteUint16(0) + bf.WriteUint32(uint32(TimeWeekStart().Unix())) doAckBufSucceed(s, pkt.AckHandle, bf.Data()) } @@ -879,7 +882,7 @@ func handleMsgMhfExchangeWeeklyStamp(s *Session, p mhfpacket.MHFPacket) { pkt := p.(*mhfpacket.MsgMhfExchangeWeeklyStamp) var total, redeemed uint16 var tktStack mhfitem.MHFItemStack - if pkt.Unk1 == 0xA { // Yearly Sub Ex + if pkt.Unk1 == 10 { // Yearly Sub Ex s.server.db.QueryRow("UPDATE stamps SET hl_total=hl_total-48, hl_redeemed=hl_redeemed-48 WHERE character_id=$1 RETURNING hl_total, hl_redeemed", s.charID).Scan(&total, &redeemed) tktStack = mhfitem.MHFItemStack{Item: mhfitem.MHFItem{ItemID: 2210}, Quantity: 1} } else { @@ -895,7 +898,8 @@ func handleMsgMhfExchangeWeeklyStamp(s *Session, p mhfpacket.MHFPacket) { bf.WriteUint16(total) bf.WriteUint16(redeemed) bf.WriteUint16(0) - bf.WriteUint32(0) // Unk, but has possible values + bf.WriteUint16(tktStack.Item.ItemID) + bf.WriteUint16(tktStack.Quantity) bf.WriteUint32(uint32(TimeWeekStart().Unix())) doAckBufSucceed(s, pkt.AckHandle, bf.Data()) }