NovaBryan/EVE_Dump
Log | Files | 📦 下载最新源码 (.zip) | Refs | README

mock_campaigns.py (36894B)


      1 #Embedded file name: C:\BuildAgent\work\20d73f1b24eed06e\eve\release\V24.01\packages\campaigns\client\v1\mock_data\mock_campaigns.py
      2 import datetime
      3 from campaigns.client.v1.data_model.campaign import CampaignID
      4 from eveProto import split_precision
      5 from eveProto.generated.eve_public.campaign.api.requests_pb2 import GetResponse, GetAllUnredeemedRewardsResponse, GetParticipantStatsResponse
      6 from eveProto.generated.eve_public.campaign.contributionmethod.configuration_pb2 import Configuration, ParameterConfiguration, MatcherParameterConfiguration
      7 from eveProto.generated.eve_public.campaign.contributionmethod.definition.definition_pb2 import Identifier as ContributionMethodIdentifier
      8 from eveProto.generated.eve_public.campaign.campaign_pb2 import Attributes as CampaignAttributes, Issuer as CampaignIssuer, Version, STATE_ACTIVE as CAMPAIGN_STATE_ACTIVE, Stats as CampaignStats
      9 from eveProto.generated.eve_public.campaign.objective.objective_pb2 import Identifier as ObjectiveIdentifier, Attributes as ObjectiveAttributes, Issuer as ObjectiveIssuer, STATE_ACTIVE as OBJECTIVE_STATE_ACTIVE, Rewards, Stats as ObjectiveStats, ParticipantStats, PARTICIPANT_STATE_COMMITTED
     10 from eveProto.generated.eve_public.career.career_pb2 import CAREER_INDUSTRIALIST
     11 from eveProto.generated.eve_public.character.character_pb2 import Identifier as CharacterIdentifier
     12 from eveProto.generated.eve_public.corporation.corporation_pb2 import Identifier as CorporationIdentifier
     13 from eveProto.generated.eve_public.isk.isk_pb2 import Currency as IskCurrency
     14 from eveProto.generated.eve_public.isk.wallet.wallet_pb2 import Owner
     15 from eveProto.generated.eve_public.localization.message_pb2 import Identifier as LocalizationIdentifier
     16 from eveProto.generated.eve_public.loyaltypoints.loyaltypoints_pb2 import Currency as LpCurrency
     17 from eveProto.generated.eve_public.semanticversion_pb2 import Specification
     18 from eveProto.generated.eve_public.standing.standing_pb2 import GainPercent, Source
     19 from eveProto.generated.eve_public.ui.annotation_pb2 import Annotation
     20 from eveProto.generated.eve_public.ui.contenttag_pb2 import Identifier as ContentTagIdentifier
     21 from eveProto.generated.eve_public.ui.icon_pb2 import Identifier as IconIdentifier
     22 from eveProto.generated.eve_public.ui.image_pb2 import Identifier as ImageIdentifier, Attributes as ImageAttributes
     23 from google.protobuf.timestamp_pb2 import Timestamp
     24 from uuid import UUID
     25 CAMPAIGN_ID2 = CampaignID(UUID('12bf6798-f8d5-4933-ad43-89df6b63d2c6'))
     26 CAMPAIGN_ID3 = CampaignID(UUID('b03d11ba-3b0c-4ff3-9c77-0e3a580575eb'))
     27 CAMPAIGN_ID4 = CampaignID(UUID('ae320f8e-2f37-47df-8a35-a0c313cd3f35'))
     28 CAMPAIGN_ID5 = CampaignID(UUID('ae320f8e-2f37-47df-8a35-a0c313cd3f36'))
     29 OBJECTIVE_1_CAMP_2 = UUID('a143655c-d6d3-49e1-a0aa-1faaa1a77f87')
     30 OBJECTIVE_1_CAMP_3 = UUID('a143655c-d6d3-49e1-a0aa-1faaa1a77f88')
     31 OBJECTIVE_1_CAMP_4 = UUID('a143655c-d6d3-49e1-a0aa-1faaa1a77f89')
     32 OBJECTIVE_1_CAMP_5 = UUID('a143655c-d6d3-49e1-a0aa-1faaa1a77f90')
     33 CORP_CALDARI_PROVISIONS = 1000009
     34 CORP_24TH_IMPERIAL = 1000179
     35 CORP_BRUTOR_TRIBE = 1000049
     36 CORP_ALGINTAL_CORE = 1000215
     37 CORP_CBD = 1000002
     38 ids_to_strings = {100: 'Amarr Campaign',
     39  101: u"++Capsuleers, Jita's newfound independence has fractured certainty across the cluster. Where others see disorder, the Empire sees opportunity.<br><br>You will support the Basilica of Commerce. You will complete the assigned operational objectives before this campaign closes, and you will do so with urgency. The Empire is initiating a monumental enhancement to the Amarr trade hub - an enduring statement of Imperial primacy and stability. ",
     40  102: u"Capsuleers, Jita's newfound independence has fractured certainty across the cluster. Where others see disorder, the Empire sees opportunity.<br><br>You will support the Basilica of Commerce. You will complete the assigned operational objectives before this campaign closes, and you will do so with urgency. The Empire is initiating a monumental enhancement to the Amarr trade hub - an enduring statement of Imperial primacy and stability. ",
     41  103: u'In every victory, the light of Amarr shines eternal. It is done.<br>By righteous fire and steadfast faith, the divine order stands unbroken.<br>Your deeds are recorded in glory before God and Empire.',
     42  104: u'The faithful have faltered.<br>The enemies of Amarr yet draw breath, and the light dims in their shadow.<br>Repent, regroup, and return in greater devotion.',
     43  105: 'One Fine Amarr Objective',
     44  106: 'Mine for me peon. - Amarr',
     45  110: '<b>To:</b> Capsuleers operating under Imperial charter',
     46  111: 'Faction Briefing',
     47  112: 'If you deliver success, the Basilica works will complete at the start of the next season, and commerce conducted within the Amarr hub will be rewarded with reduced transactional burdens for a full following season.',
     48  113: 'Understand this clearly: we are not offering comfort. We are purchasing results. If you fail to meet the campaign threshold, the Basilica project will stall in public view - unfinished scaffolding and a record of wasted effort will remain for all to see. Worse: disorder will spread. Raiders will test Imperial space. Pirates will grow bolder.',
     49  114: 'Complete the objectives. Secure the lanes. Prove that commerce belongs under order - not chaos.',
     50  200: 'Minmatar Campaign',
     51  201: u"Capsuleers, Arzad is not a footnote. It is proof. Starkmanir history was buried by force, renamed by decree, and left to rot under someone else's story. We are ending that.<br><br>You will complete the campaign objectives until the Republic's success threshold is achieved, before this campaign closes. Not for symbolism - for outcome.",
     52  202: u"Capsuleers, Arzad is not a footnote. It is proof. Starkmanir history was buried by force, renamed by decree, and left to rot under someone else's story. We are ending that.<br><br>You will complete the campaign objectives until the Republic's success threshold is achieved, before this campaign closes. Not for symbolism - for outcome.",
     53  203: u'Through coordinated strikes, relentless pressure, and unwavering support across New Eden, the Minmatar Campaign has achieved its goal. The chains of the past have been challenged not by words, but by action and the Republic stands stronger for it. ',
     54  204: u'Capsuleers of the Minmatar Republic, the campaign has come to an end  but its goal remains unfulfilled.<br>Despite the courage and sacrifices made across the warzone, the Republic was unable to secure the resources and strategic leverage required to complete the Skarkon Liberation Array. Without these critical means, construction has been halted, and the projects future is now uncertain.',
     55  205: 'One Fine Minmatar Objective',
     56  206: 'Mine for me peon. - Minmatar',
     57  210: "<b>To:</b> Capsuleers answering the Republic's call",
     58  211: 'Faction Briefing',
     59  212: 'If you succeed, Arzad II will be renamed Starkman Prime at the start of next season and Arzad and Ezzara systems will return under Republic sovereignty. A Republic station will be established in Arzad, because presence is not a speech, it is infrastructure.<br><br>And in the season that follows, we will commit resources to rebuild what was denied: planetary industry output will surge in selected systems, and convoys will begin moving through Great Wildlands. Additional reconstruction measures may be authorized to accelerate recovery and reward those who supplied it.',
     60  213: 'If you fail, the Empire will answer in the language it prefers: monuments that erase truth and reprisals that punish defiance. The name will not return, and the counter-narrative will harden into a permanent scar.',
     61  214: 'Bring the name back. Or watch it be buried again.',
     62  300: u'Gallente Campaign',
     63  301: u'Capsuleers, this is not a theoretical debate. Rogue drones are spreading, and every month we hesitate becomes another month the Federation looks weak, divided, and technologically irrelevant.<br><br>Your task is simple: contain the proliferation and recover what can be salvaged. Complete the campaign objectives until the success threshold is met, before this campaign ends. The Federation will not accept a partial effort disguised as principle.',
     64  302: u'Capsuleers, this is not a theoretical debate. Rogue drones are spreading, and every month we hesitate becomes another month the Federation looks weak, divided, and technologically irrelevant.<br><br>Your task is simple: contain the proliferation and recover what can be salvaged. Complete the campaign objectives until the success threshold is met, before this campaign ends. The Federation will not accept a partial effort disguised as principle.',
     65  303: u'Freedom prevails.<br>Through your courage, oppression has been pushed back and the Federation stands stronger.<br>The voices of the people endure. ',
     66  304: u'Liberty has suffered a setback.<br>Tyranny advances where vigilance failed.<br>The Federation will not forget - nor surrender.',
     67  305: 'One Fine Gallente Objective',
     68  306: 'Mine for me peon. - Gallente',
     69  310: '<b>To:</b> Capsuleers operating under Federal authorization',
     70  311: 'Faction Briefing',
     71  312: 'If you succeed, the Federation will permanently remove a portion of our systems from Factional Warfare exposure - our sovereignty remains intact, but the burden of constant defense will be reduced. The immediate season that follows will also see expanded drone swarm activity cluster-wide, alongside sanctioned prototype field trials for drone-adjacent technologies.',
     72  313: 'If you fail, infestation zones will become a permanent scar. Breaches will intensify next season, including in areas that should never have been threatened - and industry will be forced to adapt under pressure rather than policy.',
     73  314: 'Contain the drones. Strip them for knowledge. Then let the rest burn.',
     74  400: u'Caldari Campaign',
     75  401: u"Capsuleers, the State requires a direct corridor into Syndicate. Current routes cede too much leverage to hostile borders and unreliable intermediaries. That ends now.<br><br>Your instructions are simple: complete the campaign's operational objectives until the State's success threshold is reached. Do it before the campaign closes. The outcome will not be symbolic.",
     76  402: u"Capsuleers, the State requires a direct corridor into Syndicate. Current routes cede too much leverage to hostile borders and unreliable intermediaries. That ends now.<br><br>Your instructions are simple: complete the campaign's operational objectives until the State's success threshold is reached. Do it before the campaign closes. The outcome will not be symbolic.",
     77  403: u'Objective achieved.<br>State assets secured and opposition neutralized.<br>Your performance meets corporate expectations. ',
     78  404: u'Objectives incomplete.<br>State interests remain exposed to risk.<br>Correct deficiencies. Return with results.',
     79  405: 'One Fine Caldari Objective',
     80  406: 'Mine for me peon. - Caldari',
     81  410: '<b>To:</b> Capsuleers contracted for State operational objectives',
     82  411: 'Faction Briefing',
     83  412: 'If you succeed, a new stargate corridor will be activated at the start of next season, connecting our warzone space directly to Syndicate by building gates in [system A] and [system B]. The region will be refit for activity and rapid movement as soon the next season starts. In addition, the corporations presently flying under the Intaki Syndicate banner will be dissolved into a new alignment: under State authority.',
     84  413: 'If you fail, the corridor will remain a half-built monument to wasted effort - visible, inert, and contested. And the same Syndicate corporations will be claimed instead by the Federation. Expect the region to destabilize: hostile operations will proliferate, and Serpentis opportunists will exploit the vacuum.',
     85  414: 'This is a corridor. Build it - or watch someone else own it.'}
     86 
     87 def _get_campaign2():
     88     response = GetResponse()
     89     start_time = Timestamp()
     90     start_time.FromDatetime(datetime.datetime(2026, 2, 3, 0, 0, 0))
     91     expiry_time = Timestamp()
     92     expiry_time.FromDatetime(datetime.datetime(2026, 8, 24, 0, 0, 0))
     93     attributes = CampaignAttributes(title=LocalizationIdentifier(sequential=100), subtitle=LocalizationIdentifier(sequential=101), goal_description=LocalizationIdentifier(sequential=102), success_description=LocalizationIdentifier(sequential=103), failure_description=LocalizationIdentifier(sequential=104), icon=IconIdentifier(name='eveicon.amarr_logo'), logo=CampaignAttributes.Image(image=ImageIdentifier(path=''), attributes=ImageAttributes(display_width=200, display_height=100)), dashboard_background=ImageIdentifier(path='res:/UI/Texture/classes/Campaigns/Overview/2026_q2_background_amarr.png'), ao_feature_page=ImageIdentifier(path=''), objective_background=ImageIdentifier(path='res:/UI/Texture/classes/Opportunities/campaigns/amarr_banner.png'), issuer=CampaignIssuer(corporation=CorporationIdentifier(sequential=CORP_24TH_IMPERIAL)), presenting_character=CharacterIdentifier(sequential=3003881), annotations=[Annotation(key='race', value='amarr'),
     94      Annotation(key='theme_pack', value='amarr_campaign'),
     95      Annotation(key='campaign_set', value='mil_camp_season1'),
     96      Annotation(key='overview_button_texture_path', value='res:/UI/Texture/classes/Campaigns/Overview/cards/season1_amarr.png'),
     97      Annotation(key='ui_idx', value='1'),
     98      Annotation(key='dashboard_ambient_background', value='res:/UI/Texture/classes/Campaigns/Overview/2026_q2_ambient_amarr.png'),
     99      Annotation(key='dashboard_middleground', value='res:/UI/Texture/classes/Campaigns/Overview/2026_q2_middleground_amarr.png'),
    100      Annotation(key='dashboard_foreground', value='res:/UI/Texture/classes/Campaigns/Overview/2026_q2_foreground_amarr.png'),
    101      Annotation(key='briefing_background', value='res:/UI/Texture/classes/Campaigns/Overview/2026_q2_ambient_amarr.png'),
    102      Annotation(key='briefing_middleground', value='res:/UI/Texture/classes/Campaigns/Overview/2026_q2_middleground_amarr.png'),
    103      Annotation(key='briefing_foreground', value='res:/UI/Texture/classes/Campaigns/Overview/2026_q2_foreground_amarr.png'),
    104      Annotation(key='goal_description_header', value='111'),
    105      Annotation(key='goal_description_subheader', value='110'),
    106      Annotation(key='goal_description_success', value='112'),
    107      Annotation(key='goal_description_failure', value='113'),
    108      Annotation(key='goal_description_final_words', value='114')], total_objectives=30, scheduled_start_time=start_time, scheduled_expiry_time=expiry_time, version=Version(definition_version=Specification(major=1, minor=2, patch=3), etag=1234), not_finished=True, state=CAMPAIGN_STATE_ACTIVE, target_progress=25, contribution_method_configuration=Configuration(contribution_method=ContributionMethodIdentifier(name='complete_objectives')))
    109     start_date_one = Timestamp()
    110     start_date_one.FromDatetime(datetime.datetime(2026, 2, 10, 1, 2, 3))
    111     start_date_two = Timestamp()
    112     start_date_two.FromDatetime(datetime.datetime(2026, 2, 10, 14, 2, 4))
    113     restricted_objectives = [GetResponse.RestrictedObjective(scheduled_start_time=start_date_one, career=CAREER_INDUSTRIALIST), GetResponse.RestrictedObjective(scheduled_start_time=start_date_two)]
    114     start_date_one = Timestamp()
    115     start_date_one.FromDatetime(datetime.datetime(2026, 2, 3, 0, 0, 0))
    116     units, nanos = split_precision(0.001)
    117     available_objectives = [GetResponse.AvailableObjective(objective=ObjectiveIdentifier(uuid=OBJECTIVE_1_CAMP_2.bytes), attributes=ObjectiveAttributes(title=LocalizationIdentifier(sequential=105), subtitle=LocalizationIdentifier(sequential=106), issuer=ObjectiveIssuer(corporation=CorporationIdentifier(sequential=CORP_24TH_IMPERIAL)), presenting_character=CharacterIdentifier(sequential=3003881), content_tags=[ContentTagIdentifier(name='activity_mining'), ContentTagIdentifier(name='career_path_industrialist'), ContentTagIdentifier(name='feature_campaigns')], state=OBJECTIVE_STATE_ACTIVE, not_finished=True, scheduled_start_time=start_date_one, career=CAREER_INDUSTRIALIST, target_progress=12345678, max_progress_per_participant=1234, contribution_method_configuration=Configuration(contribution_method=ContributionMethodIdentifier(name='mine_materials'), parameters=[ParameterConfiguration(key='location', matcher=MatcherParameterConfiguration(values=[MatcherParameterConfiguration.ValueEntry(value_type='solarsystem', values=['30002389', '30002388', '30002387']), MatcherParameterConfiguration.ValueEntry(value_type='tags', values=['fw_occupancy.caldari', 'bulwark'])])), ParameterConfiguration(key='ore_type', matcher=MatcherParameterConfiguration(values=[MatcherParameterConfiguration.ValueEntry(value_type='ore_type', values=['1230'])]))]), rewards=Rewards(isk_reward=Rewards.IskReward(amount_per_interval=IskCurrency(units=10), issuer=Owner(corporation=CorporationIdentifier(sequential=CORP_24TH_IMPERIAL)), progress_interval=1), lp_reward=Rewards.LpReward(amount_per_interval=LpCurrency(amount=1, associated_corporation=CorporationIdentifier(sequential=CORP_24TH_IMPERIAL)), progress_interval=100), standing_reward=Rewards.StandingReward(gain_percent_per_interval=GainPercent(units=units, nanos=nanos), progress_interval=100, issuer=Source(corporation=CorporationIdentifier(sequential=CORP_24TH_IMPERIAL))))))]
    118     response.attributes.MergeFrom(attributes)
    119     response.available_objectives.extend(available_objectives)
    120     response.restricted_objectives.extend(restricted_objectives)
    121     return response
    122 
    123 
    124 def _get_campaign3():
    125     response = GetResponse()
    126     start_time = Timestamp()
    127     start_time.FromDatetime(datetime.datetime(2026, 2, 3, 0, 0, 0))
    128     expiry_time = Timestamp()
    129     expiry_time.FromDatetime(datetime.datetime(2026, 8, 24, 0, 0, 0))
    130     attributes = CampaignAttributes(title=LocalizationIdentifier(sequential=200), subtitle=LocalizationIdentifier(sequential=201), goal_description=LocalizationIdentifier(sequential=202), success_description=LocalizationIdentifier(sequential=203), failure_description=LocalizationIdentifier(sequential=204), icon=IconIdentifier(name='eveicon.minmatar_logo'), logo=CampaignAttributes.Image(image=ImageIdentifier(path=''), attributes=ImageAttributes(display_width=200, display_height=100)), dashboard_background=ImageIdentifier(path='res:/UI/Texture/classes/Campaigns/Overview/2026_q2_background_minmatar.png'), ao_feature_page=ImageIdentifier(path=''), objective_background=ImageIdentifier(path='res:/UI/Texture/classes/Opportunities/campaigns/minmatar_banner.png'), issuer=CampaignIssuer(corporation=CorporationIdentifier(sequential=CORP_BRUTOR_TRIBE)), presenting_character=CharacterIdentifier(sequential=3003881), annotations=[Annotation(key='race', value='minmatar'),
    131      Annotation(key='theme_pack', value='minmatar_campaign'),
    132      Annotation(key='campaign_set', value='mil_camp_season1'),
    133      Annotation(key='overview_button_texture_path', value='res:/UI/Texture/classes/Campaigns/Overview/cards/season1_minmatar.png'),
    134      Annotation(key='ui_idx', value='4'),
    135      Annotation(key='dashboard_ambient_background', value='res:/UI/Texture/classes/Campaigns/Overview/2026_q2_ambient_minmatar.png'),
    136      Annotation(key='dashboard_middleground', value='res:/UI/Texture/classes/Campaigns/Overview/2026_q2_middleground_minmatar.png'),
    137      Annotation(key='dashboard_foreground', value='res:/UI/Texture/classes/Campaigns/Overview/2026_q2_foreground_minmatar.png'),
    138      Annotation(key='briefing_background', value='res:/UI/Texture/classes/Campaigns/Overview/2026_q2_ambient_minmatar.png'),
    139      Annotation(key='briefing_middleground', value='res:/UI/Texture/classes/Campaigns/Overview/2026_q2_middleground_minmatar.png'),
    140      Annotation(key='briefing_foreground', value='res:/UI/Texture/classes/Campaigns/Overview/2026_q2_foreground_minmatar.png'),
    141      Annotation(key='goal_description_header', value='211'),
    142      Annotation(key='goal_description_subheader', value='210'),
    143      Annotation(key='goal_description_success', value='212'),
    144      Annotation(key='goal_description_failure', value='213'),
    145      Annotation(key='goal_description_final_words', value='214')], total_objectives=30, scheduled_start_time=start_time, scheduled_expiry_time=expiry_time, version=Version(definition_version=Specification(major=1, minor=2, patch=3), etag=1234), not_finished=True, state=CAMPAIGN_STATE_ACTIVE, target_progress=25, contribution_method_configuration=Configuration(contribution_method=ContributionMethodIdentifier(name='complete_objectives')))
    146     start_date_one = Timestamp()
    147     start_date_one.FromDatetime(datetime.datetime(2026, 2, 10, 1, 2, 3))
    148     start_date_two = Timestamp()
    149     start_date_two.FromDatetime(datetime.datetime(2026, 2, 10, 14, 2, 4))
    150     restricted_objectives = [GetResponse.RestrictedObjective(scheduled_start_time=start_date_one), GetResponse.RestrictedObjective(scheduled_start_time=start_date_two)]
    151     start_date_one = Timestamp()
    152     start_date_one.FromDatetime(datetime.datetime(2026, 2, 3, 0, 0, 0))
    153     units, nanos = split_precision(0.001)
    154     available_objectives = [GetResponse.AvailableObjective(objective=ObjectiveIdentifier(uuid=OBJECTIVE_1_CAMP_3.bytes), attributes=ObjectiveAttributes(title=LocalizationIdentifier(sequential=205), subtitle=LocalizationIdentifier(sequential=206), issuer=ObjectiveIssuer(corporation=CorporationIdentifier(sequential=CORP_BRUTOR_TRIBE)), presenting_character=CharacterIdentifier(sequential=3003881), content_tags=[ContentTagIdentifier(name='activity_mining'), ContentTagIdentifier(name='career_path_industrialist'), ContentTagIdentifier(name='feature_campaigns')], state=OBJECTIVE_STATE_ACTIVE, not_finished=True, scheduled_start_time=start_date_one, career=CAREER_INDUSTRIALIST, target_progress=12345678, max_progress_per_participant=1234, contribution_method_configuration=Configuration(contribution_method=ContributionMethodIdentifier(name='mine_materials'), parameters=[ParameterConfiguration(key='location', matcher=MatcherParameterConfiguration(values=[MatcherParameterConfiguration.ValueEntry(value_type='solarsystem', values=['30002389', '30002388', '30002387']), MatcherParameterConfiguration.ValueEntry(value_type='tags', values=['fw_occupancy.caldari', 'bulwark'])])), ParameterConfiguration(key='ore_type', matcher=MatcherParameterConfiguration(values=[MatcherParameterConfiguration.ValueEntry(value_type='ore_type', values=['1230'])]))]), rewards=Rewards(isk_reward=Rewards.IskReward(amount_per_interval=IskCurrency(units=10), issuer=Owner(corporation=CorporationIdentifier(sequential=CORP_BRUTOR_TRIBE)), progress_interval=1), lp_reward=Rewards.LpReward(amount_per_interval=LpCurrency(amount=1, associated_corporation=CorporationIdentifier(sequential=CORP_BRUTOR_TRIBE)), progress_interval=100), standing_reward=Rewards.StandingReward(gain_percent_per_interval=GainPercent(units=units, nanos=nanos), progress_interval=100, issuer=Source(corporation=CorporationIdentifier(sequential=CORP_BRUTOR_TRIBE))))))]
    155     response.attributes.MergeFrom(attributes)
    156     response.available_objectives.extend(available_objectives)
    157     response.restricted_objectives.extend(restricted_objectives)
    158     return response
    159 
    160 
    161 def _get_campaign4():
    162     response = GetResponse()
    163     start_time = Timestamp()
    164     start_time.FromDatetime(datetime.datetime(2026, 2, 3, 0, 0, 0))
    165     expiry_time = Timestamp()
    166     expiry_time.FromDatetime(datetime.datetime(2026, 8, 24, 0, 0, 0))
    167     attributes = CampaignAttributes(title=LocalizationIdentifier(sequential=300), subtitle=LocalizationIdentifier(sequential=301), goal_description=LocalizationIdentifier(sequential=302), success_description=LocalizationIdentifier(sequential=303), failure_description=LocalizationIdentifier(sequential=303), icon=IconIdentifier(name='eveicon.gallente_logo'), logo=CampaignAttributes.Image(image=ImageIdentifier(path=''), attributes=ImageAttributes(display_width=200, display_height=100)), dashboard_background=ImageIdentifier(path='res:/UI/Texture/classes/Campaigns/Overview/2026_q2_background_gallente.png'), ao_feature_page=ImageIdentifier(path=''), objective_background=ImageIdentifier(path='res:/UI/Texture/classes/Opportunities/campaigns/gallente_banner.png'), issuer=CampaignIssuer(corporation=CorporationIdentifier(sequential=CORP_ALGINTAL_CORE)), presenting_character=CharacterIdentifier(sequential=3003881), annotations=[Annotation(key='race', value='gallente'),
    168      Annotation(key='theme_pack', value='gallente_campaign'),
    169      Annotation(key='campaign_set', value='mil_camp_season1'),
    170      Annotation(key='overview_button_texture_path', value='res:/UI/Texture/classes/Campaigns/Overview/cards/season1_gallente.png'),
    171      Annotation(key='ui_idx', value='3'),
    172      Annotation(key='dashboard_ambient_background', value='res:/UI/Texture/classes/Campaigns/Overview/2026_q2_ambient_gallente.png'),
    173      Annotation(key='dashboard_middleground', value='res:/UI/Texture/classes/Campaigns/Overview/2026_q2_middleground_gallente.png'),
    174      Annotation(key='dashboard_foreground', value='res:/UI/Texture/classes/Campaigns/Overview/2026_q2_foreground_gallente.png'),
    175      Annotation(key='briefing_background', value='res:/UI/Texture/classes/Campaigns/Overview/2026_q2_ambient_gallente.png'),
    176      Annotation(key='briefing_middleground', value='res:/UI/Texture/classes/Campaigns/Overview/2026_q2_middleground_gallente.png'),
    177      Annotation(key='briefing_foreground', value='res:/UI/Texture/classes/Campaigns/Overview/2026_q2_foreground_gallente.png'),
    178      Annotation(key='goal_description_header', value='311'),
    179      Annotation(key='goal_description_subheader', value='310'),
    180      Annotation(key='goal_description_success', value='312'),
    181      Annotation(key='goal_description_failure', value='313'),
    182      Annotation(key='goal_description_final_words', value='314')], total_objectives=30, scheduled_start_time=start_time, scheduled_expiry_time=expiry_time, version=Version(definition_version=Specification(major=1, minor=2, patch=3), etag=1234), not_finished=True, state=CAMPAIGN_STATE_ACTIVE, target_progress=25, contribution_method_configuration=Configuration(contribution_method=ContributionMethodIdentifier(name='complete_objectives')))
    183     start_date_one = Timestamp()
    184     start_date_one.FromDatetime(datetime.datetime(2026, 2, 10, 1, 2, 3))
    185     start_date_two = Timestamp()
    186     start_date_two.FromDatetime(datetime.datetime(2026, 2, 10, 14, 2, 4))
    187     restricted_objectives = [GetResponse.RestrictedObjective(scheduled_start_time=start_date_one), GetResponse.RestrictedObjective(scheduled_start_time=start_date_two)]
    188     start_date_one = Timestamp()
    189     start_date_one.FromDatetime(datetime.datetime(2026, 2, 3, 0, 0, 0))
    190     units, nanos = split_precision(0.001)
    191     available_objectives = [GetResponse.AvailableObjective(objective=ObjectiveIdentifier(uuid=OBJECTIVE_1_CAMP_4.bytes), attributes=ObjectiveAttributes(title=LocalizationIdentifier(sequential=305), subtitle=LocalizationIdentifier(sequential=306), issuer=ObjectiveIssuer(corporation=CorporationIdentifier(sequential=CORP_ALGINTAL_CORE)), presenting_character=CharacterIdentifier(sequential=3003881), content_tags=[ContentTagIdentifier(name='activity_mining'), ContentTagIdentifier(name='career_path_industrialist'), ContentTagIdentifier(name='feature_campaigns')], state=OBJECTIVE_STATE_ACTIVE, not_finished=True, scheduled_start_time=start_date_one, career=CAREER_INDUSTRIALIST, target_progress=12345678, max_progress_per_participant=1234, contribution_method_configuration=Configuration(contribution_method=ContributionMethodIdentifier(name='mine_materials'), parameters=[ParameterConfiguration(key='location', matcher=MatcherParameterConfiguration(values=[MatcherParameterConfiguration.ValueEntry(value_type='solarsystem', values=['30002389', '30002388', '30002387']), MatcherParameterConfiguration.ValueEntry(value_type='tags', values=['fw_occupancy.caldari', 'bulwark'])])), ParameterConfiguration(key='ore_type', matcher=MatcherParameterConfiguration(values=[MatcherParameterConfiguration.ValueEntry(value_type='ore_type', values=['1230'])]))]), rewards=Rewards(isk_reward=Rewards.IskReward(amount_per_interval=IskCurrency(units=10), issuer=Owner(corporation=CorporationIdentifier(sequential=CORP_ALGINTAL_CORE)), progress_interval=1), lp_reward=Rewards.LpReward(amount_per_interval=LpCurrency(amount=1, associated_corporation=CorporationIdentifier(sequential=CORP_ALGINTAL_CORE)), progress_interval=100), standing_reward=Rewards.StandingReward(gain_percent_per_interval=GainPercent(units=units, nanos=nanos), progress_interval=100, issuer=Source(corporation=CorporationIdentifier(sequential=CORP_ALGINTAL_CORE))))))]
    192     response.attributes.MergeFrom(attributes)
    193     response.available_objectives.extend(available_objectives)
    194     response.restricted_objectives.extend(restricted_objectives)
    195     return response
    196 
    197 
    198 def _get_campaign5():
    199     response = GetResponse()
    200     start_time = Timestamp()
    201     start_time.FromDatetime(datetime.datetime(2026, 2, 3, 0, 0, 0))
    202     expiry_time = Timestamp()
    203     expiry_time.FromDatetime(datetime.datetime(2026, 8, 24, 0, 0, 0))
    204     attributes = CampaignAttributes(title=LocalizationIdentifier(sequential=400), subtitle=LocalizationIdentifier(sequential=401), goal_description=LocalizationIdentifier(sequential=402), success_description=LocalizationIdentifier(sequential=403), failure_description=LocalizationIdentifier(sequential=404), icon=IconIdentifier(name='eveicon.caldari_logo'), logo=CampaignAttributes.Image(image=ImageIdentifier(path=''), attributes=ImageAttributes(display_width=200, display_height=100)), dashboard_background=ImageIdentifier(path='res:/UI/Texture/classes/Campaigns/Overview/2026_q2_background_caldari.png'), ao_feature_page=ImageIdentifier(path=''), objective_background=ImageIdentifier(path='res:/UI/Texture/classes/Opportunities/campaigns/caldari_banner.png'), issuer=CampaignIssuer(corporation=CorporationIdentifier(sequential=CORP_CBD)), presenting_character=CharacterIdentifier(sequential=3003881), annotations=[Annotation(key='race', value='caldari'),
    205      Annotation(key='theme_pack', value='caldari_campaign'),
    206      Annotation(key='campaign_set', value='mil_camp_season1'),
    207      Annotation(key='ui_idx', value='2'),
    208      Annotation(key='overview_button_texture_path', value='res:/UI/Texture/classes/Campaigns/Overview/cards/season1_caldari.png'),
    209      Annotation(key='dashboard_ambient_background', value='res:/UI/Texture/classes/Campaigns/Overview/2026_q2_ambient_caldari.png'),
    210      Annotation(key='dashboard_middleground', value='res:/UI/Texture/classes/Campaigns/Overview/2026_q2_middleground_caldari.png'),
    211      Annotation(key='dashboard_foreground', value='res:/UI/Texture/classes/Campaigns/Overview/2026_q2_foreground_caldari.png'),
    212      Annotation(key='briefing_background', value='res:/UI/Texture/classes/Campaigns/Overview/2026_q2_background_caldari.png'),
    213      Annotation(key='briefing_middleground', value='res:/UI/Texture/classes/Campaigns/Overview/2026_q2_middleground_caldari.png'),
    214      Annotation(key='briefing_foreground', value='res:/UI/Texture/classes/Campaigns/Overview/2026_q2_foreground_caldari.png'),
    215      Annotation(key='goal_description_header', value='411'),
    216      Annotation(key='goal_description_subheader', value='410'),
    217      Annotation(key='goal_description_success', value='412'),
    218      Annotation(key='goal_description_failure', value='413'),
    219      Annotation(key='goal_description_final_words', value='414')], total_objectives=30, scheduled_start_time=start_time, scheduled_expiry_time=expiry_time, version=Version(definition_version=Specification(major=1, minor=2, patch=3), etag=1234), not_finished=True, state=CAMPAIGN_STATE_ACTIVE, target_progress=25, contribution_method_configuration=Configuration(contribution_method=ContributionMethodIdentifier(name='complete_objectives')))
    220     start_date_one = Timestamp()
    221     start_date_one.FromDatetime(datetime.datetime(2026, 2, 10, 1, 2, 3))
    222     start_date_two = Timestamp()
    223     start_date_two.FromDatetime(datetime.datetime(2026, 2, 10, 14, 2, 4))
    224     restricted_objectives = [GetResponse.RestrictedObjective(scheduled_start_time=start_date_one), GetResponse.RestrictedObjective(scheduled_start_time=start_date_two)]
    225     start_date_one = Timestamp()
    226     start_date_one.FromDatetime(datetime.datetime(2026, 2, 3, 0, 0, 0))
    227     units, nanos = split_precision(0.001)
    228     available_objectives = [GetResponse.AvailableObjective(objective=ObjectiveIdentifier(uuid=OBJECTIVE_1_CAMP_5.bytes), attributes=ObjectiveAttributes(title=LocalizationIdentifier(sequential=405), subtitle=LocalizationIdentifier(sequential=406), issuer=ObjectiveIssuer(corporation=CorporationIdentifier(sequential=CORP_CBD)), presenting_character=CharacterIdentifier(sequential=3003881), content_tags=[ContentTagIdentifier(name='activity_mining'), ContentTagIdentifier(name='career_path_industrialist'), ContentTagIdentifier(name='feature_campaigns')], state=OBJECTIVE_STATE_ACTIVE, not_finished=True, scheduled_start_time=start_date_one, career=CAREER_INDUSTRIALIST, target_progress=12345678, max_progress_per_participant=1234, contribution_method_configuration=Configuration(contribution_method=ContributionMethodIdentifier(name='mine_materials'), parameters=[ParameterConfiguration(key='location', matcher=MatcherParameterConfiguration(values=[MatcherParameterConfiguration.ValueEntry(value_type='solarsystem', values=['30002389', '30002388', '30002387']), MatcherParameterConfiguration.ValueEntry(value_type='tags', values=['fw_occupancy.caldari', 'bulwark'])])), ParameterConfiguration(key='ore_type', matcher=MatcherParameterConfiguration(values=[MatcherParameterConfiguration.ValueEntry(value_type='ore_type', values=['1230'])]))]), rewards=Rewards(isk_reward=Rewards.IskReward(amount_per_interval=IskCurrency(units=10), issuer=Owner(corporation=CorporationIdentifier(sequential=CORP_CBD)), progress_interval=1), lp_reward=Rewards.LpReward(amount_per_interval=LpCurrency(amount=1, associated_corporation=CorporationIdentifier(sequential=CORP_CBD)), progress_interval=100), standing_reward=Rewards.StandingReward(gain_percent_per_interval=GainPercent(units=units, nanos=nanos), progress_interval=100, issuer=Source(corporation=CorporationIdentifier(sequential=CORP_CBD))))))]
    229     response.attributes.MergeFrom(attributes)
    230     response.available_objectives.extend(available_objectives)
    231     response.restricted_objectives.extend(restricted_objectives)
    232     return response
    233 
    234 
    235 campaigns = {CAMPAIGN_ID2: _get_campaign2(),
    236  CAMPAIGN_ID3: _get_campaign3(),
    237  CAMPAIGN_ID4: _get_campaign4(),
    238  CAMPAIGN_ID5: _get_campaign5()}
    239 campaigns_stats = {CAMPAIGN_ID2: CampaignStats(current_campaign_progress=13, total_contributors=11),
    240  CAMPAIGN_ID3: CampaignStats(current_campaign_progress=4567, total_contributors=5),
    241  CAMPAIGN_ID4: CampaignStats(current_campaign_progress=123, total_contributors=25),
    242  CAMPAIGN_ID5: CampaignStats(current_campaign_progress=987, total_contributors=31)}
    243 campaigns_objectives = {CAMPAIGN_ID2: [OBJECTIVE_1_CAMP_2],
    244  CAMPAIGN_ID3: [OBJECTIVE_1_CAMP_3],
    245  CAMPAIGN_ID4: [OBJECTIVE_1_CAMP_4],
    246  CAMPAIGN_ID5: [OBJECTIVE_1_CAMP_5]}
    247 objectives_stats = {OBJECTIVE_1_CAMP_2: ObjectiveStats(current_objective_progress=1298, committed_participants=120, total_participants=126, total_contributors=1200),
    248  OBJECTIVE_1_CAMP_3: ObjectiveStats(current_objective_progress=1397, committed_participants=138, total_participants=1355, total_contributors=1399),
    249  OBJECTIVE_1_CAMP_4: ObjectiveStats(current_objective_progress=1477, committed_participants=14, total_participants=140, total_contributors=145),
    250  OBJECTIVE_1_CAMP_5: ObjectiveStats(current_objective_progress=1500, committed_participants=150, total_participants=155, total_contributors=159)}
    251 participant_objective_stats = {CAMPAIGN_ID2: GetParticipantStatsResponse(participant_stats=[GetParticipantStatsResponse.ParticipantStats(objective=ObjectiveIdentifier(uuid=OBJECTIVE_1_CAMP_2.bytes), stats=ParticipantStats(state=PARTICIPANT_STATE_COMMITTED, current_participant_progress=1000))]),
    252  CAMPAIGN_ID3: GetParticipantStatsResponse(participant_stats=[GetParticipantStatsResponse.ParticipantStats(objective=ObjectiveIdentifier(uuid=OBJECTIVE_1_CAMP_3.bytes), stats=ParticipantStats(state=PARTICIPANT_STATE_COMMITTED, current_participant_progress=500))]),
    253  CAMPAIGN_ID4: GetParticipantStatsResponse(participant_stats=[GetParticipantStatsResponse.ParticipantStats(objective=ObjectiveIdentifier(uuid=OBJECTIVE_1_CAMP_4.bytes), stats=ParticipantStats(state=PARTICIPANT_STATE_COMMITTED, current_participant_progress=1300))]),
    254  CAMPAIGN_ID5: GetParticipantStatsResponse(participant_stats=[GetParticipantStatsResponse.ParticipantStats(objective=ObjectiveIdentifier(uuid=OBJECTIVE_1_CAMP_5.bytes), stats=ParticipantStats(state=PARTICIPANT_STATE_COMMITTED, current_participant_progress=1000))])}
    255 unredeemed_rewards = GetAllUnredeemedRewardsResponse(objectives=[GetAllUnredeemedRewardsResponse.Objective(objective=ObjectiveIdentifier(uuid=OBJECTIVE_1_CAMP_2.bytes), isk_intervals_unredeemed=1000000, lp_intervals_unredeemed=400)], next_page=None)