handle pagination in guild enumeration

This commit is contained in:
rockisch
2022-10-23 01:19:26 -03:00
parent b69305a8a9
commit a9a7573687

View File

@@ -1103,7 +1103,7 @@ func handleMsgMhfEnumerateGuild(s *Session, p mhfpacket.MHFPacket) {
case mhfpacket.ENUMERATE_GUILD_TYPE_GUILD_NAME: case mhfpacket.ENUMERATE_GUILD_TYPE_GUILD_NAME:
bf.ReadBytes(8) bf.ReadBytes(8)
searchTerm := fmt.Sprintf(`%%%s%%`, stringsupport.SJISToUTF8(bf.ReadNullTerminatedBytes())) searchTerm := fmt.Sprintf(`%%%s%%`, stringsupport.SJISToUTF8(bf.ReadNullTerminatedBytes()))
rows, err = s.server.db.Queryx(fmt.Sprintf(`%s WHERE g.name ILIKE $1 OFFSET $2`, guildInfoSelectQuery), searchTerm, pkt.Page*10) rows, err = s.server.db.Queryx(fmt.Sprintf(`%s WHERE g.name ILIKE $1 OFFSET $2 LIMIT 11`, guildInfoSelectQuery), searchTerm, pkt.Page*10)
if err == nil { if err == nil {
for rows.Next() { for rows.Next() {
guild, _ := buildGuildObjectFromDbResult(rows, err, s) guild, _ := buildGuildObjectFromDbResult(rows, err, s)
@@ -1113,7 +1113,7 @@ func handleMsgMhfEnumerateGuild(s *Session, p mhfpacket.MHFPacket) {
case mhfpacket.ENUMERATE_GUILD_TYPE_LEADER_NAME: case mhfpacket.ENUMERATE_GUILD_TYPE_LEADER_NAME:
bf.ReadBytes(8) bf.ReadBytes(8)
searchTerm := fmt.Sprintf(`%%%s%%`, stringsupport.SJISToUTF8(bf.ReadNullTerminatedBytes())) searchTerm := fmt.Sprintf(`%%%s%%`, stringsupport.SJISToUTF8(bf.ReadNullTerminatedBytes()))
rows, err = s.server.db.Queryx(fmt.Sprintf(`%s WHERE lc.name ILIKE $1 OFFSET $2`, guildInfoSelectQuery), searchTerm, pkt.Page*10) rows, err = s.server.db.Queryx(fmt.Sprintf(`%s WHERE lc.name ILIKE $1 OFFSET $2 LIMIT 11`, guildInfoSelectQuery), searchTerm, pkt.Page*10)
if err == nil { if err == nil {
for rows.Next() { for rows.Next() {
guild, _ := buildGuildObjectFromDbResult(rows, err, s) guild, _ := buildGuildObjectFromDbResult(rows, err, s)
@@ -1131,9 +1131,9 @@ func handleMsgMhfEnumerateGuild(s *Session, p mhfpacket.MHFPacket) {
} }
case mhfpacket.ENUMERATE_GUILD_TYPE_ORDER_MEMBERS: case mhfpacket.ENUMERATE_GUILD_TYPE_ORDER_MEMBERS:
if pkt.Sorting { if pkt.Sorting {
rows, err = s.server.db.Queryx(fmt.Sprintf(`%s ORDER BY member_count DESC OFFSET $1`, guildInfoSelectQuery), pkt.Page*10) rows, err = s.server.db.Queryx(fmt.Sprintf(`%s ORDER BY member_count DESC OFFSET $1 LIMIT 11`, guildInfoSelectQuery), pkt.Page*10)
} else { } else {
rows, err = s.server.db.Queryx(fmt.Sprintf(`%s ORDER BY member_count ASC OFFSET $1`, guildInfoSelectQuery), pkt.Page*10) rows, err = s.server.db.Queryx(fmt.Sprintf(`%s ORDER BY member_count ASC OFFSET $1 LIMIT 11`, guildInfoSelectQuery), pkt.Page*10)
} }
if err == nil { if err == nil {
for rows.Next() { for rows.Next() {
@@ -1143,9 +1143,9 @@ func handleMsgMhfEnumerateGuild(s *Session, p mhfpacket.MHFPacket) {
} }
case mhfpacket.ENUMERATE_GUILD_TYPE_ORDER_REGISTRATION: case mhfpacket.ENUMERATE_GUILD_TYPE_ORDER_REGISTRATION:
if pkt.Sorting { if pkt.Sorting {
rows, err = s.server.db.Queryx(fmt.Sprintf(`%s ORDER BY id ASC OFFSET $1`, guildInfoSelectQuery), pkt.Page*10) rows, err = s.server.db.Queryx(fmt.Sprintf(`%s ORDER BY id ASC OFFSET $1 LIMIT 11`, guildInfoSelectQuery), pkt.Page*10)
} else { } else {
rows, err = s.server.db.Queryx(fmt.Sprintf(`%s ORDER BY id DESC OFFSET $1`, guildInfoSelectQuery), pkt.Page*10) rows, err = s.server.db.Queryx(fmt.Sprintf(`%s ORDER BY id DESC OFFSET $1 LIMIT 11`, guildInfoSelectQuery), pkt.Page*10)
} }
if err == nil { if err == nil {
for rows.Next() { for rows.Next() {
@@ -1155,9 +1155,9 @@ func handleMsgMhfEnumerateGuild(s *Session, p mhfpacket.MHFPacket) {
} }
case mhfpacket.ENUMERATE_GUILD_TYPE_ORDER_RANK: case mhfpacket.ENUMERATE_GUILD_TYPE_ORDER_RANK:
if pkt.Sorting { if pkt.Sorting {
rows, err = s.server.db.Queryx(fmt.Sprintf(`%s ORDER BY rank_rp DESC OFFSET $1`, guildInfoSelectQuery), pkt.Page*10) rows, err = s.server.db.Queryx(fmt.Sprintf(`%s ORDER BY rank_rp DESC OFFSET $1 LIMIT 11`, guildInfoSelectQuery), pkt.Page*10)
} else { } else {
rows, err = s.server.db.Queryx(fmt.Sprintf(`%s ORDER BY rank_rp ASC OFFSET $1`, guildInfoSelectQuery), pkt.Page*10) rows, err = s.server.db.Queryx(fmt.Sprintf(`%s ORDER BY rank_rp ASC OFFSET $1 LIMIT 11`, guildInfoSelectQuery), pkt.Page*10)
} }
if err == nil { if err == nil {
for rows.Next() { for rows.Next() {
@@ -1168,7 +1168,7 @@ func handleMsgMhfEnumerateGuild(s *Session, p mhfpacket.MHFPacket) {
case mhfpacket.ENUMERATE_GUILD_TYPE_MOTTO: case mhfpacket.ENUMERATE_GUILD_TYPE_MOTTO:
mainMotto := bf.ReadUint16() mainMotto := bf.ReadUint16()
subMotto := bf.ReadUint16() subMotto := bf.ReadUint16()
rows, err = s.server.db.Queryx(fmt.Sprintf(`%s WHERE main_motto = $1 AND sub_motto = $2 OFFSET $3`, guildInfoSelectQuery), mainMotto, subMotto, pkt.Page*10) rows, err = s.server.db.Queryx(fmt.Sprintf(`%s WHERE main_motto = $1 AND sub_motto = $2 OFFSET $3 LIMIT 11`, guildInfoSelectQuery), mainMotto, subMotto, pkt.Page*10)
if err == nil { if err == nil {
for rows.Next() { for rows.Next() {
guild, _ := buildGuildObjectFromDbResult(rows, err, s) guild, _ := buildGuildObjectFromDbResult(rows, err, s)
@@ -1177,7 +1177,7 @@ func handleMsgMhfEnumerateGuild(s *Session, p mhfpacket.MHFPacket) {
} }
case mhfpacket.ENUMERATE_GUILD_TYPE_RECRUITING: case mhfpacket.ENUMERATE_GUILD_TYPE_RECRUITING:
// Assume the player wants the newest guilds with open recruitment // Assume the player wants the newest guilds with open recruitment
rows, err = s.server.db.Queryx(fmt.Sprintf(`%s WHERE recruiting=true ORDER BY id DESC OFFSET $1`, guildInfoSelectQuery), pkt.Page*10) rows, err = s.server.db.Queryx(fmt.Sprintf(`%s WHERE recruiting=true ORDER BY id DESC OFFSET $1 LIMIT 11`, guildInfoSelectQuery), pkt.Page*10)
if err == nil { if err == nil {
for rows.Next() { for rows.Next() {
guild, _ := buildGuildObjectFromDbResult(rows, err, s) guild, _ := buildGuildObjectFromDbResult(rows, err, s)
@@ -1252,16 +1252,14 @@ func handleMsgMhfEnumerateGuild(s *Session, p mhfpacket.MHFPacket) {
bf = byteframe.NewByteFrame() bf = byteframe.NewByteFrame()
if pkt.Type > 8 { if pkt.Type > 8 {
if len(guilds) > 10 { hasNextPage := false
bf.WriteUint16(10) if len(alliances) > 10 {
} else { hasNextPage = true
bf.WriteUint16(uint16(len(alliances))) alliances = alliances[:10]
} }
bf.WriteUint8(0x00) // Unk bf.WriteUint16(uint16(len(alliances)))
for i, alliance := range alliances { bf.WriteBool(hasNextPage) // Unk
if i == 10 { for _, alliance := range alliances {
break
}
bf.WriteUint32(alliance.ID) bf.WriteUint32(alliance.ID)
bf.WriteUint32(alliance.ParentGuild.LeaderCharID) bf.WriteUint32(alliance.ParentGuild.LeaderCharID)
bf.WriteUint16(alliance.TotalMembers) bf.WriteUint16(alliance.TotalMembers)
@@ -1280,16 +1278,14 @@ func handleMsgMhfEnumerateGuild(s *Session, p mhfpacket.MHFPacket) {
bf.WriteBool(true) // TODO: Enable GuildAlliance applications bf.WriteBool(true) // TODO: Enable GuildAlliance applications
} }
} else { } else {
hasNextPage := false
if len(guilds) > 10 { if len(guilds) > 10 {
bf.WriteUint16(10) hasNextPage = true
} else { guilds = guilds[:10]
bf.WriteUint16(uint16(len(guilds)))
} }
bf.WriteUint8(0x01) // Unk bf.WriteUint16(uint16(len(guilds)))
for i, guild := range guilds { bf.WriteBool(hasNextPage)
if i == 10 { for _, guild := range guilds {
break
}
bf.WriteUint32(guild.ID) bf.WriteUint32(guild.ID)
bf.WriteUint32(guild.LeaderCharID) bf.WriteUint32(guild.LeaderCharID)
bf.WriteUint16(guild.MemberCount) bf.WriteUint16(guild.MemberCount)