mirror of
https://github.com/Mezeporta/Erupe.git
synced 2025-12-13 15:34:38 +01:00
rewrite EnumerateGuild
This commit is contained in:
@@ -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
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -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)
|
||||||
|
|||||||
Reference in New Issue
Block a user