コード例 #1
0
def info_alliance(db, itemname):
    apiroot = api.root()
    names = apiroot.eve.CharacterID(names=itemname).characters
    if len(names) == 0 or names[0].characterID == 0:
        return None
    allyid = names[0].characterID
    info = {'type': 'alliance'}
    membercorps = []
    for ally in apiroot.eve.AllianceList().alliances:
        if ally.allianceID == allyid:
            info['name'] = ally.name
            info['allianceticker'] = ally.shortName
            info['size'] = ally.memberCount
            info['allystanding'] = 0
            membercorps = [row.corporationID
                           for row in ally.memberCorporations]
            break
    if 'name' not in info:
        return None
    allykey = db.get_key('Gradient')
    for contact in allykey.corp.ContactList().allianceContactList:
        if allyid == contact.contactID:
            info['allystanding'] = contact.standing
    # corp faction
    result = db.execute("SELECT DISTINCT f.name "
                        "FROM intel_corporation c "
                        "     INNER JOIN intel_faction f "
                        "       ON c.faction_id = f.id "
                        "WHERE c.corporationid IN ({0})"
                        .format(", ".join(["%s"] * len(membercorps))),
                        membercorps)
    if len(result) == 1:
        info['militia'] = result[0][0]
    return info
コード例 #2
0
def info_faction(db, itemname):
    result = db.execute("""
SELECT factionname, factionid
FROM ccp.chrfactions
WHERE LOWER(factionname) = LOWER(%s)
""", (itemname,))
    if len(result) == 0:
        return None
    name, facid = result[0]
    info = {'type': 'faction',
            'name': name}
    result = db.execute("SELECT count(*) "
                        "FROM ccp.mapsolarsystems sys "
                        "     INNER JOIN ccp.mapconstellations const "
                        "       ON sys.constellationid = "
                        "          const.constellationid "
                        "     INNER JOIN ccp.mapregions r "
                        "       ON const.regionid = r.regionid "
                        "WHERE COALESCE(sys.factionid, const.factionid, "
                        "               r.factionid) = %s",
                        (facid,))
    info['numsystems'] = result[0][0]
    apiroot = api.root()
    fws = apiroot.map.FacWarSystems()
    numoccupied = 0
    numoccupiee = 0
    for row in fws.solarSystems:
        if row.owningFactionID == facid:
            if row.occupyingFactionID != 0:
                numoccupiee += 1
        if row.occupyingFactionID == facid:
            numoccupied += 1
    info['numoccupied'] = numoccupied
    info['numoccupiee'] = numoccupiee
    return info
コード例 #3
0
 def run(self):
     self.conn = dbutils.DBConnection()
     self.api = api.root()
     self.emapi = self.conn.get_key("Gradient")
     while True:
         try:
             self.run2()
         except:
             logging.exception("Exception during APICheck.run()")
             time.sleep(5 * 60)
コード例 #4
0
 def get_key(self, name):
     c = self.conn.cursor()
     c.execute("SELECT keyid, vcode, characterid "
               "FROM ccpeve_apikey WHERE name = %s", (name,))
     keyid, vcode, charid = c.fetchone()
     key = api.root().auth(keyID=keyid,
                           vCode=vcode)
     if charid is not None:
         key = key.character(charid)
         key._path = ''
     return key
コード例 #5
0
def patrolcontested(startsystem, maxlength):
    db = DBConnection()
    systems = db.get_interesting_systems_for_hot()
    apiroot = api.root()
    contested = []
    for row in apiroot.map.FacWarSystems().solarSystems:
        if ((row.owningFactionID in (MINMATAR_REPUBLIC, AMARR_EMPIRE) or
             row.occupyingFactionID in (MINMATAR_REPUBLIC, AMARR_EMPIRE)
             ) and
            row.contested == 'True'
            ):
            contested.append((0, row.solarSystemID))
    return patrol_generic(db, startsystem, maxlength, systems, contested)
