All checks were successful
ci/woodpecker/push/my-first-workflow Pipeline was successful
refactor(socket): 移除重复保存锁并优化panic错误处理 移除了ServerEvent.go中的sync.Once保存锁,因为可能存在重复保存问题, 同时将panic错误处理从fmt.Println改为使用cool.Logger.Error进行统一日志记录 feat(player): 优化踢人功能并添加超时机制 移除kick.go中的复杂异步超时逻辑
71 lines
1.3 KiB
Go
71 lines
1.3 KiB
Go
package socket
|
|
|
|
import (
|
|
"blazing/common/socket/errorcode"
|
|
"blazing/logic/service/common"
|
|
"blazing/logic/service/player"
|
|
"fmt"
|
|
"time"
|
|
)
|
|
|
|
type Broadcast struct {
|
|
Name string
|
|
}
|
|
|
|
func (s *Server) Broadcast(t string) int {
|
|
|
|
player.Mainplayer.Range(func(key uint32, value *player.Player) bool {
|
|
|
|
value.SendPackCmd(50003, &Broadcast{
|
|
Name: t,
|
|
})
|
|
return true
|
|
})
|
|
|
|
return player.Mainplayer.Count()
|
|
}
|
|
|
|
const kickTimeout = 5 * time.Second
|
|
|
|
func (s *Server) KickPerson(a int) error {
|
|
|
|
if a == 0 {
|
|
return nil
|
|
}
|
|
|
|
return player.KickPlayer(uint32(a))
|
|
}
|
|
|
|
// 参数不为0是强制踢出
|
|
func (s *Server) QuitSelf(a int) error {
|
|
//TODO 这里待退出
|
|
fmt.Println("检测到退出请求")
|
|
|
|
s.quit = true
|
|
if a != 0 {
|
|
player.Mainplayer.Range(func(key uint32, value *player.Player) bool {
|
|
value.Kick(1)
|
|
return false
|
|
})
|
|
} else {
|
|
go func() {
|
|
player.Mainplayer.Range(func(key uint32, value *player.Player) bool {
|
|
head := common.NewTomeeHeader(1001, value.Info.UserID)
|
|
|
|
head.Result = uint32(errorcode.ErrorCodes.ErrXinPlanSleepMode)
|
|
|
|
value.SendPack(head.Pack(nil))
|
|
return false
|
|
})
|
|
|
|
<-time.After(10 * time.Minute)
|
|
player.Mainplayer.Range(func(key uint32, value *player.Player) bool {
|
|
value.Kick(1)
|
|
return false
|
|
})
|
|
}()
|
|
}
|
|
|
|
return nil
|
|
}
|