Пример #1
0
        public void GetRoomList(int wid, string openid, int hotelId)
        {
            AjaxResult ajaxResult;

            try
            {
                GetRoomListResponse responseData = null;
                IAsyncResult        asyncResult  = new BusEntry("WeixinPF.Hotel.Plugins").MyBus.Send("WeixinPF.Hotel.Plugins.Service",
                                                                                                     new GetRoomListRequest()
                {
                    HotelId = hotelId
                })
                                                   .Register(response =>
                {
                    CompletionResult result = response.AsyncState as CompletionResult;
                    if (result != null)
                    {
                        responseData = result.Messages[0] as GetRoomListResponse;
                    }
                }, this);

                WaitHandle asyncWaitHandle = asyncResult.AsyncWaitHandle;
                asyncWaitHandle.WaitOne(WaitSeconds);

                ajaxResult = asyncResult.IsCompleted ?
                             AjaxResult.Succeed(responseData.Rooms) :
                             AjaxResult.Fail("获取房间列表失败。");
            }
            catch
            {
                ajaxResult = AjaxResult.Fail("获取房间列表失败。");
            }

            this.WriteJson(ajaxResult);
        }
Пример #2
0
    public void GenerateRoomList(GetRoomListResponse resp)
    {
        int childCount = resp.roomCount;

        ResetChild(childCount);
        List <SimpleRoomInfo> roomInfoList = resp.roomInfo;
        int index = 0;

        foreach (SimpleRoomInfo info in roomInfoList)
        {
            setRoomData(info, index);
            index++;
        }
    }
Пример #3
0
        public override async Task <GetRoomListResponse> GetRoomList(GetRoomListRequest request, ServerCallContext context)
        {
            var response = new GetRoomListResponse();

            foreach (var room in await _rooms.GetAsync())
            {
                response.Rooms.Add(new Protos.Room
                {
                    Id   = room.Id,
                    Name = room.Name
                });
            }

            return(response);
        }
