Files
Erupe/Erupe/server/channelserver/handlers_clients.go
2022-05-04 04:38:10 +10:00

71 lines
2.0 KiB
Go

package channelserver
import (
"github.com/Solenataris/Erupe/network/mhfpacket"
"github.com/Andoryuuta/byteframe"
"go.uber.org/zap"
)
func handleMsgSysEnumerateClient(s *Session, p mhfpacket.MHFPacket) {
pkt := p.(*mhfpacket.MsgSysEnumerateClient)
// Read-lock the stages map.
s.server.stagesLock.RLock()
stage, ok := s.server.stages[pkt.StageID]
if !ok {
s.logger.Fatal("Can't enumerate clients for stage that doesn't exist!", zap.String("stageID", pkt.StageID))
}
// Unlock the stages map.
s.server.stagesLock.RUnlock()
// Read-lock the stage and make the response with all of the charID's in the stage.
resp := byteframe.NewByteFrame()
stage.RLock()
// TODO(Andoryuuta): Is only the reservations needed? Do clients send this packet for mezeporta as well?
// Make a map to deduplicate the charIDs between the unreserved clients and the reservations.
deduped := make(map[uint32]interface{})
// Add the charIDs
for session := range stage.clients {
deduped[session.charID] = nil
}
for charid := range stage.reservedClientSlots {
deduped[charid] = nil
}
// Write the deduplicated response
resp.WriteUint16(uint16(len(deduped))) // Client count
for charid := range deduped {
resp.WriteUint32(charid)
}
stage.RUnlock()
doAckBufSucceed(s, pkt.AckHandle, resp.Data())
s.logger.Debug("MsgSysEnumerateClient Done!")
}
func handleMsgMhfListMember(s *Session, p mhfpacket.MHFPacket) {
pkt := p.(*mhfpacket.MsgMhfListMember)
resp := byteframe.NewByteFrame()
resp.WriteUint32(0) // Members count. (Unsure of what kind of members these actually are, guild, party, COG subscribers, etc.)
doAckBufSucceed(s, pkt.AckHandle, resp.Data())
}
func handleMsgMhfOprMember(s *Session, p mhfpacket.MHFPacket) {
pkt := p.(*mhfpacket.MsgMhfListMember)
// TODO: add targetid(uint32) to charid(uint32)'s database under new field
doAckSimpleSucceed(s, pkt.AckHandle, make([]byte, 4))
}
func handleMsgMhfShutClient(s *Session, p mhfpacket.MHFPacket) {}
func handleMsgSysHideClient(s *Session, p mhfpacket.MHFPacket) {}