def update_corporation(corp_id): corp = Corporation.objects.get(id=corp_id) api = ESI() corp_details = api.get("/v4/corporations/%s/" % corp.id) if corp_details is not None: alliance_id = corp_details.get('alliance_id', None) # Structures director = corp.characters.filter( roles__name="Director", token__isnull=False, token__extra_data__contains="esi-corporations.read_structures.v1" ).first() if director != None: api = ESI(director.token) structures = api.get("/v2/corporations/%s/structures/" % corp.id) corp.structures.exclude( id__in=map(lambda x: x['structure_id'], structures)).delete() if len(structures) > 0: with transaction.atomic(): for structure in structures: db_structure = Structure.objects.filter( id=structure['structure_id']).first() if db_structure == None: db_structure = Structure(id=structure['structure_id']) previous_state = db_structure.state db_structure.corporation = corp db_structure.type_id = structure['type_id'] db_structure.station = Station.get_or_create( structure['structure_id'], api) db_structure.system_id = structure['system_id'] db_structure.profile_id = structure['profile_id'] db_structure.state = structure['state'] db_structure.reinforce_weekday = structure[ 'reinforce_weekday'] db_structure.reinforce_hour = structure['reinforce_hour'] if "fuel_expires" in structure: db_structure.fuel_expires = parse_api_date( structure['fuel_expires']) else: db_structure.fuel_expires = None if "state_timer_start" in structure: db_structure.state_timer_start = parse_api_date( structure['state_timer_start']) else: db_structure.state_timer_start = None if "state_timer_end" in structure: db_structure.state_timer_end = parse_api_date( structure['state_timer_end']) else: db_structure.state_timer_end = None db_structure.save() db_structure.services.all().delete() if "services" in structure: for service in structure['services']: Service(structure=db_structure, name=service['name'], state={ 'online': True, 'offline': False }[service['state']]).save() # Create timer if this is newly reinforced if previous_state != structure['state']: if "reinforce" in structure['state'] or structure[ 'state'] == "anchoring": timer = Timer( structure_id=structure['type_id'], name=db_structure.station.name.replace( "%s - " % db_structure.system.name, ""), owner=corp.ticker, side=0, system_id=structure['system_id'], date=db_structure.state_timer_end, stage={ "armor_reinforce": "AR", "hull_reinforce": "ST", "anchoring": "AN", "unanchoring": "UN" }[structure['state']], visible_to_level=2, created_by=User.objects.first(), generated=True) timer.save() # Structure reinforce webhook if db_structure.state in [ "armor_reinforce", "hull_reinforce" ]: Webhook.send( "structure_reinforce", embeds.structure_state( timer, db_structure)) # Structure anchoring webhook if db_structure.state in [ "anchoring", "unanchoring" ]: Webhook.send( "structure_anchoring", embeds.structure_state( timer, db_structure)) # Ping about fuel if necessary if db_structure.fuel_expires != None: time_left = db_structure.fuel_expires - timezone.now() if time_left <= timedelta(hours=72): hours_left = int(time_left.total_seconds() / 60 / 60) if hours_left % 12 == 0: if db_structure.fuel_notifications: Webhook.send("low_fuel_filtered", embeds.low_fuel(db_structure)) Webhook.send("low_fuel_all", embeds.low_fuel(db_structure)) print "Updated structures for %s" % corp.name # Member Tracking director = corp.characters.filter( roles__name="Director", token__isnull=False, token__extra_data__contains= "esi-corporations.read_corporation_membership.v1").first() if director != None: api = ESI(director.token) # Work on differences character_ids = api.get("/v3/corporations/%s/members/" % corp.id) if character_ids is not None: # Create diffs new_character_ids = set(character_ids) db_character_ids = set( Character.objects.filter(corp=corp).values_list('id', flat=True)) joined_chars = new_character_ids - db_character_ids joined_chars = Character.objects.filter(id__in=joined_chars).all() left_chars = db_character_ids - new_character_ids left_chars = Character.objects.filter(id__in=left_chars).all() # Generate webhook events for joined_char in joined_chars: if joined_char.token is not None: if joined_char.id in settings.members[ 'alliances'] or corp.id in settings.members[ 'corps'] or alliance_id in settings.members[ 'chars']: Webhook.send("character_joined", character_joined(joined_char, corp)) for left_char in left_chars: if left_chars.id in settings.members[ 'alliances'] or corp.id in settings.members[ 'corps'] or alliance_id in settings.members[ 'chars']: Webhook.send("character_left", character_left(left_char, corp)) # Null the corp on chars that have left left_chars.update(corp=None, alliance=None) members = api.get("/v1/corporations/%s/membertracking/" % corp.id) if members is not None: with transaction.atomic(): for member in members: char = Character.get_or_create(member['character_id']) char.corp = corp char.last_login = parse_api_date(member['logon_date']) char.last_logoff = parse_api_date(member['logoff_date']) char.ship_id = member['ship_type_id'] char.save() print "Updated %s members for %s" % (len(members), corp.name)
def update_groups(user_id): user = User.objects.get(id=user_id) print "Updating groups for %s" % user.username social = user.social_auth.filter(provider="eveonline").first() # Queue character updates for char in user.characters.all(): update_character.delay(char.id) # Update char/corp/alliance api = ESI() char_id = social.extra_data['id'] char = api.get("/v4/characters/%s/" % char_id) user.profile.character = Character.get_or_create(char_id) user.profile.corporation = Corporation.get_or_create( char['corporation_id']) if "alliance_id" in char: user.profile.alliance = Alliance.get_or_create(char['alliance_id']) else: user.profile.alliance = None # Update groups for group in user.groups.filter(name__startswith="Corp: ").all(): user.groups.remove(group) for group in user.groups.filter(name__startswith="Alliance: ").all(): user.groups.remove(group) if user.profile.corporation != None: user.groups.add(user.profile.corporation.group) if user.profile.alliance != None: user.groups.add(user.profile.alliance.group) # Update access level char_id = user.profile.character_id corp_id = user.profile.corporation_id alliance_id = user.profile.alliance_id if corp_id in members['corps'] or alliance_id in members[ 'alliances'] or char_id in members['chars']: user.profile.level = 2 elif corp_id in blues['corps'] or alliance_id in blues[ 'alliances'] or char_id in members['chars']: user.profile.level = 1 else: user.profile.level = 0 user.profile.save() # Check groups are still valid with access level for group in user.groups.filter( details__access_level__gt=user.profile.level): user.groups.remove(group) # Update IPB User if ipb.is_active(): if user.profile.forum_id: forum_api = ipb.IPBUser(user) forum_api.update_access_level() update_discord.delay(user.id)