Пример #4
0
        private void ProcessMessage(IPEndPoint endPoint, byte[] buffer, int offset, int length, MmPeer peer)
        {
            //probably bad kind of using
            var operationCode = MessageBase.GetOperationCode(buffer, offset);

            _logger.Debug($"Message received. Operation code: {operationCode}");

            peer = PeerCollection.Get(endPoint);
            if (peer == null)
            {
                _logger.Warning($"GamePeerListener.OnReceivePacketFromClient error: can not find peer for endpoint {endPoint.Address}:{endPoint.Port}");
                return;
            }


            //listener handles only auth message, others are sent to roomManager
            switch (operationCode)
            {
            case ShamanOperationCode.Connect:
                _messageSender.Send(new ConnectedEvent(), peer);
                break;

            case ShamanOperationCode.Ping:
                //ping processing
                break;

            case ShamanOperationCode.Disconnect:
                OnClientDisconnect(endPoint, new SimpleDisconnectInfo(ShamanDisconnectReason.PeerLeave));
                break;

            case ShamanOperationCode.Authorization:
                var authMessage =
                    Serializer.DeserializeAs <AuthorizationRequest>(buffer, offset, length);

                if (!Config.IsAuthOn)
                {
                    //if success - send auth success
                    peer.IsAuthorizing = false;
                    peer.IsAuthorized  = true;
                    //this sessionID will be got from backend, after we send authToken, which will come in player properties
                    peer.SetSessionId(authMessage.SessionId);
                    _messageSender.Send(new AuthorizationResponse(), peer);
                }
                else
                {
                    //TODO authorizing logic
                    throw new NotImplementedException();
                }
                break;

            default:
                if (!peer.IsAuthorized && Config.IsAuthOn)
                {
                    _messageSender.Send(new AuthorizationResponse()
                    {
                        ResultCode = ResultCode.NotAuthorized
                    }, peer);
                    return;
                }
                else
                {
                    if (!peer.IsAuthorized)
                    {
                        _messageSender.Send(new AuthorizationResponse(), peer);
                    }
                }

                switch (operationCode)
                {
                case ShamanOperationCode.PingRequest:
                    _messageSender.Send(new PingResponse(), peer);
                    break;

                case ShamanOperationCode.CreateRoomFromClient:
                    var createRequest =
                        Serializer.DeserializeAs <CreateRoomFromClientRequest>(buffer, offset, length);
                    TaskScheduler.ScheduleOnceOnNow(async() =>
                    {
                        var createResult = await _matchMakingGroupsManager.CreateRoom(peer.GetSessionId(),
                                                                                      createRequest.MatchMakingProperties);
                        //parse create result and create response
                        var createResponse = new CreateRoomFromClientResponse(GetJoinInfo(createResult));
                        if (createResult.Result == RoomOperationResult.OK)
                        {
                            _logger.Info($"Room {createResult.RoomId} created");
                        }
                        _messageSender.Send(createResponse, peer);
                    });
                    break;

                case ShamanOperationCode.DirectJoin:
                    var joinRequest = Serializer.DeserializeAs <DirectJoinRequest>(buffer, offset, length);
                    TaskScheduler.ScheduleOnceOnNow(async() =>
                    {
                        //join existing room
                        var joinResult = await _roomManager.JoinRoom(joinRequest.RoomId,
                                                                     new Dictionary <Guid, Dictionary <byte, object> >
                        {
                            { peer.GetSessionId(), joinRequest.MatchMakingProperties }
                        }, joinRequest.MatchMakingWeight, joinRequest.MatchMakingWeight);
                        //parse join result and create response
                        var joinResponse = new DirectJoinResponse(GetJoinInfo(joinResult));
                        if (joinResult.Result == RoomOperationResult.OK)
                        {
                            _logger.Info($"Player direct joined room {joinResult.RoomId}");
                        }
                        _messageSender.Send(joinResponse, peer);
                    });
                    break;

                case ShamanOperationCode.GetRoomList:
                    var request = Serializer.DeserializeAs <GetRoomListRequest>(buffer, offset, length);
                    var rooms   = _matchMakingGroupsManager.GetRooms(request.MatchMakingProperties)
                                  .Select(r => new RoomInfo(r.Id, r.TotalWeightNeeded, r.CurrentWeight, r.Properties, r.State))
                                  .ToList();
                    var getRoomsResponse = new GetRoomListResponse();
                    getRoomsResponse.Rooms = rooms;
                    _messageSender.Send(getRoomsResponse, peer);
                    break;

                case ShamanOperationCode.EnterMatchMaking:
                    var enterMessage = Serializer.DeserializeAs <EnterMatchMakingRequest>(buffer, offset, length);
                    if (enterMessage == null)
                    {
                        throw new Exception("Can not deserialize EnterMatchMakingRequest. Result is null");
                    }


                    var properties = enterMessage.MatchMakingProperties;

                    var requiredProperties = _matchMaker.GetRequiredProperties();

                    foreach (var property in requiredProperties)
                    {
                        if (!properties.ContainsKey(property))
                        {
                            _logger.Error($"Player {peer.GetPeerId()} tried to enter matchmaking without property {property}");
                            _messageSender.Send(new EnterMatchMakingResponse(MatchMakingErrorCode.RequiredPlayerPropertyIsNotSet), peer);
                            return;
                        }
                    }

                    //add player
                    _matchMaker.AddPlayer(peer, enterMessage.MatchMakingProperties, enterMessage.MatchMakingWeight);

                    _messageSender.Send(new EnterMatchMakingResponse(), peer);

                    break;

                case ShamanOperationCode.LeaveMatchMaking:
                    //remove player
                    _matchMaker.RemovePlayer(peer.GetPeerId());
                    //send response
                    _messageSender.Send(new LeaveMatchMakingResponse(), peer);
                    break;

                default:
                    _messageSender.Send(new ErrorResponse(ResultCode.UnknownOperation), peer);
                    return;
                }

                break;
            }
        }