Esempio n. 1
0
File: fit.py Progetto: a-tal/Pyfa
 def newFit(self, shipID, name=None):
     try:
         ship = es_Ship(getItem(shipID))
     except ValueError:
         ship = es_Citadel(getItem(shipID))
     fit = es_Fit(ship)
     fit.name = name if name is not None else "New %s" % fit.ship.item.name
     fit.damagePattern = self.pattern
     fit.targetResists = self.targetResists
     fit.character = self.character
     fit.booster = self.booster
     eds_queries.save(fit)
     self.recalc(fit)
     return fit.ID
Esempio n. 2
0
    def build(self):
        """ Build object. Assumes proper and valid item already set """
        self.__charge = None
        self.__dps = None
        self.__volley = None
        self.__miningyield = None
        self.__itemModifiedAttributes = ModifiedAttributeDict()
        self.__chargeModifiedAttributes = ModifiedAttributeDict()

        if len(self.abilities) != len(self.item.effects):
            self.__abilities = []
            for ability in self.__getAbilities():
                self.__abilities.append(ability)

        if self.__item:
            self.__itemModifiedAttributes.original = self.__item.attributes
            self.__itemModifiedAttributes.overrides = self.__item.overrides
            self.__slot = self.__calculateSlot(self.__item)

            chargeID = self.getModifiedItemAttr("fighterAbilityLaunchBombType")
            if chargeID is not None:
                charge = getItem(int(chargeID))
                self.__charge = charge
                self.__chargeModifiedAttributes.original = charge.attributes
                self.__chargeModifiedAttributes.overrides = charge.overrides
Esempio n. 3
0
File: fit.py Progetto: a-tal/Pyfa
    def appendModule(self, fitID, itemID):
        fit = getFit(fitID)
        item = getItem(itemID, eager=("attributes", "group.category"))
        try:
            m = es_Module(item)
        except ValueError:
            return False

        if m.item.category.name == "Subsystem":
            fit.modules.freeSlot(m.getModifiedItemAttr("subSystemSlot"))

        if m.fits(fit):
            m.owner = fit
            numSlots = len(fit.modules)
            fit.modules.append(m)
            if m.isValidState(State.ACTIVE):
                m.state = State.ACTIVE

            # As some items may affect state-limiting attributes of the ship, calculate new attributes first
            self.recalc(fit)
            # Then, check states of all modules and change where needed. This will recalc if needed
            self.checkStates(fit, m)

            fit.fill()
            eds_queries.commit()

            return numSlots != len(fit.modules)
        else:
            return None
Esempio n. 4
0
File: fit.py Progetto: a-tal/Pyfa
    def changeModule(self, fitID, position, newItemID):
        fit = getFit(fitID)

        # Dummy it out in case the next bit fails
        fit.modules.toDummy(position)

        item = getItem(newItemID, eager=("attributes", "group.category"))
        try:
            m = es_Module(item)
        except ValueError:
            return False

        if m.fits(fit):
            m.owner = fit
            fit.modules.toModule(position, m)
            if m.isValidState(State.ACTIVE):
                m.state = State.ACTIVE

            # As some items may affect state-limiting attributes of the ship, calculate new attributes first
            self.recalc(fit)
            # Then, check states of all modules and change where needed. This will recalc if needed
            self.checkStates(fit, m)

            fit.fill()
            eds_queries.commit()

            return True
        else:
            return None
Esempio n. 5
0
File: fit.py Progetto: a-tal/Pyfa
    def addCargo(self, fitID, itemID, amount=1, replace=False):
        """
        Adds cargo via typeID of item. If replace = True, we replace amount with
        given parameter, otherwise we increment
        """

        if fitID is None:
            return False

        fit = getFit(fitID)
        item = getItem(itemID)
        cargo = None

        # adding from market
        for x in fit.cargo.find(item):
            if x is not None:
                # found item already in cargo, use previous value and remove old
                cargo = x
                fit.cargo.remove(x)
                break

        if cargo is None:
            # if we don't have the item already in cargo, use default values
            cargo = es_Cargo(item)

        fit.cargo.append(cargo)
        if replace:
            cargo.amount = amount
        else:
            cargo.amount += amount

        self.recalc(fit)
        eds_queries.commit()

        return True
