def cmd_kill(self, args, msg, no_url=False, raw=None, host=None): """Returns a summary of a zKillboard killmail""" if not raw: if len(args) == 0: return '!kill <Kill ID/zKillboard URL>' kill_id = args[0] try: kill_id = int(kill_id) except ValueError: m = zkillboard_regex.match(kill_id) if m: kill_id = m.groupdict()['killID'] host = m.groupdict()['host'] else: return 'Invalid kill ID' headers, data = ZKillboard( base_url='https://{}/api/'.format(host)).killID(kill_id).get() kill = data[0] else: kill = raw kill_id = raw['killID'] if no_url: url = '' else: url = ' - https://{}/kill/{}/'.format(host, kill_id) # Ignore kills over an hour old if they're from stomp age = (datetime.utcnow() - datetime.strptime(kill['killTime'], '%Y-%m-%d %H:%M:%S')) if age.total_seconds() > 60 * 60 and raw: return # Drop kills less than 1mil if they've come from stomp if raw and float(kill['zkb']['totalValue']) < 1000000: return if 'zkb' in kill and 'totalValue' in kill['zkb']: value_lost = intword(float(kill['zkb']['totalValue'])) else: value_lost = '???' return '{} ({}) in {}, {}, {} attacker(s), {} ISK lost{}'.format( kill['victim']['characterName'], self.types[unicode(kill['victim']['shipTypeID'])], self.map.node[int(kill['solarSystemID'])]['name'], naturaltime(age), len(kill['attackers']), value_lost, url, )
def cmd_id(self, args, msg): """Provides an overview of a character's activity in-game""" if len(args) == 0: return '!id <character name>' char_name = ' '.join(args) result = self.get_eveapi().eve.CharacterID(names=char_name.strip()) char_name = result.characters[0].name char_id = result.characters[0].characterID if char_id == 0: return 'Unknown character {}'.format(char_name) headers, res = ZKillboard().characterID(char_id).kills().pastSeconds( 60 * 60 * 24 * 7).get() from collections import defaultdict, Counter kill_types = defaultdict(int) ship_types = defaultdict(int) alli_assoc = defaultdict(int) sum_value = 0.0 for kill in res: kill_type_id = int(kill['victim']['shipTypeID']) if kill_type_id > 0: kill_types[self.types[unicode(kill_type_id)]] += 1 sum_value += float(kill['zkb']['totalValue']) for attk in kill['attackers']: if attk['allianceName'].strip( ) != '' and attk['allianceName'] is not None: alli_assoc[attk['allianceName']] += 1 if int(attk['characterID']) == char_id: ship_type_id = int(attk['shipTypeID']) if ship_type_id > 0: ship_types[self.types[unicode(ship_type_id)]] += 1 break if len(res) == 0: return '{} has had no kills in the last week'.format(char_name) kill_types = Counter(kill_types).most_common(5) ship_types = Counter(ship_types).most_common(5) alli_assoc = Counter(alli_assoc).most_common(5) return '{}, {} kill(s) ({} ISK) in the last week\nActive Systems: {}\nTop 5 Killed Types: {}\nTop 5 Ship: {}\nTop 5 Associates: {}'.format( char_name, len(res), intcomma(sum_value), ', '.join( set([ self.map.node[int(x['solarSystemID'])]['name'] for x in res ])), ', '.join(['{} ({})'.format(x, y) for x, y in kill_types]), ', '.join(['{} ({})'.format(x, y) for x, y in ship_types]), ', '.join([x for x, y in alli_assoc]))