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
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
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)
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
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)
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)
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
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")))
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
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"
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
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