rewrite EnumerateGuild

This commit is contained in:
wish
2023-04-23 20:26:51 +10:00
parent e04c18bccf
commit e61d6a60f3
2 changed files with 102 additions and 105 deletions

View File

@@ -2,9 +2,9 @@ package mhfpacket
import ( import (
"errors" "errors"
"io" "erupe-ce/common/bfutil"
"erupe-ce/common/byteframe" "erupe-ce/common/byteframe"
"erupe-ce/common/stringsupport"
"erupe-ce/network" "erupe-ce/network"
"erupe-ce/network/clientctx" "erupe-ce/network/clientctx"
) )
@@ -12,28 +12,30 @@ import (
type EnumerateGuildType uint8 type EnumerateGuildType uint8
const ( const (
ENUMERATE_GUILD_TYPE_GUILD_NAME = 0x01 ENUMERATE_GUILD_UNKNOWN = iota
ENUMERATE_GUILD_TYPE_LEADER_NAME = 0x02 ENUMERATE_GUILD_TYPE_GUILD_NAME
ENUMERATE_GUILD_TYPE_LEADER_ID = 0x03 ENUMERATE_GUILD_TYPE_LEADER_NAME
ENUMERATE_GUILD_TYPE_ORDER_MEMBERS = 0x04 ENUMERATE_GUILD_TYPE_LEADER_ID
ENUMERATE_GUILD_TYPE_ORDER_REGISTRATION = 0x05 ENUMERATE_GUILD_TYPE_ORDER_MEMBERS
ENUMERATE_GUILD_TYPE_ORDER_RANK = 0x06 ENUMERATE_GUILD_TYPE_ORDER_REGISTRATION
ENUMERATE_GUILD_TYPE_MOTTO = 0x07 ENUMERATE_GUILD_TYPE_ORDER_RANK
ENUMERATE_GUILD_TYPE_RECRUITING = 0x08 ENUMERATE_GUILD_TYPE_MOTTO
ENUMERATE_ALLIANCE_TYPE_ALLIANCE_NAME = 0x09 ENUMERATE_GUILD_TYPE_RECRUITING
ENUMERATE_ALLIANCE_TYPE_LEADER_NAME = 0x0A ENUMERATE_ALLIANCE_TYPE_ALLIANCE_NAME
ENUMERATE_ALLIANCE_TYPE_LEADER_ID = 0x0B ENUMERATE_ALLIANCE_TYPE_LEADER_NAME
ENUMERATE_ALLIANCE_TYPE_ORDER_MEMBERS = 0x0C ENUMERATE_ALLIANCE_TYPE_LEADER_ID
ENUMERATE_ALLIANCE_TYPE_ORDER_REGISTRATION = 0x0D ENUMERATE_ALLIANCE_TYPE_ORDER_MEMBERS
ENUMERATE_ALLIANCE_TYPE_ORDER_REGISTRATION
) )
// MsgMhfEnumerateGuild represents the MSG_MHF_ENUMERATE_GUILD // MsgMhfEnumerateGuild represents the MSG_MHF_ENUMERATE_GUILD
type MsgMhfEnumerateGuild struct { type MsgMhfEnumerateGuild struct {
AckHandle uint32 AckHandle uint32
Type EnumerateGuildType Type EnumerateGuildType
Page uint8 Page uint8
Sorting bool Sorting bool
RawDataPayload []byte Data1 []byte
Data2 string
} }
// Opcode returns the ID associated with this packet type. // Opcode returns the ID associated with this packet type.
@@ -47,9 +49,12 @@ func (m *MsgMhfEnumerateGuild) Parse(bf *byteframe.ByteFrame, ctx *clientctx.Cli
m.Type = EnumerateGuildType(bf.ReadUint8()) m.Type = EnumerateGuildType(bf.ReadUint8())
m.Page = bf.ReadUint8() m.Page = bf.ReadUint8()
m.Sorting = bf.ReadBool() m.Sorting = bf.ReadBool()
_ = bf.ReadUint8() _ = bf.ReadBytes(1)
m.RawDataPayload = bf.DataFromCurrent() m.Data1 = bf.ReadBytes(4)
bf.Seek(-2, io.SeekEnd) _ = bf.ReadBytes(2)
lenData2 := uint(bf.ReadUint8())
_ = bf.ReadBytes(1)
m.Data2 = stringsupport.SJISToUTF8(bfutil.UpToNull(bf.ReadBytes(lenData2)))
return nil return nil
} }

View File

