mirror of
https://github.com/Mezeporta/Erupe.git
synced 2025-12-13 15:34:38 +01:00
optimise road leaderboard code
This commit is contained in:
@@ -3,6 +3,7 @@ package channelserver
|
|||||||
import (
|
import (
|
||||||
ps "erupe-ce/common/pascalstring"
|
ps "erupe-ce/common/pascalstring"
|
||||||
"fmt"
|
"fmt"
|
||||||
|
"github.com/jmoiron/sqlx"
|
||||||
"io/ioutil"
|
"io/ioutil"
|
||||||
"path/filepath"
|
"path/filepath"
|
||||||
|
|
||||||
@@ -96,20 +97,13 @@ func handleMsgMhfGetRengokuBinary(s *Session, p mhfpacket.MHFPacket) {
|
|||||||
doAckBufSucceed(s, pkt.AckHandle, data)
|
doAckBufSucceed(s, pkt.AckHandle, data)
|
||||||
}
|
}
|
||||||
|
|
||||||
const rengokuScoreQuery = `
|
const rengokuScoreQuery = `, c.name FROM rengoku_score rs
|
||||||
SELECT max_stages_mp, max_points_mp, max_stages_sp, max_points_sp, c.name, gc.guild_id
|
|
||||||
FROM rengoku_score rs
|
|
||||||
LEFT JOIN characters c ON c.id = rs.character_id
|
LEFT JOIN characters c ON c.id = rs.character_id
|
||||||
LEFT JOIN guild_characters gc ON gc.character_id = rs.character_id
|
LEFT JOIN guild_characters gc ON gc.character_id = rs.character_id `
|
||||||
`
|
|
||||||
|
|
||||||
type RengokuScore struct {
|
type RengokuScore struct {
|
||||||
Name string `db:"name"`
|
Name string `db:"name"`
|
||||||
GuildID int `db:"guild_id"`
|
Score uint32 `db:"score"`
|
||||||
MaxStagesMP uint32 `db:"max_stages_mp"`
|
|
||||||
MaxPointsMP uint32 `db:"max_points_mp"`
|
|
||||||
MaxStagesSP uint32 `db:"max_stages_sp"`
|
|
||||||
MaxPointsSP uint32 `db:"max_points_sp"`
|
|
||||||
}
|
}
|
||||||
|
|
||||||
func handleMsgMhfEnumerateRengokuRanking(s *Session, p mhfpacket.MHFPacket) {
|
func handleMsgMhfEnumerateRengokuRanking(s *Session, p mhfpacket.MHFPacket) {
|
||||||
@@ -121,202 +115,60 @@ func handleMsgMhfEnumerateRengokuRanking(s *Session, p mhfpacket.MHFPacket) {
|
|||||||
guild = nil
|
guild = nil
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if pkt.Leaderboard == 2 || pkt.Leaderboard == 3 || pkt.Leaderboard == 6 || pkt.Leaderboard == 7 {
|
||||||
|
if guild == nil {
|
||||||
|
doAckBufSucceed(s, pkt.AckHandle, make([]byte, 11))
|
||||||
|
return
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
var score RengokuScore
|
var score RengokuScore
|
||||||
|
var selfExist bool
|
||||||
i := uint32(1)
|
i := uint32(1)
|
||||||
bf := byteframe.NewByteFrame()
|
bf := byteframe.NewByteFrame()
|
||||||
scoreData := byteframe.NewByteFrame()
|
scoreData := byteframe.NewByteFrame()
|
||||||
|
|
||||||
|
var rows *sqlx.Rows
|
||||||
switch pkt.Leaderboard {
|
switch pkt.Leaderboard {
|
||||||
case 0: // Max stage overall MP
|
case 0:
|
||||||
rows, _ := s.server.db.Queryx(fmt.Sprintf("%s ORDER BY max_stages_mp DESC", rengokuScoreQuery))
|
rows, _ = s.server.db.Queryx(fmt.Sprintf("SELECT max_stages_mp AS score %s ORDER BY max_stages_mp DESC", rengokuScoreQuery))
|
||||||
for rows.Next() {
|
case 1:
|
||||||
rows.StructScan(&score)
|
rows, _ = s.server.db.Queryx(fmt.Sprintf("SELECT max_points_mp AS score %s ORDER BY max_points_mp DESC", rengokuScoreQuery))
|
||||||
if score.Name == s.Name {
|
case 2:
|
||||||
bf.WriteUint32(i)
|
rows, _ = s.server.db.Queryx(fmt.Sprintf("SELECT max_stages_mp AS score %s WHERE guild_id=$1 ORDER BY max_stages_mp DESC", rengokuScoreQuery), guild.ID)
|
||||||
bf.WriteUint32(score.MaxStagesMP)
|
case 3:
|
||||||
ps.Uint8(bf, s.Name, true)
|
rows, _ = s.server.db.Queryx(fmt.Sprintf("SELECT max_points_mp AS score %s WHERE guild_id=$1 ORDER BY max_points_mp DESC", rengokuScoreQuery), guild.ID)
|
||||||
ps.Uint8(bf, "", false)
|
case 4:
|
||||||
}
|
rows, _ = s.server.db.Queryx(fmt.Sprintf("SELECT max_stages_sp AS score %s ORDER BY max_stages_sp DESC", rengokuScoreQuery))
|
||||||
if i > 100 {
|
case 5:
|
||||||
i++
|
rows, _ = s.server.db.Queryx(fmt.Sprintf("SELECT max_points_sp AS score %s ORDER BY max_points_sp DESC", rengokuScoreQuery))
|
||||||
continue
|
case 6:
|
||||||
}
|
rows, _ = s.server.db.Queryx(fmt.Sprintf("SELECT max_stages_sp AS score %s WHERE guild_id=$1 ORDER BY max_stages_sp DESC", rengokuScoreQuery), guild.ID)
|
||||||
scoreData.WriteUint32(i)
|
case 7:
|
||||||
scoreData.WriteUint32(score.MaxStagesMP)
|
rows, _ = s.server.db.Queryx(fmt.Sprintf("SELECT max_points_sp AS score %s WHERE guild_id=$1 ORDER BY max_points_sp DESC", rengokuScoreQuery), guild.ID)
|
||||||
ps.Uint8(scoreData, score.Name, true)
|
|
||||||
ps.Uint8(scoreData, "", false)
|
|
||||||
i++
|
|
||||||
}
|
|
||||||
case 1: // Max RdP overall MP
|
|
||||||
rows, _ := s.server.db.Queryx(fmt.Sprintf("%s ORDER BY max_points_mp DESC", rengokuScoreQuery))
|
|
||||||
for rows.Next() {
|
|
||||||
rows.StructScan(&score)
|
|
||||||
if score.Name == s.Name {
|
|
||||||
bf.WriteUint32(i)
|
|
||||||
bf.WriteUint32(score.MaxPointsMP)
|
|
||||||
ps.Uint8(bf, s.Name, true)
|
|
||||||
ps.Uint8(bf, "", false)
|
|
||||||
}
|
|
||||||
if i > 100 {
|
|
||||||
i++
|
|
||||||
continue
|
|
||||||
}
|
|
||||||
scoreData.WriteUint32(i)
|
|
||||||
scoreData.WriteUint32(score.MaxPointsMP)
|
|
||||||
ps.Uint8(scoreData, score.Name, true)
|
|
||||||
ps.Uint8(scoreData, "", false)
|
|
||||||
i++
|
|
||||||
}
|
|
||||||
case 2: // Max stage guild MP
|
|
||||||
if guild != nil {
|
|
||||||
rows, _ := s.server.db.Queryx(fmt.Sprintf("%s WHERE guild_id=$1 ORDER BY max_stages_mp DESC", rengokuScoreQuery), guild.ID)
|
|
||||||
for rows.Next() {
|
|
||||||
rows.StructScan(&score)
|
|
||||||
if score.Name == s.Name {
|
|
||||||
bf.WriteUint32(i)
|
|
||||||
bf.WriteUint32(score.MaxStagesMP)
|
|
||||||
ps.Uint8(bf, s.Name, true)
|
|
||||||
ps.Uint8(bf, "", false)
|
|
||||||
}
|
|
||||||
if i > 100 {
|
|
||||||
i++
|
|
||||||
continue
|
|
||||||
}
|
|
||||||
scoreData.WriteUint32(i)
|
|
||||||
scoreData.WriteUint32(score.MaxStagesMP)
|
|
||||||
ps.Uint8(scoreData, score.Name, true)
|
|
||||||
ps.Uint8(scoreData, "", false)
|
|
||||||
i++
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
bf.WriteBytes(make([]byte, 11))
|
|
||||||
}
|
|
||||||
case 3: // Max RdP guild MP
|
|
||||||
if guild != nil {
|
|
||||||
rows, _ := s.server.db.Queryx(fmt.Sprintf("%s WHERE guild_id=$1 ORDER BY max_points_mp DESC", rengokuScoreQuery), guild.ID)
|
|
||||||
for rows.Next() {
|
|
||||||
rows.StructScan(&score)
|
|
||||||
if score.Name == s.Name {
|
|
||||||
bf.WriteUint32(i)
|
|
||||||
bf.WriteUint32(score.MaxPointsMP)
|
|
||||||
ps.Uint8(bf, s.Name, true)
|
|
||||||
ps.Uint8(bf, "", false)
|
|
||||||
}
|
|
||||||
if i > 100 {
|
|
||||||
i++
|
|
||||||
continue
|
|
||||||
}
|
|
||||||
scoreData.WriteUint32(i)
|
|
||||||
scoreData.WriteUint32(score.MaxPointsMP)
|
|
||||||
ps.Uint8(scoreData, score.Name, true)
|
|
||||||
ps.Uint8(scoreData, "", false)
|
|
||||||
i++
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
bf.WriteBytes(make([]byte, 11))
|
|
||||||
}
|
|
||||||
case 4: // Max stage overall SP
|
|
||||||
rows, _ := s.server.db.Queryx(fmt.Sprintf("%s ORDER BY max_stages_sp DESC", rengokuScoreQuery))
|
|
||||||
for rows.Next() {
|
|
||||||
rows.StructScan(&score)
|
|
||||||
if score.Name == s.Name {
|
|
||||||
bf.WriteUint32(i)
|
|
||||||
bf.WriteUint32(score.MaxStagesSP)
|
|
||||||
ps.Uint8(bf, s.Name, true)
|
|
||||||
ps.Uint8(bf, "", false)
|
|
||||||
}
|
|
||||||
if i > 100 {
|
|
||||||
i++
|
|
||||||
continue
|
|
||||||
}
|
|
||||||
scoreData.WriteUint32(i)
|
|
||||||
scoreData.WriteUint32(score.MaxStagesSP)
|
|
||||||
ps.Uint8(scoreData, score.Name, true)
|
|
||||||
ps.Uint8(scoreData, "", false)
|
|
||||||
i++
|
|
||||||
}
|
|
||||||
case 5: // Max RdP overall SP
|
|
||||||
rows, _ := s.server.db.Queryx(fmt.Sprintf("%s ORDER BY max_points_sp DESC", rengokuScoreQuery))
|
|
||||||
for rows.Next() {
|
|
||||||
rows.StructScan(&score)
|
|
||||||
if score.Name == s.Name {
|
|
||||||
bf.WriteUint32(i)
|
|
||||||
bf.WriteUint32(score.MaxPointsSP)
|
|
||||||
ps.Uint8(bf, s.Name, true)
|
|
||||||
ps.Uint8(bf, "", false)
|
|
||||||
}
|
|
||||||
if i > 100 {
|
|
||||||
i++
|
|
||||||
continue
|
|
||||||
}
|
|
||||||
scoreData.WriteUint32(i)
|
|
||||||
scoreData.WriteUint32(score.MaxPointsSP)
|
|
||||||
ps.Uint8(scoreData, score.Name, true)
|
|
||||||
ps.Uint8(scoreData, "", false)
|
|
||||||
i++
|
|
||||||
}
|
|
||||||
case 6: // Max stage guild SP
|
|
||||||
if guild != nil {
|
|
||||||
rows, _ := s.server.db.Queryx(fmt.Sprintf("%s WHERE guild_id=$1 ORDER BY max_stages_sp DESC", rengokuScoreQuery), guild.ID)
|
|
||||||
for rows.Next() {
|
|
||||||
rows.StructScan(&score)
|
|
||||||
if score.Name == s.Name {
|
|
||||||
bf.WriteUint32(i)
|
|
||||||
bf.WriteUint32(score.MaxStagesSP)
|
|
||||||
ps.Uint8(bf, s.Name, true)
|
|
||||||
ps.Uint8(bf, "", false)
|
|
||||||
}
|
|
||||||
if i > 100 {
|
|
||||||
i++
|
|
||||||
continue
|
|
||||||
}
|
|
||||||
scoreData.WriteUint32(i)
|
|
||||||
scoreData.WriteUint32(score.MaxStagesSP)
|
|
||||||
ps.Uint8(scoreData, score.Name, true)
|
|
||||||
ps.Uint8(scoreData, "", false)
|
|
||||||
i++
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
bf.WriteBytes(make([]byte, 11))
|
|
||||||
}
|
|
||||||
case 7: // Max RdP guild SP
|
|
||||||
if guild != nil {
|
|
||||||
rows, _ := s.server.db.Queryx(fmt.Sprintf("%s WHERE guild_id=$1 ORDER BY max_points_sp DESC", rengokuScoreQuery), guild.ID)
|
|
||||||
for rows.Next() {
|
|
||||||
rows.StructScan(&score)
|
|
||||||
if score.Name == s.Name {
|
|
||||||
bf.WriteUint32(i)
|
|
||||||
bf.WriteUint32(score.MaxPointsSP)
|
|
||||||
ps.Uint8(bf, s.Name, true)
|
|
||||||
ps.Uint8(bf, "", false)
|
|
||||||
}
|
|
||||||
if i > 100 {
|
|
||||||
i++
|
|
||||||
continue
|
|
||||||
}
|
|
||||||
scoreData.WriteUint32(i)
|
|
||||||
scoreData.WriteUint32(score.MaxPointsSP)
|
|
||||||
ps.Uint8(scoreData, score.Name, true)
|
|
||||||
ps.Uint8(scoreData, "", false)
|
|
||||||
i++
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
bf.WriteBytes(make([]byte, 11))
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
if i == 1 {
|
|
||||||
bf.WriteUint32(1)
|
for rows.Next() {
|
||||||
bf.WriteUint32(0)
|
rows.StructScan(&score)
|
||||||
ps.Uint8(bf, s.Name, true)
|
if score.Name == s.Name {
|
||||||
ps.Uint8(bf, "", false)
|
bf.WriteUint32(i)
|
||||||
bf.WriteUint8(1)
|
bf.WriteUint32(score.Score)
|
||||||
bf.WriteUint32(1)
|
ps.Uint8(bf, s.Name, true)
|
||||||
bf.WriteUint32(0)
|
ps.Uint8(bf, "", false)
|
||||||
ps.Uint8(bf, s.Name, true)
|
selfExist = true
|
||||||
ps.Uint8(bf, "", false)
|
}
|
||||||
} else {
|
scoreData.WriteUint32(i)
|
||||||
bf.WriteUint8(uint8(i) - 1)
|
scoreData.WriteUint32(score.Score)
|
||||||
bf.WriteBytes(scoreData.Data())
|
ps.Uint8(scoreData, score.Name, true)
|
||||||
|
ps.Uint8(scoreData, "", false)
|
||||||
|
i++
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if !selfExist {
|
||||||
|
bf.WriteBytes(make([]byte, 10))
|
||||||
|
}
|
||||||
|
bf.WriteUint8(uint8(i) - 1)
|
||||||
|
bf.WriteBytes(scoreData.Data())
|
||||||
doAckBufSucceed(s, pkt.AckHandle, bf.Data())
|
doAckBufSucceed(s, pkt.AckHandle, bf.Data())
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user