
enterprises.orbital.evekit.model.character.sync.ESICharacterPlanetsSync Maven / Gradle / Ivy
Go to download
Show more of this group Show more artifacts with this name
Show all versions of sync Show documentation
Show all versions of sync Show documentation
Handles periodic synchronization of account data
The newest version!
package enterprises.orbital.evekit.model.character.sync;
import enterprises.orbital.base.OrbitalProperties;
import enterprises.orbital.eve.esi.client.api.PlanetaryInteractionApi;
import enterprises.orbital.eve.esi.client.invoker.ApiException;
import enterprises.orbital.eve.esi.client.invoker.ApiResponse;
import enterprises.orbital.eve.esi.client.model.*;
import enterprises.orbital.evekit.account.SynchronizedEveAccount;
import enterprises.orbital.evekit.model.*;
import enterprises.orbital.evekit.model.character.*;
import org.apache.commons.lang3.tuple.Pair;
import org.apache.commons.lang3.tuple.Triple;
import org.joda.time.DateTime;
import java.io.IOException;
import java.util.*;
import java.util.logging.Logger;
public class ESICharacterPlanetsSync extends AbstractESIAccountSync {
protected static final Logger log = Logger.getLogger(ESICharacterPlanetsSync.class.getName());
class PlanetData {
List planets;
Map planetData = new HashMap<>();
}
public ESICharacterPlanetsSync(SynchronizedEveAccount account) {
super(account);
}
@Override
public ESISyncEndpoint endpoint() {
return ESISyncEndpoint.CHAR_PLANETS;
}
@Override
protected void commit(long time,
CachedData item) throws IOException {
assert (item instanceof PlanetaryColony) ||
(item instanceof PlanetaryRoute) ||
(item instanceof PlanetaryLink) ||
(item instanceof PlanetaryPin);
CachedData existing = null;
if (item.getLifeStart() == 0) {
// Only need to check for existing item if current item is an update
if (item instanceof PlanetaryColony)
existing = PlanetaryColony.get(account, time, ((PlanetaryColony) item).getPlanetID());
else if (item instanceof PlanetaryRoute)
existing = PlanetaryRoute.get(account, time, ((PlanetaryRoute) item).getPlanetID(),
((PlanetaryRoute) item).getRouteID());
else if (item instanceof PlanetaryLink)
existing = PlanetaryLink.get(account, time, ((PlanetaryLink) item).getPlanetID(),
((PlanetaryLink) item).getSourcePinID(),
((PlanetaryLink) item).getDestinationPinID());
else
existing = PlanetaryPin.get(account, time, ((PlanetaryPin) item).getPlanetID(),
((PlanetaryPin) item).getPinID());
}
evolveOrAdd(time, existing, item);
}
@Override
protected ESIAccountServerResult getServerData(
ESIAccountClientProvider cp) throws ApiException, IOException {
PlanetData data = new PlanetData();
PlanetaryInteractionApi apiInstance = cp.getPlanetaryInteractionApi();
ESIThrottle.throttle(endpoint().name(), account);
ApiResponse> planetResult = apiInstance.getCharactersCharacterIdPlanetsWithHttpInfo(
(int) account.getEveCharacterID(),
null,
null,
accessToken(),
null,
null);
checkCommonProblems(planetResult);
data.planets = planetResult.getData();
long expiry = extractExpiry(planetResult, OrbitalProperties.getCurrentTime() + maxDelay());
for (GetCharactersCharacterIdPlanets200Ok next : data.planets) {
ESIThrottle.throttle(endpoint().name(), account);
ApiResponse piResult = apiInstance.getCharactersCharacterIdPlanetsPlanetIdWithHttpInfo(
(int) account.getEveCharacterID(),
next.getPlanetId(),
null,
null,
accessToken(),
null,
null);
checkCommonProblems(piResult);
data.planetData.put(next.getPlanetId(), piResult.getData());
expiry = Math.max(expiry, extractExpiry(piResult, OrbitalProperties.getCurrentTime() + maxDelay()));
}
return new ESIAccountServerResult<>(expiry, data);
}
@SuppressWarnings("RedundantThrows")
@Override
protected void processServerData(long time,
ESIAccountServerResult data,
List updates) throws IOException {
// Save seen planets, routes, pins and links
Set seenPlanets = new HashSet<>(); // planetID
Set> seenRoutes = new HashSet<>(); // planetID, routeID
Set> seenPins = new HashSet<>(); // planetID, pinID
Set> seenLinks = new HashSet<>(); // planetID, srcPinID, destPinID
// Create colonies
for (GetCharactersCharacterIdPlanets200Ok next : data.getData().planets) {
updates.add(new PlanetaryColony(
next.getPlanetId(),
next.getSolarSystemId(),
next.getPlanetType()
.toString(),
next.getOwnerId(),
next.getLastUpdate()
.getMillis(),
next.getUpgradeLevel(),
next.getNumPins()
));
seenPlanets.add(next.getPlanetId());
GetCharactersCharacterIdPlanetsPlanetIdOk pInfo = data.getData().planetData.get(next.getPlanetId());
// Create routes
for (GetCharactersCharacterIdPlanetsPlanetIdRoute route : pInfo.getRoutes()) {
PlanetaryRoute newRoute = new PlanetaryRoute(
next.getPlanetId(),
route.getRouteId(),
route.getSourcePinId(),
route.getDestinationPinId(),
route.getContentTypeId(),
route.getQuantity(),
new ArrayList<>()
);
for (long waypoint : route.getWaypoints())
newRoute.getWaypoints()
.add(waypoint);
updates.add(newRoute);
seenRoutes.add(Pair.of(next.getPlanetId(), route.getRouteId()));
}
// Create pins
for (GetCharactersCharacterIdPlanetsPlanetIdPin pin : pInfo.getPins()) {
GetCharactersCharacterIdPlanetsPlanetIdExtractorDetails extractor = pin.getExtractorDetails();
// GetCharactersCharacterIdPlanetsPlanetIdFactoryDetails factory = pin.getFactoryDetails();
PlanetaryPin newPin = new PlanetaryPin(
next.getPlanetId(),
pin.getPinId(),
pin.getTypeId(),
nullSafeInteger(pin.getSchematicId(), 0),
nullSafeDateTime(pin.getLastCycleStart(), new DateTime(new Date(0L))).getMillis(),
extractor == null ? 0 : nullSafeInteger(extractor.getCycleTime(), 0),
extractor == null ? 0 : nullSafeInteger(extractor.getQtyPerCycle(), 0),
nullSafeDateTime(pin.getInstallTime(), new DateTime(new Date(0L))).getMillis(),
nullSafeDateTime(pin.getExpiryTime(), new DateTime(new Date(0L))).getMillis(),
extractor == null ? 0 : nullSafeInteger(extractor.getProductTypeId(), 0),
pin.getLongitude(),
pin.getLatitude(),
extractor == null ? 0 : nullSafeFloat(extractor.getHeadRadius(), 0),
new HashSet<>(),
new HashSet<>());
for (GetCharactersCharacterIdPlanetsPlanetIdContent content : pin.getContents())
newPin.getContents()
.add(new PlanetaryPinContent(content.getTypeId(), content.getAmount()));
if (extractor != null) {
for (GetCharactersCharacterIdPlanetsPlanetIdHead head : extractor.getHeads())
newPin.getHeads()
.add(new PlanetaryPinHead(head.getHeadId(), head.getLatitude(), head.getLongitude()));
}
updates.add(newPin);
seenPins.add(Pair.of(next.getPlanetId(), pin.getPinId()));
}
// Create links
for (GetCharactersCharacterIdPlanetsPlanetIdLink link : pInfo.getLinks()) {
updates.add(new PlanetaryLink(
next.getPlanetId(),
link.getSourcePinId(),
link.getDestinationPinId(),
link.getLinkLevel()
));
seenLinks.add(Triple.of(next.getPlanetId(), link.getSourcePinId(), link.getDestinationPinId()));
}
}
// Remove non-existent colonies
for (PlanetaryColony existing : retrieveAll(time,
(long contid, AttributeSelector at) -> PlanetaryColony.accessQuery(
account, contid,
1000,
false, at,
ANY_SELECTOR,
ANY_SELECTOR,
ANY_SELECTOR,
ANY_SELECTOR,
ANY_SELECTOR,
ANY_SELECTOR,
ANY_SELECTOR))) {
if (!seenPlanets.contains(existing.getPlanetID())) {
existing.evolve(null, time);
updates.add(existing);
}
}
// Remove non-existent routes
for (PlanetaryRoute existing : retrieveAll(time,
(long contid, AttributeSelector at) -> PlanetaryRoute.accessQuery(
account, contid,
1000,
false, at,
ANY_SELECTOR,
ANY_SELECTOR,
ANY_SELECTOR,
ANY_SELECTOR,
ANY_SELECTOR,
ANY_SELECTOR,
ANY_SELECTOR))) {
if (!seenRoutes.contains(Pair.of(existing.getPlanetID(), existing.getRouteID()))) {
existing.evolve(null, time);
updates.add(existing);
}
}
// Remove non-existent pins
for (PlanetaryPin existing : retrieveAll(time,
(long contid, AttributeSelector at) -> PlanetaryPin.accessQuery(account,
contid,
1000,
false, at,
ANY_SELECTOR,
ANY_SELECTOR,
ANY_SELECTOR,
ANY_SELECTOR,
ANY_SELECTOR,
ANY_SELECTOR,
ANY_SELECTOR,
ANY_SELECTOR,
ANY_SELECTOR,
ANY_SELECTOR,
ANY_SELECTOR,
ANY_SELECTOR,
ANY_SELECTOR,
ANY_SELECTOR,
ANY_SELECTOR,
ANY_SELECTOR,
ANY_SELECTOR,
ANY_SELECTOR))) {
if (!seenPins.contains(Pair.of(existing.getPlanetID(), existing.getPinID()))) {
existing.evolve(null, time);
updates.add(existing);
}
}
// Remove non-existent links
for (PlanetaryLink existing : retrieveAll(time,
(long contid, AttributeSelector at) -> PlanetaryLink.accessQuery(account,
contid,
1000,
false,
at,
ANY_SELECTOR,
ANY_SELECTOR,
ANY_SELECTOR,
ANY_SELECTOR))) {
if (!seenLinks.contains(
Triple.of(existing.getPlanetID(), existing.getSourcePinID(), existing.getDestinationPinID()))) {
existing.evolve(null, time);
updates.add(existing);
}
}
}
}
© 2015 - 2025 Weber Informatics LLC | Privacy Policy