Esempio n. 6
0
File: fit.py Progetto: a-tal/Pyfa
    def addDrone(self, fitID, itemID):
        if fitID is None:
            return False

        fit = getFit(fitID)
        item = getItem(itemID, eager=("attributes", "group.category"))
        if item.category.name == "Drone":
            drone = None
            for d in fit.drones.find(item):
                if d is not None and d.amountActive == 0 and d.amount < max(
                        5, fit.extraAttributes["maxActiveDrones"]):
                    drone = d
                    break

            if drone is None:
                drone = es_Drone(item)
                if drone.fits(fit) is True:
                    fit.drones.append(drone)
                else:
                    return False
            drone.amount += 1
            eds_queries.commit()
            self.recalc(fit)
            return True
        else:
            return False
Esempio n. 7
0
    def addImplant(self, charID, itemID):
        char = getCharacter(charID)
        if char.ro:
            logger.error("Trying to add implant to read-only character")
            return

        implant = es_Implant(getItem(itemID))
        char.implants.append(implant)
        eds_queries.commit()
Esempio n. 8
0
File: fit.py Progetto: a-tal/Pyfa
    def setAmmo(self, fitID, ammoID, modules):
        if fitID is None:
            return

        fit = getFit(fitID)
        ammo = getItem(ammoID) if ammoID else None

        for mod in modules:
            if mod.isValidCharge(ammo):
                mod.charge = ammo

        self.recalc(fit)
Esempio n. 9
0
File: cargo.py Progetto: a-tal/Pyfa
    def init(self):
        """Initialize cargo from the database and validate"""
        self.__item = None

        if self.itemID:
            self.__item = getItem(self.itemID)
            if self.__item is None:
                logger.error("Item (id: %d) does not exist", self.itemID)
                return

        self.__itemModifiedAttributes = ModifiedAttributeDict()
        self.__itemModifiedAttributes.original = self.__item.attributes
        self.__itemModifiedAttributes.overrides = self.__item.overrides
Esempio n. 10
0
    def init(self):
        """Initialize a module from the database and validate"""
        self.__item = None
        self.__charge = None

        # we need this early if module is invalid and returns early
        self.__slot = self.dummySlot

        if self.itemID:
            self.__item = getItem(self.itemID)
            if self.__item is None:
                logger.error("Item (id: %d) does not exist", self.itemID)
                return

        if self.isInvalid:
            logger.error("Item (id: %d) is not a Module", self.itemID)
            return

        if self.chargeID:
            self.__charge = getItem(self.chargeID)

        self.build()
Esempio n. 11
0
    def init(self):
        self.__item = None

        if self.itemID:
            self.__item = getItem(self.itemID)
            if self.__item is None:
                logger.error("Item (id: %d) does not exist", self.itemID)
                return

        if self.isInvalid:
            logger.error("Item (id: %d) is not an Implant", self.itemID)
            return

        self.build()
Esempio n. 12
0
File: market.py Progetto: a-tal/Pyfa
    def getItem(self, identity, *args, **kwargs):
        """Get item by its ID or name"""
        try:
            if isinstance(identity, e_Item):
                item = identity
            elif isinstance(identity, int):
                item = getItem(identity, *args, **kwargs)
            elif isinstance(identity, basestring):
                # We normally lookup with string when we are using import/export
                # features. Check against overrides
                identity = conversions.all.get(identity, identity)
                item = getItem(identity, *args, **kwargs)
            elif isinstance(identity, float):
                id = int(identity)
                item = getItem(id, *args, **kwargs)
            else:
                raise TypeError(
                    "Need Item object, integer, float or string as argument")
        except:
            logger.error("Could not get item: %s", identity)
            raise

        return item
Esempio n. 13
0
File: fit.py Progetto: a-tal/Pyfa
    def addBooster(self, fitID, itemID):
        if fitID is None:
            return False

        fit = getFit(fitID)
        item = getItem(itemID, eager="attributes")
        try:
            booster = es_Booster(item)
        except ValueError:
            return False

        fit.boosters.append(booster)
        self.recalc(fit)
        return True
