143 lines
3.3 KiB
Go
143 lines
3.3 KiB
Go
package handler
|
|
|
|
import (
|
|
"encoding/json"
|
|
"fmt"
|
|
"samba/pkg/log"
|
|
"samba/proto"
|
|
"samba/stub"
|
|
"samba/util/model"
|
|
"time"
|
|
)
|
|
|
|
var GameServerMgr = newGameServerMgr()
|
|
|
|
type gameServer struct {
|
|
*proto.NtfNewService
|
|
Time time.Time
|
|
IsNew bool // 是不是最新服务
|
|
}
|
|
|
|
type gameServerMgr struct {
|
|
gameServers []*gameServer
|
|
}
|
|
|
|
func newGameServerMgr() *gameServerMgr {
|
|
return &gameServerMgr{gameServers: make([]*gameServer, 0)}
|
|
}
|
|
|
|
func (g *gameServerMgr) Init() {
|
|
gs := model.GetCurrentService()
|
|
if gs != "" {
|
|
err := json.Unmarshal([]byte(gs), &g.gameServers)
|
|
if err != nil {
|
|
log.Error(err.Error())
|
|
}
|
|
}
|
|
}
|
|
|
|
func (g *gameServerMgr) Update(ntf *proto.NtfNewService) {
|
|
for _, s := range g.gameServers {
|
|
if s.Type == ntf.Type && ntf.IsClub == s.IsClub {
|
|
s.IsNew = false
|
|
break
|
|
}
|
|
}
|
|
exist := false
|
|
for _, s := range g.gameServers {
|
|
if s.Type == ntf.Type && s.RouterKey == ntf.RouterKey {
|
|
s.NtfNewService = ntf
|
|
s.IsNew = true
|
|
s.Time = time.Now()
|
|
exist = true
|
|
break
|
|
}
|
|
}
|
|
if !exist {
|
|
g.gameServers = append(g.gameServers, &gameServer{NtfNewService: ntf, Time: time.Now(), IsNew: true})
|
|
}
|
|
if bgs, err := json.Marshal(g.gameServers); err == nil {
|
|
model.SetCurrentService(string(bgs))
|
|
} else {
|
|
log.Error(err.Error())
|
|
}
|
|
}
|
|
|
|
func (g *gameServerMgr) roomTypeToServiceType(roomType int, isClub bool) string {
|
|
rm, _ := stub.Rooms[roomType]
|
|
if rm == nil {
|
|
log.Error(fmt.Sprintf("room type:%v not exist", roomType))
|
|
return ""
|
|
}
|
|
for _, gs := range g.gameServers {
|
|
if !gs.IsNew || gs.IsClub != isClub {
|
|
continue
|
|
}
|
|
for _, tp := range gs.PlayType {
|
|
if rm.PlayType == tp {
|
|
return gs.Type
|
|
}
|
|
}
|
|
}
|
|
log.Error(fmt.Sprintf("room type:%v not exist", roomType))
|
|
return ""
|
|
}
|
|
|
|
func (g *gameServerMgr) FindByRoomType(roomType int, isClub bool) *proto.NtfNewService {
|
|
sType := g.roomTypeToServiceType(roomType, isClub)
|
|
for _, s := range g.gameServers {
|
|
if s.Type == sType && s.IsNew && isClub == s.IsClub {
|
|
return s.NtfNewService
|
|
}
|
|
}
|
|
log.Error(fmt.Sprintf("can not find service type:%v", sType))
|
|
return nil
|
|
}
|
|
|
|
func (g *gameServerMgr) playTypeToServiceType(playType int, isClub bool) string {
|
|
for _, gs := range g.gameServers {
|
|
for _, tp := range gs.PlayType {
|
|
if playType == tp && gs.IsClub == isClub {
|
|
return gs.Type
|
|
}
|
|
}
|
|
}
|
|
log.Error(fmt.Sprintf("play type:%v not exist", playType))
|
|
return ""
|
|
}
|
|
|
|
func (g *gameServerMgr) FindByPlayType(playType int, isClub bool) *proto.NtfNewService {
|
|
sType := g.playTypeToServiceType(playType, isClub)
|
|
for _, s := range g.gameServers {
|
|
if s.Type == sType && s.IsNew && s.IsClub == isClub {
|
|
return s.NtfNewService
|
|
}
|
|
}
|
|
log.Error(fmt.Sprintf("can not find service type:%v", sType))
|
|
return nil
|
|
}
|
|
|
|
func (g *gameServerMgr) FindByType(sType string, isClub bool) *proto.NtfNewService {
|
|
for _, s := range g.gameServers {
|
|
if s.Type == sType && s.IsNew && isClub == s.IsClub {
|
|
return s.NtfNewService
|
|
}
|
|
}
|
|
log.Error(fmt.Sprintf("can not find service type:%v", sType))
|
|
return nil
|
|
}
|
|
|
|
func (g *gameServerMgr) FindByRoomId(roomId int) *proto.NtfNewService {
|
|
for _, s := range g.gameServers {
|
|
if roomId >= s.RoomMinId && roomId < s.RoomMaxId {
|
|
return s.NtfNewService
|
|
}
|
|
}
|
|
log.Error(fmt.Sprintf("can not find service.roomId:%v", roomId))
|
|
return nil
|
|
}
|
|
|
|
func (g *gameServerMgr) AllServer() []*gameServer {
|
|
return g.gameServers
|
|
}
|