package socket import ( "blazing/common/socket/errorcode" "blazing/logic/service/common" "blazing/logic/service/player" "blazing/modules/base/service" "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 } // 1. 创建结果通道 resultChan := make(chan error, 1) // 2. 启动 goroutine 执行踢人操作 go func() { err := player.KickPlayer(uint32(a)) resultChan <- err }() // 3. 用 select 监听结果和超时信号 select { case err := <-resultChan: // 正常完成 return err case <-time.After(kickTimeout): service.NewBaseSysLogService().RecordKick(uint32(a), fmt.Errorf("踢人操作超时(超时时间:%v)", kickTimeout).Error()) // 超时触发,返回自定义或内置超时错误 return fmt.Errorf("踢人操作超时(超时时间:%v)", kickTimeout) } } // 参数不为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 }