public override Task <QueueStateMsg> LeaveQueue(LeaveQueueAttempt request, ServerCallContext context) { var player = PlayerAuth.Instance.GetPlayer(context); if (player == null) { return(not_authenticated()); } var result = player.match_maker.Cancel(); switch (result.new_state) { case MatchMaker.State.NotQueued: var ev = new_state(MatchMaker.State.NotQueued); var players = result.match_decl.Left.Concat(result.match_decl.Right); //TODO: Does Concat handle the null possibility? foreach (var match_player in players) { match_player.stream_match_maker.Enqueue(ev); } return(Task.FromResult(ev)); case MatchMaker.State.AwaitingAccept: case MatchMaker.State.AwaitingOtherPlayers: case MatchMaker.State.Queued: case MatchMaker.State.InArena: return(state_task(result.new_state)); default: throw new Exception("Unhandle enum value " + result.new_state); } }
public override async Task <LeaveQueueResult> LeaveQueue(LeaveQueueAttempt request, ServerCallContext context) { var q_result = new LeaveQueueResult(); Player player; try { player = auth.GetPlayer(context); if (player == null) { q_result.NotInQueue = true; return(q_result); } } catch (Exception e) { Log.Exception(e); q_result.NotInQueue = true; return(q_result); } try { return(await in_memory_worker.Schedule(() => { if (player.arena_state != ArenaState.Queued) { q_result.NotInQueue = true; return q_result; } var group = player.group; if (group != null) { if (group.leader != player) { q_result.NotInQueue = false; return q_result; } var ev = new Event { GroupQueueStateChanged = new Event_GroupQueueStateChanged { Queued = false } }; foreach (var group_player in group.players) { if (group_player != player) { group_player.event_stream.Enqueue(ev); } } } else { match_maker.RemovePlayer(player); } q_result.NotInQueue = true; return q_result; })); } catch (Exception e) { Log.Exception(e); return(q_result); } }