From e61d6a60f328f5887d0bfec14b484fce64800730 Mon Sep 17 00:00:00 2001 From: wish Date: Sun, 23 Apr 2023 20:26:51 +1000 Subject: [PATCH] rewrite EnumerateGuild --- network/mhfpacket/msg_mhf_enumerate_guild.go | 51 +++--- server/channelserver/handlers_guild.go | 156 +++++++++---------- 2 files changed, 102 insertions(+), 105 deletions(-) diff --git a/network/mhfpacket/msg_mhf_enumerate_guild.go b/network/mhfpacket/msg_mhf_enumerate_guild.go index 691f8241f..f90a7cc7b 100644 --- a/network/mhfpacket/msg_mhf_enumerate_guild.go +++ b/network/mhfpacket/msg_mhf_enumerate_guild.go @@ -2,9 +2,9 @@ package mhfpacket import ( "errors" - "io" - + "erupe-ce/common/bfutil" "erupe-ce/common/byteframe" + "erupe-ce/common/stringsupport" "erupe-ce/network" "erupe-ce/network/clientctx" ) @@ -12,28 +12,30 @@ import ( type EnumerateGuildType uint8 const ( - ENUMERATE_GUILD_TYPE_GUILD_NAME = 0x01 - ENUMERATE_GUILD_TYPE_LEADER_NAME = 0x02 - ENUMERATE_GUILD_TYPE_LEADER_ID = 0x03 - ENUMERATE_GUILD_TYPE_ORDER_MEMBERS = 0x04 - ENUMERATE_GUILD_TYPE_ORDER_REGISTRATION = 0x05 - ENUMERATE_GUILD_TYPE_ORDER_RANK = 0x06 - ENUMERATE_GUILD_TYPE_MOTTO = 0x07 - ENUMERATE_GUILD_TYPE_RECRUITING = 0x08 - ENUMERATE_ALLIANCE_TYPE_ALLIANCE_NAME = 0x09 - ENUMERATE_ALLIANCE_TYPE_LEADER_NAME = 0x0A - ENUMERATE_ALLIANCE_TYPE_LEADER_ID = 0x0B - ENUMERATE_ALLIANCE_TYPE_ORDER_MEMBERS = 0x0C - ENUMERATE_ALLIANCE_TYPE_ORDER_REGISTRATION = 0x0D + ENUMERATE_GUILD_UNKNOWN = iota + ENUMERATE_GUILD_TYPE_GUILD_NAME + ENUMERATE_GUILD_TYPE_LEADER_NAME + ENUMERATE_GUILD_TYPE_LEADER_ID + ENUMERATE_GUILD_TYPE_ORDER_MEMBERS + ENUMERATE_GUILD_TYPE_ORDER_REGISTRATION + ENUMERATE_GUILD_TYPE_ORDER_RANK + ENUMERATE_GUILD_TYPE_MOTTO + ENUMERATE_GUILD_TYPE_RECRUITING + ENUMERATE_ALLIANCE_TYPE_ALLIANCE_NAME + ENUMERATE_ALLIANCE_TYPE_LEADER_NAME + ENUMERATE_ALLIANCE_TYPE_LEADER_ID + ENUMERATE_ALLIANCE_TYPE_ORDER_MEMBERS + ENUMERATE_ALLIANCE_TYPE_ORDER_REGISTRATION ) // MsgMhfEnumerateGuild represents the MSG_MHF_ENUMERATE_GUILD type MsgMhfEnumerateGuild struct { - AckHandle uint32 - Type EnumerateGuildType - Page uint8 - Sorting bool - RawDataPayload []byte + AckHandle uint32 + Type EnumerateGuildType + Page uint8 + Sorting bool + Data1 []byte + Data2 string } // 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.Page = bf.ReadUint8() m.Sorting = bf.ReadBool() - _ = bf.ReadUint8() - m.RawDataPayload = bf.DataFromCurrent() - bf.Seek(-2, io.SeekEnd) + _ = bf.ReadBytes(1) + m.Data1 = bf.ReadBytes(4) + _ = bf.ReadBytes(2) + lenData2 := uint(bf.ReadUint8()) + _ = bf.ReadBytes(1) + m.Data2 = stringsupport.SJISToUTF8(bfutil.UpToNull(bf.ReadBytes(lenData2))) return nil } diff --git a/server/channelserver/handlers_guild.go b/server/channelserver/handlers_guild.go index 7eca11a16..06f3b0692 100644 --- a/server/channelserver/handlers_guild.go +++ b/server/channelserver/handlers_guild.go @@ -1100,91 +1100,87 @@ func handleMsgMhfEnumerateGuild(s *Session, p mhfpacket.MHFPacket) { var alliances []*GuildAlliance var rows *sqlx.Rows var err error - bf := byteframe.NewByteFrameFromBytes(pkt.RawDataPayload) + bf := byteframe.NewByteFrameFromBytes(pkt.Data1) - switch pkt.Type { - case mhfpacket.ENUMERATE_GUILD_TYPE_GUILD_NAME: - bf.ReadBytes(8) - 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 pkt.Type <= 8 { + var tempGuilds []*Guild + rows, err = s.server.db.Queryx(guildInfoSelectQuery) if err == nil { for rows.Next() { - guild, _ := buildGuildObjectFromDbResult(rows, err, s) - guilds = append(guilds, guild) + guild, err := buildGuildObjectFromDbResult(rows, err, s) + if err != nil { + continue + } + tempGuilds = append(tempGuilds, guild) } } - case mhfpacket.ENUMERATE_GUILD_TYPE_LEADER_NAME: - bf.ReadBytes(8) - searchTerm := fmt.Sprintf(`%%%s%%`, stringsupport.SJISToUTF8(bf.ReadNullTerminatedBytes())) - 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 { - for rows.Next() { - guild, _ := buildGuildObjectFromDbResult(rows, err, s) - guilds = append(guilds, guild) + switch pkt.Type { + case mhfpacket.ENUMERATE_GUILD_TYPE_GUILD_NAME: + for _, guild := range tempGuilds { + if strings.Contains(guild.Name, pkt.Data2) { + guilds = append(guilds, guild) + } } - } - case mhfpacket.ENUMERATE_GUILD_TYPE_LEADER_ID: - ID := bf.ReadUint32() - rows, err = s.server.db.Queryx(fmt.Sprintf(`%s WHERE leader_id = $1`, guildInfoSelectQuery), ID) - if err == nil { - for rows.Next() { - guild, _ := buildGuildObjectFromDbResult(rows, err, s) - guilds = append(guilds, guild) + case mhfpacket.ENUMERATE_GUILD_TYPE_LEADER_NAME: + for _, guild := range tempGuilds { + if strings.Contains(guild.LeaderName, pkt.Data2) { + guilds = append(guilds, guild) + } } - } - case mhfpacket.ENUMERATE_GUILD_TYPE_ORDER_MEMBERS: - if pkt.Sorting { - rows, err = s.server.db.Queryx(fmt.Sprintf(`%s ORDER BY member_count DESC OFFSET $1 LIMIT 11`, guildInfoSelectQuery), pkt.Page*10) - } else { - 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_LEADER_ID: + ID := bf.ReadUint32() + for _, guild := range tempGuilds { + if guild.LeaderCharID == ID { + guilds = append(guilds, guild) + } } - } - case mhfpacket.ENUMERATE_GUILD_TYPE_ORDER_REGISTRATION: - if pkt.Sorting { - rows, err = s.server.db.Queryx(fmt.Sprintf(`%s ORDER BY id ASC OFFSET $1 LIMIT 11`, guildInfoSelectQuery), pkt.Page*10) - } else { - rows, err = s.server.db.Queryx(fmt.Sprintf(`%s ORDER BY id DESC 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: + if pkt.Sorting { + sort.Slice(tempGuilds, func(i, j int) bool { + return tempGuilds[i].MemberCount > tempGuilds[j].MemberCount + }) + } else { + sort.Slice(tempGuilds, func(i, j int) bool { + return tempGuilds[i].MemberCount < tempGuilds[j].MemberCount + }) } - } - case mhfpacket.ENUMERATE_GUILD_TYPE_ORDER_RANK: - 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) - } else { - 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 { - for rows.Next() { - guild, _ := buildGuildObjectFromDbResult(rows, err, s) - guilds = append(guilds, guild) + guilds = tempGuilds + case mhfpacket.ENUMERATE_GUILD_TYPE_ORDER_REGISTRATION: + if pkt.Sorting { + sort.Slice(tempGuilds, func(i, j int) bool { + return tempGuilds[i].CreatedAt.Unix() > tempGuilds[j].CreatedAt.Unix() + }) + } else { + sort.Slice(tempGuilds, func(i, j int) bool { + return tempGuilds[i].CreatedAt.Unix() < tempGuilds[j].CreatedAt.Unix() + }) } - } - case mhfpacket.ENUMERATE_GUILD_TYPE_MOTTO: - mainMotto := bf.ReadUint16() - subMotto := bf.ReadUint16() - 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 { - for rows.Next() { - guild, _ := buildGuildObjectFromDbResult(rows, err, s) - guilds = append(guilds, guild) + guilds = tempGuilds + case mhfpacket.ENUMERATE_GUILD_TYPE_ORDER_RANK: + if pkt.Sorting { + sort.Slice(tempGuilds, func(i, j int) bool { + return tempGuilds[i].RankRP > tempGuilds[j].RankRP + }) + } else { + sort.Slice(tempGuilds, func(i, j int) bool { + return tempGuilds[i].RankRP < tempGuilds[j].RankRP + }) } - } - case mhfpacket.ENUMERATE_GUILD_TYPE_RECRUITING: - // 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 LIMIT 11`, guildInfoSelectQuery), pkt.Page*10) - if err == nil { - for rows.Next() { - guild, _ := buildGuildObjectFromDbResult(rows, err, s) - guilds = append(guilds, guild) + guilds = tempGuilds + case mhfpacket.ENUMERATE_GUILD_TYPE_MOTTO: + mainMotto := uint8(bf.ReadUint16()) + subMotto := uint8(bf.ReadUint16()) + for _, guild := range tempGuilds { + if guild.MainMotto == mainMotto && guild.SubMotto == subMotto { + 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 { case mhfpacket.ENUMERATE_ALLIANCE_TYPE_ALLIANCE_NAME: - bf.ReadBytes(8) - searchTerm := stringsupport.SJISToUTF8(bf.ReadNullTerminatedBytes()) for _, alliance := range tempAlliances { - if strings.Contains(alliance.Name, searchTerm) { + if strings.Contains(alliance.Name, pkt.Data2) { alliances = append(alliances, alliance) } } case mhfpacket.ENUMERATE_ALLIANCE_TYPE_LEADER_NAME: - bf.ReadBytes(8) - searchTerm := stringsupport.SJISToUTF8(bf.ReadNullTerminatedBytes()) for _, alliance := range tempAlliances { - if strings.Contains(alliance.ParentGuild.LeaderName, searchTerm) { + if strings.Contains(alliance.ParentGuild.LeaderName, pkt.Data2) { alliances = append(alliances, alliance) } } @@ -1292,8 +1284,8 @@ func handleMsgMhfEnumerateGuild(s *Session, p mhfpacket.MHFPacket) { bf.WriteUint32(guild.ID) bf.WriteUint32(guild.LeaderCharID) bf.WriteUint16(guild.MemberCount) - bf.WriteUint16(0x0000) // Unk - bf.WriteUint16(guild.Rank) // OR guilds in alliance + bf.WriteUint16(0x0000) // Unk + bf.WriteUint16(guild.Rank) bf.WriteUint32(uint32(guild.CreatedAt.Unix())) ps.Uint8(bf, guild.Name, true) ps.Uint8(bf, guild.LeaderName, true)