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); } }
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); } }
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); } }
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); } }