コード例 #6
0
def patrol(startsystem, maxlength):
    db = DBConnection()
    systems = db.get_interesting_systems_for_hot()
    apiroot = api.root()
    kills = []
    data = apiroot.map.Kills()
    datatime = datetime.datetime.utcfromtimestamp(data.dataTime)
    for row in data.solarSystems:
        if (row.shipKills > 0 and
            row.solarSystemID in systems
            ):
            kills.append((row.shipKills, row.solarSystemID))
    killdict = dict((sysid, nkills) for (nkills, sysid) in kills)
    kills.sort(key=lambda elt: (-elt[0], elt[1]))
    return patrol_generic(db, startsystem, maxlength, systems, kills)
コード例 #7
0
 def get_itemname(self, itemid):
     c = self.conn.cursor()
     c.execute("SELECT itemname FROM ccp.invnames "
               "WHERE itemid = %s", (itemid,))
     if c.rowcount > 0:
         return c.fetchone()[0]
     apiroot = api.root()
     try:
         names = apiroot.eve.CharacterName(ids=itemid)
     except api.eveapi.Error as e:
         if e.code != 130:
             raise
         else:
             return "<itemID {0}>".format(itemid)
     else:
         return names.characters[0].name
コード例 #8
0
ファイル: hot.py プロジェクト: ScotSalmon/electusmatari.com
def hot():
    db = DBConnection()
    systems = db.get_interesting_systems_for_hot()
    apiroot = api.root()
    kills = []
    data = apiroot.map.Kills()
    datatime = datetime.datetime.utcfromtimestamp(data.dataTime)
    for row in data.solarSystems:
        if (row.shipKills > 0 and
            row.solarSystemID in systems
            ):
            kills.append((row.shipKills, systems[row.solarSystemID]))
    kills.sort(key=lambda elt: (-elt[0], elt[1]))
    return (", ".join("{1} ({0})".format(*row) for row in kills[:20])
            +
            " (from {0})".format(datatime.strftime("%Y-%m-%d %H:%M:%S")))
コード例 #9
0
def info_corporation(db, itemname):
    apiroot = api.root()
    names = apiroot.eve.CharacterID(names=itemname).characters
    if len(names) == 0 or names[0].characterID == 0:
        return None
    corpid = names[0].characterID
    try:
        corpinfo = apiroot.corp.CorporationSheet(
            corporationID=corpid)
    except api.eveapi.Error as e:
        if e.code == 522: # Failed getting character information
            raise
        else:
            return None
    info = {'type': 'corp',
            'name': corpinfo.corporationName,
            'ticker': corpinfo.ticker,
            'size': corpinfo.memberCount,
            'hq': corpinfo.stationName,
            'alliance': getattr(corpinfo, 'allianceName', ''),
            'faction': None,
            'corpstanding': 0,
            'allystanding': 0}
    if getattr(corpinfo, 'allianceID', 0) > 0:
        for ally in apiroot.eve.AllianceList().alliances:
            if ally.allianceID == corpinfo.allianceID:
                info['allianceticker'] = ally.shortName
                info['allysize'] = ally.memberCount
                break
    allykey = db.get_key('Gradient')
    for contact in allykey.corp.ContactList().allianceContactList:
        if corpinfo.corporationID == contact.contactID:
            info['corpstanding'] = contact.standing
        elif getattr(corpinfo, 'allianceID', None) == contact.contactID:
            info['allystanding'] = contact.standing
    # corp faction
    result = db.execute("SELECT f.name "
                        "FROM intel_corporation c "
                        "     INNER JOIN intel_faction f "
                        "       ON c.faction_id = f.id "
                        "WHERE c.corporationid = %s",
                        (corpinfo.corporationID,))
    if len(result) > 0:
        info['militia'] = result[0][0]
    return info
