async public Task <JoinRoomResponse> JoinRoom(JoinRoomS2S request)
        {
            if (_roomMembers.Count >= MaxRoomSize)
            {
                return new JoinRoomResponse {
                           RetCode = JoinRoomRetCode.RoomIsFull
                }
            }
            ;
            else
            {
                if (_roomMembers.Any(x => x.UserName == request.UserName))
                {
                    return new JoinRoomResponse {
                               RetCode = JoinRoomRetCode.NameIsTaken
                    }
                }
                ;

                try
                {
                    var joinNotification = new RoomEvent {
                        Text = "User joined", UserName = request.UserName
                    };

                    _callbackChannel.OnRoomEvent(joinNotification);

                    _roomMembers.Add(new RoomMember {
                        UserName = request.UserName
                    });

                    return(new JoinRoomResponse {
                        RetCode = JoinRoomRetCode.Ok
                    });
                }
                catch (Exception)
                {
                    return(new JoinRoomResponse()
                    {
                        RetCode = JoinRoomRetCode.Retry
                    });
                }
            }
        }
Пример #2
0
        async Task <JoinRoomResponse> OnRoomJoin(JoinRoom msg, IOperationContext context)
        {
            var room = ActorProxy.Create <ISFRoomActor>(new ActorId(msg.RoomName));

            await room.SubscribeAsync(this);

            var joinRoomOnServer = new JoinRoomS2S()
            {
                RoomName = msg.RoomName,
                UserName = msg.UserName
            };
            var reply = await room.JoinRoom(joinRoomOnServer);

            if (reply.RetCode == JoinRoomRetCode.Ok)
            {
                _room     = room;
                _userName = msg.UserName;
            }

            return(reply);
        }
Пример #3
0
        async Task <JoinRoomResponse> OnRoomJoin(JoinRoom msg, IOperationContext context)
        {
            var room = await _rooms.GetActor(new ActorKey(msg.RoomName));

            var callbackRef      = _callbacksNode.ExposeAsCallbackChannel(this);
            var joinRoomOnServer = new JoinRoomS2S()
            {
                CallbackChannelRef = callbackRef,
                RoomName           = msg.RoomName,
                UserName           = msg.UserName
            };
            var reply = await room.SendAsync <JoinRoomResponse>(joinRoomOnServer, context);

            if (reply.RetCode == JoinRoomRetCode.Ok)
            {
                _room     = room;
                _userName = msg.UserName;
            }

            return(reply);
        }
        async public Task <JoinRoomResponse> Process(JoinRoomS2S request, IOperationContext context)
        {
            if (_roomMembers.Count >= MaxRoomSize)
            {
                return new JoinRoomResponse {
                           RetCode = JoinRoomRetCode.RoomIsFull
                }
            }
            ;
            else
            {
                if (_roomMembers.Any(x => x.UserName == request.UserName))
                {
                    return new JoinRoomResponse {
                               RetCode = JoinRoomRetCode.NameIsTaken
                    }
                }
                ;

                _state = await _stateManager.GetOrAddAsync <IReliableDictionary <string, DateTime> >(ActorRef.Key.Id);

                try
                {
                    var callbackChannel = await _node.ConnectToCallbackChannel(request.CallbackChannelRef);

                    callbackChannel.DisconnectedEvent
                    .Subscribe(_ =>
                               Fiber.Process(() =>
                    {
                        _roomMembers.RemoveAll(x => x.UserName == request.UserName);

                        var leaveNotification = new RoomEvent {
                            Text = "User left", UserName = request.UserName
                        };
                        foreach (var roomMember in _roomMembers)
                        {
                            roomMember.CallbackChannel.Send(leaveNotification);
                        }

                        if (_roomMembers.Count == 0)
                        {
                            Dispose();
                        }
                    }));

                    var joinNotification = new RoomEvent {
                        Text = "User joined", UserName = request.UserName
                    };
                    foreach (var roomMember in _roomMembers)
                    {
                        roomMember.CallbackChannel.Send(joinNotification);
                    }

                    _roomMembers.Add(new RoomMember {
                        UserName = request.UserName, CallbackChannel = callbackChannel
                    });

                    return(new JoinRoomResponse {
                        RetCode = JoinRoomRetCode.Ok
                    });
                }
                catch (Exception)
                {
                    return(new JoinRoomResponse()
                    {
                        RetCode = JoinRoomRetCode.Retry
                    });
                }
            }
        }