public async Task <IActionResult> Fit(IFormCollection request) { int currentFits = await _Db.Fits.Where(c => c.AccountId == User.AccountId() && !c.IsShipScan && c.DeletedAt == null).CountAsync(); // Accounts are only allowed five fits at a time if (currentFits >= 5)// Does not take into account fits added by an FC through the fit scanner { return(BadRequest("You have reached your five ship limit. Please delete a ship before saving a new one")); } FitDna fitUrlObject; try { fitUrlObject = Util.ParseFitDna(request._str("fitUrl")); await ShipType.EnsureInDatabase(fitUrlObject.ship_typeId, _Db); Fit newFit = new Fit { AccountId = User.AccountId(), ShipTypeId = fitUrlObject.ship_typeId, FittingDNA = fitUrlObject.dna, Description = fitUrlObject.description, IsShipScan = false, CreatedAt = DateTime.UtcNow }; // Save new fit await _Db.AddAsync(newFit); await _Db.SaveChangesAsync(); return(Ok()); } catch (Exception ex) { _Logger.LogError("{0} submitted an invalid fit URL {1}: {2}", User.AccountName(), request._str("fitUrl"), ex.Message); return(BadRequest(ex.Message)); } }
private async void DoWork(object state) { _logger.LogInformation("Background Service Started: updating fleets."); List <Fleet> fleets = await _Db.Fleets.Include(ci => ci.BossPilot).Where(c => c.BossPilot != null && c.ClosedAt == null).ToListAsync(); if (fleets.Count == 0) { return; } foreach (Fleet fleet in fleets) { //I'm not sure why, but occasionally a fleet without a boss will bleed through //This happens if boss was null, and then updated by an FC before this system next runs. if (fleet.BossPilotId == null) { continue; } Pilot pilot = await _Db.Pilots.FindAsync(fleet.BossPilotId); try { // Update fleet location based on the Fleet Boss await pilot.UpdateToken(); if (!pilot.ESIValid) { throw new UnauthorizedAccessException("The Fleet Boss's ESI token is no longer valid"); } var System = await EsiWrapper.GetSystem((AuthorizedCharacterData)pilot); fleet.SystemId = System?.SolarSystemId; // Update Wings, Squads await pilot.UpdateToken(); fleet.Wings = await EsiWrapper.GetFleetLayout((AuthorizedCharacterData)pilot, fleet.EveFleetId); // Update the pilots in fleet await pilot.UpdateToken(); long fleetId = (long)fleet.EveFleetId; List <FleetAssignment> current_members = await _Db.FleetAssignments.Where(c => c.FleetId == fleet.Id && c.DeletedAt == null).Include(c => c.WaitingPilot).ToListAsync(); Dictionary <int, FleetAssignment> knownMembers = current_members.ToDictionary(x => x.WaitingPilot.PilotId, x => x); List <ESI.NET.Models.Fleets.Member> esiMembers = await EsiWrapper.GetFleetMembers((AuthorizedCharacterData)pilot, fleetId); if (esiMembers != null) { foreach (var fleetMember in esiMembers) { await ShipType.EnsureInDatabase(fleetMember.ShipTypeId, _Db); // If we know about the fleet member update their info if (knownMembers.ContainsKey(fleetMember.CharacterId)) { knownMembers[fleetMember.CharacterId].ShipTypeId = fleetMember.ShipTypeId; knownMembers[fleetMember.CharacterId].TakesFleetWarp = fleetMember.TakesFleetWarp; knownMembers[fleetMember.CharacterId].UpdatedAt = DateTime.UtcNow; knownMembers[fleetMember.CharacterId].SystemId = fleetMember.SolarSystemId; } else { // Otherwise they're new, let's add them to our fleet assignments var waitlistId = await CheckWaitlistForPilot(fleetMember.CharacterId, fleet); await _Db.FleetAssignments.AddAsync(new FleetAssignment { WaitingPilotId = waitlistId ?? null, FleetId = fleet.Id, IsExitCyno = false, ShipTypeId = fleetMember.ShipTypeId, TakesFleetWarp = fleetMember.TakesFleetWarp, SystemId = fleetMember.SolarSystemId, CreatedAt = DateTime.UtcNow, UpdatedAt = DateTime.UtcNow }); } } // Delete pilots who have not been reported through ESI for more than 1 minutes. current_members = await _Db.FleetAssignments.Where(c => c.FleetId == fleet.Id && c.DeletedAt == null).ToListAsync(); foreach (FleetAssignment member in current_members) { if (member.UpdatedAt.Value.AddMinutes(1) < DateTime.UtcNow) { member.DeletedAt = DateTime.UtcNow; } } await _Db.SaveChangesAsync(); } // NO errors, resetting counter fleet.ErrorCount = null; } catch (Exception ex) { _logger.LogError("Error updating fleet {0} (FC: {1}). {2} ", fleet.Id, fleet.BossPilot.CharacterName, ex.Message); if (ex.Message == FleetErrorType.FleetDead.ToString()) { fleet.ClosedAt = DateTime.UtcNow; _logger.LogInformation("The fleet no longer exists and has been closed"); continue; } // Increase error counter int?errors = fleet.ErrorCount; fleet.ErrorCount = (errors != null) ? errors + 1 : 1; // Too many errors, deleting fleet boss to protect against error throttling if (errors >= 15) { fleet.BossPilotId = null; fleet.ErrorCount = null; } } // Touch Updated At timestamp fleet.UpdatedAt = DateTime.UtcNow; } await _Db.SaveChangesAsync(); _logger.LogInformation("Background Service Completed: fleets updated."); }