コード例 #10
0
    def guess_itemtype(self, itemid):
        """
        Guess the itemtype of the given itemID.

        One of "character", "corporation" or "alliance".
        """
        c = self.conn.cursor()
        c.execute("SELECT characterid FROM intel_pilot "
                  "WHERE characterid = %s", (itemid,))
        if c.rowcount > 0:
            return "character"
        c.execute("SELECT corporationid FROM intel_corporation "
                  "WHERE corporationid = %s", (itemid,))
        if c.rowcount > 0:
            return "corporation"
        c.execute("SELECT allianceid FROM intel_alliance "
                  "WHERE allianceid = %s", (itemid,))
        if c.rowcount > 0:
            return "alliance"
        # Not in DB. We have to do some guesswork from the API.
        apiroot = api.root()
        try:
            apiroot.eve.CharacterInfo(characterID=itemid)
            return "character"
        except api.eveapi.Error as e:
            if e.code not in (105,  # Invalid characterID
                              522): # Failed getting character information
                raise
        try:
            apiroot.corp.CorporationSheet(corporationID=itemid)
            return "corporation"
        except api.eveapi.Error as e:
            if e.code != 523: # Failed getting corporation information
                raise
        # Otherwise, must be alliance ...
        return "alliance"
コード例 #11
0
def info_character(db, itemname):
    apiroot = api.root()
    try:
        names = apiroot.eve.CharacterID(names=itemname).characters
    except:
        return None
    if len(names) == 0 or names[0].characterID == 0:
        return None
    #name = names[0].name
    charid = names[0].characterID
    try:
        charinfo = apiroot.eve.CharacterInfo(characterID=charid)
    except RuntimeError:
        # for some reason requesting CharacterInfo on a non-character
        # started throwing RuntimeError instead of api.eveapi.Error,
        # for now, just treat as one of the known API errors
        return None
    except api.eveapi.Error as e:
        if e.code not in (105,  # Invalid characterID
                          522): # Failed getting character information
            raise
        else:
            return None
    info = {'type': 'pilot',
            'name': charinfo.characterName,
            'race': charinfo.race,
            'bloodline': charinfo.bloodline,
            'corporation': charinfo.corporation,
            'alliance': getattr(charinfo, 'alliance', None),
            'security': charinfo.securityStatus,
            'corpticker': '',
            'allianceticker': '',
            'charstanding': 0,
            'corpstanding': 0,
            'allystanding': 0}
    corpinfo = apiroot.corp.CorporationSheet(
        corporationID=charinfo.corporationID)
    info['corpticker'] = corpinfo.ticker
    if getattr(charinfo, 'alliance', False):
        for ally in apiroot.eve.AllianceList().alliances:
            if ally.allianceID == charinfo.allianceID:
                info['allianceticker'] = ally.shortName
                break
    allykey = db.get_key('Gradient')
    for contact in allykey.corp.ContactList().allianceContactList:
        if charinfo.characterID == contact.contactID:
            info['charstanding'] = contact.standing
        elif charinfo.corporationID == contact.contactID:
            info['corpstanding'] = contact.standing
        elif getattr(charinfo, 'allianceID', None) == contact.contactID:
            info['allystanding'] = contact.standing
    # corp faction
    result = db.execute("SELECT f.name "
                        "FROM intel_corporation c "
                        "     INNER JOIN intel_faction f "
                        "       ON c.faction_id = f.id "
                        "WHERE c.corporationid = %s",
                        (charinfo.corporationID,))
    if len(result) > 0:
        info['militia'] = result[0][0]
    return info
