예제 #1
0
        public static bool AddRideRequest(UserRideRequest request)
        {
            var matchableRequest = new MatchableRideRequest(request);

            matchableRequest.AddToQuadtree(rideRequestOrigins, rideRequestDestination);
            if (!pendingRequests.TryAdd(request.Id, matchableRequest))
            {
                return(false);
            }

            request.Changed += OnRideRequestChanged;
            request.Canceled.RunWhenFired(OnRideRequestCanceled);

            return(true);
        }
예제 #2
0
        async Task <bool> RiderConfirm(UserRideRequest request)
        {
            if (state != PendingRideState.WaitingOnRiders)
            {
                return(false);
            }

            lock (requests)
            {
                //Not a part of this
                if (!requests.Contains(request))
                {
                    return(false);
                }
            }

            //TODO should return something to indicate the request was already confirmed
            if (confirmedRideRequests.Contains(request))
            {
                return(true);
            }

            confirmedRideRequests.Add(request);

            //These events should no longer be invokable anyway
            request.Canceled.Remove(OnRideRequestCanceled);
            request.Changed -= OnRideRequestCanceled;

            request.UserConfirmed();

            bool doneGettingConfirmations = false;

            lock (requests)
            {
                if (confirmedRideRequests.Count == requests.Count)
                {
                    doneGettingConfirmations = true;
                }
            }

            if (doneGettingConfirmations)
            {
                await DoneGettingConfirmations();
            }

            return(true);
        }
예제 #3
0
        void OnRideRequestCanceled(UserRequest request)
        {
            //if the ride has been confirmed, we don't care about canceled requests
            if (state == PendingRideState.Confirmed)
            {
                return;
            }

            UserRideRequest rr = request as UserRideRequest;

            //If one already confirmed, they cannot cancel through the request
            if (confirmedRideRequests.Contains(rr))
            {
                return;
            }

            rr.Canceled.Remove(OnRideRequestCanceled);
            rr.Changed -= OnRideRequestCanceled;

            originalRideModified = true;

            bool doneGettingConfirmations = false;

            lock (requests)
            {
                requests.Remove(rr);
                userToUserRequest.Remove(rr.User, out UserRequest r);

                if (confirmedRideRequests.Count == requests.Count)
                {
                    doneGettingConfirmations = true;
                }
            }

            if (doneGettingConfirmations)
            {
                DoneGettingConfirmations().FireAndForgetAsync(Program.ErrorHandler);
            }
        }
예제 #4
0
 public MatchableRideRequest(UserRideRequest request)
 {
     Request = request;
 }