package servers // import ( // "errors" // "fmt" // "leafstalk/covenant/msg" // "leafstalk/module" // "leafstalk/network/cluster" // "leafstalk/otherutils/snowflake" // "leafstalk/otherutils/timercache" // "os" // "time" // ) // func test() { // var req string // s := GetWorldServer() // RemoteCall(req, func() { // }, func() { // }, func() { // }, s, c) // } // var ( // NodeNum int64 // ) // type RemoteCallService struct { // Skeleton *module.Skeleton // // Processor *json.Processor // timerCache *timercache.CacheKeys // // getAgent func() *cluster.ServerAgent // node int64 // MsgIdSequence *snowflake.Node // } // // 1、每个模块有一个单独的节点 // // // // 1、router中,解析消息ID,发往对应模块 // func NewRemoteCallAndInit(m *module.Skeleton) (*RemoteCallService, error) { // rcs := new(RemoteCallService) // rcs.timerCache = timercache.NewCacheKeys(time.Second * 10) // NodeNum += 1 // rcs.node = NodeNum // var err error // rcs.MsgIdSequence, err = snowflake.NewSecondNode(rcs.node, 10) // if err != nil { // return nil, err // } // rcs.Skeleton = m // // s.Processor = Processor // // s.getAgent = getAgent // rcs.Skeleton.RegisterChanRPC("RpcTimeout", handleRpcTimeout) // return rcs, nil // } // // 主协程处理超时消息 // func handleRpcTimeout(args []interface{}) { // f, ok := args[0].(func(resp interface{}, err error)) // if !ok { // fmt.Fprintf(os.Stderr, "handleRpcTimeout func type error. %#v", args[0]) // return // } // f(nil, ErrTimeOut) // } // func (rcs *RemoteCallService) SendMsgTo(msg msg.RPCer, fSucess func(resp interface{}, err error), toServerAgent *cluster.ServerAgent, playerId int64, gateId int) error { // if toServerAgent == nil { // return ErrNoConnected // } // //定时缓存 // k := rcs.timerCache.Add(fSucess, func(e *timercache.TimerEntry) { // //另一个协程,发送超时消息给处理协程 // rcs.Skeleton.HandlerServer.Go("RpcTimeout", fSucess) // }) // msg.SetMsgId(k) // //发送 // err := toServerAgent.WriteServerRouteMsg(msg, playerId, gateId) // if err != nil { // rcs.timerCache.Remove(k) // return err // } // return nil // } // type RemoteCallSendParam struct { // toServerAgent *cluster.ServerAgent // playerId int64 // gateId int // } // type SendOpt interface { // configureSendParam(opts *RemoteCallSendParam) error // } // type SendOptFn func(opts *RemoteCallSendParam) error // func (opt SendOptFn) configureSendParam(opts *RemoteCallSendParam) error { // return opt(opts) // } // func ReceiveServer(agent *cluster.ServerAgent) SendOpt { // return SendOptFn(func(opts *RemoteCallSendParam) error { // opts.toServerAgent = agent // return nil // }) // } // func AboutPlayer(playerId int64, gateId int) SendOpt { // return SendOptFn(func(opts *RemoteCallSendParam) error { // opts.playerId = playerId // opts.gateId = gateId // return nil // }) // } // func AboutPlayerAgent(playerAgent *servers.PlayerAgent) SendOpt { // return SendOptFn(func(opts *RemoteCallSendParam) error { // if playerAgent == nil { // return errors.New("playerAgent is nil") // } // opts.playerId = playerAgent.PlayerId // opts.gateId = playerAgent.GateId // return nil // }) // } // // func RemoteCall() // func RemoteCall[T msg.RpcResponse](request msg.RPCer, sucess func(respMsg T), // fail func(errCode int, err error), noexpect func(exceptCode int), // rpcService *RemoteCallService, peerServer *server, opts ...SendOpt) { // processResponse := func(respa interface{}, err error) { // if err != nil { // noexpect(22) //超时 // return // } // resp3, ok := respa.(T) // if !ok { // noexpect(23) //数据类型错误 // return // } // // 添加失败打印错误,并不恢复 // errCode := resp3.GetErrCode() // if errCode != 0 { // fail(errCode, fmt.Errorf("%v", errCode)) // return // } // // 奖品发送给客户端 // sucess(resp3) // } // config := RemoteCallSendParam{} // for _, opt := range opts { // if opt == nil { // continue // } // if err := opt.configureSendParam(&config); err != nil { // fail(25, err) // return // } // } // if transService == nil { // fail(26, fmt.Errorf("%v", 26)) // return // } // //定时缓存 // k := rpcService.timerCache.Add(fSucess, func(e *timercache.TimerEntry) { // //另一个协程,发送超时消息给处理协程 // rpcService.Skeleton.HandlerServer.Go("RpcTimeout", fSucess) // }) // msg.SetMsgId(k) // //发送 // toServerAgent := config.toServerAgent // err := toServerAgent.WriteServerRouteMsg(msg, playerId, gateId) // if err != nil { // s.timerCache.Remove(k) // return err // } // // if toServerAgent == nil { // // toServerAgent = transService.getAgent() // // } // // err := transService.SendMsgTo2(request, processResponse, toServerAgent, config.playerId, config.gateId) // // if err != nil { // // fail(21, err) // // } // }