コード例 #12
0
def info_solarsystem(db, itemname):
    result = db.execute("""
SELECT s.solarsystemname,
       s.solarsystemid,
       s.security,
       n.itemname,
       c.constellationname,
       c.constellationid,
       r.regionname,
       r.regionid
FROM ccp.mapsolarsystems s
     INNER JOIN ccp.mapconstellations c
       ON s.constellationid = c.constellationid
     INNER JOIN ccp.mapregions r
       ON c.regionid = r.regionid
     LEFT JOIN ccp.invnames n
       ON n.itemid = COALESCE(s.factionid, c.factionid, r.factionid)
WHERE LOWER(s.solarsystemname) = LOWER(%s)
""", (itemname,))
    if len(result) != 1:
        return None
    (sysname, sysid, security, factionname,
     constname, constid, regionname, regionid) = result[0]
    info = {'type': 'solarsystem',
            'name': sysname,
            'itemid': sysid,
            'security': security,
            'factionname': factionname,
            'constellationname': constname,
            'regionname': regionname}
    result = db.execute("SELECT COUNT(*) FROM ccp.mapsolarsystemjumps "
                        "WHERE fromsolarsystemid = %s", (sysid,))
    info['numgates'] = result[0][0]
    result = db.execute("SELECT COUNT(*) FROM ccp.mapdenormalize d "
                        "INNER JOIN ccp.invtypes t "
                        "  ON t.typeid = d.typeid "
                        "WHERE d.solarsystemid = %s "
                        "  AND t.typename = 'Asteroid Belt'",
                        (sysid,))
    info['numbelts'] = result[0][0]
    result = db.execute("SELECT COUNT(*) FROM ccp.mapdenormalize d "
                        "INNER JOIN ccp.invtypes t "
                        "  ON t.typeid = d.typeid "
                        "WHERE d.solarsystemid = %s "
                        "  AND t.typename = 'Ice Field'",
                        (sysid,))
    info['numicefields'] = result[0][0]
    result = db.execute("SELECT COUNT(*) FROM ccp.stastations "
                        "WHERE solarsystemid = %s",
                        (sysid,))
    info['numstations'] = result[0][0]
    result = db.execute("SELECT COUNT(*) FROM ccp.warcombatzonesystems "
                        "WHERE solarsystemid = %s", (sysid,))
    if result[0][0] == 0:
        info['facwar'] = False
    else:
        info['facwar'] = True
        apiroot = api.root()
        fws = apiroot.map.FacWarSystems()
        for row in fws.solarSystems:
            if row.solarSystemID == sysid:
                if row.occupyingFactionID > 0:
                    result = db.execute("SELECT itemname FROM ccp.invnames "
                                        "WHERE itemid = %s",
                                        (row.occupyingFactionID,))
                    info['occupiedby'] = result[0][0]
                info['contested'] = row.contested == 'True'
                break
        result = db.execute("SELECT cachetimestamp, victorypoints, threshold "
                            "FROM uploader_facwarsystem "
                            "WHERE solarsystemid = %s",
                            (sysid,))
        if len(result) > 0:
            info['vptimestamp'] = result[0][0]
            info['vp'] = result[0][1]
            info['vpthreshold'] = result[0][2]
    result = db.execute("""
SELECT SQRT((a.x - b.x)^2 + (a.y - b.y)^2 + (a.z - b.z)^2)
FROM ccp.mapdenormalize a
     INNER JOIN ccp.mapdenormalize b
       ON a.solarsystemid = b.solarsystemid
WHERE a.solarsystemid = %s
ORDER BY SQRT DESC
LIMIT 1
""", (sysid,))
    info['diameter'] = result[0][0] * METER_TO_AU
    if 11000024 <= regionid <= 11000029:
        info['type'] = 'w-space'
        info['class'] = '?'
        info['anomaly'] = None
        for locid in [sysid, constid, regionid]:
            result = db.execute("SELECT wormholeclassid "
                                "FROM ccp.maplocationwormholeclasses "
                                "WHERE locationid = %s", (locid,))
            if len(result) == 1:
                info['class'] = result[0][0]
                break
        result = db.execute("SELECT t.typename "
                            "FROM ccp.mapdenormalize d "
                            "     INNER JOIN ccp.invtypes t "
                            "       ON d.typeid = t.typeid "
                            "     INNER JOIN ccp.invgroups g "
                            "       ON g.groupid = t.groupid "
                            "WHERE d.solarsystemid = %s "
                            "  AND g.groupname = 'Secondary Sun'",
                            (sysid,))
        if len(result) > 0:
            info['anomaly'] = result[0][0]
    return info