Esempio n. 1
0
        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);
            }
        }
Esempio n. 2
0
        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);
            }
        }