Esempio n. 14
0
File: fit.py Progetto: a-tal/Pyfa
    def addFighter(self, fitID, itemID):
        if fitID is None:
            return False

        fit = getFit(fitID)
        item = getItem(itemID, eager=("attributes", "group.category"))
        if item.category.name == "Fighter":
            fighter = None
            '''
            for d in fit.fighters.find(item):
                if d is not None and d.amountActive == 0 and d.amount < max(5, fit.extraAttributes["maxActiveDrones"]):
                    drone = d
                    break
            '''
            if fighter is None:
                fighter = es_Fighter(item)
                used = fit.getSlotsUsed(fighter.slot)
                total = fit.getNumSlots(fighter.slot)
                standardAttackActive = False
                for ability in fighter.abilities:
                    if (ability.effect.isImplemented
                            and ability.effect.handlerName
                            == u'fighterabilityattackm'):
                        # Activate "standard attack" if available
                        ability.active = True
                        standardAttackActive = True
                    else:
                        # Activate all other abilities (Neut, Web, etc) except propmods if no standard attack is active
                        if (ability.effect.isImplemented
                                and standardAttackActive is False
                                and ability.effect.handlerName !=
                                u'fighterabilitymicrowarpdrive'
                                and ability.effect.handlerName !=
                                u'fighterabilityevasivemaneuvers'):
                            ability.active = True

                if used >= total:
                    fighter.active = False

                if fighter.fits(fit) is True:
                    fit.fighters.append(fighter)
                else:
                    return False

            eds_queries.commit()
            self.recalc(fit)
            return True
        else:
            return False
Esempio n. 15
0
    def displayFit(self, event):
        selection = self.fittingsTreeCtrl.GetSelection()
        fit = json.loads(self.fittingsTreeCtrl.GetPyData(selection))
        list = []

        for item in fit['items']:
            try:
                cargo = Cargo(getItem(item['type']['id']))
                cargo.amount = item['quantity']
                list.append(cargo)
            except:
                pass

        self.parent.fitView.fitSelection = selection
        self.parent.fitView.update(list)
Esempio n. 16
0
 def OnImport(self, event):
     dlg = wx.FileDialog(self,
                         "Import pyfa override file",
                         wildcard="pyfa override file (*.csv)|*.csv",
                         style=wx.FD_OPEN | wx.FD_FILE_MUST_EXIST)
     if (dlg.ShowModal() == wx.ID_OK):
         path = dlg.GetPath()
         with open(path, 'rb') as csvfile:
             spamreader = csv.reader(csvfile)
             for row in spamreader:
                 itemID, attrID, value = row
                 item = getItem(int(itemID))
                 attr = getAttributeInfo(int(attrID))
                 item.setOverride(attr, float(value))
         self.itemView.updateItems(True)
Esempio n. 17
0
File: fit.py Progetto: a-tal/Pyfa
    def addImplant(self, fitID, itemID, recalc=True):
        if fitID is None:
            return False

        fit = getFit(fitID)
        item = getItem(itemID, eager="attributes")
        try:
            implant = es_Implant(item)
        except ValueError:
            return False

        fit.implants.append(implant)
        if recalc:
            self.recalc(fit)
        return True
Esempio n. 18
0
    def init(self):
        self.__attr = None
        self.__item = None

        if self.attrID:
            self.__attr = getAttributeInfo(self.attrID)
            if self.__attr is None:
                logger.error("Attribute (id: %d) does not exist", self.attrID)
                return

        if self.itemID:
            self.__item = getItem(self.itemID)
            if self.__item is None:
                logger.error("Item (id: %d) does not exist", self.itemID)
                return
Esempio n. 19
0
    def init(self):
        """Initialize a drone from the database and validate"""
        self.__item = None

        if self.itemID:
            self.__item = getItem(self.itemID)
            if self.__item is None:
                logger.error("Item (id: %d) does not exist", self.itemID)
                return

        if self.isInvalid:
            logger.error("Item (id: %d) is not a Drone", self.itemID)
            return

        self.build()
Esempio n. 20
0
File: fit.py Progetto: a-tal/Pyfa
    def project(self, fitID, thing):
        if fitID is None:
            return

        fit = getFit(fitID)

        if isinstance(thing, int):
            thing = getItem(thing, eager=("attributes", "group.category"))

        if isinstance(thing, es_Fit):
            if thing in fit.projectedFits:
                return

            fit.__projectedFits[thing.ID] = thing

            # this bit is required -- see GH issue # 83
            sqlAlchemy.saveddata_session.flush()
            sqlAlchemy.saveddata_session.refresh(thing)
        elif thing.category.name == "Drone":
            drone = None
            for d in fit.projectedDrones.find(thing):
                if d is None or d.amountActive == d.amount or d.amount >= 5:
                    drone = d
                    break

            if drone is None:
                drone = es_Drone(thing)
                fit.projectedDrones.append(drone)

            drone.amount += 1
        elif thing.category.name == "Fighter":
            fighter = es_Fighter(thing)
            fit.projectedFighters.append(fighter)
        elif thing.group.name == "Effect Beacon":
            module = es_Module(thing)
            module.state = State.ONLINE
            fit.projectedModules.append(module)
        else:
            module = es_Module(thing)
            module.state = State.ACTIVE
            if not module.canHaveState(module.state, fit):
                module.state = State.OFFLINE
            fit.projectedModules.append(module)

        eds_queries.commit()
        self.recalc(fit)
        return True
