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); }
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); }
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); } }
public MatchableRideRequest(UserRideRequest request) { Request = request; }