Exemplo n.º 1
0
        public override async Task Subscribe(SubscriptionAttempt request, IServerStreamWriter <Event_Arena> responseStream, ServerCallContext context)
        {
            if (!connected_main_server.SetStream(responseStream, context))
            {
                return;
            }

            try
            {
                for (; ;)
                {
                    if (!await connected_main_server.SendCurrentEvents())
                    {
                        break;
                    }
                    await Task.Delay(5);
                }
            }
            catch (InvalidOperationException) { }
            catch (RpcException) {}
            catch (Exception e)
            {
                Log.Exception(e);
            }
        }
Exemplo n.º 2
0
        public override async Task Subscribe(SubscriptionAttempt request, IServerStreamWriter <Event3D> responseStream, ServerCallContext context)
        {
            var player = PlayerAuth.Instance.GetPlayer(context);

            if (player == null || !player.stream_3d.SetStream(responseStream, context))
            {
                return;
            }

            try
            {
                for (; ;)
                {
                    if (!player.online || !await player.stream_3d.SendCurrentEvents())
                    {
                        break;
                    }
                    await Task.Delay(5);
                }
            }
            catch (InvalidOperationException)
            {
                //Happens when cancellation token is set to true
            }
            catch (RpcException)
            {
                //Nothing special
            } catch (Exception e)
            {
                Log.Exception(e);
            }
        }
Exemplo n.º 3
0
        public override async Task Subscribe(SubscriptionAttempt request, IServerStreamWriter <Event> responseStream, ServerCallContext context)
        {
            var login_result_ev = new Event
            {
                LoginResult = new Event_LoginResult()
            };
            var login_result = login_result_ev.LoginResult;

            Player player;
            List <BasicPlayerInfo> incoming_friend_requests;

            try
            {
                if (auth.Count > config.MaxPlayersOnline)
                {
                    login_result.Success = false;
                    await responseStream.WriteAsync(login_result_ev);

                    return;
                }

                var login_result_data = await auth.Login(request.Username, request.Password);

                if (!login_result_data.HasValue)
                {
                    login_result.Success = false;
                    await responseStream.WriteAsync(login_result_ev);

                    return;
                }
                player = login_result_data.Value.player;
                incoming_friend_requests = login_result_data.Value.pending_friend_requests_incoming;
            } catch (InvalidOperationException)
            {
                //Expected to happen when response stream is closed
                return;
            } catch (RpcException)
            {
                //Expected to happen when user logs out or gets disconnected for any other reason
                return;
            } catch (Exception e)
            {
                Log.Exception(e);
                return;
            }

            try
            {
                if (!player.event_stream.SetStream(responseStream, context))
                {
                    return;
                }

                login_result.Success = true;
                login_result.Token   = ByteString.CopyFrom(player.session_id.ToByteArray());
                await in_memory_worker.Schedule(() =>
                {
                    login_result.Friends.AddRange(player.friends);
                    login_result.Ignored.AddRange(player.ignored);
                    login_result.PendingFriendRequestsOutgoing.AddRange(player.pending_friend_requests_outgoing);
                    login_result.PendingFriendRequestsIncoming.AddRange(incoming_friend_requests);
                });

                await responseStream.WriteAsync(login_result_ev);

                for (; ;)
                {
                    if (!player.online || !await player.event_stream.SendCurrentEvents())
                    {
                        return;
                    }
                    await Task.Delay(500);
                }
            } catch (InvalidOperationException)
            {
                //Expected to happen when response stream is closed
                return;
            }
            catch (RpcException)
            {
                //Expected to happen when user logs out or gets disconnected for any other reason

                return;
            }
            catch (Exception e)
            {
                Log.Exception(e);
                await auth.Logout(player.session_id);
            }
        }
Exemplo n.º 4
0
        public override async Task Subscribe(SubscriptionAttempt request, IServerStreamWriter <EventArena> responseStream, ServerCallContext context)
        {
            var player = PlayerAuth.Instance.GetPlayer(context);

            if (player == null)
            {
                return;
            }

            if (player.match_maker.GetState() != Matchmaking.MatchMaker.State.InArena)
            {
                return;
            }

            //Send the involved players
            {
                var arena = player.match_maker.GetArena();
                if (arena == null)
                {
                    return;
                }

                if (!player.stream_arena.SetStream(responseStream, context))
                {
                    return;
                }

                var ev = new EventArena
                {
                    PlayerDecl = new EventArena_PlayerDecl()
                };
                arena.FillPlayerDecl(player, ev.PlayerDecl);
                await responseStream.WriteAsync(ev);
            }

            try
            {
                for (; ;)
                {
                    if (!player.online || !await player.stream_arena.SendCurrentEvents())
                    {
                        break;
                    }
                    await Task.Delay(5);
                }
            }
            catch (InvalidOperationException)
            {
                //Happens when cancellation token is set to true
            }
            catch (RpcException)
            {
                //Expected to happen when player leaves arena
            }
            catch (Exception e)
            {
                Log.Exception(e);
            }
            finally
            {
                remove_player_from_arena(player);
            }
        }