Esempio n. 21
0
    def build(self):
        """ Build object. Assumes proper and valid item already set """
        self.__charge = None
        self.__dps = None
        self.__volley = None
        self.__miningyield = None
        self.__itemModifiedAttributes = ModifiedAttributeDict()
        self.__itemModifiedAttributes.original = self.__item.attributes
        self.__itemModifiedAttributes.overrides = self.__item.overrides

        self.__chargeModifiedAttributes = ModifiedAttributeDict()
        chargeID = self.getModifiedItemAttr("entityMissileTypeID")
        if chargeID is not None:
            charge = getItem(int(chargeID))
            self.__charge = charge
            self.__chargeModifiedAttributes.original = charge.attributes
            self.__chargeModifiedAttributes.overrides = charge.overrides
Esempio n. 22
0
File: fit.py Progetto: a-tal/Pyfa
 def isAmmo(self, itemID):
     return getItem(itemID).category.name == "Charge"
Esempio n. 23
0
File: price.py Progetto: a-tal/Pyfa
    def fetchPrices(cls, prices):
        """Fetch all prices passed to this method"""

        # Dictionary for our price objects
        priceMap = {}
        # Check all provided price objects, and add invalid ones to dictionary
        for price in prices:
            if not price.isValid:
                priceMap[price.typeID] = price

        if len(priceMap) == 0:
            return

        # Set of items which are still to be requested from this service
        toRequest = set()

        # Compose list of items we're going to request
        for typeID in priceMap:
            # Get item object
            item = getItem(typeID)
            # We're not going to request items only with market group, as eve-central
            # doesn't provide any data for items not on the market
            if item is not None and item.marketGroupID:
                toRequest.add(typeID)

        # Do not waste our time if all items are not on the market
        if len(toRequest) == 0:
            return

        # This will store POST data for eve-central
        data = []

        # Base request URL
        baseurl = "https://eve-central.com/api/marketstat"
        data.append(("usesystem", 30000142))  # Use Jita for market

        for typeID in toRequest:  # Add all typeID arguments
            data.append(("typeid", typeID))

        # Attempt to send request and process it
        try:
            network = Network.getInstance()
            data = network.request(baseurl, network.PRICES, data)
            xml = minidom.parse(data)
            types = xml.getElementsByTagName("marketstat").item(
                0).getElementsByTagName("type")
            # Cycle through all types we've got from request
            for type_ in types:
                # Get data out of each typeID details tree
                typeID = int(type_.getAttribute("id"))
                sell = type_.getElementsByTagName("sell").item(0)
                # If price data wasn't there, set price to zero
                try:
                    percprice = float(
                        sell.getElementsByTagName("percentile").item(
                            0).firstChild.data)
                except (TypeError, ValueError):
                    percprice = 0

                # Fill price data
                priceobj = priceMap[typeID]
                priceobj.price = percprice
                priceobj.time = time.time() + VALIDITY
                priceobj.failed = None

                # delete price from working dict
                del priceMap[typeID]

        # If getting or processing data returned any errors
        except TimeoutError:
            # Timeout error deserves special treatment
            for typeID in priceMap.keys():
                priceobj = priceMap[typeID]
                priceobj.time = time.time() + TIMEOUT
                priceobj.failed = True
                del priceMap[typeID]
        except:
            # all other errors will pass and continue onward to the REREQUEST delay
            pass

        # if we get to this point, then we've got an error. Set to REREQUEST delay
        for typeID in priceMap.keys():
            priceobj = priceMap[typeID]
            priceobj.time = time.time() + REREQUEST
            priceobj.failed = True
Esempio n. 24
0
 def getSkillDescription(self, itemID):
     return getItem(itemID).description
Esempio n. 25
0
 def addImplant(self, setID, itemID):
     getImplantSet(setID).implants.append(es_Implant(getItem(itemID)))
     eds_queries.commit()