Goodbye CREST support, we hardly used ya! (close #201)
This commit is contained in:
155
service/port.py
155
service/port.py
@@ -29,10 +29,8 @@ try:
|
|||||||
except ImportError:
|
except ImportError:
|
||||||
from utils.compat import OrderedDict
|
from utils.compat import OrderedDict
|
||||||
|
|
||||||
FIT_WIN_HEADINGS = ["High power", "Medium power", "Low power", "Rig Slot", "Sub System", "Charges"]
|
|
||||||
EFT_SLOT_ORDER = [Slot.LOW, Slot.MED, Slot.HIGH, Slot.RIG, Slot.SUBSYSTEM]
|
EFT_SLOT_ORDER = [Slot.LOW, Slot.MED, Slot.HIGH, Slot.RIG, Slot.SUBSYSTEM]
|
||||||
|
|
||||||
|
|
||||||
class Port(object):
|
class Port(object):
|
||||||
"""Service which houses all import/export format functions"""
|
"""Service which houses all import/export format functions"""
|
||||||
|
|
||||||
@@ -42,27 +40,6 @@ class Port(object):
|
|||||||
firstLine = re.split("[\n\r]+", string.strip(), maxsplit=1)[0]
|
firstLine = re.split("[\n\r]+", string.strip(), maxsplit=1)[0]
|
||||||
firstLine = firstLine.strip()
|
firstLine = firstLine.strip()
|
||||||
|
|
||||||
# If string is from in-game copy of fitting window
|
|
||||||
# We match " power" instead of "High power" in case a fit has no high modules
|
|
||||||
if firstLine in FIT_WIN_HEADINGS and activeFit is not None:
|
|
||||||
return "FIT", (cls.importFittingWindow(string, activeFit),)
|
|
||||||
|
|
||||||
# If we have "<url=fitting", fit is coming from eve chat
|
|
||||||
# Gather data and send to DNA
|
|
||||||
chatDna = re.search("<url=fitting:(.*::)>.*</url>", firstLine)
|
|
||||||
if chatDna:
|
|
||||||
return "DNA", (cls.importDna(chatDna.group(1)),)
|
|
||||||
|
|
||||||
# If we have a CREST kill link
|
|
||||||
killLink = re.search("http://public-crest.eveonline.com/killmails/(.*)/", firstLine)
|
|
||||||
if killLink:
|
|
||||||
return "CREST", (cls.importCrest(tuple(killLink.group(1).split("/"))),)
|
|
||||||
|
|
||||||
# If we have "<url=killReport", fit is killmail from eve chat
|
|
||||||
killReport = re.search("<url=killReport:(.*)>.*</url>", firstLine)
|
|
||||||
if killReport:
|
|
||||||
return "CREST", (cls.importCrest(tuple(killReport.group(1).split(":"))),)
|
|
||||||
|
|
||||||
# If XML-style start of tag encountered, detect as XML
|
# If XML-style start of tag encountered, detect as XML
|
||||||
if re.match("<", firstLine):
|
if re.match("<", firstLine):
|
||||||
return "XML", cls.importXml(string)
|
return "XML", cls.importXml(string)
|
||||||
@@ -81,138 +58,6 @@ class Port(object):
|
|||||||
# Use DNA format for all other cases
|
# Use DNA format for all other cases
|
||||||
return "DNA", (cls.importDna(string),)
|
return "DNA", (cls.importDna(string),)
|
||||||
|
|
||||||
@staticmethod
|
|
||||||
def importFittingWindow(string, activeFit):
|
|
||||||
sMkt = service.Market.getInstance()
|
|
||||||
sFit = service.Fit.getInstance()
|
|
||||||
|
|
||||||
activeFit = sFit.getFit(activeFit)
|
|
||||||
|
|
||||||
# if the current fit has mods, do not mess with it. Instead, make new fit
|
|
||||||
if activeFit.modCount > 0:
|
|
||||||
fit = Fit()
|
|
||||||
fit.ship = Ship(sMkt.getItem(activeFit.ship.item.ID))
|
|
||||||
fit.name = "%s (copy)" % activeFit.name
|
|
||||||
else:
|
|
||||||
fit = activeFit
|
|
||||||
lines = re.split('[\n\r]+', string)
|
|
||||||
|
|
||||||
droneMap = {}
|
|
||||||
cargoMap = {}
|
|
||||||
modules = []
|
|
||||||
|
|
||||||
for i in range(1, len(lines)):
|
|
||||||
line = lines[i].strip()
|
|
||||||
if not line:
|
|
||||||
continue
|
|
||||||
|
|
||||||
try:
|
|
||||||
amount, modName = line.split("x ")
|
|
||||||
amount = int(amount)
|
|
||||||
item = sMkt.getItem(modName, eager="group.category")
|
|
||||||
except:
|
|
||||||
# if no data can be found (old names)
|
|
||||||
continue
|
|
||||||
|
|
||||||
if item.category.name == "Drone":
|
|
||||||
if not modName in droneMap:
|
|
||||||
droneMap[modName] = 0
|
|
||||||
droneMap[modName] += amount
|
|
||||||
elif item.category.name == "Charge":
|
|
||||||
if not modName in cargoMap:
|
|
||||||
cargoMap[modName] = 0
|
|
||||||
cargoMap[modName] += amount
|
|
||||||
else:
|
|
||||||
for _ in xrange(amount):
|
|
||||||
try:
|
|
||||||
m = Module(item)
|
|
||||||
except ValueError:
|
|
||||||
continue
|
|
||||||
# If we are importing T3 ship, we must apply subsystems first, then
|
|
||||||
# calcModAttr() to get the ship slots
|
|
||||||
if m.slot == Slot.SUBSYSTEM and m.fits(fit):
|
|
||||||
fit.modules.append(m)
|
|
||||||
else:
|
|
||||||
modules.append(m)
|
|
||||||
|
|
||||||
fit.clear()
|
|
||||||
fit.calculateModifiedAttributes()
|
|
||||||
|
|
||||||
for m in modules:
|
|
||||||
# we check to see if module fits as a basic sanity check
|
|
||||||
# if it doesn't then the imported fit is most likely invalid
|
|
||||||
# (ie: user tried to import Legion fit to a Rifter)
|
|
||||||
if m.fits(fit):
|
|
||||||
fit.modules.append(m)
|
|
||||||
if m.isValidState(State.ACTIVE):
|
|
||||||
m.state = State.ACTIVE
|
|
||||||
m.owner = fit # not sure why this is required when it's not for other import methods, but whatever
|
|
||||||
else:
|
|
||||||
return
|
|
||||||
|
|
||||||
for droneName in droneMap:
|
|
||||||
d = Drone(sMkt.getItem(droneName))
|
|
||||||
d.amount = droneMap[droneName]
|
|
||||||
fit.drones.append(d)
|
|
||||||
|
|
||||||
for cargoName in cargoMap:
|
|
||||||
c = Cargo(sMkt.getItem(cargoName))
|
|
||||||
c.amount = cargoMap[cargoName]
|
|
||||||
fit.cargo.append(c)
|
|
||||||
|
|
||||||
return fit
|
|
||||||
|
|
||||||
@staticmethod
|
|
||||||
def importCrest(info):
|
|
||||||
sMkt = service.Market.getInstance()
|
|
||||||
network = service.Network.getInstance()
|
|
||||||
try:
|
|
||||||
response = network.request("https://public-crest.eveonline.com/killmails/%s/%s/" % info, network.EVE)
|
|
||||||
except:
|
|
||||||
return
|
|
||||||
|
|
||||||
kill = (json.loads(response.read()))['victim']
|
|
||||||
|
|
||||||
fit = Fit()
|
|
||||||
fit.ship = Ship(sMkt.getItem(kill['shipType']['name']))
|
|
||||||
fit.name = "CREST: %s's %s" % (kill['character']['name'], kill['shipType']['name'])
|
|
||||||
|
|
||||||
# sort based on flag to get proper rack position
|
|
||||||
items = sorted(kill['items'], key=lambda k: k['flag'])
|
|
||||||
|
|
||||||
# We create a relation between module flag and module position on fit at time of append:
|
|
||||||
# this allows us to know which module to apply charges to if need be (see below)
|
|
||||||
flagMap = {}
|
|
||||||
|
|
||||||
# Charges may show up before or after the module. We process modules first,
|
|
||||||
# storing any charges that are fitted in a dict and noting their flag (module).
|
|
||||||
charges = {}
|
|
||||||
|
|
||||||
for mod in items:
|
|
||||||
if mod['flag'] == 5: # throw out cargo
|
|
||||||
continue
|
|
||||||
|
|
||||||
item = sMkt.getItem(mod['itemType']['name'], eager="group.category")
|
|
||||||
|
|
||||||
if item.category.name == "Drone":
|
|
||||||
d = Drone(item)
|
|
||||||
d.amount = mod['quantityDropped'] if 'quantityDropped' in mod else mod['quantityDestroyed']
|
|
||||||
fit.drones.append(d)
|
|
||||||
elif item.category.name == "Charge":
|
|
||||||
charges[mod['flag']] = item
|
|
||||||
else:
|
|
||||||
m = Module(item)
|
|
||||||
if m.isValidState(State.ACTIVE):
|
|
||||||
m.state = State.ACTIVE
|
|
||||||
fit.modules.append(m)
|
|
||||||
flagMap[mod['flag']] = fit.modules.index(m)
|
|
||||||
|
|
||||||
for flag, item in charges.items():
|
|
||||||
# we do not need to verify valid charge as it comes directly from CCP
|
|
||||||
fit.modules[flagMap[flag]].charge = item
|
|
||||||
|
|
||||||
return fit
|
|
||||||
|
|
||||||
@staticmethod
|
@staticmethod
|
||||||
def importDna(string):
|
def importDna(string):
|
||||||
sMkt = service.Market.getInstance()
|
sMkt = service.Market.getInstance()
|
||||||
|
|||||||
Reference in New Issue
Block a user