@@ -1100,91 +1100,87 @@ func handleMsgMhfEnumerateGuild(s *Session, p mhfpacket.MHFPacket) {
var alliances []*GuildAlliance var alliances []*GuildAlliance
var rows *sqlx.Rows var rows *sqlx.Rows
var err error var err error
bf := byteframe.NewByteFrameFromBytes(pkt.RawDataPayload) bf := byteframe.NewByteFrameFromBytes(pkt.Data1)
switch pkt.Type { if pkt.Type <= 8 {
case mhfpacket.ENUMERATE_GUILD_TYPE_GUILD_NAME: var tempGuilds []*Guild
bf.ReadBytes(8) rows, err = s.server.db.Queryx(guildInfoSelectQuery)
searchTerm := fmt.Sprintf(`%%%s%%`, stringsupport.SJISToUTF8(bf.ReadNullTerminatedBytes()))
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, err := buildGuildObjectFromDbResult(rows, err, s)
guilds = append(guilds, guild) if err != nil {
continue
}
tempGuilds = append(tempGuilds, guild)
} }
} }
case mhfpacket.ENUMERATE_GUILD_TYPE_LEADER_NAME: switch pkt.Type {
bf.ReadBytes(8) case mhfpacket.ENUMERATE_GUILD_TYPE_GUILD_NAME:
searchTerm := fmt.Sprintf(`%%%s%%`, stringsupport.SJISToUTF8(bf.ReadNullTerminatedBytes())) for _, guild := range tempGuilds {
rows, err = s.server.db.Queryx(fmt.Sprintf(`%s WHERE lc.name ILIKE $1 OFFSET $2 LIMIT 11`, guildInfoSelectQuery), searchTerm, pkt.Page*10) if strings.Contains(guild.Name, pkt.Data2) {
if err == nil { guilds = append(guilds, guild)
for rows.Next() { }
guild, _ := buildGuildObjectFromDbResult(rows, err, s)
guilds = append(guilds, guild)
} }
} case mhfpacket.ENUMERATE_GUILD_TYPE_LEADER_NAME:
case mhfpacket.ENUMERATE_GUILD_TYPE_LEADER_ID: for _, guild := range tempGuilds {
ID := bf.ReadUint32() if strings.Contains(guild.LeaderName, pkt.Data2) {
rows, err = s.server.db.Queryx(fmt.Sprintf(`%s WHERE leader_id = $1`, guildInfoSelectQuery), ID) guilds = append(guilds, guild)
if err == nil { }
for rows.Next() {
guild, _ := buildGuildObjectFromDbResult(rows, err, s)
guilds = append(guilds, guild)
} }
} case mhfpacket.ENUMERATE_GUILD_TYPE_LEADER_ID:
case mhfpacket.ENUMERATE_GUILD_TYPE_ORDER_MEMBERS: ID := bf.ReadUint32()
if pkt.Sorting { for _, guild := range tempGuilds {
rows, err = s.server.db.Queryx(fmt.Sprintf(`%s ORDER BY member_count DESC OFFSET $1 LIMIT 11`, guildInfoSelectQuery), pkt.Page*10) if guild.LeaderCharID == ID {
} else { guilds = append(guilds, guild)
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 {
for rows.Next() {
guild, _ := buildGuildObjectFromDbResult(rows, err, s)
guilds = append(guilds, guild)
} }
} case mhfpacket.ENUMERATE_GUILD_TYPE_ORDER_MEMBERS:
case mhfpacket.ENUMERATE_GUILD_TYPE_ORDER_REGISTRATION: if pkt.Sorting {
if pkt.Sorting { sort.Slice(tempGuilds, func(i, j int) bool {
rows, err = s.server.db.Queryx(fmt.Sprintf(`%s ORDER BY id ASC OFFSET $1 LIMIT 11`, guildInfoSelectQuery), pkt.Page*10) return tempGuilds[i].MemberCount > tempGuilds[j].MemberCount
} else { })
rows, err = s.server.db.Queryx(fmt.Sprintf(`%s ORDER BY id DESC OFFSET $1 LIMIT 11`, guildInfoSelectQuery), pkt.Page*10) } else {
} sort.Slice(tempGuilds, func(i, j int) bool {
if err == nil { return tempGuilds[i].MemberCount < tempGuilds[j].MemberCount
for rows.Next() { })
guild, _ := buildGuildObjectFromDbResult(rows, err, s)
guilds = append(guilds, guild)
} }
} guilds = tempGuilds
case mhfpacket.ENUMERATE_GUILD_TYPE_ORDER_RANK: case mhfpacket.ENUMERATE_GUILD_TYPE_ORDER_REGISTRATION:
if pkt.Sorting { if pkt.Sorting {
rows, err = s.server.db.Queryx(fmt.Sprintf(`%s ORDER BY rank_rp DESC OFFSET $1 LIMIT 11`, guildInfoSelectQuery), pkt.Page*10) sort.Slice(tempGuilds, func(i, j int) bool {
} else { return tempGuilds[i].CreatedAt.Unix() > tempGuilds[j].CreatedAt.Unix()
rows, err = s.server.db.Queryx(fmt.Sprintf(`%s ORDER BY rank_rp ASC OFFSET $1 LIMIT 11`, guildInfoSelectQuery), pkt.Page*10) })
} } else {
if err == nil { sort.Slice(tempGuilds, func(i, j int) bool {
for rows.Next() { return tempGuilds[i].CreatedAt.Unix() < tempGuilds[j].CreatedAt.Unix()
guild, _ := buildGuildObjectFromDbResult(rows, err, s) })
guilds = append(guilds, guild)
} }
} guilds = tempGuilds
case mhfpacket.ENUMERATE_GUILD_TYPE_MOTTO: case mhfpacket.ENUMERATE_GUILD_TYPE_ORDER_RANK:
mainMotto := bf.ReadUint16() if pkt.Sorting {
subMotto := bf.ReadUint16() sort.Slice(tempGuilds, func(i, j int) bool {
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) return tempGuilds[i].RankRP > tempGuilds[j].RankRP
if err == nil { })
for rows.Next() { } else {
guild, _ := buildGuildObjectFromDbResult(rows, err, s) sort.Slice(tempGuilds, func(i, j int) bool {
guilds = append(guilds, guild) return tempGuilds[i].RankRP < tempGuilds[j].RankRP
})
} }
} guilds = tempGuilds
case mhfpacket.ENUMERATE_GUILD_TYPE_RECRUITING: case mhfpacket.ENUMERATE_GUILD_TYPE_MOTTO:
// Assume the player wants the newest guilds with open recruitment mainMotto := uint8(bf.ReadUint16())
rows, err = s.server.db.Queryx(fmt.Sprintf(`%s WHERE recruiting=true ORDER BY id DESC OFFSET $1 LIMIT 11`, guildInfoSelectQuery), pkt.Page*10) subMotto := uint8(bf.ReadUint16())
if err == nil { for _, guild := range tempGuilds {
for rows.Next() { if guild.MainMotto == mainMotto && guild.SubMotto == subMotto {
guild, _ := buildGuildObjectFromDbResult(rows, err, s) guilds = append(guilds, guild)
guilds = append(guilds, guild) }
}
case mhfpacket.ENUMERATE_GUILD_TYPE_RECRUITING:
recruitingMotto := uint8(bf.ReadUint16())
for _, guild := range tempGuilds {
if guild.MainMotto == recruitingMotto {
guilds = append(guilds, guild)
}
} }
} }
} }
@@ -1200,18 +1196,14 @@ func handleMsgMhfEnumerateGuild(s *Session, p mhfpacket.MHFPacket) {
} }
switch pkt.Type { switch pkt.Type {
case mhfpacket.ENUMERATE_ALLIANCE_TYPE_ALLIANCE_NAME: case mhfpacket.ENUMERATE_ALLIANCE_TYPE_ALLIANCE_NAME:
bf.ReadBytes(8)
searchTerm := stringsupport.SJISToUTF8(bf.ReadNullTerminatedBytes())
for _, alliance := range tempAlliances { for _, alliance := range tempAlliances {
if strings.Contains(alliance.Name, searchTerm) { if strings.Contains(alliance.Name, pkt.Data2) {
alliances = append(alliances, alliance) alliances = append(alliances, alliance)
} }
} }
case mhfpacket.ENUMERATE_ALLIANCE_TYPE_LEADER_NAME: case mhfpacket.ENUMERATE_ALLIANCE_TYPE_LEADER_NAME:
bf.ReadBytes(8)
searchTerm := stringsupport.SJISToUTF8(bf.ReadNullTerminatedBytes())
for _, alliance := range tempAlliances { for _, alliance := range tempAlliances {
if strings.Contains(alliance.ParentGuild.LeaderName, searchTerm) { if strings.Contains(alliance.ParentGuild.LeaderName, pkt.Data2) {
alliances = append(alliances, alliance) alliances = append(alliances, alliance)
} }
} }
@@ -1292,8 +1284,8 @@ func handleMsgMhfEnumerateGuild(s *Session, p mhfpacket.MHFPacket) {
bf.WriteUint32(guild.ID) bf.WriteUint32(guild.ID)
bf.WriteUint32(guild.LeaderCharID) bf.WriteUint32(guild.LeaderCharID)
bf.WriteUint16(guild.MemberCount) bf.WriteUint16(guild.MemberCount)
bf.WriteUint16(0x0000) // Unk bf.WriteUint16(0x0000) // Unk
bf.WriteUint16(guild.Rank) // OR guilds in alliance bf.WriteUint16(guild.Rank)
bf.WriteUint32(uint32(guild.CreatedAt.Unix())) bf.WriteUint32(uint32(guild.CreatedAt.Unix()))
ps.Uint8(bf, guild.Name, true) ps.Uint8(bf, guild.Name, true)
ps.Uint8(bf, guild.LeaderName, true) ps.Uint8(bf, guild.LeaderName, true)