commit 12fb88d7283b81fb5a63259eece29ded45d0a6e5 parent 047d3c93ca6719bd9b5026561d8b7a9f6ed9dcfa Author: NovaBryan <29001820+NovaBryan@users.noreply.github.com> Date: Thu, 8 Oct 2026 13:20:33 +0000 Auto-dump EVE code: 24.01.3593370 (20261008_3593370_code) Diffstat:
47 files changed, 1991 insertions(+), 34 deletions(-)
diff --git a/README.md b/README.md @@ -8,6 +8,7 @@ A timeline of all version captures and synchronizations is documented here: | Update Date | Target Version Tag | Version | Notes | | :--- | :--- | :--- | :--- | +| **2026-10-08** | `eve-24_01_3593370` | 24.01.3593370 | Automated unpack and sync | | **2026-10-07** | `eve-24_01_3586130` | 24.01.3586130 | Automated unpack and sync | | **2026-10-06** | `eve-24_01_3579973` | 24.01.3579973 | Automated unpack and sync | | **2026-10-05** | `eve-24_01_3575015` | 24.01.3575015 | Automated unpack and sync | diff --git a/eve/client/script/ui/eveCommands.py b/eve/client/script/ui/eveCommands.py @@ -768,6 +768,7 @@ class EveCommandService(CommandService): m.append(c(self.ToggleUILinearColor, None)) m.append(c(self.ToggleGammaCorrectText, None)) m.append(c(self.OpenSkillTreeWindow, None)) + m.append(c(self.OpenImageCacheDemo, None)) if localization.util.AmOnChineseServer(): m.append(c(self.ToggleActivities, None)) for cm in m: @@ -2536,6 +2537,10 @@ class EveCommandService(CommandService): def OpenSkillTreeWindow(self): return SkillTreeDockablePanel.ToggleOpenClose() + def OpenImageCacheDemo(self, *args): + from imagecaching.demo.image_cache_demo_window import ImageCacheDemoWindow + ImageCacheDemoWindow.ToggleOpenClose() + def ToggleTelemetryRecord(self): if self._telemetrySessionActive: blue.statistics.StopTelemetry() diff --git a/eve/devtools/script/insider.py b/eve/devtools/script/insider.py @@ -33,6 +33,7 @@ from eve.devtools.script.uiAnimationTest import TestAnimationsWnd from eve.client.script.environment.spaceObject.nonInteractableObject import NonInteractableObject from carbonui.button.group import ButtonGroup from eve.client.script.ui.control.fileDialog import FileDialog +from imagecaching.demo.image_cache_demo_window import ImageCacheDemoWindow from player_messaging.client.ui_message import message_player, prompt_player_fsd_dialog from eve.client.script.ui.cosmetics.ship.shipSKINRWindow import ShipSKINRWindow from eve.client.script.ui.cosmetics.structure.paintToolWnd import PaintToolWnd @@ -1543,6 +1544,7 @@ class InsiderService(service.Service): if session.role & ROLE_QA: toolMenu.append(('Module Test', lambda : sm.GetService('modtest').Show())) toolMenu.append(('Skill Tool', lambda : sm.GetService('trainer').Show())) + toolMenu.append(('Image Cache Demo', ImageCacheDemoWindow.Open)) if session.role & ROLEMASK_ELEVATEDPLAYER: toolMenu.append(('Copycat', lambda : sm.GetService('copycat').Show())) toolMenu.append(('Cap Simulator', lambda : sm.GetService('capsim').Show())) diff --git a/eveProto/generated/eve/campaign/objective/objective_pb2.py b/eveProto/generated/eve/campaign/objective/objective_pb2.py @@ -8,7 +8,7 @@ _sym_db = _symbol_database.Default() from eveProto.generated.eve.campaign.objective.definition import definition_pb2 as eve_dot_campaign_dot_objective_dot_definition_dot_definition__pb2 from eveProto.generated.eve.campaign.parameter import parameter_pb2 as eve_dot_campaign_dot_parameter_dot_parameter__pb2 from google.protobuf import timestamp_pb2 as google_dot_protobuf_dot_timestamp__pb2 -DESCRIPTOR = _descriptor.FileDescriptor(name='eve/campaign/objective/objective.proto', package='eve.campaign.objective', syntax='proto3', serialized_options='ZAgithub.com/ccpgames/eve-proto-go/generated/eve/campaign/objective', create_key=_descriptor._internal_create_key, serialized_pb='\n&eve/campaign/objective/objective.proto\x12\x16eve.campaign.objective\x1a2eve/campaign/objective/definition/definition.proto\x1a&eve/campaign/parameter/parameter.proto\x1a\x1fgoogle/protobuf/timestamp.proto"\x1a\n\nIdentifier\x12\x0c\n\x04uuid\x18\x01 \x01(\x0c"\x8c\x03\n\nAttributes\x12A\n\ndefinition\x18\x01 \x01(\x0b2-.eve.campaign.objective.definition.Identifier\x12.\n\nstart_time\x18\x03 \x01(\x0b2\x1a.google.protobuf.Timestamp\x12?\n\x0flifecycle_state\x18\x06 \x01(\x0b2&.eve.campaign.objective.LifecycleState\x129\n\nparameters\x18\x07 \x03(\x0b2%.eve.campaign.parameter.Configuration\x120\n\x05state\x18\x02 \x01(\x0e2\x1d.eve.campaign.objective.StateB\x02\x18\x01\x12\x1a\n\x0cnot_finished\x18\x04 \x01(\x08B\x02\x18\x01H\x00\x125\n\x0bfinish_time\x18\x05 \x01(\x0b2\x1a.google.protobuf.TimestampB\x02\x18\x01H\x00B\n\n\x08finished"\xc6\x02\n\x05Stats\x12\x1a\n\x12total_contributors\x18\x04 \x01(\r\x12I\n\x10commitment_stats\x18\x05 \x01(\x0b2-.eve.campaign.objective.Stats.CommitmentStatsH\x00\x12\x17\n\rno_commitment\x18\x06 \x01(\x08H\x00\x12\x1c\n\x10current_progress\x18\x01 \x01(\x04B\x02\x18\x01\x12"\n\x16committed_participants\x18\x02 \x01(\rB\x02\x18\x01\x12\x1e\n\x12total_participants\x18\x03 \x01(\rB\x02\x18\x01\x1aM\n\x0fCommitmentStats\x12\x1e\n\x16committed_participants\x18\x01 \x01(\r\x12\x1a\n\x12total_participants\x18\x02 \x01(\rB\x0c\n\ncommitment"\xe8\x04\n\x0eLifecycleState\x12,\n\x05state\x18\x01 \x01(\x0e2\x1d.eve.campaign.objective.State\x123\n\x0ftransition_time\x18\x02 \x01(\x0b2\x1a.google.protobuf.Timestamp\x12H\n\x0ctriggered_by\x18\x03 \x01(\x0b22.eve.campaign.objective.LifecycleState.TriggeredBy\x1a\xa8\x03\n\x0bTriggeredBy\x12\x15\n\x0bunspecified\x18\x01 \x01(\x08H\x00\x12`\n\x11lifecycle_trigger\x18\x02 \x01(\x0b2C.eve.campaign.objective.LifecycleState.TriggeredBy.LifecycleTriggerH\x00\x12h\n\x15administrative_action\x18\x03 \x01(\x0b2G.eve.campaign.objective.LifecycleState.TriggeredBy.AdministrativeActionH\x00\x12`\n\x11definition_update\x18\x04 \x01(\x0b2C.eve.campaign.objective.LifecycleState.TriggeredBy.DefinitionUpdateH\x00\x1a\x1f\n\x10LifecycleTrigger\x12\x0b\n\x03key\x18\x01 \x01(\t\x1a\x16\n\x14AdministrativeAction\x1a\x12\n\x10DefinitionUpdateB\x07\n\x05cause*\xc6\x01\n\x05State\x12\x15\n\x11STATE_UNSPECIFIED\x10\x00\x12\x14\n\x0cSTATE_ACTIVE\x10\x01\x1a\x02\x08\x01\x12\x13\n\x0fSTATE_COMPLETED\x10\x02\x12\x15\n\rSTATE_EXPIRED\x10\x03\x1a\x02\x08\x01\x12\x13\n\x0fSTATE_CANCELLED\x10\x04\x12\x10\n\x0cSTATE_FAILED\x10\x05\x12\x16\n\x12STATE_INSTANTIATED\x10\x06\x12\x11\n\rSTATE_STARTED\x10\x07\x12\x12\n\x0eSTATE_DISABLED\x10\x08BCZAgithub.com/ccpgames/eve-proto-go/generated/eve/campaign/objectiveb\x06proto3', dependencies=[eve_dot_campaign_dot_objective_dot_definition_dot_definition__pb2.DESCRIPTOR, eve_dot_campaign_dot_parameter_dot_parameter__pb2.DESCRIPTOR, google_dot_protobuf_dot_timestamp__pb2.DESCRIPTOR]) +DESCRIPTOR = _descriptor.FileDescriptor(name='eve/campaign/objective/objective.proto', package='eve.campaign.objective', syntax='proto3', serialized_options='ZAgithub.com/ccpgames/eve-proto-go/generated/eve/campaign/objective', create_key=_descriptor._internal_create_key, serialized_pb='\n&eve/campaign/objective/objective.proto\x12\x16eve.campaign.objective\x1a2eve/campaign/objective/definition/definition.proto\x1a&eve/campaign/parameter/parameter.proto\x1a\x1fgoogle/protobuf/timestamp.proto"\x1a\n\nIdentifier\x12\x0c\n\x04uuid\x18\x01 \x01(\x0c"\x90\x03\n\nAttributes\x12A\n\ndefinition\x18\x01 \x01(\x0b2-.eve.campaign.objective.definition.Identifier\x12?\n\x0flifecycle_state\x18\x06 \x01(\x0b2&.eve.campaign.objective.LifecycleState\x129\n\nparameters\x18\x07 \x03(\x0b2%.eve.campaign.parameter.Configuration\x120\n\x05state\x18\x02 \x01(\x0e2\x1d.eve.campaign.objective.StateB\x02\x18\x01\x122\n\nstart_time\x18\x03 \x01(\x0b2\x1a.google.protobuf.TimestampB\x02\x18\x01\x12\x1a\n\x0cnot_finished\x18\x04 \x01(\x08B\x02\x18\x01H\x00\x125\n\x0bfinish_time\x18\x05 \x01(\x0b2\x1a.google.protobuf.TimestampB\x02\x18\x01H\x00B\n\n\x08finished"\xc6\x02\n\x05Stats\x12\x1a\n\x12total_contributors\x18\x04 \x01(\r\x12I\n\x10commitment_stats\x18\x05 \x01(\x0b2-.eve.campaign.objective.Stats.CommitmentStatsH\x00\x12\x17\n\rno_commitment\x18\x06 \x01(\x08H\x00\x12\x1c\n\x10current_progress\x18\x01 \x01(\x04B\x02\x18\x01\x12"\n\x16committed_participants\x18\x02 \x01(\rB\x02\x18\x01\x12\x1e\n\x12total_participants\x18\x03 \x01(\rB\x02\x18\x01\x1aM\n\x0fCommitmentStats\x12\x1e\n\x16committed_participants\x18\x01 \x01(\r\x12\x1a\n\x12total_participants\x18\x02 \x01(\rB\x0c\n\ncommitment"\xe8\x04\n\x0eLifecycleState\x12,\n\x05state\x18\x01 \x01(\x0e2\x1d.eve.campaign.objective.State\x123\n\x0ftransition_time\x18\x02 \x01(\x0b2\x1a.google.protobuf.Timestamp\x12H\n\x0ctriggered_by\x18\x03 \x01(\x0b22.eve.campaign.objective.LifecycleState.TriggeredBy\x1a\xa8\x03\n\x0bTriggeredBy\x12\x15\n\x0bunspecified\x18\x01 \x01(\x08H\x00\x12`\n\x11lifecycle_trigger\x18\x02 \x01(\x0b2C.eve.campaign.objective.LifecycleState.TriggeredBy.LifecycleTriggerH\x00\x12h\n\x15administrative_action\x18\x03 \x01(\x0b2G.eve.campaign.objective.LifecycleState.TriggeredBy.AdministrativeActionH\x00\x12`\n\x11definition_update\x18\x04 \x01(\x0b2C.eve.campaign.objective.LifecycleState.TriggeredBy.DefinitionUpdateH\x00\x1a\x1f\n\x10LifecycleTrigger\x12\x0b\n\x03key\x18\x01 \x01(\t\x1a\x16\n\x14AdministrativeAction\x1a\x12\n\x10DefinitionUpdateB\x07\n\x05cause*\xc6\x01\n\x05State\x12\x15\n\x11STATE_UNSPECIFIED\x10\x00\x12\x14\n\x0cSTATE_ACTIVE\x10\x01\x1a\x02\x08\x01\x12\x13\n\x0fSTATE_COMPLETED\x10\x02\x12\x15\n\rSTATE_EXPIRED\x10\x03\x1a\x02\x08\x01\x12\x13\n\x0fSTATE_CANCELLED\x10\x04\x12\x10\n\x0cSTATE_FAILED\x10\x05\x12\x16\n\x12STATE_INSTANTIATED\x10\x06\x12\x11\n\rSTATE_STARTED\x10\x07\x12\x12\n\x0eSTATE_DISABLED\x10\x08BCZAgithub.com/ccpgames/eve-proto-go/generated/eve/campaign/objectiveb\x06proto3', dependencies=[eve_dot_campaign_dot_objective_dot_definition_dot_definition__pb2.DESCRIPTOR, eve_dot_campaign_dot_parameter_dot_parameter__pb2.DESCRIPTOR, google_dot_protobuf_dot_timestamp__pb2.DESCRIPTOR]) _STATE = _descriptor.EnumDescriptor(name='State', full_name='eve.campaign.objective.State', filename=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key, values=[_descriptor.EnumValueDescriptor(name='STATE_UNSPECIFIED', index=0, number=0, serialized_options=None, type=None, create_key=_descriptor._internal_create_key), _descriptor.EnumValueDescriptor(name='STATE_ACTIVE', index=1, number=1, serialized_options='\x08\x01', type=None, create_key=_descriptor._internal_create_key), _descriptor.EnumValueDescriptor(name='STATE_COMPLETED', index=2, number=2, serialized_options=None, type=None, create_key=_descriptor._internal_create_key), @@ -17,7 +17,7 @@ _STATE = _descriptor.EnumDescriptor(name='State', full_name='eve.campaign.object _descriptor.EnumValueDescriptor(name='STATE_FAILED', index=5, number=5, serialized_options=None, type=None, create_key=_descriptor._internal_create_key), _descriptor.EnumValueDescriptor(name='STATE_INSTANTIATED', index=6, number=6, serialized_options=None, type=None, create_key=_descriptor._internal_create_key), _descriptor.EnumValueDescriptor(name='STATE_STARTED', index=7, number=7, serialized_options=None, type=None, create_key=_descriptor._internal_create_key), - _descriptor.EnumValueDescriptor(name='STATE_DISABLED', index=8, number=8, serialized_options=None, type=None, create_key=_descriptor._internal_create_key)], containing_type=None, serialized_options=None, serialized_start=1567, serialized_end=1765) + _descriptor.EnumValueDescriptor(name='STATE_DISABLED', index=8, number=8, serialized_options=None, type=None, create_key=_descriptor._internal_create_key)], containing_type=None, serialized_options=None, serialized_start=1571, serialized_end=1769) _sym_db.RegisterEnumDescriptor(_STATE) State = enum_type_wrapper.EnumTypeWrapper(_STATE) STATE_UNSPECIFIED = 0 @@ -31,32 +31,32 @@ STATE_STARTED = 7 STATE_DISABLED = 8 _IDENTIFIER = _descriptor.Descriptor(name='Identifier', full_name='eve.campaign.objective.Identifier', filename=None, file=DESCRIPTOR, containing_type=None, create_key=_descriptor._internal_create_key, fields=[_descriptor.FieldDescriptor(name='uuid', full_name='eve.campaign.objective.Identifier.uuid', index=0, number=1, type=12, cpp_type=9, label=1, has_default_value=False, default_value='', message_type=None, enum_type=None, containing_type=None, is_extension=False, extension_scope=None, serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key)], extensions=[], nested_types=[], enum_types=[], serialized_options=None, is_extendable=False, syntax='proto3', extension_ranges=[], oneofs=[], serialized_start=191, serialized_end=217) _ATTRIBUTES = _descriptor.Descriptor(name='Attributes', full_name='eve.campaign.objective.Attributes', filename=None, file=DESCRIPTOR, containing_type=None, create_key=_descriptor._internal_create_key, fields=[_descriptor.FieldDescriptor(name='definition', full_name='eve.campaign.objective.Attributes.definition', index=0, number=1, type=11, cpp_type=10, label=1, has_default_value=False, default_value=None, message_type=None, enum_type=None, containing_type=None, is_extension=False, extension_scope=None, serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key), - _descriptor.FieldDescriptor(name='start_time', full_name='eve.campaign.objective.Attributes.start_time', index=1, number=3, type=11, cpp_type=10, label=1, has_default_value=False, default_value=None, message_type=None, enum_type=None, containing_type=None, is_extension=False, extension_scope=None, serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key), - _descriptor.FieldDescriptor(name='lifecycle_state', full_name='eve.campaign.objective.Attributes.lifecycle_state', index=2, number=6, type=11, cpp_type=10, label=1, has_default_value=False, default_value=None, message_type=None, enum_type=None, containing_type=None, is_extension=False, extension_scope=None, serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key), - _descriptor.FieldDescriptor(name='parameters', full_name='eve.campaign.objective.Attributes.parameters', index=3, number=7, type=11, cpp_type=10, label=3, has_default_value=False, default_value=[], message_type=None, enum_type=None, containing_type=None, is_extension=False, extension_scope=None, serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key), - _descriptor.FieldDescriptor(name='state', full_name='eve.campaign.objective.Attributes.state', index=4, number=2, type=14, cpp_type=8, label=1, has_default_value=False, default_value=0, message_type=None, enum_type=None, containing_type=None, is_extension=False, extension_scope=None, serialized_options='\x18\x01', file=DESCRIPTOR, create_key=_descriptor._internal_create_key), + _descriptor.FieldDescriptor(name='lifecycle_state', full_name='eve.campaign.objective.Attributes.lifecycle_state', index=1, number=6, type=11, cpp_type=10, label=1, has_default_value=False, default_value=None, message_type=None, enum_type=None, containing_type=None, is_extension=False, extension_scope=None, serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key), + _descriptor.FieldDescriptor(name='parameters', full_name='eve.campaign.objective.Attributes.parameters', index=2, number=7, type=11, cpp_type=10, label=3, has_default_value=False, default_value=[], message_type=None, enum_type=None, containing_type=None, is_extension=False, extension_scope=None, serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key), + _descriptor.FieldDescriptor(name='state', full_name='eve.campaign.objective.Attributes.state', index=3, number=2, type=14, cpp_type=8, label=1, has_default_value=False, default_value=0, message_type=None, enum_type=None, containing_type=None, is_extension=False, extension_scope=None, serialized_options='\x18\x01', file=DESCRIPTOR, create_key=_descriptor._internal_create_key), + _descriptor.FieldDescriptor(name='start_time', full_name='eve.campaign.objective.Attributes.start_time', index=4, number=3, type=11, cpp_type=10, label=1, has_default_value=False, default_value=None, message_type=None, enum_type=None, containing_type=None, is_extension=False, extension_scope=None, serialized_options='\x18\x01', file=DESCRIPTOR, create_key=_descriptor._internal_create_key), _descriptor.FieldDescriptor(name='not_finished', full_name='eve.campaign.objective.Attributes.not_finished', index=5, number=4, type=8, cpp_type=7, label=1, has_default_value=False, default_value=False, message_type=None, enum_type=None, containing_type=None, is_extension=False, extension_scope=None, serialized_options='\x18\x01', file=DESCRIPTOR, create_key=_descriptor._internal_create_key), - _descriptor.FieldDescriptor(name='finish_time', full_name='eve.campaign.objective.Attributes.finish_time', index=6, number=5, type=11, cpp_type=10, label=1, has_default_value=False, default_value=None, message_type=None, enum_type=None, containing_type=None, is_extension=False, extension_scope=None, serialized_options='\x18\x01', file=DESCRIPTOR, create_key=_descriptor._internal_create_key)], extensions=[], nested_types=[], enum_types=[], serialized_options=None, is_extendable=False, syntax='proto3', extension_ranges=[], oneofs=[_descriptor.OneofDescriptor(name='finished', full_name='eve.campaign.objective.Attributes.finished', index=0, containing_type=None, create_key=_descriptor._internal_create_key, fields=[])], serialized_start=220, serialized_end=616) -_STATS_COMMITMENTSTATS = _descriptor.Descriptor(name='CommitmentStats', full_name='eve.campaign.objective.Stats.CommitmentStats', filename=None, file=DESCRIPTOR, containing_type=None, create_key=_descriptor._internal_create_key, fields=[_descriptor.FieldDescriptor(name='committed_participants', full_name='eve.campaign.objective.Stats.CommitmentStats.committed_participants', index=0, number=1, type=13, cpp_type=3, label=1, has_default_value=False, default_value=0, message_type=None, enum_type=None, containing_type=None, is_extension=False, extension_scope=None, serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key), _descriptor.FieldDescriptor(name='total_participants', full_name='eve.campaign.objective.Stats.CommitmentStats.total_participants', index=1, number=2, type=13, cpp_type=3, label=1, has_default_value=False, default_value=0, message_type=None, enum_type=None, containing_type=None, is_extension=False, extension_scope=None, serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key)], extensions=[], nested_types=[], enum_types=[], serialized_options=None, is_extendable=False, syntax='proto3', extension_ranges=[], oneofs=[], serialized_start=854, serialized_end=931) + _descriptor.FieldDescriptor(name='finish_time', full_name='eve.campaign.objective.Attributes.finish_time', index=6, number=5, type=11, cpp_type=10, label=1, has_default_value=False, default_value=None, message_type=None, enum_type=None, containing_type=None, is_extension=False, extension_scope=None, serialized_options='\x18\x01', file=DESCRIPTOR, create_key=_descriptor._internal_create_key)], extensions=[], nested_types=[], enum_types=[], serialized_options=None, is_extendable=False, syntax='proto3', extension_ranges=[], oneofs=[_descriptor.OneofDescriptor(name='finished', full_name='eve.campaign.objective.Attributes.finished', index=0, containing_type=None, create_key=_descriptor._internal_create_key, fields=[])], serialized_start=220, serialized_end=620) +_STATS_COMMITMENTSTATS = _descriptor.Descriptor(name='CommitmentStats', full_name='eve.campaign.objective.Stats.CommitmentStats', filename=None, file=DESCRIPTOR, containing_type=None, create_key=_descriptor._internal_create_key, fields=[_descriptor.FieldDescriptor(name='committed_participants', full_name='eve.campaign.objective.Stats.CommitmentStats.committed_participants', index=0, number=1, type=13, cpp_type=3, label=1, has_default_value=False, default_value=0, message_type=None, enum_type=None, containing_type=None, is_extension=False, extension_scope=None, serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key), _descriptor.FieldDescriptor(name='total_participants', full_name='eve.campaign.objective.Stats.CommitmentStats.total_participants', index=1, number=2, type=13, cpp_type=3, label=1, has_default_value=False, default_value=0, message_type=None, enum_type=None, containing_type=None, is_extension=False, extension_scope=None, serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key)], extensions=[], nested_types=[], enum_types=[], serialized_options=None, is_extendable=False, syntax='proto3', extension_ranges=[], oneofs=[], serialized_start=858, serialized_end=935) _STATS = _descriptor.Descriptor(name='Stats', full_name='eve.campaign.objective.Stats', filename=None, file=DESCRIPTOR, containing_type=None, create_key=_descriptor._internal_create_key, fields=[_descriptor.FieldDescriptor(name='total_contributors', full_name='eve.campaign.objective.Stats.total_contributors', index=0, number=4, type=13, cpp_type=3, label=1, has_default_value=False, default_value=0, message_type=None, enum_type=None, containing_type=None, is_extension=False, extension_scope=None, serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key), _descriptor.FieldDescriptor(name='commitment_stats', full_name='eve.campaign.objective.Stats.commitment_stats', index=1, number=5, type=11, cpp_type=10, label=1, has_default_value=False, default_value=None, message_type=None, enum_type=None, containing_type=None, is_extension=False, extension_scope=None, serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key), _descriptor.FieldDescriptor(name='no_commitment', full_name='eve.campaign.objective.Stats.no_commitment', index=2, number=6, type=8, cpp_type=7, label=1, has_default_value=False, default_value=False, message_type=None, enum_type=None, containing_type=None, is_extension=False, extension_scope=None, serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key), _descriptor.FieldDescriptor(name='current_progress', full_name='eve.campaign.objective.Stats.current_progress', index=3, number=1, type=4, cpp_type=4, label=1, has_default_value=False, default_value=0, message_type=None, enum_type=None, containing_type=None, is_extension=False, extension_scope=None, serialized_options='\x18\x01', file=DESCRIPTOR, create_key=_descriptor._internal_create_key), _descriptor.FieldDescriptor(name='committed_participants', full_name='eve.campaign.objective.Stats.committed_participants', index=4, number=2, type=13, cpp_type=3, label=1, has_default_value=False, default_value=0, message_type=None, enum_type=None, containing_type=None, is_extension=False, extension_scope=None, serialized_options='\x18\x01', file=DESCRIPTOR, create_key=_descriptor._internal_create_key), - _descriptor.FieldDescriptor(name='total_participants', full_name='eve.campaign.objective.Stats.total_participants', index=5, number=3, type=13, cpp_type=3, label=1, has_default_value=False, default_value=0, message_type=None, enum_type=None, containing_type=None, is_extension=False, extension_scope=None, serialized_options='\x18\x01', file=DESCRIPTOR, create_key=_descriptor._internal_create_key)], extensions=[], nested_types=[_STATS_COMMITMENTSTATS], enum_types=[], serialized_options=None, is_extendable=False, syntax='proto3', extension_ranges=[], oneofs=[_descriptor.OneofDescriptor(name='commitment', full_name='eve.campaign.objective.Stats.commitment', index=0, containing_type=None, create_key=_descriptor._internal_create_key, fields=[])], serialized_start=619, serialized_end=945) -_LIFECYCLESTATE_TRIGGEREDBY_LIFECYCLETRIGGER = _descriptor.Descriptor(name='LifecycleTrigger', full_name='eve.campaign.objective.LifecycleState.TriggeredBy.LifecycleTrigger', filename=None, file=DESCRIPTOR, containing_type=None, create_key=_descriptor._internal_create_key, fields=[_descriptor.FieldDescriptor(name='key', full_name='eve.campaign.objective.LifecycleState.TriggeredBy.LifecycleTrigger.key', index=0, number=1, type=9, cpp_type=9, label=1, has_default_value=False, default_value=''.decode('utf-8'), message_type=None, enum_type=None, containing_type=None, is_extension=False, extension_scope=None, serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key)], extensions=[], nested_types=[], enum_types=[], serialized_options=None, is_extendable=False, syntax='proto3', extension_ranges=[], oneofs=[], serialized_start=1480, serialized_end=1511) -_LIFECYCLESTATE_TRIGGEREDBY_ADMINISTRATIVEACTION = _descriptor.Descriptor(name='AdministrativeAction', full_name='eve.campaign.objective.LifecycleState.TriggeredBy.AdministrativeAction', filename=None, file=DESCRIPTOR, containing_type=None, create_key=_descriptor._internal_create_key, fields=[], extensions=[], nested_types=[], enum_types=[], serialized_options=None, is_extendable=False, syntax='proto3', extension_ranges=[], oneofs=[], serialized_start=1513, serialized_end=1535) -_LIFECYCLESTATE_TRIGGEREDBY_DEFINITIONUPDATE = _descriptor.Descriptor(name='DefinitionUpdate', full_name='eve.campaign.objective.LifecycleState.TriggeredBy.DefinitionUpdate', filename=None, file=DESCRIPTOR, containing_type=None, create_key=_descriptor._internal_create_key, fields=[], extensions=[], nested_types=[], enum_types=[], serialized_options=None, is_extendable=False, syntax='proto3', extension_ranges=[], oneofs=[], serialized_start=1537, serialized_end=1555) + _descriptor.FieldDescriptor(name='total_participants', full_name='eve.campaign.objective.Stats.total_participants', index=5, number=3, type=13, cpp_type=3, label=1, has_default_value=False, default_value=0, message_type=None, enum_type=None, containing_type=None, is_extension=False, extension_scope=None, serialized_options='\x18\x01', file=DESCRIPTOR, create_key=_descriptor._internal_create_key)], extensions=[], nested_types=[_STATS_COMMITMENTSTATS], enum_types=[], serialized_options=None, is_extendable=False, syntax='proto3', extension_ranges=[], oneofs=[_descriptor.OneofDescriptor(name='commitment', full_name='eve.campaign.objective.Stats.commitment', index=0, containing_type=None, create_key=_descriptor._internal_create_key, fields=[])], serialized_start=623, serialized_end=949) +_LIFECYCLESTATE_TRIGGEREDBY_LIFECYCLETRIGGER = _descriptor.Descriptor(name='LifecycleTrigger', full_name='eve.campaign.objective.LifecycleState.TriggeredBy.LifecycleTrigger', filename=None, file=DESCRIPTOR, containing_type=None, create_key=_descriptor._internal_create_key, fields=[_descriptor.FieldDescriptor(name='key', full_name='eve.campaign.objective.LifecycleState.TriggeredBy.LifecycleTrigger.key', index=0, number=1, type=9, cpp_type=9, label=1, has_default_value=False, default_value=''.decode('utf-8'), message_type=None, enum_type=None, containing_type=None, is_extension=False, extension_scope=None, serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key)], extensions=[], nested_types=[], enum_types=[], serialized_options=None, is_extendable=False, syntax='proto3', extension_ranges=[], oneofs=[], serialized_start=1484, serialized_end=1515) +_LIFECYCLESTATE_TRIGGEREDBY_ADMINISTRATIVEACTION = _descriptor.Descriptor(name='AdministrativeAction', full_name='eve.campaign.objective.LifecycleState.TriggeredBy.AdministrativeAction', filename=None, file=DESCRIPTOR, containing_type=None, create_key=_descriptor._internal_create_key, fields=[], extensions=[], nested_types=[], enum_types=[], serialized_options=None, is_extendable=False, syntax='proto3', extension_ranges=[], oneofs=[], serialized_start=1517, serialized_end=1539) +_LIFECYCLESTATE_TRIGGEREDBY_DEFINITIONUPDATE = _descriptor.Descriptor(name='DefinitionUpdate', full_name='eve.campaign.objective.LifecycleState.TriggeredBy.DefinitionUpdate', filename=None, file=DESCRIPTOR, containing_type=None, create_key=_descriptor._internal_create_key, fields=[], extensions=[], nested_types=[], enum_types=[], serialized_options=None, is_extendable=False, syntax='proto3', extension_ranges=[], oneofs=[], serialized_start=1541, serialized_end=1559) _LIFECYCLESTATE_TRIGGEREDBY = _descriptor.Descriptor(name='TriggeredBy', full_name='eve.campaign.objective.LifecycleState.TriggeredBy', filename=None, file=DESCRIPTOR, containing_type=None, create_key=_descriptor._internal_create_key, fields=[_descriptor.FieldDescriptor(name='unspecified', full_name='eve.campaign.objective.LifecycleState.TriggeredBy.unspecified', index=0, number=1, type=8, cpp_type=7, label=1, has_default_value=False, default_value=False, message_type=None, enum_type=None, containing_type=None, is_extension=False, extension_scope=None, serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key), _descriptor.FieldDescriptor(name='lifecycle_trigger', full_name='eve.campaign.objective.LifecycleState.TriggeredBy.lifecycle_trigger', index=1, number=2, type=11, cpp_type=10, label=1, has_default_value=False, default_value=None, message_type=None, enum_type=None, containing_type=None, is_extension=False, extension_scope=None, serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key), _descriptor.FieldDescriptor(name='administrative_action', full_name='eve.campaign.objective.LifecycleState.TriggeredBy.administrative_action', index=2, number=3, type=11, cpp_type=10, label=1, has_default_value=False, default_value=None, message_type=None, enum_type=None, containing_type=None, is_extension=False, extension_scope=None, serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key), - _descriptor.FieldDescriptor(name='definition_update', full_name='eve.campaign.objective.LifecycleState.TriggeredBy.definition_update', index=3, number=4, type=11, cpp_type=10, label=1, has_default_value=False, default_value=None, message_type=None, enum_type=None, containing_type=None, is_extension=False, extension_scope=None, serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key)], extensions=[], nested_types=[_LIFECYCLESTATE_TRIGGEREDBY_LIFECYCLETRIGGER, _LIFECYCLESTATE_TRIGGEREDBY_ADMINISTRATIVEACTION, _LIFECYCLESTATE_TRIGGEREDBY_DEFINITIONUPDATE], enum_types=[], serialized_options=None, is_extendable=False, syntax='proto3', extension_ranges=[], oneofs=[_descriptor.OneofDescriptor(name='cause', full_name='eve.campaign.objective.LifecycleState.TriggeredBy.cause', index=0, containing_type=None, create_key=_descriptor._internal_create_key, fields=[])], serialized_start=1140, serialized_end=1564) -_LIFECYCLESTATE = _descriptor.Descriptor(name='LifecycleState', full_name='eve.campaign.objective.LifecycleState', filename=None, file=DESCRIPTOR, containing_type=None, create_key=_descriptor._internal_create_key, fields=[_descriptor.FieldDescriptor(name='state', full_name='eve.campaign.objective.LifecycleState.state', index=0, number=1, type=14, cpp_type=8, label=1, has_default_value=False, default_value=0, message_type=None, enum_type=None, containing_type=None, is_extension=False, extension_scope=None, serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key), _descriptor.FieldDescriptor(name='transition_time', full_name='eve.campaign.objective.LifecycleState.transition_time', index=1, number=2, type=11, cpp_type=10, label=1, has_default_value=False, default_value=None, message_type=None, enum_type=None, containing_type=None, is_extension=False, extension_scope=None, serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key), _descriptor.FieldDescriptor(name='triggered_by', full_name='eve.campaign.objective.LifecycleState.triggered_by', index=2, number=3, type=11, cpp_type=10, label=1, has_default_value=False, default_value=None, message_type=None, enum_type=None, containing_type=None, is_extension=False, extension_scope=None, serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key)], extensions=[], nested_types=[_LIFECYCLESTATE_TRIGGEREDBY], enum_types=[], serialized_options=None, is_extendable=False, syntax='proto3', extension_ranges=[], oneofs=[], serialized_start=948, serialized_end=1564) + _descriptor.FieldDescriptor(name='definition_update', full_name='eve.campaign.objective.LifecycleState.TriggeredBy.definition_update', index=3, number=4, type=11, cpp_type=10, label=1, has_default_value=False, default_value=None, message_type=None, enum_type=None, containing_type=None, is_extension=False, extension_scope=None, serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key)], extensions=[], nested_types=[_LIFECYCLESTATE_TRIGGEREDBY_LIFECYCLETRIGGER, _LIFECYCLESTATE_TRIGGEREDBY_ADMINISTRATIVEACTION, _LIFECYCLESTATE_TRIGGEREDBY_DEFINITIONUPDATE], enum_types=[], serialized_options=None, is_extendable=False, syntax='proto3', extension_ranges=[], oneofs=[_descriptor.OneofDescriptor(name='cause', full_name='eve.campaign.objective.LifecycleState.TriggeredBy.cause', index=0, containing_type=None, create_key=_descriptor._internal_create_key, fields=[])], serialized_start=1144, serialized_end=1568) +_LIFECYCLESTATE = _descriptor.Descriptor(name='LifecycleState', full_name='eve.campaign.objective.LifecycleState', filename=None, file=DESCRIPTOR, containing_type=None, create_key=_descriptor._internal_create_key, fields=[_descriptor.FieldDescriptor(name='state', full_name='eve.campaign.objective.LifecycleState.state', index=0, number=1, type=14, cpp_type=8, label=1, has_default_value=False, default_value=0, message_type=None, enum_type=None, containing_type=None, is_extension=False, extension_scope=None, serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key), _descriptor.FieldDescriptor(name='transition_time', full_name='eve.campaign.objective.LifecycleState.transition_time', index=1, number=2, type=11, cpp_type=10, label=1, has_default_value=False, default_value=None, message_type=None, enum_type=None, containing_type=None, is_extension=False, extension_scope=None, serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key), _descriptor.FieldDescriptor(name='triggered_by', full_name='eve.campaign.objective.LifecycleState.triggered_by', index=2, number=3, type=11, cpp_type=10, label=1, has_default_value=False, default_value=None, message_type=None, enum_type=None, containing_type=None, is_extension=False, extension_scope=None, serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key)], extensions=[], nested_types=[_LIFECYCLESTATE_TRIGGEREDBY], enum_types=[], serialized_options=None, is_extendable=False, syntax='proto3', extension_ranges=[], oneofs=[], serialized_start=952, serialized_end=1568) _ATTRIBUTES.fields_by_name['definition'].message_type = eve_dot_campaign_dot_objective_dot_definition_dot_definition__pb2._IDENTIFIER -_ATTRIBUTES.fields_by_name['start_time'].message_type = google_dot_protobuf_dot_timestamp__pb2._TIMESTAMP _ATTRIBUTES.fields_by_name['lifecycle_state'].message_type = _LIFECYCLESTATE _ATTRIBUTES.fields_by_name['parameters'].message_type = eve_dot_campaign_dot_parameter_dot_parameter__pb2._CONFIGURATION _ATTRIBUTES.fields_by_name['state'].enum_type = _STATE +_ATTRIBUTES.fields_by_name['start_time'].message_type = google_dot_protobuf_dot_timestamp__pb2._TIMESTAMP _ATTRIBUTES.fields_by_name['finish_time'].message_type = google_dot_protobuf_dot_timestamp__pb2._TIMESTAMP _ATTRIBUTES.oneofs_by_name['finished'].fields.append(_ATTRIBUTES.fields_by_name['not_finished']) _ATTRIBUTES.fields_by_name['not_finished'].containing_oneof = _ATTRIBUTES.oneofs_by_name['finished'] @@ -123,6 +123,7 @@ DESCRIPTOR._options = None _STATE.values_by_name['STATE_ACTIVE']._options = None _STATE.values_by_name['STATE_EXPIRED']._options = None _ATTRIBUTES.fields_by_name['state']._options = None +_ATTRIBUTES.fields_by_name['start_time']._options = None _ATTRIBUTES.fields_by_name['not_finished']._options = None _ATTRIBUTES.fields_by_name['finish_time']._options = None _STATS.fields_by_name['current_progress']._options = None diff --git a/eveProto/generated/eve/tournament/arena/layout/layout_pb2.py b/eveProto/generated/eve/tournament/arena/layout/layout_pb2.py @@ -5,7 +5,7 @@ from google.protobuf import reflection as _reflection from google.protobuf import symbol_database as _symbol_database _sym_db = _symbol_database.Default() from eveProto.generated.eve.inventory import generic_item_type_pb2 as eve_dot_inventory_dot_generic__item__type__pb2 -DESCRIPTOR = _descriptor.FileDescriptor(name='eve/tournament/arena/layout/layout.proto', package='eve.tournament.arena.layout', syntax='proto3', serialized_options='ZFgithub.com/ccpgames/eve-proto-go/generated/eve/tournament/arena/layout', create_key=_descriptor._internal_create_key, serialized_pb='\n(eve/tournament/arena/layout/layout.proto\x12\x1beve.tournament.arena.layout\x1a%eve/inventory/generic_item_type.proto"\x1a\n\nIdentifier\x12\x0c\n\x04uuid\x18\x01 \x01(\x0c")\n\x06Offset\x12\t\n\x01x\x18\x01 \x01(\x12\x12\t\n\x01y\x18\x02 \x01(\x12\x12\t\n\x01z\x18\x03 \x01(\x12"\x89\x01\n\x06Object\x12\x0c\n\x04name\x18\x01 \x01(\t\x12<\n\titem_type\x18\x02 \x01(\x0b2).eve.inventory.genericitemtype.Identifier\x123\n\x06offset\x18\x03 \x01(\x0b2#.eve.tournament.arena.layout.Offset"\x8a\x01\n\x05Cloud\x12<\n\titem_type\x18\x01 \x01(\x0b2).eve.inventory.genericitemtype.Identifier\x123\n\x06offset\x18\x02 \x01(\x0b2#.eve.tournament.arena.layout.Offset\x12\x0e\n\x06radius\x18\x03 \x01(\x04"\xdf\x01\n\nAttributes\x12\x0c\n\x04name\x18\x01 \x01(\t\x12\x0f\n\x07version\x18\x02 \x01(\x04\x12\x0e\n\x06radius\x18\x03 \x01(\x04\x124\n\x07objects\x18\x06 \x03(\x0b2#.eve.tournament.arena.layout.Object\x122\n\x06clouds\x18\x07 \x03(\x0b2".eve.tournament.arena.layout.Cloud\x12\x14\n\x0cnebula_codes\x18\x08 \x03(\tJ\x04\x08\x04\x10\x05J\x04\x08\x05\x10\x06R\tno_nebulaR\x0bnebula_codeBHZFgithub.com/ccpgames/eve-proto-go/generated/eve/tournament/arena/layoutb\x06proto3', dependencies=[eve_dot_inventory_dot_generic__item__type__pb2.DESCRIPTOR]) +DESCRIPTOR = _descriptor.FileDescriptor(name='eve/tournament/arena/layout/layout.proto', package='eve.tournament.arena.layout', syntax='proto3', serialized_options='ZFgithub.com/ccpgames/eve-proto-go/generated/eve/tournament/arena/layout', create_key=_descriptor._internal_create_key, serialized_pb='\n(eve/tournament/arena/layout/layout.proto\x12\x1beve.tournament.arena.layout\x1a%eve/inventory/generic_item_type.proto"\x1a\n\nIdentifier\x12\x0c\n\x04uuid\x18\x01 \x01(\x0c")\n\x06Offset\x12\t\n\x01x\x18\x01 \x01(\x12\x12\t\n\x01y\x18\x02 \x01(\x12\x12\t\n\x01z\x18\x03 \x01(\x12"\x89\x01\n\x06Object\x12\x0c\n\x04name\x18\x01 \x01(\t\x12<\n\titem_type\x18\x02 \x01(\x0b2).eve.inventory.genericitemtype.Identifier\x123\n\x06offset\x18\x03 \x01(\x0b2#.eve.tournament.arena.layout.Offset"\x8a\x01\n\x05Cloud\x12<\n\titem_type\x18\x01 \x01(\x0b2).eve.inventory.genericitemtype.Identifier\x123\n\x06offset\x18\x02 \x01(\x0b2#.eve.tournament.arena.layout.Offset\x12\x0e\n\x06radius\x18\x03 \x01(\x04"\x80\x02\n\nAttributes\x12\x0c\n\x04name\x18\x01 \x01(\t\x12\x0f\n\x07version\x18\x02 \x01(\x04\x12\x0e\n\x06radius\x18\x03 \x01(\x04\x124\n\x07objects\x18\x06 \x03(\x0b2#.eve.tournament.arena.layout.Object\x122\n\x06clouds\x18\x07 \x03(\x0b2".eve.tournament.arena.layout.Cloud\x12\x14\n\x0cnebula_codes\x18\x08 \x03(\t\x12\x1f\n\x17planet_distance_percent\x18\t \x01(\rJ\x04\x08\x04\x10\x05J\x04\x08\x05\x10\x06R\tno_nebulaR\x0bnebula_codeBHZFgithub.com/ccpgames/eve-proto-go/generated/eve/tournament/arena/layoutb\x06proto3', dependencies=[eve_dot_inventory_dot_generic__item__type__pb2.DESCRIPTOR]) _IDENTIFIER = _descriptor.Descriptor(name='Identifier', full_name='eve.tournament.arena.layout.Identifier', filename=None, file=DESCRIPTOR, containing_type=None, create_key=_descriptor._internal_create_key, fields=[_descriptor.FieldDescriptor(name='uuid', full_name='eve.tournament.arena.layout.Identifier.uuid', index=0, number=1, type=12, cpp_type=9, label=1, has_default_value=False, default_value='', message_type=None, enum_type=None, containing_type=None, is_extension=False, extension_scope=None, serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key)], extensions=[], nested_types=[], enum_types=[], serialized_options=None, is_extendable=False, syntax='proto3', extension_ranges=[], oneofs=[], serialized_start=112, serialized_end=138) _OFFSET = _descriptor.Descriptor(name='Offset', full_name='eve.tournament.arena.layout.Offset', filename=None, file=DESCRIPTOR, containing_type=None, create_key=_descriptor._internal_create_key, fields=[_descriptor.FieldDescriptor(name='x', full_name='eve.tournament.arena.layout.Offset.x', index=0, number=1, type=18, cpp_type=2, label=1, has_default_value=False, default_value=0, message_type=None, enum_type=None, containing_type=None, is_extension=False, extension_scope=None, serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key), _descriptor.FieldDescriptor(name='y', full_name='eve.tournament.arena.layout.Offset.y', index=1, number=2, type=18, cpp_type=2, label=1, has_default_value=False, default_value=0, message_type=None, enum_type=None, containing_type=None, is_extension=False, extension_scope=None, serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key), _descriptor.FieldDescriptor(name='z', full_name='eve.tournament.arena.layout.Offset.z', index=2, number=3, type=18, cpp_type=2, label=1, has_default_value=False, default_value=0, message_type=None, enum_type=None, containing_type=None, is_extension=False, extension_scope=None, serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key)], extensions=[], nested_types=[], enum_types=[], serialized_options=None, is_extendable=False, syntax='proto3', extension_ranges=[], oneofs=[], serialized_start=140, serialized_end=181) _OBJECT = _descriptor.Descriptor(name='Object', full_name='eve.tournament.arena.layout.Object', filename=None, file=DESCRIPTOR, containing_type=None, create_key=_descriptor._internal_create_key, fields=[_descriptor.FieldDescriptor(name='name', full_name='eve.tournament.arena.layout.Object.name', index=0, number=1, type=9, cpp_type=9, label=1, has_default_value=False, default_value=''.decode('utf-8'), message_type=None, enum_type=None, containing_type=None, is_extension=False, extension_scope=None, serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key), _descriptor.FieldDescriptor(name='item_type', full_name='eve.tournament.arena.layout.Object.item_type', index=1, number=2, type=11, cpp_type=10, label=1, has_default_value=False, default_value=None, message_type=None, enum_type=None, containing_type=None, is_extension=False, extension_scope=None, serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key), _descriptor.FieldDescriptor(name='offset', full_name='eve.tournament.arena.layout.Object.offset', index=2, number=3, type=11, cpp_type=10, label=1, has_default_value=False, default_value=None, message_type=None, enum_type=None, containing_type=None, is_extension=False, extension_scope=None, serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key)], extensions=[], nested_types=[], enum_types=[], serialized_options=None, is_extendable=False, syntax='proto3', extension_ranges=[], oneofs=[], serialized_start=184, serialized_end=321) @@ -15,7 +15,8 @@ _ATTRIBUTES = _descriptor.Descriptor(name='Attributes', full_name='eve.tournamen _descriptor.FieldDescriptor(name='radius', full_name='eve.tournament.arena.layout.Attributes.radius', index=2, number=3, type=4, cpp_type=4, label=1, has_default_value=False, default_value=0, message_type=None, enum_type=None, containing_type=None, is_extension=False, extension_scope=None, serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key), _descriptor.FieldDescriptor(name='objects', full_name='eve.tournament.arena.layout.Attributes.objects', index=3, number=6, type=11, cpp_type=10, label=3, has_default_value=False, default_value=[], message_type=None, enum_type=None, containing_type=None, is_extension=False, extension_scope=None, serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key), _descriptor.FieldDescriptor(name='clouds', full_name='eve.tournament.arena.layout.Attributes.clouds', index=4, number=7, type=11, cpp_type=10, label=3, has_default_value=False, default_value=[], message_type=None, enum_type=None, containing_type=None, is_extension=False, extension_scope=None, serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key), - _descriptor.FieldDescriptor(name='nebula_codes', full_name='eve.tournament.arena.layout.Attributes.nebula_codes', index=5, number=8, type=9, cpp_type=9, label=3, has_default_value=False, default_value=[], message_type=None, enum_type=None, containing_type=None, is_extension=False, extension_scope=None, serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key)], extensions=[], nested_types=[], enum_types=[], serialized_options=None, is_extendable=False, syntax='proto3', extension_ranges=[], oneofs=[], serialized_start=465, serialized_end=688) + _descriptor.FieldDescriptor(name='nebula_codes', full_name='eve.tournament.arena.layout.Attributes.nebula_codes', index=5, number=8, type=9, cpp_type=9, label=3, has_default_value=False, default_value=[], message_type=None, enum_type=None, containing_type=None, is_extension=False, extension_scope=None, serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key), + _descriptor.FieldDescriptor(name='planet_distance_percent', full_name='eve.tournament.arena.layout.Attributes.planet_distance_percent', index=6, number=9, type=13, cpp_type=3, label=1, has_default_value=False, default_value=0, message_type=None, enum_type=None, containing_type=None, is_extension=False, extension_scope=None, serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key)], extensions=[], nested_types=[], enum_types=[], serialized_options=None, is_extendable=False, syntax='proto3', extension_ranges=[], oneofs=[], serialized_start=465, serialized_end=721) _OBJECT.fields_by_name['item_type'].message_type = eve_dot_inventory_dot_generic__item__type__pb2._IDENTIFIER _OBJECT.fields_by_name['offset'].message_type = _OFFSET _CLOUD.fields_by_name['item_type'].message_type = eve_dot_inventory_dot_generic__item__type__pb2._IDENTIFIER diff --git a/eveProto/generated/eve/user/character/transfer/__init__.py b/eveProto/generated/eve/user/character/transfer/__init__.py @@ -0,0 +1,2 @@ +#Embedded file name: C:\BuildAgent\work\20d73f1b24eed06e\eve\release\V24.01\packages\eveProto\generated\eve\user\character\transfer\__init__.py +pass diff --git a/eveProto/generated/eve/user/character/transfer/api/__init__.py b/eveProto/generated/eve/user/character/transfer/api/__init__.py @@ -0,0 +1,2 @@ +#Embedded file name: C:\BuildAgent\work\20d73f1b24eed06e\eve\release\V24.01\packages\eveProto\generated\eve\user\character\transfer\api\__init__.py +pass diff --git a/eveProto/generated/eve/user/character/transfer/api/events_pb2.py b/eveProto/generated/eve/user/character/transfer/api/events_pb2.py @@ -0,0 +1,19 @@ +#Embedded file name: C:\BuildAgent\work\20d73f1b24eed06e\eve\release\V24.01\packages\eveProto\generated\eve\user\character\transfer\api\events_pb2.py +from google.protobuf import descriptor as _descriptor +from google.protobuf import message as _message +from google.protobuf import reflection as _reflection +from google.protobuf import symbol_database as _symbol_database +_sym_db = _symbol_database.Default() +from eveProto.generated.eve.character import character_pb2 as eve_dot_character_dot_character__pb2 +from eveProto.generated.eve.user import user_pb2 as eve_dot_user_dot_user__pb2 +DESCRIPTOR = _descriptor.FileDescriptor(name='eve/user/character/transfer/api/events.proto', package='eve.user.character.transfer.api', syntax='proto3', serialized_options='ZJgithub.com/ccpgames/eve-proto-go/generated/eve/user/character/transfer/api', create_key=_descriptor._internal_create_key, serialized_pb='\n,eve/user/character/transfer/api/events.proto\x12\x1feve.user.character.transfer.api\x1a\x1deve/character/character.proto\x1a\x13eve/user/user.proto"\x8e\x01\n\tCompleted\x12,\n\tcharacter\x18\x01 \x01(\x0b2\x19.eve.character.Identifier\x12+\n\rprevious_user\x18\x02 \x01(\x0b2\x14.eve.user.Identifier\x12&\n\x08new_user\x18\x03 \x01(\x0b2\x14.eve.user.IdentifierBLZJgithub.com/ccpgames/eve-proto-go/generated/eve/user/character/transfer/apib\x06proto3', dependencies=[eve_dot_character_dot_character__pb2.DESCRIPTOR, eve_dot_user_dot_user__pb2.DESCRIPTOR]) +_COMPLETED = _descriptor.Descriptor(name='Completed', full_name='eve.user.character.transfer.api.Completed', filename=None, file=DESCRIPTOR, containing_type=None, create_key=_descriptor._internal_create_key, fields=[_descriptor.FieldDescriptor(name='character', full_name='eve.user.character.transfer.api.Completed.character', index=0, number=1, type=11, cpp_type=10, label=1, has_default_value=False, default_value=None, message_type=None, enum_type=None, containing_type=None, is_extension=False, extension_scope=None, serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key), _descriptor.FieldDescriptor(name='previous_user', full_name='eve.user.character.transfer.api.Completed.previous_user', index=1, number=2, type=11, cpp_type=10, label=1, has_default_value=False, default_value=None, message_type=None, enum_type=None, containing_type=None, is_extension=False, extension_scope=None, serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key), _descriptor.FieldDescriptor(name='new_user', full_name='eve.user.character.transfer.api.Completed.new_user', index=2, number=3, type=11, cpp_type=10, label=1, has_default_value=False, default_value=None, message_type=None, enum_type=None, containing_type=None, is_extension=False, extension_scope=None, serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key)], extensions=[], nested_types=[], enum_types=[], serialized_options=None, is_extendable=False, syntax='proto3', extension_ranges=[], oneofs=[], serialized_start=134, serialized_end=276) +_COMPLETED.fields_by_name['character'].message_type = eve_dot_character_dot_character__pb2._IDENTIFIER +_COMPLETED.fields_by_name['previous_user'].message_type = eve_dot_user_dot_user__pb2._IDENTIFIER +_COMPLETED.fields_by_name['new_user'].message_type = eve_dot_user_dot_user__pb2._IDENTIFIER +DESCRIPTOR.message_types_by_name['Completed'] = _COMPLETED +_sym_db.RegisterFileDescriptor(DESCRIPTOR) +Completed = _reflection.GeneratedProtocolMessageType('Completed', (_message.Message,), {'DESCRIPTOR': _COMPLETED, + '__module__': 'eve.user.character.transfer.api.events_pb2'}) +_sym_db.RegisterMessage(Completed) +DESCRIPTOR._options = None diff --git a/eveProto/generated/eve_public/app/platform_pb2.py b/eveProto/generated/eve_public/app/platform_pb2.py @@ -6,8 +6,8 @@ from google.protobuf import reflection as _reflection from google.protobuf import symbol_database as _symbol_database _sym_db = _symbol_database.Default() from google.protobuf import timestamp_pb2 as google_dot_protobuf_dot_timestamp__pb2 -DESCRIPTOR = _descriptor.FileDescriptor(name='eve_public/app/platform.proto', package='eve_public.app.platform', syntax='proto3', serialized_options='ZJgithub.com/ccpgames/eve-proto-go/generated/eve_public/application/platform', create_key=_descriptor._internal_create_key, serialized_pb='\n\x1deve_public/app/platform.proto\x12\x17eve_public.app.platform\x1a\x1fgoogle/protobuf/timestamp.proto"a\n\x0fSemanticVersion\x12\r\n\x05major\x18\x01 \x01(\r\x12\r\n\x05minor\x18\x02 \x01(\r\x12\r\n\x05patch\x18\x03 \x01(\r\x12\x12\n\nprerelease\x18\x04 \x01(\t\x12\r\n\x05build\x18\x05 \x01(\t"\x89\x07\n\x02OS\x12.\n\x04type\x18\x01 \x01(\x0e2 .eve_public.app.platform.OS.Kind\x12\x0c\n\x04name\x18\x02 \x01(\t\x121\n\x07bitness\x18\x03 \x01(\x0e2 .eve_public.app.platform.Bitness\x12\x15\n\rmajor_version\x18\x04 \x01(\t\x12\x15\n\rminor_version\x18\x05 \x01(\t\x12\x14\n\x0cbuild_number\x18\x06 \x01(\t\x12\x16\n\x0ekernel_version\x18\x07 \x01(\t\x12\x10\n\x08username\x18\x08 \x01(\t\x12\x13\n\x0buser_locale\x18\t \x01(\t\x12\x19\n\x11is_remote_session\x18\n \x01(\x08\x12?\n\rgraphics_apis\x18\x0b \x01(\x0b2(.eve_public.app.platform.OS.GraphicsAPIs\x12.\n\x04wine\x18\x0c \x01(\x0b2 .eve_public.app.platform.OS.Wine\x12G\n\x11streaming_service\x18\r \x01(\x0b2,.eve_public.app.platform.OS.StreamingService\x1a\x92\x01\n\x0cGraphicsAPIs\x12\x17\n\x0fmetal_supported\x18\x01 \x01(\x08\x12\x18\n\x10vulkan_supported\x18\x02 \x01(\x08\x12(\n vulkan_highest_supported_version\x18\x03 \x01(\t\x12%\n\x1dd3d_highest_supported_version\x18\x04 \x01(\t\x1a(\n\x04Wine\x12\x0f\n\x07version\x18\x01 \x01(\t\x12\x0f\n\x07host_os\x18\x02 \x01(\t\x1a\xab\x01\n\x10StreamingService\x12G\n\x08provider\x18\x01 \x01(\x0e25.eve_public.app.platform.OS.StreamingService.Provider"N\n\x08Provider\x12\x18\n\x14PROVIDER_UNSPECIFIED\x10\x00\x12\x14\n\x10PROVIDER_UNKNOWN\x10\x01\x12\x12\n\x0ePROVIDER_INTEL\x10\x02"M\n\x04Kind\x12\x14\n\x10KIND_UNSPECIFIED\x10\x00\x12\x10\n\x0cKIND_WINDOWS\x10\x01\x12\x0e\n\nKIND_MACOS\x10\x02\x12\r\n\tKIND_WINE\x10\x03"\xb0\x0e\n\x07Machine\x12\r\n\x05model\x18\x01 \x01(\t\x12\x0c\n\x04name\x18\x02 \x01(\t\x12\x0c\n\x04uuid\x18\x03 \x01(\x0c\x12\x14\n\x0ctotal_memory\x18\x04 \x01(\x03\x12\x15\n\rmonitor_count\x18\x05 \x01(\x05\x121\n\x03cpu\x18\x06 \x01(\x0b2$.eve_public.app.platform.Machine.CPU\x12/\n\x02vm\x18\x07 \x01(\x0b2#.eve_public.app.platform.Machine.VM\x12:\n\x08monitors\x18\x08 \x03(\x0b2(.eve_public.app.platform.Machine.Monitor\x122\n\x04gpus\x18\t \x03(\x0b2$.eve_public.app.platform.Machine.GPU\x12I\n\x10network_adapters\x18\n \x03(\x0b2/.eve_public.app.platform.Machine.NetworkAdapter\x12L\n\x11battery_detection\x18\x0b \x01(\x0e21.eve_public.app.platform.Machine.BatteryDetection\x12?\n\x0bhard_drives\x18\x0c \x03(\x0b2*.eve_public.app.platform.Machine.HardDrive\x1a\x90\x03\n\x03CPU\x121\n\x07bitness\x18\x01 \x01(\x0e2 .eve_public.app.platform.Bitness\x12\x1a\n\x12logical_core_count\x18\x02 \x01(\x05\x12\r\n\x05brand\x18\x03 \x01(\t\x12\x0e\n\x06vendor\x18\x04 \x01(\t\x12\r\n\x05model\x18\x05 \x01(\x05\x12\x10\n\x08stepping\x18\x06 \x01(\x05\x12G\n\x0carchitecture\x18\x07 \x01(\x0e21.eve_public.app.platform.Machine.CPU.Architecture\x12\x12\n\nextensions\x18\x08 \x03(\t\x12\x11\n\tfrequency\x18\t \x01(\r"\x89\x01\n\x0cArchitecture\x12\x1c\n\x18ARCHITECTURE_UNSPECIFIED\x10\x00\x12\x14\n\x10ARCHITECTURE_X86\x10\x01\x12\x17\n\x13ARCHITECTURE_X86_64\x10\x02\x12\x14\n\x10ARCHITECTURE_ARM\x10\x03\x12\x16\n\x12ARCHITECTURE_ARM64\x10\x04\x1a\x93\x01\n\x02VM\x12\x17\n\x0fis_suspected_vm\x18\x01 \x01(\x08\x12\x1a\n\x12has_hypervisor_bit\x18\x02 \x01(\x08\x12\x17\n\x0fhypervisor_name\x18\x03 \x01(\t\x12\x1e\n\x16is_hypervisor_guest_os\x18\x04 \x01(\x08\x12\x1f\n\x17has_vm_execution_timing\x18\x05 \x01(\x08\x1a\x9e\x01\n\x07Monitor\x12\x0c\n\x04name\x18\x01 \x01(\t\x12\x1d\n\x15horizontal_resolution\x18\x02 \x01(\x05\x12\x1b\n\x13vertical_resolution\x18\x03 \x01(\x05\x12\x16\n\x0ebits_per_color\x18\x04 \x01(\x05\x12\x14\n\x0crefresh_rate\x18\x05 \x01(\x05\x12\x1b\n\x13dpi_scaling_percent\x18\x06 \x01(\x05\x1a\xf2\x01\n\x03GPU\x12\x13\n\x0bdescription\x18\x01 \x01(\t\x12\x11\n\tvendor_id\x18\x02 \x01(\x05\x12\x11\n\tdevice_id\x18\x03 \x01(\x05\x12\x10\n\x08revision\x18\x04 \x01(\x05\x12\x14\n\x0cvideo_memory\x18\x05 \x01(\x03\x12;\n\x06driver\x18\x06 \x01(\x0b2+.eve_public.app.platform.Machine.GPU.Driver\x12\x12\n\ncore_count\x18\x07 \x01(\r\x1a7\n\x06Driver\x12\x0c\n\x04date\x18\x01 \x01(\t\x12\x0e\n\x06vendor\x18\x02 \x01(\t\x12\x0f\n\x07version\x18\x03 \x01(\t\x1aA\n\x0eNetworkAdapter\x12\x0c\n\x04name\x18\x01 \x01(\t\x12\x13\n\x0bmac_address\x18\x02 \x01(\x0c\x12\x0c\n\x04uuid\x18\x03 \x01(\x0c\x1a\xbf\x01\n\tHardDrive\x12\x0c\n\x04name\x18\x01 \x01(\t\x12H\n\ndrive_type\x18\x02 \x01(\x0e24.eve_public.app.platform.Machine.HardDrive.DriveType\x12\x0c\n\x04size\x18\x03 \x01(\x04"L\n\tDriveType\x12\x19\n\x15DRIVETYPE_UNSPECIFIED\x10\x00\x12\x11\n\rDRIVETYPE_SSD\x10\x01\x12\x11\n\rDRIVETYPE_HDD\x10\x02"[\n\x10BatteryDetection\x12\x17\n\x13BATTERY_UNSPECIFIED\x10\x00\x12\x14\n\x10BATTERY_DETECTED\x10\x01\x12\x18\n\x14BATTERY_NOT_DETECTED\x10\x02"[\n\x07Process\x12\x1d\n\x15running_under_rosetta\x18\x01 \x01(\x08\x121\n\x07bitness\x18\x02 \x01(\x0e2 .eve_public.app.platform.Bitness"\xc5\x02\n\x0bInformation\x129\n\x07version\x18\x01 \x01(\x0b2(.eve_public.app.platform.SemanticVersion\x12-\n\ttimestamp\x18\x02 \x01(\x0b2\x1a.google.protobuf.Timestamp\x12=\n\x0fprocess_bitness\x18\x03 \x01(\x0e2 .eve_public.app.platform.BitnessB\x02\x18\x01\x12\'\n\x02os\x18\x04 \x01(\x0b2\x1b.eve_public.app.platform.OS\x121\n\x07machine\x18\x05 \x01(\x0b2 .eve_public.app.platform.Machine\x121\n\x07process\x18\x06 \x01(\x0b2 .eve_public.app.platform.Process*B\n\x07Bitness\x12\x17\n\x13BITNESS_UNSPECIFIED\x10\x00\x12\x0e\n\nBITNESS_32\x10\x01\x12\x0e\n\nBITNESS_64\x10\x02BLZJgithub.com/ccpgames/eve-proto-go/generated/eve_public/application/platformb\x06proto3', dependencies=[google_dot_protobuf_dot_timestamp__pb2.DESCRIPTOR]) -_BITNESS = _descriptor.EnumDescriptor(name='Bitness', full_name='eve_public.app.platform.Bitness', filename=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key, values=[_descriptor.EnumValueDescriptor(name='BITNESS_UNSPECIFIED', index=0, number=0, serialized_options=None, type=None, create_key=_descriptor._internal_create_key), _descriptor.EnumValueDescriptor(name='BITNESS_32', index=1, number=1, serialized_options=None, type=None, create_key=_descriptor._internal_create_key), _descriptor.EnumValueDescriptor(name='BITNESS_64', index=2, number=2, serialized_options=None, type=None, create_key=_descriptor._internal_create_key)], containing_type=None, serialized_options=None, serialized_start=3362, serialized_end=3428) +DESCRIPTOR = _descriptor.FileDescriptor(name='eve_public/app/platform.proto', package='eve_public.app.platform', syntax='proto3', serialized_options='ZJgithub.com/ccpgames/eve-proto-go/generated/eve_public/application/platform', create_key=_descriptor._internal_create_key, serialized_pb='\n\x1deve_public/app/platform.proto\x12\x17eve_public.app.platform\x1a\x1fgoogle/protobuf/timestamp.proto"a\n\x0fSemanticVersion\x12\r\n\x05major\x18\x01 \x01(\r\x12\r\n\x05minor\x18\x02 \x01(\r\x12\r\n\x05patch\x18\x03 \x01(\r\x12\x12\n\nprerelease\x18\x04 \x01(\t\x12\r\n\x05build\x18\x05 \x01(\t"\x99\x07\n\x02OS\x12.\n\x04type\x18\x01 \x01(\x0e2 .eve_public.app.platform.OS.Kind\x12\x0c\n\x04name\x18\x02 \x01(\t\x121\n\x07bitness\x18\x03 \x01(\x0e2 .eve_public.app.platform.Bitness\x12\x15\n\rmajor_version\x18\x04 \x01(\t\x12\x15\n\rminor_version\x18\x05 \x01(\t\x12\x14\n\x0cbuild_number\x18\x06 \x01(\t\x12\x16\n\x0ekernel_version\x18\x07 \x01(\t\x12\x10\n\x08username\x18\x08 \x01(\t\x12\x13\n\x0buser_locale\x18\t \x01(\t\x12\x19\n\x11is_remote_session\x18\n \x01(\x08\x12?\n\rgraphics_apis\x18\x0b \x01(\x0b2(.eve_public.app.platform.OS.GraphicsAPIs\x12.\n\x04wine\x18\x0c \x01(\x0b2 .eve_public.app.platform.OS.Wine\x12G\n\x11streaming_service\x18\r \x01(\x0b2,.eve_public.app.platform.OS.StreamingService\x1a\x92\x01\n\x0cGraphicsAPIs\x12\x17\n\x0fmetal_supported\x18\x01 \x01(\x08\x12\x18\n\x10vulkan_supported\x18\x02 \x01(\x08\x12(\n vulkan_highest_supported_version\x18\x03 \x01(\t\x12%\n\x1dd3d_highest_supported_version\x18\x04 \x01(\t\x1a(\n\x04Wine\x12\x0f\n\x07version\x18\x01 \x01(\t\x12\x0f\n\x07host_os\x18\x02 \x01(\t\x1a\xab\x01\n\x10StreamingService\x12G\n\x08provider\x18\x01 \x01(\x0e25.eve_public.app.platform.OS.StreamingService.Provider"N\n\x08Provider\x12\x18\n\x14PROVIDER_UNSPECIFIED\x10\x00\x12\x14\n\x10PROVIDER_UNKNOWN\x10\x01\x12\x12\n\x0ePROVIDER_INTEL\x10\x02"]\n\x04Kind\x12\x14\n\x10KIND_UNSPECIFIED\x10\x00\x12\x10\n\x0cKIND_WINDOWS\x10\x01\x12\x0e\n\nKIND_MACOS\x10\x02\x12\r\n\tKIND_WINE\x10\x03\x12\x0e\n\nKIND_LINUX\x10\x04"\xb0\x0e\n\x07Machine\x12\r\n\x05model\x18\x01 \x01(\t\x12\x0c\n\x04name\x18\x02 \x01(\t\x12\x0c\n\x04uuid\x18\x03 \x01(\x0c\x12\x14\n\x0ctotal_memory\x18\x04 \x01(\x03\x12\x15\n\rmonitor_count\x18\x05 \x01(\x05\x121\n\x03cpu\x18\x06 \x01(\x0b2$.eve_public.app.platform.Machine.CPU\x12/\n\x02vm\x18\x07 \x01(\x0b2#.eve_public.app.platform.Machine.VM\x12:\n\x08monitors\x18\x08 \x03(\x0b2(.eve_public.app.platform.Machine.Monitor\x122\n\x04gpus\x18\t \x03(\x0b2$.eve_public.app.platform.Machine.GPU\x12I\n\x10network_adapters\x18\n \x03(\x0b2/.eve_public.app.platform.Machine.NetworkAdapter\x12L\n\x11battery_detection\x18\x0b \x01(\x0e21.eve_public.app.platform.Machine.BatteryDetection\x12?\n\x0bhard_drives\x18\x0c \x03(\x0b2*.eve_public.app.platform.Machine.HardDrive\x1a\x90\x03\n\x03CPU\x121\n\x07bitness\x18\x01 \x01(\x0e2 .eve_public.app.platform.Bitness\x12\x1a\n\x12logical_core_count\x18\x02 \x01(\x05\x12\r\n\x05brand\x18\x03 \x01(\t\x12\x0e\n\x06vendor\x18\x04 \x01(\t\x12\r\n\x05model\x18\x05 \x01(\x05\x12\x10\n\x08stepping\x18\x06 \x01(\x05\x12G\n\x0carchitecture\x18\x07 \x01(\x0e21.eve_public.app.platform.Machine.CPU.Architecture\x12\x12\n\nextensions\x18\x08 \x03(\t\x12\x11\n\tfrequency\x18\t \x01(\r"\x89\x01\n\x0cArchitecture\x12\x1c\n\x18ARCHITECTURE_UNSPECIFIED\x10\x00\x12\x14\n\x10ARCHITECTURE_X86\x10\x01\x12\x17\n\x13ARCHITECTURE_X86_64\x10\x02\x12\x14\n\x10ARCHITECTURE_ARM\x10\x03\x12\x16\n\x12ARCHITECTURE_ARM64\x10\x04\x1a\x93\x01\n\x02VM\x12\x17\n\x0fis_suspected_vm\x18\x01 \x01(\x08\x12\x1a\n\x12has_hypervisor_bit\x18\x02 \x01(\x08\x12\x17\n\x0fhypervisor_name\x18\x03 \x01(\t\x12\x1e\n\x16is_hypervisor_guest_os\x18\x04 \x01(\x08\x12\x1f\n\x17has_vm_execution_timing\x18\x05 \x01(\x08\x1a\x9e\x01\n\x07Monitor\x12\x0c\n\x04name\x18\x01 \x01(\t\x12\x1d\n\x15horizontal_resolution\x18\x02 \x01(\x05\x12\x1b\n\x13vertical_resolution\x18\x03 \x01(\x05\x12\x16\n\x0ebits_per_color\x18\x04 \x01(\x05\x12\x14\n\x0crefresh_rate\x18\x05 \x01(\x05\x12\x1b\n\x13dpi_scaling_percent\x18\x06 \x01(\x05\x1a\xf2\x01\n\x03GPU\x12\x13\n\x0bdescription\x18\x01 \x01(\t\x12\x11\n\tvendor_id\x18\x02 \x01(\x05\x12\x11\n\tdevice_id\x18\x03 \x01(\x05\x12\x10\n\x08revision\x18\x04 \x01(\x05\x12\x14\n\x0cvideo_memory\x18\x05 \x01(\x03\x12;\n\x06driver\x18\x06 \x01(\x0b2+.eve_public.app.platform.Machine.GPU.Driver\x12\x12\n\ncore_count\x18\x07 \x01(\r\x1a7\n\x06Driver\x12\x0c\n\x04date\x18\x01 \x01(\t\x12\x0e\n\x06vendor\x18\x02 \x01(\t\x12\x0f\n\x07version\x18\x03 \x01(\t\x1aA\n\x0eNetworkAdapter\x12\x0c\n\x04name\x18\x01 \x01(\t\x12\x13\n\x0bmac_address\x18\x02 \x01(\x0c\x12\x0c\n\x04uuid\x18\x03 \x01(\x0c\x1a\xbf\x01\n\tHardDrive\x12\x0c\n\x04name\x18\x01 \x01(\t\x12H\n\ndrive_type\x18\x02 \x01(\x0e24.eve_public.app.platform.Machine.HardDrive.DriveType\x12\x0c\n\x04size\x18\x03 \x01(\x04"L\n\tDriveType\x12\x19\n\x15DRIVETYPE_UNSPECIFIED\x10\x00\x12\x11\n\rDRIVETYPE_SSD\x10\x01\x12\x11\n\rDRIVETYPE_HDD\x10\x02"[\n\x10BatteryDetection\x12\x17\n\x13BATTERY_UNSPECIFIED\x10\x00\x12\x14\n\x10BATTERY_DETECTED\x10\x01\x12\x18\n\x14BATTERY_NOT_DETECTED\x10\x02"[\n\x07Process\x12\x1d\n\x15running_under_rosetta\x18\x01 \x01(\x08\x121\n\x07bitness\x18\x02 \x01(\x0e2 .eve_public.app.platform.Bitness"\xc5\x02\n\x0bInformation\x129\n\x07version\x18\x01 \x01(\x0b2(.eve_public.app.platform.SemanticVersion\x12-\n\ttimestamp\x18\x02 \x01(\x0b2\x1a.google.protobuf.Timestamp\x12=\n\x0fprocess_bitness\x18\x03 \x01(\x0e2 .eve_public.app.platform.BitnessB\x02\x18\x01\x12\'\n\x02os\x18\x04 \x01(\x0b2\x1b.eve_public.app.platform.OS\x121\n\x07machine\x18\x05 \x01(\x0b2 .eve_public.app.platform.Machine\x121\n\x07process\x18\x06 \x01(\x0b2 .eve_public.app.platform.Process*B\n\x07Bitness\x12\x17\n\x13BITNESS_UNSPECIFIED\x10\x00\x12\x0e\n\nBITNESS_32\x10\x01\x12\x0e\n\nBITNESS_64\x10\x02BLZJgithub.com/ccpgames/eve-proto-go/generated/eve_public/application/platformb\x06proto3', dependencies=[google_dot_protobuf_dot_timestamp__pb2.DESCRIPTOR]) +_BITNESS = _descriptor.EnumDescriptor(name='Bitness', full_name='eve_public.app.platform.Bitness', filename=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key, values=[_descriptor.EnumValueDescriptor(name='BITNESS_UNSPECIFIED', index=0, number=0, serialized_options=None, type=None, create_key=_descriptor._internal_create_key), _descriptor.EnumValueDescriptor(name='BITNESS_32', index=1, number=1, serialized_options=None, type=None, create_key=_descriptor._internal_create_key), _descriptor.EnumValueDescriptor(name='BITNESS_64', index=2, number=2, serialized_options=None, type=None, create_key=_descriptor._internal_create_key)], containing_type=None, serialized_options=None, serialized_start=3378, serialized_end=3444) _sym_db.RegisterEnumDescriptor(_BITNESS) Bitness = enum_type_wrapper.EnumTypeWrapper(_BITNESS) BITNESS_UNSPECIFIED = 0 @@ -18,17 +18,18 @@ _sym_db.RegisterEnumDescriptor(_OS_STREAMINGSERVICE_PROVIDER) _OS_KIND = _descriptor.EnumDescriptor(name='Kind', full_name='eve_public.app.platform.OS.Kind', filename=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key, values=[_descriptor.EnumValueDescriptor(name='KIND_UNSPECIFIED', index=0, number=0, serialized_options=None, type=None, create_key=_descriptor._internal_create_key), _descriptor.EnumValueDescriptor(name='KIND_WINDOWS', index=1, number=1, serialized_options=None, type=None, create_key=_descriptor._internal_create_key), _descriptor.EnumValueDescriptor(name='KIND_MACOS', index=2, number=2, serialized_options=None, type=None, create_key=_descriptor._internal_create_key), - _descriptor.EnumValueDescriptor(name='KIND_WINE', index=3, number=3, serialized_options=None, type=None, create_key=_descriptor._internal_create_key)], containing_type=None, serialized_options=None, serialized_start=1019, serialized_end=1096) + _descriptor.EnumValueDescriptor(name='KIND_WINE', index=3, number=3, serialized_options=None, type=None, create_key=_descriptor._internal_create_key), + _descriptor.EnumValueDescriptor(name='KIND_LINUX', index=4, number=4, serialized_options=None, type=None, create_key=_descriptor._internal_create_key)], containing_type=None, serialized_options=None, serialized_start=1019, serialized_end=1112) _sym_db.RegisterEnumDescriptor(_OS_KIND) _MACHINE_CPU_ARCHITECTURE = _descriptor.EnumDescriptor(name='Architecture', full_name='eve_public.app.platform.Machine.CPU.Architecture', filename=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key, values=[_descriptor.EnumValueDescriptor(name='ARCHITECTURE_UNSPECIFIED', index=0, number=0, serialized_options=None, type=None, create_key=_descriptor._internal_create_key), _descriptor.EnumValueDescriptor(name='ARCHITECTURE_X86', index=1, number=1, serialized_options=None, type=None, create_key=_descriptor._internal_create_key), _descriptor.EnumValueDescriptor(name='ARCHITECTURE_X86_64', index=2, number=2, serialized_options=None, type=None, create_key=_descriptor._internal_create_key), _descriptor.EnumValueDescriptor(name='ARCHITECTURE_ARM', index=3, number=3, serialized_options=None, type=None, create_key=_descriptor._internal_create_key), - _descriptor.EnumValueDescriptor(name='ARCHITECTURE_ARM64', index=4, number=4, serialized_options=None, type=None, create_key=_descriptor._internal_create_key)], containing_type=None, serialized_options=None, serialized_start=1892, serialized_end=2029) + _descriptor.EnumValueDescriptor(name='ARCHITECTURE_ARM64', index=4, number=4, serialized_options=None, type=None, create_key=_descriptor._internal_create_key)], containing_type=None, serialized_options=None, serialized_start=1908, serialized_end=2045) _sym_db.RegisterEnumDescriptor(_MACHINE_CPU_ARCHITECTURE) -_MACHINE_HARDDRIVE_DRIVETYPE = _descriptor.EnumDescriptor(name='DriveType', full_name='eve_public.app.platform.Machine.HardDrive.DriveType', filename=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key, values=[_descriptor.EnumValueDescriptor(name='DRIVETYPE_UNSPECIFIED', index=0, number=0, serialized_options=None, type=None, create_key=_descriptor._internal_create_key), _descriptor.EnumValueDescriptor(name='DRIVETYPE_SSD', index=1, number=1, serialized_options=None, type=None, create_key=_descriptor._internal_create_key), _descriptor.EnumValueDescriptor(name='DRIVETYPE_HDD', index=2, number=2, serialized_options=None, type=None, create_key=_descriptor._internal_create_key)], containing_type=None, serialized_options=None, serialized_start=2770, serialized_end=2846) +_MACHINE_HARDDRIVE_DRIVETYPE = _descriptor.EnumDescriptor(name='DriveType', full_name='eve_public.app.platform.Machine.HardDrive.DriveType', filename=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key, values=[_descriptor.EnumValueDescriptor(name='DRIVETYPE_UNSPECIFIED', index=0, number=0, serialized_options=None, type=None, create_key=_descriptor._internal_create_key), _descriptor.EnumValueDescriptor(name='DRIVETYPE_SSD', index=1, number=1, serialized_options=None, type=None, create_key=_descriptor._internal_create_key), _descriptor.EnumValueDescriptor(name='DRIVETYPE_HDD', index=2, number=2, serialized_options=None, type=None, create_key=_descriptor._internal_create_key)], containing_type=None, serialized_options=None, serialized_start=2786, serialized_end=2862) _sym_db.RegisterEnumDescriptor(_MACHINE_HARDDRIVE_DRIVETYPE) -_MACHINE_BATTERYDETECTION = _descriptor.EnumDescriptor(name='BatteryDetection', full_name='eve_public.app.platform.Machine.BatteryDetection', filename=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key, values=[_descriptor.EnumValueDescriptor(name='BATTERY_UNSPECIFIED', index=0, number=0, serialized_options=None, type=None, create_key=_descriptor._internal_create_key), _descriptor.EnumValueDescriptor(name='BATTERY_DETECTED', index=1, number=1, serialized_options=None, type=None, create_key=_descriptor._internal_create_key), _descriptor.EnumValueDescriptor(name='BATTERY_NOT_DETECTED', index=2, number=2, serialized_options=None, type=None, create_key=_descriptor._internal_create_key)], containing_type=None, serialized_options=None, serialized_start=2848, serialized_end=2939) +_MACHINE_BATTERYDETECTION = _descriptor.EnumDescriptor(name='BatteryDetection', full_name='eve_public.app.platform.Machine.BatteryDetection', filename=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key, values=[_descriptor.EnumValueDescriptor(name='BATTERY_UNSPECIFIED', index=0, number=0, serialized_options=None, type=None, create_key=_descriptor._internal_create_key), _descriptor.EnumValueDescriptor(name='BATTERY_DETECTED', index=1, number=1, serialized_options=None, type=None, create_key=_descriptor._internal_create_key), _descriptor.EnumValueDescriptor(name='BATTERY_NOT_DETECTED', index=2, number=2, serialized_options=None, type=None, create_key=_descriptor._internal_create_key)], containing_type=None, serialized_options=None, serialized_start=2864, serialized_end=2955) _sym_db.RegisterEnumDescriptor(_MACHINE_BATTERYDETECTION) _SEMANTICVERSION = _descriptor.Descriptor(name='SemanticVersion', full_name='eve_public.app.platform.SemanticVersion', filename=None, file=DESCRIPTOR, containing_type=None, create_key=_descriptor._internal_create_key, fields=[_descriptor.FieldDescriptor(name='major', full_name='eve_public.app.platform.SemanticVersion.major', index=0, number=1, type=13, cpp_type=3, label=1, has_default_value=False, default_value=0, message_type=None, enum_type=None, containing_type=None, is_extension=False, extension_scope=None, serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key), _descriptor.FieldDescriptor(name='minor', full_name='eve_public.app.platform.SemanticVersion.minor', index=1, number=2, type=13, cpp_type=3, label=1, has_default_value=False, default_value=0, message_type=None, enum_type=None, containing_type=None, is_extension=False, extension_scope=None, serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key), @@ -53,7 +54,7 @@ _OS = _descriptor.Descriptor(name='OS', full_name='eve_public.app.platform.OS', _descriptor.FieldDescriptor(name='is_remote_session', full_name='eve_public.app.platform.OS.is_remote_session', index=9, number=10, type=8, cpp_type=7, label=1, has_default_value=False, default_value=False, message_type=None, enum_type=None, containing_type=None, is_extension=False, extension_scope=None, serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key), _descriptor.FieldDescriptor(name='graphics_apis', full_name='eve_public.app.platform.OS.graphics_apis', index=10, number=11, type=11, cpp_type=10, label=1, has_default_value=False, default_value=None, message_type=None, enum_type=None, containing_type=None, is_extension=False, extension_scope=None, serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key), _descriptor.FieldDescriptor(name='wine', full_name='eve_public.app.platform.OS.wine', index=11, number=12, type=11, cpp_type=10, label=1, has_default_value=False, default_value=None, message_type=None, enum_type=None, containing_type=None, is_extension=False, extension_scope=None, serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key), - _descriptor.FieldDescriptor(name='streaming_service', full_name='eve_public.app.platform.OS.streaming_service', index=12, number=13, type=11, cpp_type=10, label=1, has_default_value=False, default_value=None, message_type=None, enum_type=None, containing_type=None, is_extension=False, extension_scope=None, serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key)], extensions=[], nested_types=[_OS_GRAPHICSAPIS, _OS_WINE, _OS_STREAMINGSERVICE], enum_types=[_OS_KIND], serialized_options=None, is_extendable=False, syntax='proto3', extension_ranges=[], oneofs=[], serialized_start=191, serialized_end=1096) + _descriptor.FieldDescriptor(name='streaming_service', full_name='eve_public.app.platform.OS.streaming_service', index=12, number=13, type=11, cpp_type=10, label=1, has_default_value=False, default_value=None, message_type=None, enum_type=None, containing_type=None, is_extension=False, extension_scope=None, serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key)], extensions=[], nested_types=[_OS_GRAPHICSAPIS, _OS_WINE, _OS_STREAMINGSERVICE], enum_types=[_OS_KIND], serialized_options=None, is_extendable=False, syntax='proto3', extension_ranges=[], oneofs=[], serialized_start=191, serialized_end=1112) _MACHINE_CPU = _descriptor.Descriptor(name='CPU', full_name='eve_public.app.platform.Machine.CPU', filename=None, file=DESCRIPTOR, containing_type=None, create_key=_descriptor._internal_create_key, fields=[_descriptor.FieldDescriptor(name='bitness', full_name='eve_public.app.platform.Machine.CPU.bitness', index=0, number=1, type=14, cpp_type=8, label=1, has_default_value=False, default_value=0, message_type=None, enum_type=None, containing_type=None, is_extension=False, extension_scope=None, serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key), _descriptor.FieldDescriptor(name='logical_core_count', full_name='eve_public.app.platform.Machine.CPU.logical_core_count', index=1, number=2, type=5, cpp_type=1, label=1, has_default_value=False, default_value=0, message_type=None, enum_type=None, containing_type=None, is_extension=False, extension_scope=None, serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key), _descriptor.FieldDescriptor(name='brand', full_name='eve_public.app.platform.Machine.CPU.brand', index=2, number=3, type=9, cpp_type=9, label=1, has_default_value=False, default_value=''.decode('utf-8'), message_type=None, enum_type=None, containing_type=None, is_extension=False, extension_scope=None, serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key), @@ -62,28 +63,28 @@ _MACHINE_CPU = _descriptor.Descriptor(name='CPU', full_name='eve_public.app.plat _descriptor.FieldDescriptor(name='stepping', full_name='eve_public.app.platform.Machine.CPU.stepping', index=5, number=6, type=5, cpp_type=1, label=1, has_default_value=False, default_value=0, message_type=None, enum_type=None, containing_type=None, is_extension=False, extension_scope=None, serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key), _descriptor.FieldDescriptor(name='architecture', full_name='eve_public.app.platform.Machine.CPU.architecture', index=6, number=7, type=14, cpp_type=8, label=1, has_default_value=False, default_value=0, message_type=None, enum_type=None, containing_type=None, is_extension=False, extension_scope=None, serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key), _descriptor.FieldDescriptor(name='extensions', full_name='eve_public.app.platform.Machine.CPU.extensions', index=7, number=8, type=9, cpp_type=9, label=3, has_default_value=False, default_value=[], message_type=None, enum_type=None, containing_type=None, is_extension=False, extension_scope=None, serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key), - _descriptor.FieldDescriptor(name='frequency', full_name='eve_public.app.platform.Machine.CPU.frequency', index=8, number=9, type=13, cpp_type=3, label=1, has_default_value=False, default_value=0, message_type=None, enum_type=None, containing_type=None, is_extension=False, extension_scope=None, serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key)], extensions=[], nested_types=[], enum_types=[_MACHINE_CPU_ARCHITECTURE], serialized_options=None, is_extendable=False, syntax='proto3', extension_ranges=[], oneofs=[], serialized_start=1629, serialized_end=2029) + _descriptor.FieldDescriptor(name='frequency', full_name='eve_public.app.platform.Machine.CPU.frequency', index=8, number=9, type=13, cpp_type=3, label=1, has_default_value=False, default_value=0, message_type=None, enum_type=None, containing_type=None, is_extension=False, extension_scope=None, serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key)], extensions=[], nested_types=[], enum_types=[_MACHINE_CPU_ARCHITECTURE], serialized_options=None, is_extendable=False, syntax='proto3', extension_ranges=[], oneofs=[], serialized_start=1645, serialized_end=2045) _MACHINE_VM = _descriptor.Descriptor(name='VM', full_name='eve_public.app.platform.Machine.VM', filename=None, file=DESCRIPTOR, containing_type=None, create_key=_descriptor._internal_create_key, fields=[_descriptor.FieldDescriptor(name='is_suspected_vm', full_name='eve_public.app.platform.Machine.VM.is_suspected_vm', index=0, number=1, type=8, cpp_type=7, label=1, has_default_value=False, default_value=False, message_type=None, enum_type=None, containing_type=None, is_extension=False, extension_scope=None, serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key), _descriptor.FieldDescriptor(name='has_hypervisor_bit', full_name='eve_public.app.platform.Machine.VM.has_hypervisor_bit', index=1, number=2, type=8, cpp_type=7, label=1, has_default_value=False, default_value=False, message_type=None, enum_type=None, containing_type=None, is_extension=False, extension_scope=None, serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key), _descriptor.FieldDescriptor(name='hypervisor_name', full_name='eve_public.app.platform.Machine.VM.hypervisor_name', index=2, number=3, type=9, cpp_type=9, label=1, has_default_value=False, default_value=''.decode('utf-8'), message_type=None, enum_type=None, containing_type=None, is_extension=False, extension_scope=None, serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key), _descriptor.FieldDescriptor(name='is_hypervisor_guest_os', full_name='eve_public.app.platform.Machine.VM.is_hypervisor_guest_os', index=3, number=4, type=8, cpp_type=7, label=1, has_default_value=False, default_value=False, message_type=None, enum_type=None, containing_type=None, is_extension=False, extension_scope=None, serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key), - _descriptor.FieldDescriptor(name='has_vm_execution_timing', full_name='eve_public.app.platform.Machine.VM.has_vm_execution_timing', index=4, number=5, type=8, cpp_type=7, label=1, has_default_value=False, default_value=False, message_type=None, enum_type=None, containing_type=None, is_extension=False, extension_scope=None, serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key)], extensions=[], nested_types=[], enum_types=[], serialized_options=None, is_extendable=False, syntax='proto3', extension_ranges=[], oneofs=[], serialized_start=2032, serialized_end=2179) + _descriptor.FieldDescriptor(name='has_vm_execution_timing', full_name='eve_public.app.platform.Machine.VM.has_vm_execution_timing', index=4, number=5, type=8, cpp_type=7, label=1, has_default_value=False, default_value=False, message_type=None, enum_type=None, containing_type=None, is_extension=False, extension_scope=None, serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key)], extensions=[], nested_types=[], enum_types=[], serialized_options=None, is_extendable=False, syntax='proto3', extension_ranges=[], oneofs=[], serialized_start=2048, serialized_end=2195) _MACHINE_MONITOR = _descriptor.Descriptor(name='Monitor', full_name='eve_public.app.platform.Machine.Monitor', filename=None, file=DESCRIPTOR, containing_type=None, create_key=_descriptor._internal_create_key, fields=[_descriptor.FieldDescriptor(name='name', full_name='eve_public.app.platform.Machine.Monitor.name', index=0, number=1, type=9, cpp_type=9, label=1, has_default_value=False, default_value=''.decode('utf-8'), message_type=None, enum_type=None, containing_type=None, is_extension=False, extension_scope=None, serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key), _descriptor.FieldDescriptor(name='horizontal_resolution', full_name='eve_public.app.platform.Machine.Monitor.horizontal_resolution', index=1, number=2, type=5, cpp_type=1, label=1, has_default_value=False, default_value=0, message_type=None, enum_type=None, containing_type=None, is_extension=False, extension_scope=None, serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key), _descriptor.FieldDescriptor(name='vertical_resolution', full_name='eve_public.app.platform.Machine.Monitor.vertical_resolution', index=2, number=3, type=5, cpp_type=1, label=1, has_default_value=False, default_value=0, message_type=None, enum_type=None, containing_type=None, is_extension=False, extension_scope=None, serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key), _descriptor.FieldDescriptor(name='bits_per_color', full_name='eve_public.app.platform.Machine.Monitor.bits_per_color', index=3, number=4, type=5, cpp_type=1, label=1, has_default_value=False, default_value=0, message_type=None, enum_type=None, containing_type=None, is_extension=False, extension_scope=None, serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key), _descriptor.FieldDescriptor(name='refresh_rate', full_name='eve_public.app.platform.Machine.Monitor.refresh_rate', index=4, number=5, type=5, cpp_type=1, label=1, has_default_value=False, default_value=0, message_type=None, enum_type=None, containing_type=None, is_extension=False, extension_scope=None, serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key), - _descriptor.FieldDescriptor(name='dpi_scaling_percent', full_name='eve_public.app.platform.Machine.Monitor.dpi_scaling_percent', index=5, number=6, type=5, cpp_type=1, label=1, has_default_value=False, default_value=0, message_type=None, enum_type=None, containing_type=None, is_extension=False, extension_scope=None, serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key)], extensions=[], nested_types=[], enum_types=[], serialized_options=None, is_extendable=False, syntax='proto3', extension_ranges=[], oneofs=[], serialized_start=2182, serialized_end=2340) -_MACHINE_GPU_DRIVER = _descriptor.Descriptor(name='Driver', full_name='eve_public.app.platform.Machine.GPU.Driver', filename=None, file=DESCRIPTOR, containing_type=None, create_key=_descriptor._internal_create_key, fields=[_descriptor.FieldDescriptor(name='date', full_name='eve_public.app.platform.Machine.GPU.Driver.date', index=0, number=1, type=9, cpp_type=9, label=1, has_default_value=False, default_value=''.decode('utf-8'), message_type=None, enum_type=None, containing_type=None, is_extension=False, extension_scope=None, serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key), _descriptor.FieldDescriptor(name='vendor', full_name='eve_public.app.platform.Machine.GPU.Driver.vendor', index=1, number=2, type=9, cpp_type=9, label=1, has_default_value=False, default_value=''.decode('utf-8'), message_type=None, enum_type=None, containing_type=None, is_extension=False, extension_scope=None, serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key), _descriptor.FieldDescriptor(name='version', full_name='eve_public.app.platform.Machine.GPU.Driver.version', index=2, number=3, type=9, cpp_type=9, label=1, has_default_value=False, default_value=''.decode('utf-8'), message_type=None, enum_type=None, containing_type=None, is_extension=False, extension_scope=None, serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key)], extensions=[], nested_types=[], enum_types=[], serialized_options=None, is_extendable=False, syntax='proto3', extension_ranges=[], oneofs=[], serialized_start=2530, serialized_end=2585) + _descriptor.FieldDescriptor(name='dpi_scaling_percent', full_name='eve_public.app.platform.Machine.Monitor.dpi_scaling_percent', index=5, number=6, type=5, cpp_type=1, label=1, has_default_value=False, default_value=0, message_type=None, enum_type=None, containing_type=None, is_extension=False, extension_scope=None, serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key)], extensions=[], nested_types=[], enum_types=[], serialized_options=None, is_extendable=False, syntax='proto3', extension_ranges=[], oneofs=[], serialized_start=2198, serialized_end=2356) +_MACHINE_GPU_DRIVER = _descriptor.Descriptor(name='Driver', full_name='eve_public.app.platform.Machine.GPU.Driver', filename=None, file=DESCRIPTOR, containing_type=None, create_key=_descriptor._internal_create_key, fields=[_descriptor.FieldDescriptor(name='date', full_name='eve_public.app.platform.Machine.GPU.Driver.date', index=0, number=1, type=9, cpp_type=9, label=1, has_default_value=False, default_value=''.decode('utf-8'), message_type=None, enum_type=None, containing_type=None, is_extension=False, extension_scope=None, serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key), _descriptor.FieldDescriptor(name='vendor', full_name='eve_public.app.platform.Machine.GPU.Driver.vendor', index=1, number=2, type=9, cpp_type=9, label=1, has_default_value=False, default_value=''.decode('utf-8'), message_type=None, enum_type=None, containing_type=None, is_extension=False, extension_scope=None, serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key), _descriptor.FieldDescriptor(name='version', full_name='eve_public.app.platform.Machine.GPU.Driver.version', index=2, number=3, type=9, cpp_type=9, label=1, has_default_value=False, default_value=''.decode('utf-8'), message_type=None, enum_type=None, containing_type=None, is_extension=False, extension_scope=None, serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key)], extensions=[], nested_types=[], enum_types=[], serialized_options=None, is_extendable=False, syntax='proto3', extension_ranges=[], oneofs=[], serialized_start=2546, serialized_end=2601) _MACHINE_GPU = _descriptor.Descriptor(name='GPU', full_name='eve_public.app.platform.Machine.GPU', filename=None, file=DESCRIPTOR, containing_type=None, create_key=_descriptor._internal_create_key, fields=[_descriptor.FieldDescriptor(name='description', full_name='eve_public.app.platform.Machine.GPU.description', index=0, number=1, type=9, cpp_type=9, label=1, has_default_value=False, default_value=''.decode('utf-8'), message_type=None, enum_type=None, containing_type=None, is_extension=False, extension_scope=None, serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key), _descriptor.FieldDescriptor(name='vendor_id', full_name='eve_public.app.platform.Machine.GPU.vendor_id', index=1, number=2, type=5, cpp_type=1, label=1, has_default_value=False, default_value=0, message_type=None, enum_type=None, containing_type=None, is_extension=False, extension_scope=None, serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key), _descriptor.FieldDescriptor(name='device_id', full_name='eve_public.app.platform.Machine.GPU.device_id', index=2, number=3, type=5, cpp_type=1, label=1, has_default_value=False, default_value=0, message_type=None, enum_type=None, containing_type=None, is_extension=False, extension_scope=None, serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key), _descriptor.FieldDescriptor(name='revision', full_name='eve_public.app.platform.Machine.GPU.revision', index=3, number=4, type=5, cpp_type=1, label=1, has_default_value=False, default_value=0, message_type=None, enum_type=None, containing_type=None, is_extension=False, extension_scope=None, serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key), _descriptor.FieldDescriptor(name='video_memory', full_name='eve_public.app.platform.Machine.GPU.video_memory', index=4, number=5, type=3, cpp_type=2, label=1, has_default_value=False, default_value=0, message_type=None, enum_type=None, containing_type=None, is_extension=False, extension_scope=None, serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key), _descriptor.FieldDescriptor(name='driver', full_name='eve_public.app.platform.Machine.GPU.driver', index=5, number=6, type=11, cpp_type=10, label=1, has_default_value=False, default_value=None, message_type=None, enum_type=None, containing_type=None, is_extension=False, extension_scope=None, serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key), - _descriptor.FieldDescriptor(name='core_count', full_name='eve_public.app.platform.Machine.GPU.core_count', index=6, number=7, type=13, cpp_type=3, label=1, has_default_value=False, default_value=0, message_type=None, enum_type=None, containing_type=None, is_extension=False, extension_scope=None, serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key)], extensions=[], nested_types=[_MACHINE_GPU_DRIVER], enum_types=[], serialized_options=None, is_extendable=False, syntax='proto3', extension_ranges=[], oneofs=[], serialized_start=2343, serialized_end=2585) -_MACHINE_NETWORKADAPTER = _descriptor.Descriptor(name='NetworkAdapter', full_name='eve_public.app.platform.Machine.NetworkAdapter', filename=None, file=DESCRIPTOR, containing_type=None, create_key=_descriptor._internal_create_key, fields=[_descriptor.FieldDescriptor(name='name', full_name='eve_public.app.platform.Machine.NetworkAdapter.name', index=0, number=1, type=9, cpp_type=9, label=1, has_default_value=False, default_value=''.decode('utf-8'), message_type=None, enum_type=None, containing_type=None, is_extension=False, extension_scope=None, serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key), _descriptor.FieldDescriptor(name='mac_address', full_name='eve_public.app.platform.Machine.NetworkAdapter.mac_address', index=1, number=2, type=12, cpp_type=9, label=1, has_default_value=False, default_value='', message_type=None, enum_type=None, containing_type=None, is_extension=False, extension_scope=None, serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key), _descriptor.FieldDescriptor(name='uuid', full_name='eve_public.app.platform.Machine.NetworkAdapter.uuid', index=2, number=3, type=12, cpp_type=9, label=1, has_default_value=False, default_value='', message_type=None, enum_type=None, containing_type=None, is_extension=False, extension_scope=None, serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key)], extensions=[], nested_types=[], enum_types=[], serialized_options=None, is_extendable=False, syntax='proto3', extension_ranges=[], oneofs=[], serialized_start=2587, serialized_end=2652) -_MACHINE_HARDDRIVE = _descriptor.Descriptor(name='HardDrive', full_name='eve_public.app.platform.Machine.HardDrive', filename=None, file=DESCRIPTOR, containing_type=None, create_key=_descriptor._internal_create_key, fields=[_descriptor.FieldDescriptor(name='name', full_name='eve_public.app.platform.Machine.HardDrive.name', index=0, number=1, type=9, cpp_type=9, label=1, has_default_value=False, default_value=''.decode('utf-8'), message_type=None, enum_type=None, containing_type=None, is_extension=False, extension_scope=None, serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key), _descriptor.FieldDescriptor(name='drive_type', full_name='eve_public.app.platform.Machine.HardDrive.drive_type', index=1, number=2, type=14, cpp_type=8, label=1, has_default_value=False, default_value=0, message_type=None, enum_type=None, containing_type=None, is_extension=False, extension_scope=None, serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key), _descriptor.FieldDescriptor(name='size', full_name='eve_public.app.platform.Machine.HardDrive.size', index=2, number=3, type=4, cpp_type=4, label=1, has_default_value=False, default_value=0, message_type=None, enum_type=None, containing_type=None, is_extension=False, extension_scope=None, serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key)], extensions=[], nested_types=[], enum_types=[_MACHINE_HARDDRIVE_DRIVETYPE], serialized_options=None, is_extendable=False, syntax='proto3', extension_ranges=[], oneofs=[], serialized_start=2655, serialized_end=2846) + _descriptor.FieldDescriptor(name='core_count', full_name='eve_public.app.platform.Machine.GPU.core_count', index=6, number=7, type=13, cpp_type=3, label=1, has_default_value=False, default_value=0, message_type=None, enum_type=None, containing_type=None, is_extension=False, extension_scope=None, serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key)], extensions=[], nested_types=[_MACHINE_GPU_DRIVER], enum_types=[], serialized_options=None, is_extendable=False, syntax='proto3', extension_ranges=[], oneofs=[], serialized_start=2359, serialized_end=2601) +_MACHINE_NETWORKADAPTER = _descriptor.Descriptor(name='NetworkAdapter', full_name='eve_public.app.platform.Machine.NetworkAdapter', filename=None, file=DESCRIPTOR, containing_type=None, create_key=_descriptor._internal_create_key, fields=[_descriptor.FieldDescriptor(name='name', full_name='eve_public.app.platform.Machine.NetworkAdapter.name', index=0, number=1, type=9, cpp_type=9, label=1, has_default_value=False, default_value=''.decode('utf-8'), message_type=None, enum_type=None, containing_type=None, is_extension=False, extension_scope=None, serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key), _descriptor.FieldDescriptor(name='mac_address', full_name='eve_public.app.platform.Machine.NetworkAdapter.mac_address', index=1, number=2, type=12, cpp_type=9, label=1, has_default_value=False, default_value='', message_type=None, enum_type=None, containing_type=None, is_extension=False, extension_scope=None, serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key), _descriptor.FieldDescriptor(name='uuid', full_name='eve_public.app.platform.Machine.NetworkAdapter.uuid', index=2, number=3, type=12, cpp_type=9, label=1, has_default_value=False, default_value='', message_type=None, enum_type=None, containing_type=None, is_extension=False, extension_scope=None, serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key)], extensions=[], nested_types=[], enum_types=[], serialized_options=None, is_extendable=False, syntax='proto3', extension_ranges=[], oneofs=[], serialized_start=2603, serialized_end=2668) +_MACHINE_HARDDRIVE = _descriptor.Descriptor(name='HardDrive', full_name='eve_public.app.platform.Machine.HardDrive', filename=None, file=DESCRIPTOR, containing_type=None, create_key=_descriptor._internal_create_key, fields=[_descriptor.FieldDescriptor(name='name', full_name='eve_public.app.platform.Machine.HardDrive.name', index=0, number=1, type=9, cpp_type=9, label=1, has_default_value=False, default_value=''.decode('utf-8'), message_type=None, enum_type=None, containing_type=None, is_extension=False, extension_scope=None, serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key), _descriptor.FieldDescriptor(name='drive_type', full_name='eve_public.app.platform.Machine.HardDrive.drive_type', index=1, number=2, type=14, cpp_type=8, label=1, has_default_value=False, default_value=0, message_type=None, enum_type=None, containing_type=None, is_extension=False, extension_scope=None, serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key), _descriptor.FieldDescriptor(name='size', full_name='eve_public.app.platform.Machine.HardDrive.size', index=2, number=3, type=4, cpp_type=4, label=1, has_default_value=False, default_value=0, message_type=None, enum_type=None, containing_type=None, is_extension=False, extension_scope=None, serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key)], extensions=[], nested_types=[], enum_types=[_MACHINE_HARDDRIVE_DRIVETYPE], serialized_options=None, is_extendable=False, syntax='proto3', extension_ranges=[], oneofs=[], serialized_start=2671, serialized_end=2862) _MACHINE = _descriptor.Descriptor(name='Machine', full_name='eve_public.app.platform.Machine', filename=None, file=DESCRIPTOR, containing_type=None, create_key=_descriptor._internal_create_key, fields=[_descriptor.FieldDescriptor(name='model', full_name='eve_public.app.platform.Machine.model', index=0, number=1, type=9, cpp_type=9, label=1, has_default_value=False, default_value=''.decode('utf-8'), message_type=None, enum_type=None, containing_type=None, is_extension=False, extension_scope=None, serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key), _descriptor.FieldDescriptor(name='name', full_name='eve_public.app.platform.Machine.name', index=1, number=2, type=9, cpp_type=9, label=1, has_default_value=False, default_value=''.decode('utf-8'), message_type=None, enum_type=None, containing_type=None, is_extension=False, extension_scope=None, serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key), _descriptor.FieldDescriptor(name='uuid', full_name='eve_public.app.platform.Machine.uuid', index=2, number=3, type=12, cpp_type=9, label=1, has_default_value=False, default_value='', message_type=None, enum_type=None, containing_type=None, is_extension=False, extension_scope=None, serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key), @@ -100,14 +101,14 @@ _MACHINE = _descriptor.Descriptor(name='Machine', full_name='eve_public.app.plat _MACHINE_MONITOR, _MACHINE_GPU, _MACHINE_NETWORKADAPTER, - _MACHINE_HARDDRIVE], enum_types=[_MACHINE_BATTERYDETECTION], serialized_options=None, is_extendable=False, syntax='proto3', extension_ranges=[], oneofs=[], serialized_start=1099, serialized_end=2939) -_PROCESS = _descriptor.Descriptor(name='Process', full_name='eve_public.app.platform.Process', filename=None, file=DESCRIPTOR, containing_type=None, create_key=_descriptor._internal_create_key, fields=[_descriptor.FieldDescriptor(name='running_under_rosetta', full_name='eve_public.app.platform.Process.running_under_rosetta', index=0, number=1, type=8, cpp_type=7, label=1, has_default_value=False, default_value=False, message_type=None, enum_type=None, containing_type=None, is_extension=False, extension_scope=None, serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key), _descriptor.FieldDescriptor(name='bitness', full_name='eve_public.app.platform.Process.bitness', index=1, number=2, type=14, cpp_type=8, label=1, has_default_value=False, default_value=0, message_type=None, enum_type=None, containing_type=None, is_extension=False, extension_scope=None, serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key)], extensions=[], nested_types=[], enum_types=[], serialized_options=None, is_extendable=False, syntax='proto3', extension_ranges=[], oneofs=[], serialized_start=2941, serialized_end=3032) + _MACHINE_HARDDRIVE], enum_types=[_MACHINE_BATTERYDETECTION], serialized_options=None, is_extendable=False, syntax='proto3', extension_ranges=[], oneofs=[], serialized_start=1115, serialized_end=2955) +_PROCESS = _descriptor.Descriptor(name='Process', full_name='eve_public.app.platform.Process', filename=None, file=DESCRIPTOR, containing_type=None, create_key=_descriptor._internal_create_key, fields=[_descriptor.FieldDescriptor(name='running_under_rosetta', full_name='eve_public.app.platform.Process.running_under_rosetta', index=0, number=1, type=8, cpp_type=7, label=1, has_default_value=False, default_value=False, message_type=None, enum_type=None, containing_type=None, is_extension=False, extension_scope=None, serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key), _descriptor.FieldDescriptor(name='bitness', full_name='eve_public.app.platform.Process.bitness', index=1, number=2, type=14, cpp_type=8, label=1, has_default_value=False, default_value=0, message_type=None, enum_type=None, containing_type=None, is_extension=False, extension_scope=None, serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key)], extensions=[], nested_types=[], enum_types=[], serialized_options=None, is_extendable=False, syntax='proto3', extension_ranges=[], oneofs=[], serialized_start=2957, serialized_end=3048) _INFORMATION = _descriptor.Descriptor(name='Information', full_name='eve_public.app.platform.Information', filename=None, file=DESCRIPTOR, containing_type=None, create_key=_descriptor._internal_create_key, fields=[_descriptor.FieldDescriptor(name='version', full_name='eve_public.app.platform.Information.version', index=0, number=1, type=11, cpp_type=10, label=1, has_default_value=False, default_value=None, message_type=None, enum_type=None, containing_type=None, is_extension=False, extension_scope=None, serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key), _descriptor.FieldDescriptor(name='timestamp', full_name='eve_public.app.platform.Information.timestamp', index=1, number=2, type=11, cpp_type=10, label=1, has_default_value=False, default_value=None, message_type=None, enum_type=None, containing_type=None, is_extension=False, extension_scope=None, serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key), _descriptor.FieldDescriptor(name='process_bitness', full_name='eve_public.app.platform.Information.process_bitness', index=2, number=3, type=14, cpp_type=8, label=1, has_default_value=False, default_value=0, message_type=None, enum_type=None, containing_type=None, is_extension=False, extension_scope=None, serialized_options='\x18\x01', file=DESCRIPTOR, create_key=_descriptor._internal_create_key), _descriptor.FieldDescriptor(name='os', full_name='eve_public.app.platform.Information.os', index=3, number=4, type=11, cpp_type=10, label=1, has_default_value=False, default_value=None, message_type=None, enum_type=None, containing_type=None, is_extension=False, extension_scope=None, serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key), _descriptor.FieldDescriptor(name='machine', full_name='eve_public.app.platform.Information.machine', index=4, number=5, type=11, cpp_type=10, label=1, has_default_value=False, default_value=None, message_type=None, enum_type=None, containing_type=None, is_extension=False, extension_scope=None, serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key), - _descriptor.FieldDescriptor(name='process', full_name='eve_public.app.platform.Information.process', index=5, number=6, type=11, cpp_type=10, label=1, has_default_value=False, default_value=None, message_type=None, enum_type=None, containing_type=None, is_extension=False, extension_scope=None, serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key)], extensions=[], nested_types=[], enum_types=[], serialized_options=None, is_extendable=False, syntax='proto3', extension_ranges=[], oneofs=[], serialized_start=3035, serialized_end=3360) + _descriptor.FieldDescriptor(name='process', full_name='eve_public.app.platform.Information.process', index=5, number=6, type=11, cpp_type=10, label=1, has_default_value=False, default_value=None, message_type=None, enum_type=None, containing_type=None, is_extension=False, extension_scope=None, serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key)], extensions=[], nested_types=[], enum_types=[], serialized_options=None, is_extendable=False, syntax='proto3', extension_ranges=[], oneofs=[], serialized_start=3051, serialized_end=3376) _OS_GRAPHICSAPIS.containing_type = _OS _OS_WINE.containing_type = _OS _OS_STREAMINGSERVICE.fields_by_name['provider'].enum_type = _OS_STREAMINGSERVICE_PROVIDER diff --git a/imagecaching/__init__.py b/imagecaching/__init__.py @@ -0,0 +1,2 @@ +#Embedded file name: C:\BuildAgent\work\20d73f1b24eed06e\eve\release\V24.01\packages\imagecaching\__init__.py +pass diff --git a/imagecaching/client/__init__.py b/imagecaching/client/__init__.py @@ -0,0 +1,2 @@ +#Embedded file name: C:\BuildAgent\work\20d73f1b24eed06e\eve\release\V24.01\packages\imagecaching\client\__init__.py +pass diff --git a/imagecaching/client/api/__init__.py b/imagecaching/client/api/__init__.py @@ -0,0 +1,2 @@ +#Embedded file name: C:\BuildAgent\work\20d73f1b24eed06e\eve\release\V24.01\packages\imagecaching\client\api\__init__.py +pass diff --git a/imagecaching/client/api/error.py b/imagecaching/client/api/error.py @@ -0,0 +1,9 @@ +#Embedded file name: C:\BuildAgent\work\20d73f1b24eed06e\eve\release\V24.01\packages\imagecaching\client\api\error.py + + +class ImageCacheError(RuntimeError): + pass + + +class ImageDownloadError(ImageCacheError): + pass diff --git a/imagecaching/client/api/repository.py b/imagecaching/client/api/repository.py @@ -0,0 +1,14 @@ +#Embedded file name: C:\BuildAgent\work\20d73f1b24eed06e\eve\release\V24.01\packages\imagecaching\client\api\repository.py +from imagecaching.client.repository.repository import ImageCacheRepository +_repository = None + +def get_repository(): + global _repository + if _repository is None: + _repository = ImageCacheRepository() + return _repository + + +def clear_repository(): + global _repository + _repository = None diff --git a/imagecaching/client/api/signal.py b/imagecaching/client/api/signal.py @@ -0,0 +1,4 @@ +#Embedded file name: C:\BuildAgent\work\20d73f1b24eed06e\eve\release\V24.01\packages\imagecaching\client\api\signal.py +from signals import Signal +on_image_cached = Signal('imagecache.on_image_cached') +on_image_deleted = Signal('imagecache.on_image_deleted') diff --git a/imagecaching/client/compat.py b/imagecaching/client/compat.py @@ -0,0 +1,7 @@ +#Embedded file name: C:\BuildAgent\work\20d73f1b24eed06e\eve\release\V24.01\packages\imagecaching\client\compat.py +text_type = unicode + +def to_text(value, encoding = 'utf-8'): + if value is None or isinstance(value, text_type): + return value + return value.decode(encoding) diff --git a/imagecaching/client/const.py b/imagecaching/client/const.py @@ -0,0 +1,34 @@ +#Embedded file name: C:\BuildAgent\work\20d73f1b24eed06e\eve\release\V24.01\packages\imagecaching\client\const.py +import hashlib +import re +LOGGER_NAME = 'IMAGECACHE' +INDEX_FILENAME = u'image_cache.fb' +DEFAULT_BASE_PATH = u'cache:/Storage/imagecache' +USER_FOLDER = u'users' +OUTCOME_DOWNLOADED = u'downloaded' +OUTCOME_NOT_MODIFIED = u'not_modified' +OUTCOME_SERVED_STALE = u'served_stale' +OUTCOME_FAILED = u'failed' +_EXT_BY_MIME = {u'image/png': u'.png', + u'image/jpeg': u'.jpg'} +IMAGE_EXTENSIONS = frozenset(_EXT_BY_MIME.values()) + +def extension_for_content_type(content_type): + if not content_type: + return None + mime = content_type.split(u';', 1)[0].strip().lower() + return _EXT_BY_MIME.get(mime) + + +def user_cache_folder(user_id, feature_folder): + return u'%s/%d/%s' % (USER_FOLDER, user_id, feature_folder) + + +_UNSAFE_FILENAME_CHARS = re.compile('[^A-Za-z0-9._-]+') +_DIGEST_LENGTH = 8 +_MAX_SLUG_LENGTH = 40 + +def image_cache_path(cache_folder, image_id): + slug = _UNSAFE_FILENAME_CHARS.sub(u'_', image_id)[:_MAX_SLUG_LENGTH].strip(u'_') + digest = hashlib.sha1(image_id.encode('utf-8')).hexdigest()[:_DIGEST_LENGTH] + return u'%s/%s-%s' % (cache_folder, slug or u'image', digest) diff --git a/imagecaching/client/model/__init__.py b/imagecaching/client/model/__init__.py @@ -0,0 +1,2 @@ +#Embedded file name: C:\BuildAgent\work\20d73f1b24eed06e\eve\release\V24.01\packages\imagecaching\client\model\__init__.py +pass diff --git a/imagecaching/client/model/definitions/__init__.py b/imagecaching/client/model/definitions/__init__.py @@ -0,0 +1,2 @@ +#Embedded file name: C:\BuildAgent\work\20d73f1b24eed06e\eve\release\V24.01\packages\imagecaching\client\model\definitions\__init__.py +pass diff --git a/imagecaching/client/model/definitions/image/__init__.py b/imagecaching/client/model/definitions/image/__init__.py @@ -0,0 +1,2 @@ +#Embedded file name: C:\BuildAgent\work\20d73f1b24eed06e\eve\release\V24.01\packages\imagecaching\client\model\definitions\image\__init__.py +pass diff --git a/imagecaching/client/model/definitions/image/attributes.py b/imagecaching/client/model/definitions/image/attributes.py @@ -0,0 +1,32 @@ +#Embedded file name: C:\BuildAgent\work\20d73f1b24eed06e\eve\release\V24.01\packages\imagecaching\client\model\definitions\image\attributes.py +from imagecaching.client.compat import to_text +from imagecaching.client.model.flatbuffer.image_cache_generated import ImageInformation + +class ImageAttributes(object): + + def __init__(self, res_path, e_tag): + self._res_path = res_path + self._e_tag = e_tag + + @property + def res_path(self): + return self._res_path + + @property + def e_tag(self): + return self._e_tag + + @classmethod + def from_flatbuffer(cls, fb_data): + return ImageAttributes(res_path=to_text(fb_data.ResPath()), e_tag=to_text(fb_data.ETag())) + + def __eq__(self, other): + if other is None or not isinstance(other, ImageAttributes): + return False + return self.res_path == other.res_path and self.e_tag == other.e_tag + + def __ne__(self, other): + return not self.__eq__(other) + + def __str__(self): + return 'res_path: %s\n' % self.res_path + 'class: %s\n' % self.__class__.__name__ + 'e_tag: %s' % self.e_tag diff --git a/imagecaching/client/model/definitions/image/entry.py b/imagecaching/client/model/definitions/image/entry.py @@ -0,0 +1,49 @@ +#Embedded file name: C:\BuildAgent\work\20d73f1b24eed06e\eve\release\V24.01\packages\imagecaching\client\model\definitions\image\entry.py +from imagecaching.client.model.definitions.image.attributes import ImageAttributes +from imagecaching.client.model.definitions.image.identifier import ImageIdentifier +from imagecaching.client.model.flatbuffer.image_cache_generated import ImageInformationStart, ImageInformationAddImageId, ImageInformationAddResPath, ImageInformationAddETag, ImageInformationEnd +if False: + import flatbuffers + from imagecaching.client.model.flatbuffer.image_cache_generated import ImageInformation + +class ImageEntry(object): + + def __init__(self, identifier, attributes): + self._identifier = identifier + self._attributes = attributes + + @property + def identifier(self): + return self._identifier + + @property + def attributes(self): + return self._attributes + + @classmethod + def from_flatbuffer(cls, fb_data): + return ImageEntry(identifier=ImageIdentifier.from_flatbuffer(fb_data), attributes=ImageAttributes.from_flatbuffer(fb_data)) + + def to_flatbuffer(self, builder): + image_id_offset = builder.CreateString(self._identifier.image_id) if self._identifier.image_id is not None else None + res_path_offset = builder.CreateString(self._attributes.res_path) if self._attributes.res_path is not None else None + e_tag_offset = builder.CreateString(self._attributes.e_tag) if self._attributes.e_tag is not None else None + ImageInformationStart(builder) + if image_id_offset is not None: + ImageInformationAddImageId(builder, image_id_offset) + if res_path_offset is not None: + ImageInformationAddResPath(builder, res_path_offset) + if e_tag_offset is not None: + ImageInformationAddETag(builder, e_tag_offset) + return ImageInformationEnd(builder) + + def __eq__(self, other): + if other is None or not isinstance(other, ImageEntry): + return False + return self.identifier == other.identifier and self.attributes == other.attributes + + def __ne__(self, other): + return not self.__eq__(other) + + def __str__(self): + return 'identifier: %s\n' % self.identifier + 'class: %s\n' % self.__class__.__name__ + 'attributes: %s' % self.attributes diff --git a/imagecaching/client/model/definitions/image/identifier.py b/imagecaching/client/model/definitions/image/identifier.py @@ -0,0 +1,30 @@ +#Embedded file name: C:\BuildAgent\work\20d73f1b24eed06e\eve\release\V24.01\packages\imagecaching\client\model\definitions\image\identifier.py +from imagecaching.client.compat import to_text +from imagecaching.client.model.flatbuffer.image_cache_generated import ImageInformation + +class ImageIdentifier(object): + + def __init__(self, image_id): + self._image_id = image_id + + @property + def image_id(self): + return self._image_id + + @classmethod + def from_flatbuffer(cls, fb_data): + return ImageIdentifier(image_id=to_text(fb_data.ImageId())) + + def __eq__(self, other): + if other is None or not isinstance(other, ImageIdentifier): + return False + return self.image_id == other.image_id + + def __ne__(self, other): + return not self.__eq__(other) + + def __hash__(self): + return hash(self._image_id) + + def __str__(self): + return 'image_id: %s' % self.image_id diff --git a/imagecaching/client/model/flatbuffer/__init__.py b/imagecaching/client/model/flatbuffer/__init__.py @@ -0,0 +1,2 @@ +#Embedded file name: C:\BuildAgent\work\20d73f1b24eed06e\eve\release\V24.01\packages\imagecaching\client\model\flatbuffer\__init__.py +pass diff --git a/imagecaching/client/model/flatbuffer/image_cache_generated.py b/imagecaching/client/model/flatbuffer/image_cache_generated.py @@ -0,0 +1,110 @@ +#Embedded file name: C:\BuildAgent\work\20d73f1b24eed06e\eve\release\V24.01\packages\imagecaching\client\model\flatbuffer\image_cache_generated.py +import flatbuffers +from flatbuffers.compat import import_numpy +np = import_numpy() + +class ImageInformation(object): + __slots__ = ['_tab'] + + @classmethod + def GetRootAs(cls, buf, offset = 0): + n = flatbuffers.encode.Get(flatbuffers.packer.uoffset, buf, offset) + x = ImageInformation() + x.Init(buf, n + offset) + return x + + @classmethod + def GetRootAsImageInformation(cls, buf, offset = 0): + return cls.GetRootAs(buf, offset) + + def Init(self, buf, pos): + self._tab = flatbuffers.table.Table(buf, pos) + + def ImageId(self): + o = flatbuffers.number_types.UOffsetTFlags.py_type(self._tab.Offset(4)) + if o != 0: + return self._tab.String(o + self._tab.Pos) + + def ResPath(self): + o = flatbuffers.number_types.UOffsetTFlags.py_type(self._tab.Offset(6)) + if o != 0: + return self._tab.String(o + self._tab.Pos) + + def ETag(self): + o = flatbuffers.number_types.UOffsetTFlags.py_type(self._tab.Offset(8)) + if o != 0: + return self._tab.String(o + self._tab.Pos) + + +def ImageInformationStart(builder): + builder.StartObject(3) + + +def ImageInformationAddImageId(builder, imageId): + builder.PrependUOffsetTRelativeSlot(0, flatbuffers.number_types.UOffsetTFlags.py_type(imageId), 0) + + +def ImageInformationAddResPath(builder, resPath): + builder.PrependUOffsetTRelativeSlot(1, flatbuffers.number_types.UOffsetTFlags.py_type(resPath), 0) + + +def ImageInformationAddETag(builder, eTag): + builder.PrependUOffsetTRelativeSlot(2, flatbuffers.number_types.UOffsetTFlags.py_type(eTag), 0) + + +def ImageInformationEnd(builder): + return builder.EndObject() + + +class ImageList(object): + __slots__ = ['_tab'] + + @classmethod + def GetRootAs(cls, buf, offset = 0): + n = flatbuffers.encode.Get(flatbuffers.packer.uoffset, buf, offset) + x = ImageList() + x.Init(buf, n + offset) + return x + + @classmethod + def GetRootAsImageList(cls, buf, offset = 0): + return cls.GetRootAs(buf, offset) + + def Init(self, buf, pos): + self._tab = flatbuffers.table.Table(buf, pos) + + def Images(self, j): + o = flatbuffers.number_types.UOffsetTFlags.py_type(self._tab.Offset(4)) + if o != 0: + x = self._tab.Vector(o) + x += flatbuffers.number_types.UOffsetTFlags.py_type(j) * 4 + x = self._tab.Indirect(x) + obj = ImageInformation() + obj.Init(self._tab.Bytes, x) + return obj + + def ImagesLength(self): + o = flatbuffers.number_types.UOffsetTFlags.py_type(self._tab.Offset(4)) + if o != 0: + return self._tab.VectorLen(o) + return 0 + + def ImagesIsNone(self): + o = flatbuffers.number_types.UOffsetTFlags.py_type(self._tab.Offset(4)) + return o == 0 + + +def ImageListStart(builder): + builder.StartObject(1) + + +def ImageListAddImages(builder, images): + builder.PrependUOffsetTRelativeSlot(0, flatbuffers.number_types.UOffsetTFlags.py_type(images), 0) + + +def ImageListStartImagesVector(builder, numElems): + return builder.StartVector(4, numElems, 4) + + +def ImageListEnd(builder): + return builder.EndObject() diff --git a/imagecaching/client/repository/__init__.py b/imagecaching/client/repository/__init__.py @@ -0,0 +1,2 @@ +#Embedded file name: C:\BuildAgent\work\20d73f1b24eed06e\eve\release\V24.01\packages\imagecaching\client\repository\__init__.py +pass diff --git a/imagecaching/client/repository/downloader.py b/imagecaching/client/repository/downloader.py @@ -0,0 +1,81 @@ +#Embedded file name: C:\BuildAgent\work\20d73f1b24eed06e\eve\release\V24.01\packages\imagecaching\client\repository\downloader.py +import logging +import blue +import requests +from httplib import OK, NOT_MODIFIED +from imagecaching.client.compat import to_text +from imagecaching.client.const import LOGGER_NAME, extension_for_content_type +logger = logging.getLogger(LOGGER_NAME) +MAX_ATTEMPTS = 4 +REQUEST_TIMEOUT_SEC = 10 +HTTPS_PREFIX = u'https://' + +def _default_sleep(milliseconds): + blue.pyos.synchro.SleepWallclock(milliseconds) + + +class DownloadResult(object): + __slots__ = ['status', + 'data', + 'e_tag', + 'status_code', + 'error', + 'extension'] + + def __init__(self, status, data = None, e_tag = None, status_code = None, error = None, extension = None): + self.status = status + self.data = data + self.e_tag = e_tag + self.status_code = status_code + self.error = error + self.extension = extension + + +class ImageDownloader(object): + + def __init__(self, session = None, sleep = None): + self._session = session or requests.session() + self._sleep = sleep or _default_sleep + + def fetch(self, url, e_tag = None): + url = url.strip() + if not url.lower().startswith(HTTPS_PREFIX): + logger.warn('Refusing to fetch a non-https url: %s', url) + return DownloadResult(status=None, error=u'url is not https') + request_url = url.encode('ascii') + headers = {'If-None-Match': e_tag} if e_tag else {} + response, exc = self._make_request(request_url, headers) + if response is None: + logger.warn('Retries exhausted for %s: %s', url, exc) + return DownloadResult(status=None, error=u'%s' % (exc,) if exc else u'request failed') + final_url = to_text(response.url) or u'' + if not final_url.lower().startswith(HTTPS_PREFIX): + logger.warn('Refusing a redirect off https for %s: ended at %s', url, final_url) + return DownloadResult(status=None, status_code=response.status_code, error=u'redirected to a non-https url') + if response.status_code == NOT_MODIFIED: + return DownloadResult(status=NOT_MODIFIED, status_code=response.status_code) + if response.status_code != OK: + logger.warn('Unexpected response for %s: status=%s', url, response.status_code) + return DownloadResult(status=None, status_code=response.status_code, error=u'unexpected response (status=%s)' % response.status_code) + content_type = response.headers.get('Content-Type', None) + extension = extension_for_content_type(content_type) + if extension is None: + logger.warn('Refusing an unsupported content type for %s: %s', url, content_type) + return DownloadResult(status=None, status_code=response.status_code, error=u'unsupported image content-type (%s)' % content_type) + return DownloadResult(status=OK, data=response.content, e_tag=response.headers.get('ETag'), status_code=response.status_code, extension=extension) + + def _make_request(self, request_url, headers): + response = None + exc = None + for attempt in range(MAX_ATTEMPTS): + try: + response = self._session.get(request_url, headers=headers, timeout=REQUEST_TIMEOUT_SEC, allow_redirects=True) + break + except Exception as e: + exc = e + if attempt + 1 < MAX_ATTEMPTS: + backoff_seconds = 2 ** attempt + logger.warn('Retrying requesting image for url: %s. Sleeping for %s seconds. Attempts done so far: (%s/%s). Exception: %s', request_url, backoff_seconds, attempt + 1, MAX_ATTEMPTS, e) + self._sleep(backoff_seconds * 1000) + + return (response, exc) diff --git a/imagecaching/client/repository/flatbuffer_index.py b/imagecaching/client/repository/flatbuffer_index.py @@ -0,0 +1,116 @@ +#Embedded file name: C:\BuildAgent\work\20d73f1b24eed06e\eve\release\V24.01\packages\imagecaching\client\repository\flatbuffer_index.py +import os +import blue +import flatbuffers +import uthread2 +from locks import FifoLock, TempLock +from imagecaching.client.model.definitions.image.entry import ImageEntry +from imagecaching.client.model.definitions.image.identifier import ImageIdentifier +from imagecaching.client.model.flatbuffer.image_cache_generated import ImageList, ImageListStart, ImageListAddImages, ImageListStartImagesVector, ImageListEnd +from imagecaching.client.const import INDEX_FILENAME +if False: + from typing import Dict, Optional + +def _resolve_path_for_writing(res_path): + return blue.paths.ResolvePathForWriting(res_path) + + +class FolderIndex(object): + RETRY_DELAY = 0.1 + RETRY_ATTEMPTS = 5 + + def __init__(self, folder_res_path): + self._folder_res_path = folder_res_path + self._entries = {} + self._retry_attempts = FolderIndex.RETRY_ATTEMPTS + + @property + def folder_res_path(self): + return self._folder_res_path + + @property + def index_res_path(self): + return u'%s/%s' % (self._folder_res_path, INDEX_FILENAME) + + def get(self, image_id): + return self._entries.get(image_id) + + def identifiers(self): + return sorted(self._entries, key=lambda identifier: identifier.image_id) + + def upsert(self, image_entry): + self._entries[image_entry.identifier] = image_entry + + def remove(self, image_id): + return self._entries.pop(image_id, None) is not None + + def from_bytes(self, buf): + self._entries = {} + if not buf: + return + root = ImageList.GetRootAs(buf, 0) + for i in range(root.ImagesLength()): + entry = ImageEntry.from_flatbuffer(root.Images(i)) + self._entries[entry.identifier] = entry + + def to_bytes(self): + builder = flatbuffers.Builder(0) + image_offsets = [ entry.to_flatbuffer(builder) for entry in self._entries.values() ] + ImageListStartImagesVector(builder, len(image_offsets)) + for offset in reversed(image_offsets): + builder.PrependUOffsetTRelative(offset) + + images_vector = builder.EndVector() + ImageListStart(builder) + ImageListAddImages(builder, images_vector) + root = ImageListEnd(builder) + builder.Finish(root) + return builder.Output() + + def _access_lock(self): + return TempLock(self.index_res_path, FifoLock) + + def _retry_wrapper(self, impl_method, *args, **kwargs): + with self._access_lock(): + for attempt in range(self._retry_attempts): + try: + return impl_method(*args, **kwargs) + except (OSError, IOError): + if attempt < self._retry_attempts - 1: + uthread2.Sleep(FolderIndex.RETRY_DELAY) + else: + raise + + def load(self): + self._retry_wrapper(self._load_impl) + + def _load_impl(self): + path = _resolve_path_for_writing(self.index_res_path) + if not os.path.exists(path): + self._entries = {} + return + with open(path, 'rb') as index_file: + buf = index_file.read() + self.from_bytes(buf) + + def save(self): + self._retry_wrapper(self._save_impl) + + def _save_impl(self): + folder_path = _resolve_path_for_writing(self._folder_res_path) + if not os.path.exists(folder_path): + os.makedirs(folder_path) + path = _resolve_path_for_writing(self.index_res_path) + with open(path, 'wb') as index_file: + index_file.write(self.to_bytes()) + index_file.flush() + os.fsync(index_file.fileno()) + + def update(self, mutator): + + def _txn(): + self._load_impl() + mutator(self) + self._save_impl() + + self._retry_wrapper(_txn) diff --git a/imagecaching/client/repository/repository.py b/imagecaching/client/repository/repository.py @@ -0,0 +1,161 @@ +#Embedded file name: C:\BuildAgent\work\20d73f1b24eed06e\eve\release\V24.01\packages\imagecaching\client\repository\repository.py +import logging +import os +import re +import sys +import blue +from httplib import NOT_MODIFIED +from imagecaching.client.api.error import ImageCacheError +from imagecaching.client.api.signal import on_image_cached, on_image_deleted +from imagecaching.client.const import DEFAULT_BASE_PATH, IMAGE_EXTENSIONS, LOGGER_NAME, OUTCOME_NOT_MODIFIED, OUTCOME_FAILED, OUTCOME_DOWNLOADED, OUTCOME_SERVED_STALE +from imagecaching.client.model.definitions.image.attributes import ImageAttributes +from imagecaching.client.model.definitions.image.entry import ImageEntry +from imagecaching.client.model.definitions.image.identifier import ImageIdentifier +from imagecaching.client.repository.downloader import ImageDownloader +from imagecaching.client.repository.flatbuffer_index import FolderIndex +from locks.singleFlight import single_flight +logger = logging.getLogger(LOGGER_NAME) +_MOUNT_PREFIX = re.compile('^[A-Za-z0-9_]+:/') + +def _resolve_path_for_writing(res_path): + return blue.paths.ResolvePathForWriting(res_path) + + +class ImageCacheRepository(object): + + def __init__(self, downloader = None): + self._downloader = downloader or ImageDownloader() + self.last_status_code = None + self.last_error = None + self.last_outcome = None + + @single_flight + def cache_image(self, image_id, url, cache_path): + cache_path = self._resolve_uri(cache_path) + folder = cache_path.rsplit(u'/', 1)[0] + index = FolderIndex(folder) + index.load() + identifier = ImageIdentifier(image_id) + existing = index.get(identifier) + cached = existing if existing and self._image_file_exists(existing.attributes.res_path) else None + result = self._downloader.fetch(url, cached.attributes.e_tag if cached else None) + self.last_status_code = result.status_code + self.last_error = result.error + if result.status is None: + self.last_outcome = OUTCOME_SERVED_STALE if cached else OUTCOME_FAILED + if cached: + return cached.attributes.res_path + return + if result.status == NOT_MODIFIED: + if cached: + self.last_outcome = OUTCOME_NOT_MODIFIED + return cached.attributes.res_path + self.last_outcome = OUTCOME_FAILED + return + base, old_ext = os.path.splitext(cache_path) + if old_ext.lower() in IMAGE_EXTENSIONS: + cache_path = base + result.extension + else: + cache_path += result.extension + self._write_image_file(cache_path, result.data) + self._invalidate_res_manager(cache_path) + if existing and existing.attributes.res_path != cache_path: + self._delete_image_file(existing.attributes.res_path) + self._invalidate_res_manager(existing.attributes.res_path) + entry = ImageEntry(identifier, ImageAttributes(cache_path, result.e_tag)) + index.update(lambda idx: idx.upsert(entry)) + self.last_outcome = OUTCOME_DOWNLOADED + on_image_cached(image_id, cache_path) + return cache_path + + def delete_image(self, image_id, cache_path): + cache_path = self._resolve_uri(cache_path) + folder = cache_path.rsplit(u'/', 1)[0] + index = FolderIndex(folder) + index.load() + identifier = ImageIdentifier(image_id) + existing = index.get(identifier) + res_path = existing.attributes.res_path if existing else cache_path + self._delete_image_file(res_path) + self._invalidate_res_manager(res_path) + removed = [False] + + def _remove(idx): + removed[0] = idx.remove(identifier) + + index.update(_remove) + if removed[0]: + on_image_deleted(image_id, res_path) + return removed[0] + + def list_entries(self, cache_folder): + index = self._load_folder_index(cache_folder) + return [ index.get(identifier) for identifier in index.identifiers() ] + + def list_image_ids(self, cache_folder): + return [ entry.identifier.image_id for entry in self.list_entries(cache_folder) ] + + def prune_folder(self, cache_folder, keep_image_ids): + keep = set(keep_image_ids) + deleted = [] + for entry in self.list_entries(cache_folder): + image_id = entry.identifier.image_id + if image_id in keep: + continue + if self.delete_image(image_id, entry.attributes.res_path): + deleted.append(image_id) + + return deleted + + @classmethod + def _load_folder_index(cls, cache_folder): + index = FolderIndex(cls._resolve_uri(cache_folder)) + index.load() + return index + + @staticmethod + def _resolve_uri(cache_path): + if _MOUNT_PREFIX.match(cache_path): + return cache_path + return u'%s/%s' % (DEFAULT_BASE_PATH, cache_path.lstrip(u'/')) + + @staticmethod + def _write_image_file(cache_path, data): + folder_path = _resolve_path_for_writing(cache_path.rsplit(u'/', 1)[0]) + try: + os.makedirs(folder_path) + except OSError: + if not os.path.isdir(folder_path): + raise + sys.exc_clear() + + resfile = blue.classes.CreateInstance('blue.ResFile') + opened = resfile.Open(cache_path, 0) + if not opened: + opened = resfile.Create(cache_path) + if not opened: + raise ImageCacheError(u'Could not open cache file for writing: %s' % cache_path) + try: + resfile.Write(data) + finally: + resfile.Close() + + @staticmethod + def _image_file_exists(cache_path): + return os.path.exists(_resolve_path_for_writing(cache_path)) + + @staticmethod + def _delete_image_file(cache_path): + try: + os.remove(_resolve_path_for_writing(cache_path)) + except OSError: + sys.exc_clear() + + @staticmethod + def _invalidate_res_manager(cache_path): + try: + res = blue.resMan.GetResource(str(cache_path), 'atlas') + if res: + res.Reload() + except SystemError: + sys.exc_clear() diff --git a/imagecaching/demo/__init__.py b/imagecaching/demo/__init__.py @@ -0,0 +1,2 @@ +#Embedded file name: C:\BuildAgent\work\20d73f1b24eed06e\eve\release\V24.01\packages\imagecaching\demo\__init__.py +pass diff --git a/imagecaching/demo/image_cache_demo_window.py b/imagecaching/demo/image_cache_demo_window.py @@ -0,0 +1,226 @@ +#Embedded file name: C:\BuildAgent\work\20d73f1b24eed06e\eve\release\V24.01\packages\imagecaching\demo\image_cache_demo_window.py +import logging +import blue +import carbonui +import eveui +import uthread2 +from httplib import responses +from carbonui import fontconst, uiconst, Align +from carbonui.control.dragResizeCont import DragResizeCont +from carbonui.control.singlelineedits.singleLineEditText import SingleLineEditText +from carbonui.control.window import Window +from carbonui.primitives.container import Container +from carbonui.primitives.containerAutoSize import ContainerAutoSize +from carbonui.primitives.sprite import Sprite +from carbonui.uiconst import PickState +from eve.client.script.ui.control.eveEditPlainText import EditPlainText +from eve.client.script.ui.control.eveLabel import EveLabelMedium +from imagecaching.client.api.repository import get_repository +from imagecaching.client.const import INDEX_FILENAME, LOGGER_NAME, OUTCOME_SERVED_STALE, OUTCOME_NOT_MODIFIED, image_cache_path +logger = logging.getLogger(LOGGER_NAME) +MARGIN = 8 +PREVIEW_SIZE = 512 +INDEX_PANEL_HEIGHT = 140 +INDEX_PANEL_MIN_PROPORTION = 0.15 +INDEX_PANEL_MAX_PROPORTION = 0.75 +INDEX_PANEL_SETTINGS_ID = 'imageCacheDemoIndexPanel' +DEFAULT_URL = u'https://images.evetech.net/types/587/render?size=512' +DEFAULT_FOLDER = u'demo' + +class ImageCacheDemoWindow(Window): + __guid__ = 'ImageCacheDemoTool' + default_caption = 'Image Cache Demo' + default_captionLabelPath = None + default_windowID = 'ImageCacheDemoTool' + default_iconNum = 'res:/Ui/Texture/WindowIcons/info.png' + default_width = PREVIEW_SIZE + 4 * MARGIN + default_height = PREVIEW_SIZE + 220 + INDEX_PANEL_HEIGHT + MARGIN + default_minSize = (440, 420) + panelID = default_windowID + + def ApplyAttributes(self, attributes): + super(ImageCacheDemoWindow, self).ApplyAttributes(attributes) + self._last_cache_path = None + self._last_image_id = None + self._last_folder = None + self._construct_layout() + + def _construct_layout(self): + self.main_container = Container(name='main_container', parent=self.content, padding=MARGIN) + self._construct_inputs() + self._construct_buttons() + self._construct_index_panel() + self._construct_path_label() + self._construct_preview() + + def _construct_inputs(self): + self.input_container = ContainerAutoSize(name='input_container', parent=self.main_container, align=Align.TOTOP, height=70) + self.url_edit = SingleLineEditText(name='url_edit', parent=self.input_container, align=Align.TOTOP, setvalue=DEFAULT_URL, height=18, label='Image URL', padding=(0, 10, 0, 0)) + self.folder_edit = SingleLineEditText(name='folder_edit', parent=self.input_container, align=Align.TOTOP, setvalue=DEFAULT_FOLDER, height=18, label='Folder (relative to cache:/Storage/imagecache)', padding=(0, 30, 0, 0)) + + def _construct_buttons(self): + self.button_container = Container(name='button_container', parent=self.main_container, align=Align.TOTOP, height=70, top=MARGIN) + left = 0 + self.fetch_button = self._construct_button(name='fetch_button', label='FETCH & CACHE', func=self._on_fetch, width=120, left=left, variant=carbonui.ButtonVariant.PRIMARY) + left += 120 + MARGIN + self.open_button = self._construct_button(name='open_button', label='OPEN FOLDER', func=self._on_open_folder, width=110, left=left, enabled=False) + left += 110 + MARGIN + self.delete_button = self._construct_button(name='delete_button', label='DELETE', func=self._on_delete, width=80, left=left, enabled=False) + left += 80 + MARGIN + self.index_button = self._construct_button(name='index_button', label='SHOW INDEX', func=self._on_show_index, width=110, left=left) + + def _construct_button(self, name, label, func, width, left, variant = None, enabled = True): + return eveui.Button(name=name, parent=self.button_container, state=eveui.State.normal, align=Align.CENTERLEFT, variant=variant or carbonui.ButtonVariant.GHOST, density=carbonui.Density.COMPACT, label=label, func=lambda x: func(), width=width, left=left, enabled=enabled) + + def _construct_preview(self): + self.preview_container = Container(name='preview_container', parent=self.main_container, align=Align.TOALL, padTop=MARGIN, border_style='bright_blue') + self.preview = Sprite(name='preview', parent=self.preview_container, align=Align.CENTER_PRESERVE_ASPECT, state=uiconst.UI_NORMAL, pickState=PickState.OFF) + + def _construct_path_label(self): + self.path_label = EveLabelMedium(name='path_label', parent=self.main_container, align=Align.TOBOTTOM, padding=(0, + MARGIN, + 0, + MARGIN), text='No image cached yet.') + + def _construct_index_panel(self): + self.index_panel = DragResizeCont(name='index_panel', parent=self.main_container, align=Align.TOBOTTOM, defaultSize=INDEX_PANEL_HEIGHT, minSize=INDEX_PANEL_MIN_PROPORTION, maxSize=INDEX_PANEL_MAX_PROPORTION, settingsID=INDEX_PANEL_SETTINGS_ID, show_line=True) + self.index_text = EditPlainText(name='index_text', parent=self.index_panel.mainCont, align=Align.TOALL, readonly=True, ignoreTags=True, fontPath=fontconst.CONSOLA_PATH, fontsize=12) + self._set_index_text(u'Index not read yet - press SHOW INDEX.') + + def _on_fetch(self): + url = self.url_edit.GetValue() + folder = self.folder_edit.GetValue() + if not url: + self.path_label.text = 'Enter an image URL first.' + return + image_id = url + cache_path = image_cache_path(folder, image_id) + self.path_label.text = 'Fetching...' + self.fetch_button.enabled = False + uthread2.StartTasklet(self._fetch_worker, image_id, url, cache_path, folder) + + def _fetch_worker(self, image_id, url, cache_path, folder): + res_path = None + status_code = None + error_text = None + outcome = None + try: + repo = get_repository() + res_path = repo.cache_image(image_id, url, cache_path) + status_code = repo.last_status_code + error_text = repo.last_error + outcome = repo.last_outcome + except Exception as e: + logger.exception('Image cache demo: failed to cache %s', url) + error_text = u'%s' % (e,) + finally: + self._on_fetch_done(image_id, folder, res_path, status_code, error_text, outcome) + + def _on_fetch_done(self, image_id, folder, res_path, status_code = None, error_text = None, outcome = None): + if self.destroyed: + return + self.fetch_button.enabled = True + self._start_index_refresh(folder) + if res_path is None: + self.preview.texturePath = None + text = u'Failed to fetch/cache the image.%s' % self._describe_status(status_code) + if error_text: + text += u' %s' % error_text + self.path_label.text = text + self.open_button.enabled = False + self.delete_button.enabled = False + return + self._last_cache_path = res_path + self._last_image_id = image_id + self._last_folder = folder + self.preview.texturePath = res_path + self.path_label.text = u'%s\n%s' % (self._describe_outcome(outcome, status_code, error_text), res_path) + self.open_button.enabled = True + self.delete_button.enabled = True + + @classmethod + def _describe_outcome(cls, outcome, status_code, error_text): + if outcome == OUTCOME_NOT_MODIFIED: + return u'Already cached - ETag matched, not re-downloaded.%s' % cls._describe_status(status_code) + if outcome == OUTCOME_SERVED_STALE: + detail = cls._describe_status(status_code) + if error_text: + detail += u' %s' % error_text + return u'Could not refresh; showing previously cached copy.%s' % detail + return u'Downloaded.%s' % cls._describe_status(status_code) + + @staticmethod + def _describe_status(status_code): + if status_code is None: + return u'' + return u' (HTTP %s %s)' % (status_code, responses.get(status_code, u'?')) + + def _on_open_folder(self): + if not self._last_cache_path: + return + folder_uri = self._last_cache_path.rsplit(u'/', 1)[0] + fs_folder = blue.paths.ResolvePath(folder_uri) + blue.os.ShellExecute(fs_folder) + + def _on_show_index(self): + self._start_index_refresh(self.folder_edit.GetValue()) + + def _on_delete(self): + if not self._last_image_id: + return + try: + get_repository().delete_image(self._last_image_id, self._last_cache_path) + except Exception: + logger.exception('Image cache demo: failed to delete %s', self._last_image_id) + self.path_label.text = 'Failed to delete the cached image.' + return + + folder = self._last_folder + self.preview.texturePath = None + self.path_label.text = 'Deleted: %s' % self._last_cache_path + self._last_cache_path = None + self._last_image_id = None + self._last_folder = None + self.open_button.enabled = False + self.delete_button.enabled = False + self._start_index_refresh(folder) + + def _start_index_refresh(self, folder): + if not folder: + return + uthread2.StartTasklet(self._index_worker, folder) + + def _index_worker(self, folder): + entries = [] + error_text = None + try: + entries = get_repository().list_entries(folder) + except Exception as e: + logger.exception('Image cache demo: failed to read the index of %s', folder) + error_text = u'%s' % (e,) + + self._on_index_read(folder, entries, error_text) + + def _on_index_read(self, folder, entries, error_text = None): + if self.destroyed: + return + index_path = u'%s/%s' % (folder, INDEX_FILENAME) + if error_text: + self._set_index_text(u'Could not read %s: %s' % (index_path, error_text)) + return + lines = [u'%s - %s' % (index_path, self._describe_entry_count(len(entries)))] + lines.extend((self._describe_entry(entry) for entry in entries)) + self._set_index_text(u'\n'.join(lines)) + + def _set_index_text(self, text): + self.index_text.SetValue(text, scrolltotop=1) + + @staticmethod + def _describe_entry_count(count): + if count == 1: + return u'1 entry' + return u'%s entries' % count + + @staticmethod + def _describe_entry(entry): + return u'%s\n res_path: %s\n e_tag: %s' % (entry.identifier.image_id, entry.attributes.res_path, entry.attributes.e_tag) diff --git a/multiprocessing/pool.pyc b/multiprocessing/pool.pyc Binary files differ. diff --git a/store/client/model/__init__.py b/store/client/model/__init__.py @@ -0,0 +1,2 @@ +#Embedded file name: C:\BuildAgent\work\20d73f1b24eed06e\eve\release\V24.01\packages\store\client\model\__init__.py +pass diff --git a/store/client/model/flatbuffer/__init__.py b/store/client/model/flatbuffer/__init__.py @@ -0,0 +1,2 @@ +#Embedded file name: C:\BuildAgent\work\20d73f1b24eed06e\eve\release\V24.01\packages\store\client\model\flatbuffer\__init__.py +pass diff --git a/store/client/model/flatbuffer/offer_notification_state_generated.py b/store/client/model/flatbuffer/offer_notification_state_generated.py @@ -0,0 +1,192 @@ +#Embedded file name: C:\BuildAgent\work\20d73f1b24eed06e\eve\release\V24.01\packages\store\client\model\flatbuffer\offer_notification_state_generated.py +import flatbuffers +from flatbuffers.compat import import_numpy +np = import_numpy() + +class OfferNotificationState(object): + NONE = 0 + Seen = 1 + Dismissed = 2 + + +class Seen(object): + __slots__ = ['_tab'] + + @classmethod + def GetRootAs(cls, buf, offset = 0): + n = flatbuffers.encode.Get(flatbuffers.packer.uoffset, buf, offset) + x = Seen() + x.Init(buf, n + offset) + return x + + @classmethod + def GetRootAsSeen(cls, buf, offset = 0): + return cls.GetRootAs(buf, offset) + + def Init(self, buf, pos): + self._tab = flatbuffers.table.Table(buf, pos) + + def IsSeen(self): + o = flatbuffers.number_types.UOffsetTFlags.py_type(self._tab.Offset(4)) + if o != 0: + return bool(self._tab.Get(flatbuffers.number_types.BoolFlags, o + self._tab.Pos)) + return False + + +def SeenStart(builder): + builder.StartObject(1) + + +def SeenAddIsSeen(builder, isSeen): + builder.PrependBoolSlot(0, isSeen, 0) + + +def SeenEnd(builder): + return builder.EndObject() + + +class Dismissed(object): + __slots__ = ['_tab'] + + @classmethod + def GetRootAs(cls, buf, offset = 0): + n = flatbuffers.encode.Get(flatbuffers.packer.uoffset, buf, offset) + x = Dismissed() + x.Init(buf, n + offset) + return x + + @classmethod + def GetRootAsDismissed(cls, buf, offset = 0): + return cls.GetRootAs(buf, offset) + + def Init(self, buf, pos): + self._tab = flatbuffers.table.Table(buf, pos) + + def IsDismissed(self): + o = flatbuffers.number_types.UOffsetTFlags.py_type(self._tab.Offset(4)) + if o != 0: + return bool(self._tab.Get(flatbuffers.number_types.BoolFlags, o + self._tab.Pos)) + return False + + +def DismissedStart(builder): + builder.StartObject(1) + + +def DismissedAddIsDismissed(builder, isDismissed): + builder.PrependBoolSlot(0, isDismissed, 0) + + +def DismissedEnd(builder): + return builder.EndObject() + + +class Offer(object): + __slots__ = ['_tab'] + + @classmethod + def GetRootAs(cls, buf, offset = 0): + n = flatbuffers.encode.Get(flatbuffers.packer.uoffset, buf, offset) + x = Offer() + x.Init(buf, n + offset) + return x + + @classmethod + def GetRootAsOffer(cls, buf, offset = 0): + return cls.GetRootAs(buf, offset) + + def Init(self, buf, pos): + self._tab = flatbuffers.table.Table(buf, pos) + + def OfferId(self): + o = flatbuffers.number_types.UOffsetTFlags.py_type(self._tab.Offset(4)) + if o != 0: + return self._tab.String(o + self._tab.Pos) + + def NotificationStateType(self): + o = flatbuffers.number_types.UOffsetTFlags.py_type(self._tab.Offset(6)) + if o != 0: + return self._tab.Get(flatbuffers.number_types.Uint8Flags, o + self._tab.Pos) + return 0 + + def NotificationState(self): + o = flatbuffers.number_types.UOffsetTFlags.py_type(self._tab.Offset(8)) + if o != 0: + from flatbuffers.table import Table + obj = Table(bytearray(), 0) + self._tab.Union(obj, o) + return obj + + +def OfferStart(builder): + builder.StartObject(3) + + +def OfferAddOfferId(builder, offerId): + builder.PrependUOffsetTRelativeSlot(0, flatbuffers.number_types.UOffsetTFlags.py_type(offerId), 0) + + +def OfferAddNotificationStateType(builder, notificationStateType): + builder.PrependUint8Slot(1, notificationStateType, 0) + + +def OfferAddNotificationState(builder, notificationState): + builder.PrependUOffsetTRelativeSlot(2, flatbuffers.number_types.UOffsetTFlags.py_type(notificationState), 0) + + +def OfferEnd(builder): + return builder.EndObject() + + +class Offers(object): + __slots__ = ['_tab'] + + @classmethod + def GetRootAs(cls, buf, offset = 0): + n = flatbuffers.encode.Get(flatbuffers.packer.uoffset, buf, offset) + x = Offers() + x.Init(buf, n + offset) + return x + + @classmethod + def GetRootAsOffers(cls, buf, offset = 0): + return cls.GetRootAs(buf, offset) + + def Init(self, buf, pos): + self._tab = flatbuffers.table.Table(buf, pos) + + def Offers(self, j): + o = flatbuffers.number_types.UOffsetTFlags.py_type(self._tab.Offset(4)) + if o != 0: + x = self._tab.Vector(o) + x += flatbuffers.number_types.UOffsetTFlags.py_type(j) * 4 + x = self._tab.Indirect(x) + obj = Offer() + obj.Init(self._tab.Bytes, x) + return obj + + def OffersLength(self): + o = flatbuffers.number_types.UOffsetTFlags.py_type(self._tab.Offset(4)) + if o != 0: + return self._tab.VectorLen(o) + return 0 + + def OffersIsNone(self): + o = flatbuffers.number_types.UOffsetTFlags.py_type(self._tab.Offset(4)) + return o == 0 + + +def OffersStart(builder): + builder.StartObject(1) + + +def OffersAddOffers(builder, offers): + builder.PrependUOffsetTRelativeSlot(0, flatbuffers.number_types.UOffsetTFlags.py_type(offers), 0) + + +def OffersStartOffersVector(builder, numElems): + return builder.StartVector(4, numElems, 4) + + +def OffersEnd(builder): + return builder.EndObject() diff --git a/store/client/targetaudience/__init__.py b/store/client/targetaudience/__init__.py @@ -0,0 +1,2 @@ +#Embedded file name: C:\BuildAgent\work\20d73f1b24eed06e\eve\release\V24.01\packages\store\client\targetaudience\__init__.py +pass diff --git a/store/client/targetaudience/catalogue_svc.py b/store/client/targetaudience/catalogue_svc.py @@ -0,0 +1,150 @@ +#Embedded file name: C:\BuildAgent\work\20d73f1b24eed06e\eve\release\V24.01\packages\store\client\targetaudience\catalogue_svc.py +from __future__ import absolute_import, division, print_function +import logging +from collections import namedtuple +import evetypes +import uthread +from caching.memoize import MemoizeWithLock +from imagecaching.client.api.error import ImageCacheError +from imagecaching.client.api.repository import get_repository +from imagecaching.client.const import user_cache_folder +from publicGateway.grpc.exceptions import GenericException +from stackless_response_router.exceptions import TimeoutException +from store.client.const import LOG_ENTRY_NAME +from store.client.targetaudience.const import MAX_OFFER_LIST_PAGES, OFFER_CACHE_TTL_MINUTES, OFFER_LIST_PAGE_SIZE, TAO_IMAGE_CACHE_FOLDER +from store.client.targetaudience.feature_flags import tao_enabled +from store.client.targetaudience.messenger.request_messenger import PublicTargetAudienceOfferRequestMessenger +logger = logging.getLogger(__name__) +CatalogueOffer = namedtuple('CatalogueOffer', ['offer_id', 'offer', 'thumbnail_res_path']) +_instance = None + +@MemoizeWithLock(OFFER_CACHE_TTL_MINUTES) +def get_catalogue(): + return get_catalogue_svc().fetch_catalogue() + + +def get_catalogue_svc(): + global _instance + if not tao_enabled(): + logger.info('%s - target audience offers are disabled, returning no service', LOG_ENTRY_NAME) + return + if _instance is None: + _instance = _CatalogueSvc(request_messenger=PublicTargetAudienceOfferRequestMessenger(sm.GetService('publicGatewaySvc')), image_repository=get_repository(), service_manager=sm) + return _instance + + +def clear_catalogue_svc(): + global _instance + if _instance is not None: + _instance.shutdown() + _instance = None + get_catalogue.clear_memoized() + + +class _CatalogueSvc(object): + __startupdependencies__ = ['publicGatewaySvc'] + __notifyevents__ = ['OnSessionChanged'] + + def __init__(self, request_messenger, image_repository, service_manager): + self._request_messenger = request_messenger + self._image_repository = image_repository + self._service_manager = service_manager + self._service_manager.RegisterNotify(self) + + def shutdown(self): + self._service_manager.UnregisterNotify(self) + + def OnSessionChanged(self, _is_remote, _session, change): + if 'userid' in change or 'charid' in change: + get_catalogue.clear_memoized() + + def fetch_catalogue(self): + if not tao_enabled(): + logger.info('%s - target audience offers are disabled, returning an empty catalogue', LOG_ENTRY_NAME) + return [] + cache_folder = _thumbnail_cache_folder() + if cache_folder is None: + logger.info('%s - no logged-in user, returning an empty target audience catalogue', LOG_ENTRY_NAME) + return [] + offer_ids = self._list_offer_ids() + offers = self._get_offers(offer_ids) + catalogue = [] + for offer_id in offer_ids: + offer = offers.get(offer_id) + if offer is None: + continue + if not self._has_known_type_ids(offer_id, offer): + continue + catalogue.append(CatalogueOffer(offer_id=offer_id, offer=offer, thumbnail_res_path=self._cache_thumbnail(cache_folder, offer_id, offer))) + + self._prune_thumbnails(cache_folder, [ x.offer_id for x in catalogue ]) + logger.info('%s - target audience catalogue fetched: %s of %s offers usable', LOG_ENTRY_NAME, len(catalogue), len(offer_ids)) + return catalogue + + def _list_offer_ids(self): + offer_ids = [] + page_token = None + for _page in range(MAX_OFFER_LIST_PAGES): + page_offer_ids, page_token = self._request_messenger.list_offers_request(page_size=OFFER_LIST_PAGE_SIZE, page_token=page_token) + offer_ids.extend(page_offer_ids) + if page_token is None: + break + else: + logger.error('%s - target audience offers pages exceed the maximum amount of %s pages', LOG_ENTRY_NAME, MAX_OFFER_LIST_PAGES) + + return offer_ids + + def _get_offers(self, offer_ids): + offers = {} + calls = [ (self._get_offer, (offer_id, offers)) for offer_id in offer_ids ] + if calls: + uthread.parallel(calls) + return offers + + def _get_offer(self, offer_id, offers): + try: + offer = self._request_messenger.get_offer_request(offer_id) + except (GenericException, TimeoutException): + logger.exception('%s - could not fetch target audience offer %s', LOG_ENTRY_NAME, offer_id) + return + + if offer is not None: + offers[offer_id] = offer + + @staticmethod + def _has_known_type_ids(offer_id, offer): + for type_id in offer.get_type_ids(): + if not evetypes.Exists(type_id): + logger.warning('%s - dropping target audience offer %s, it grants unknown item type id %s', LOG_ENTRY_NAME, offer_id, type_id) + return False + + return True + + def _cache_thumbnail(self, cache_folder, offer_id, offer): + if not offer.thumbnail_url: + return None + try: + return self._image_repository.cache_image(_image_id(offer_id), offer.thumbnail_url, _thumbnail_cache_path(cache_folder, offer_id)) + except ImageCacheError: + logger.exception('%s - could not cache the thumbnail of target audience offer %s', LOG_ENTRY_NAME, offer_id) + return None + + def _prune_thumbnails(self, cache_folder, offer_ids): + deleted_image_ids = self._image_repository.prune_folder(cache_folder, [ _image_id(x) for x in offer_ids ]) + if deleted_image_ids: + logger.info('%s - pruned %s stale target audience thumbnails', LOG_ENTRY_NAME, len(deleted_image_ids)) + + +def _image_id(offer_id): + return u'%s' % offer_id.catalogue_entry_name + + +def _thumbnail_cache_folder(): + user_id = getattr(session, 'userid', None) + if user_id is None: + return + return user_cache_folder(user_id, TAO_IMAGE_CACHE_FOLDER) + + +def _thumbnail_cache_path(cache_folder, offer_id): + return u'%s/%s' % (cache_folder, _image_id(offer_id)) diff --git a/store/client/targetaudience/compat.py b/store/client/targetaudience/compat.py @@ -0,0 +1,7 @@ +#Embedded file name: C:\BuildAgent\work\20d73f1b24eed06e\eve\release\V24.01\packages\store\client\targetaudience\compat.py +text_type = unicode + +def to_text(value, encoding = 'utf-8'): + if value is None or isinstance(value, text_type): + return value + return value.decode(encoding) diff --git a/store/client/targetaudience/const.py b/store/client/targetaudience/const.py @@ -0,0 +1,8 @@ +#Embedded file name: C:\BuildAgent\work\20d73f1b24eed06e\eve\release\V24.01\packages\store\client\targetaudience\const.py +from __future__ import absolute_import, division, print_function +TAO_IMAGE_CACHE_FOLDER = u'targetaudience' +TAO_STORAGE_FOLDER = u'targetaudienceoffers' +TAO_NOTIFICATION_STATE_FOLDER = u'notificationstate' +OFFER_CACHE_TTL_MINUTES = 5 +OFFER_LIST_PAGE_SIZE = 100 +MAX_OFFER_LIST_PAGES = 10 diff --git a/store/client/targetaudience/feature_flags.py b/store/client/targetaudience/feature_flags.py @@ -0,0 +1,4 @@ +#Embedded file name: C:\BuildAgent\work\20d73f1b24eed06e\eve\release\V24.01\packages\store\client\targetaudience\feature_flags.py +from featuremanagement.client.flag import flag_bool +from tao_signals import on_tao_enabled_changed +tao_enabled = flag_bool(key='eve_tao_enabled', default_value=False, callback=on_tao_enabled_changed) diff --git a/store/client/targetaudience/messenger/__init__.py b/store/client/targetaudience/messenger/__init__.py @@ -0,0 +1,2 @@ +#Embedded file name: C:\BuildAgent\work\20d73f1b24eed06e\eve\release\V24.01\packages\store\client\targetaudience\messenger\__init__.py +pass diff --git a/store/client/targetaudience/messenger/request_messenger.py b/store/client/targetaudience/messenger/request_messenger.py @@ -0,0 +1,88 @@ +#Embedded file name: C:\BuildAgent\work\20d73f1b24eed06e\eve\release\V24.01\packages\store\client\targetaudience\messenger\request_messenger.py +from __future__ import absolute_import, division, print_function +import logging +from localization.const import LOCALE_SHORT_ENGLISH +from publicGateway.grpc.exceptions import GenericException +from stackless_response_router.exceptions import TimeoutException +from store.client.const import LOG_ENTRY_NAME +from store.client.targetaudience.offer import TargetAudienceOffer +from store.client.targetaudience.offer_identifier import TargetAudienceOfferIdentifier +from eveProto.generated.eve_public.public_pb2 import Page +from eveProto.generated.eve_public.store.targetaudience.offer.api.requests_pb2 import GetRequest, GetResponse, ListRequest, ListResponse +_TIMEOUT_SECONDS = 5 +_DEFAULT_PAGE_SIZE = 100 +logger = logging.getLogger(__name__) + +class PublicTargetAudienceOfferRequestMessenger(object): + + def __init__(self, public_gateway): + self.public_gateway = public_gateway + + def get_offer_request(self, offer_identifier, language = None): + offer_id = TargetAudienceOfferIdentifier.to_proto(offer_identifier) + if language is None: + request = GetRequest(offer_id=offer_id, all_languages=True) + else: + request = GetRequest(offer_id=offer_id, specified_language=language) + info_log = '{log_entry} - Get target audience offer id {id} '.format(log_entry=LOG_ENTRY_NAME, id=offer_identifier) + try: + response_primitive, response_payload = self._blocking_request(request, GetResponse) + if response_payload is None: + info_log += 'Response: no offer found. ' + return + info_log += 'Response: offer found: {offer}. '.format(offer=response_payload.offer) + return TargetAudienceOffer.build_from_proto(response_payload.offer) + except GenericException as exc: + status_code = exc.response_primitive.status_code + info_log += 'ERROR (status_code={status_code})'.format(status_code=status_code) + logger.exception('Unexpected exception when requesting target audience offer: %s', exc) + raise + except TimeoutException as exc: + info_log += 'TIMED OUT' + logger.exception('Timed out when requesting target audience offer: %s', exc) + raise + finally: + logger.info(info_log) + + def list_offers_request(self, page_size = _DEFAULT_PAGE_SIZE, page_token = None): + first_page = page_token is None + page = Page(size=page_size, token=page_token if not first_page else '') + request = ListRequest(page=page) + info_log = '{log_entry} - List target audience offers '.format(log_entry=LOG_ENTRY_NAME) + if first_page: + info_log += ' - first page. ' + else: + info_log += ' - page {token}. '.format(token=page_token) + try: + response_primitive, response_payload = self._blocking_request(request, ListResponse) + if response_payload is None: + if first_page: + info_log += 'Response: no offers found. ' + else: + info_log += 'Response: no offers found on page {token}. '.format(token=page_token) + return ([], None) + if first_page: + info_log += 'Response: {amount} offers found on first page. '.format(amount=len(response_payload.offer_ids)) + else: + info_log += 'Response: {amount} offers found on page {token}. '.format(amount=len(response_payload.offer_ids), token=page_token) + next_page_token = response_payload.next_page.token if response_payload.next_page.token else None + offer_identifiers = [ TargetAudienceOfferIdentifier.build_from_proto(x) for x in response_payload.offer_ids ] + return (offer_identifiers, next_page_token) + except GenericException as exc: + status_code = exc.response_primitive.status_code + info_log += 'ERROR (status_code={status_code})'.format(status_code=status_code) + logger.exception('Unexpected exception when listing target audience offers: %s', exc) + raise + except TimeoutException as exc: + info_log += 'TIMED OUT' + logger.exception('Timed out when listing target audience offers: %s', exc) + raise + finally: + logger.info(info_log) + + def _blocking_request(self, request, response_class): + request_primitive, response_channel = self.public_gateway.send_user_request(request, response_class, _TIMEOUT_SECONDS) + response_primitive, payload = response_channel.receive() + if response_primitive.status_code != 200: + raise GenericException(request_primitive, response_primitive) + return (response_primitive, payload) diff --git a/store/client/targetaudience/notification_state.py b/store/client/targetaudience/notification_state.py @@ -0,0 +1,78 @@ +#Embedded file name: C:\BuildAgent\work\20d73f1b24eed06e\eve\release\V24.01\packages\store\client\targetaudience\notification_state.py +from __future__ import absolute_import, division, print_function +import flatbuffers +from store.client.targetaudience.compat import to_text +from store.client.model.flatbuffer.offer_notification_state_generated import Dismissed, DismissedAddIsDismissed, DismissedEnd, DismissedStart, OfferAddNotificationState, OfferAddNotificationStateType, OfferAddOfferId, OfferEnd, OfferNotificationState, Offers, OffersAddOffers, OffersEnd, OffersStart, OffersStartOffersVector, OfferStart, Seen, SeenAddIsSeen, SeenEnd, SeenStart +STATE_UNSEEN = u'unseen' +STATE_SEEN = u'seen' +STATE_DISMISSED = u'dismissed' +_UNION_TYPE_BY_STATE = {STATE_SEEN: OfferNotificationState.Seen, + STATE_DISMISSED: OfferNotificationState.Dismissed} + +def states_from_bytes(payload_bytes): + if not payload_bytes: + return {} + root = Offers.GetRootAs(payload_bytes, 0) + states = {} + for i in range(root.OffersLength()): + fb_offer = root.Offers(i) + offer_key = to_text(fb_offer.OfferId()) + state = _state_from_flatbuffer(fb_offer) + if offer_key and state != STATE_UNSEEN: + states[offer_key] = state + + return states + + +def states_to_bytes(states): + builder = flatbuffers.Builder(0) + offer_offsets = [ _offer_to_flatbuffer(builder, offer_key, states[offer_key]) for offer_key in sorted(states) if states[offer_key] != STATE_UNSEEN ] + OffersStartOffersVector(builder, len(offer_offsets)) + for offset in reversed(offer_offsets): + builder.PrependUOffsetTRelative(offset) + + offers_vector = builder.EndVector() + OffersStart(builder) + OffersAddOffers(builder, offers_vector) + builder.Finish(OffersEnd(builder)) + return builder.Output() + + +def _state_from_flatbuffer(fb_offer): + state_table = fb_offer.NotificationState() + if state_table is None: + return STATE_UNSEEN + state_type = fb_offer.NotificationStateType() + if state_type == OfferNotificationState.Seen: + seen = Seen() + seen.Init(state_table.Bytes, state_table.Pos) + if seen.IsSeen(): + return STATE_SEEN + return STATE_UNSEEN + if state_type == OfferNotificationState.Dismissed: + dismissed = Dismissed() + dismissed.Init(state_table.Bytes, state_table.Pos) + if dismissed.IsDismissed(): + return STATE_DISMISSED + return STATE_UNSEEN + return STATE_UNSEEN + + +def _offer_to_flatbuffer(builder, offer_key, state): + offer_id_offset = builder.CreateString(offer_key) + state_offset = _state_to_flatbuffer(builder, state) + OfferStart(builder) + OfferAddOfferId(builder, offer_id_offset) + OfferAddNotificationStateType(builder, _UNION_TYPE_BY_STATE[state]) + OfferAddNotificationState(builder, state_offset) + return OfferEnd(builder) + + +def _state_to_flatbuffer(builder, state): + if state == STATE_DISMISSED: + DismissedStart(builder) + DismissedAddIsDismissed(builder, True) + return DismissedEnd(builder) + SeenStart(builder) + SeenAddIsSeen(builder, True) + return SeenEnd(builder) diff --git a/store/client/targetaudience/notification_state_repository.py b/store/client/targetaudience/notification_state_repository.py @@ -0,0 +1,111 @@ +#Embedded file name: C:\BuildAgent\work\20d73f1b24eed06e\eve\release\V24.01\packages\store\client\targetaudience\notification_state_repository.py +from __future__ import absolute_import, division, print_function +import logging +from caching.client.storage.disk_storage import BinaryDiskStorage +from imagecaching.client.const import user_cache_folder +from locks import FifoLock, TempLock +from store.client.const import LOG_ENTRY_NAME +from store.client.targetaudience.const import TAO_NOTIFICATION_STATE_FOLDER, TAO_STORAGE_FOLDER +from store.client.targetaudience.feature_flags import tao_enabled +from store.client.targetaudience.notification_state import STATE_DISMISSED, STATE_SEEN, STATE_UNSEEN, states_from_bytes, states_to_bytes +logger = logging.getLogger(__name__) +_instance = None + +def get_notification_state_repository(): + global _instance + if not tao_enabled(): + logger.info('%s - target audience offers are disabled, returning an empty catalogue', LOG_ENTRY_NAME) + return [] + if _instance is None: + _instance = OfferNotificationStateRepository() + return _instance + + +def clear_notification_state_repository(): + global _instance + _instance = None + + +def notification_state_content_id(user_id): + return u'%s/%s' % (TAO_STORAGE_FOLDER, user_cache_folder(user_id, TAO_NOTIFICATION_STATE_FOLDER)) + + +class OfferNotificationStateRepository(object): + + def __init__(self, storage_factory = None): + self._storage_factory = storage_factory or BinaryDiskStorage + self._storage_by_user = {} + self._states_by_user = {} + + def get_state(self, offer_id): + return self._states(offer_id.user_id).get(_offer_key(offer_id), STATE_UNSEEN) + + def mark_seen(self, offer_id): + self._update(offer_id, _seen_after) + + def mark_dismissed(self, offer_id): + self._update(offer_id, _dismissed_after) + + def _update(self, offer_id, transition): + user_id = offer_id.user_id + offer_key = _offer_key(offer_id) + with TempLock(notification_state_content_id(user_id), FifoLock): + states = self._load(user_id) + self._states_by_user[user_id] = states + current_state = states.get(offer_key, STATE_UNSEEN) + new_state = transition(current_state) + if new_state == current_state: + return + states[offer_key] = new_state + self._save(user_id, states) + + def _states(self, user_id): + states = self._states_by_user.get(user_id) + if states is not None: + return states + with TempLock(notification_state_content_id(user_id), FifoLock): + states = self._states_by_user.get(user_id) + if states is None: + states = self._load(user_id) + self._states_by_user[user_id] = states + return states + + def _load(self, user_id): + try: + payload_bytes = self._storage(user_id).get() + except (OSError, IOError): + logger.exception('%s - could not read the target audience notification state of user %s', LOG_ENTRY_NAME, user_id) + return {} + + try: + return states_from_bytes(payload_bytes) + except Exception: + logger.exception('%s - discarding the unreadable target audience notification state of user %s', LOG_ENTRY_NAME, user_id) + return {} + + def _save(self, user_id, states): + try: + self._storage(user_id).set(states_to_bytes(states)) + except (OSError, IOError): + logger.exception('%s - could not persist the target audience notification state of user %s', LOG_ENTRY_NAME, user_id) + + def _storage(self, user_id): + storage = self._storage_by_user.get(user_id) + if storage is None: + storage = self._storage_factory(notification_state_content_id(user_id)) + self._storage_by_user[user_id] = storage + return storage + + +def _offer_key(offer_id): + return u'%s' % offer_id.catalogue_entry_name + + +def _seen_after(current_state): + if current_state == STATE_DISMISSED: + return current_state + return STATE_SEEN + + +def _dismissed_after(_current_state): + return STATE_DISMISSED diff --git a/store/client/targetaudience/offer.py b/store/client/targetaudience/offer.py @@ -0,0 +1,344 @@ +#Embedded file name: C:\BuildAgent\work\20d73f1b24eed06e\eve\release\V24.01\packages\store\client\targetaudience\offer.py +from __future__ import absolute_import, division, print_function +from datetime import datetime +from eveProto.generated.eve_public.inventory.generic_item_type_pb2 import Identifier as ItemTypeIdentifier +from eveProto.generated.eve_public.store.targetaudience.image_resource_pb2 import ImageResource +from eveProto.generated.eve_public.store.targetaudience.localized_text_pb2 import LocalizedEntry, LocalizedText +from eveProto.generated.eve_public.store.targetaudience.offer.content_pb2 import BlueprintCopyGrant, Content, EveItemGrant, GrantedProduct, LicenceGrant, PlexGrant +from eveProto.generated.eve_public.store.targetaudience.offer.offer_pb2 import Attributes as OfferAttributes +from eveProto.generated.eve_public.store.targetaudience.offer.overlay_pb2 import Overlay +from eveProto.generated.eve_public.store.targetaudience.offer.price_pb2 import PlexPrice, Price, PriceInCurrency + +def _build_localized_text_from_proto(payload): + return {entry.id:entry.text for entry in payload.entries} + + +def _localized_text_to_proto(text_by_language): + return LocalizedText(entries=[ LocalizedEntry(id=language, text=text) for language, text in sorted(text_by_language.items()) ]) + + +class TargetAudienceOfferPrice(object): + PRICE_TYPE_FREE = 'free' + PRICE_TYPE_REAL_MONEY = 'real_money_price' + PRICE_TYPE_PLEX = 'plex_price' + + def __init__(self, price_type, currency_prices = None, plex_price_in_cents = None): + self._price_type = price_type + self._currency_prices = currency_prices if currency_prices is not None else [] + self._plex_price_in_cents = plex_price_in_cents + + @property + def price_type(self): + return self._price_type + + @property + def currency_prices(self): + return self._currency_prices + + @property + def plex_price_in_cents(self): + return self._plex_price_in_cents + + def is_free(self): + return self.price_type == self.PRICE_TYPE_FREE + + def has_currency_prices(self): + return self.price_type == self.PRICE_TYPE_REAL_MONEY + + def has_plex_price(self): + return self.price_type == self.PRICE_TYPE_PLEX + + @classmethod + def build_from_proto(cls, payload): + price_type = payload.WhichOneof('price_details') + currency_prices = [] + plex_price_in_cents = None + if price_type == cls.PRICE_TYPE_REAL_MONEY: + currency_prices = [ (x.currency, x.amount_in_cents) for x in payload.real_money_price.prices ] + elif price_type == cls.PRICE_TYPE_PLEX: + plex_price_in_cents = payload.plex_price.amount_in_cents + return TargetAudienceOfferPrice(price_type=price_type, currency_prices=currency_prices, plex_price_in_cents=plex_price_in_cents) + + @classmethod + def to_proto(cls, price): + if price.is_free(): + return Price(free=True) + if price.has_currency_prices(): + prices = [ PriceInCurrency(currency=currency, amount_in_cents=amount_in_cents) for currency, amount_in_cents in price.currency_prices ] + return Price(real_money_price=Price.Payable(prices=prices)) + if price.has_plex_price(): + return Price(plex_price=PlexPrice(amount_in_cents=price.plex_price_in_cents)) + return Price() + + def __eq__(self, other): + return other is not None and self.price_type == other.price_type and self.currency_prices == other.currency_prices and self.plex_price_in_cents == other.plex_price_in_cents + + def __ne__(self, other): + return not self.__eq__(other) + + +class TargetAudienceOfferGrantedProduct(object): + GRANT_TYPE_EVE_ITEM = 'eve_item' + GRANT_TYPE_BLUEPRINT_COPY = 'blueprint_copy' + GRANT_TYPE_LICENCE = 'licence' + GRANT_TYPE_PLEX = 'plex' + EXPIRY_TYPE_LICENCE_DAYS = 'licence_days' + EXPIRY_TYPE_FIXED_DAY = 'fixed_expiry_day' + + def __init__(self, grant_type, quantity, type_id = None, soulbound = False, blueprint_runs = 0, blueprint_material_level = 0, blueprint_productivity_level = 0, licence_entitlement_id = '', licence_days = None, licence_expiry = None): + self._grant_type = grant_type + self._quantity = quantity + self._type_id = type_id + self._soulbound = soulbound + self._blueprint_runs = blueprint_runs + self._blueprint_material_level = blueprint_material_level + self._blueprint_productivity_level = blueprint_productivity_level + self._licence_entitlement_id = licence_entitlement_id + self._licence_days = licence_days + self._licence_expiry = licence_expiry + + @property + def grant_type(self): + return self._grant_type + + @property + def quantity(self): + return self._quantity + + @property + def type_id(self): + return self._type_id + + @property + def soulbound(self): + return self._soulbound + + @property + def blueprint_runs(self): + return self._blueprint_runs + + @property + def blueprint_material_level(self): + return self._blueprint_material_level + + @property + def blueprint_productivity_level(self): + return self._blueprint_productivity_level + + @property + def licence_entitlement_id(self): + return self._licence_entitlement_id + + @property + def licence_days(self): + return self._licence_days + + @property + def licence_expiry(self): + return self._licence_expiry + + def is_eve_item(self): + return self.grant_type == self.GRANT_TYPE_EVE_ITEM + + def is_blueprint_copy(self): + return self.grant_type == self.GRANT_TYPE_BLUEPRINT_COPY + + def is_licence(self): + return self.grant_type == self.GRANT_TYPE_LICENCE + + def is_plex(self): + return self.grant_type == self.GRANT_TYPE_PLEX + + def has_type_id(self): + return self.type_id is not None + + @classmethod + def build_from_proto(cls, payload): + grant_type = payload.WhichOneof('grant') + type_id = None + soulbound = False + blueprint_runs = 0 + blueprint_material_level = 0 + blueprint_productivity_level = 0 + licence_entitlement_id = '' + licence_days = None + licence_expiry = None + if grant_type == cls.GRANT_TYPE_EVE_ITEM: + type_id = payload.eve_item.type_id.sequential + soulbound = payload.eve_item.soulbound + elif grant_type == cls.GRANT_TYPE_BLUEPRINT_COPY: + type_id = payload.blueprint_copy.type_id.sequential + blueprint_runs = payload.blueprint_copy.runs + blueprint_material_level = payload.blueprint_copy.material_level + blueprint_productivity_level = payload.blueprint_copy.productivity_level + elif grant_type == cls.GRANT_TYPE_LICENCE: + licence_entitlement_id = payload.licence.entitlement_id + expiry_type = payload.licence.WhichOneof('expiry') + if expiry_type == cls.EXPIRY_TYPE_LICENCE_DAYS: + licence_days = payload.licence.licence_days + elif expiry_type == cls.EXPIRY_TYPE_FIXED_DAY: + licence_expiry = datetime.fromtimestamp(payload.licence.fixed_expiry_day.ToSeconds()) + return TargetAudienceOfferGrantedProduct(grant_type=grant_type, quantity=payload.quantity, type_id=type_id, soulbound=soulbound, blueprint_runs=blueprint_runs, blueprint_material_level=blueprint_material_level, blueprint_productivity_level=blueprint_productivity_level, licence_entitlement_id=licence_entitlement_id, licence_days=licence_days, licence_expiry=licence_expiry) + + @classmethod + def to_proto(cls, granted_product): + if granted_product.is_eve_item(): + return GrantedProduct(quantity=granted_product.quantity, eve_item=EveItemGrant(type_id=ItemTypeIdentifier(sequential=granted_product.type_id), soulbound=granted_product.soulbound)) + if granted_product.is_blueprint_copy(): + return GrantedProduct(quantity=granted_product.quantity, blueprint_copy=BlueprintCopyGrant(type_id=ItemTypeIdentifier(sequential=granted_product.type_id), runs=granted_product.blueprint_runs, material_level=granted_product.blueprint_material_level, productivity_level=granted_product.blueprint_productivity_level)) + if granted_product.is_licence(): + licence = LicenceGrant(entitlement_id=granted_product.licence_entitlement_id) + if granted_product.licence_days is not None: + licence.licence_days = granted_product.licence_days + elif granted_product.licence_expiry is not None: + licence.fixed_expiry_day.FromDatetime(granted_product.licence_expiry) + return GrantedProduct(quantity=granted_product.quantity, licence=licence) + if granted_product.is_plex(): + return GrantedProduct(quantity=granted_product.quantity, plex=PlexGrant()) + return GrantedProduct(quantity=granted_product.quantity) + + def __eq__(self, other): + return other is not None and self.grant_type == other.grant_type and self.quantity == other.quantity and self.type_id == other.type_id and self.soulbound == other.soulbound and self.blueprint_runs == other.blueprint_runs and self.blueprint_material_level == other.blueprint_material_level and self.blueprint_productivity_level == other.blueprint_productivity_level and self.licence_entitlement_id == other.licence_entitlement_id and self.licence_days == other.licence_days and self.licence_expiry == other.licence_expiry + + def __ne__(self, other): + return not self.__eq__(other) + + +class TargetAudienceOfferContent(object): + + def __init__(self, name, title, description, quantity, thumbnail_url, granted_products): + self._name = name + self._title = title + self._description = description + self._quantity = quantity + self._thumbnail_url = thumbnail_url + self._granted_products = granted_products + + @property + def name(self): + return self._name + + @property + def title(self): + return self._title + + @property + def description(self): + return self._description + + @property + def quantity(self): + return self._quantity + + @property + def thumbnail_url(self): + return self._thumbnail_url + + @property + def granted_products(self): + return self._granted_products + + def get_type_ids(self): + return [ x.type_id for x in self.granted_products if x.has_type_id() ] + + @classmethod + def build_from_proto(cls, payload): + return TargetAudienceOfferContent(name=payload.name, title=_build_localized_text_from_proto(payload.title), description=_build_localized_text_from_proto(payload.description), quantity=payload.quantity, thumbnail_url=payload.thumbnail.signed_cdn_url, granted_products=[ TargetAudienceOfferGrantedProduct.build_from_proto(x) for x in payload.granted_products ]) + + @classmethod + def to_proto(cls, content): + return Content(name=content.name, title=_localized_text_to_proto(content.title), description=_localized_text_to_proto(content.description), quantity=content.quantity, thumbnail=ImageResource(signed_cdn_url=content.thumbnail_url), granted_products=[ TargetAudienceOfferGrantedProduct.to_proto(x) for x in content.granted_products ]) + + def __eq__(self, other): + return other is not None and self.name == other.name and self.title == other.title and self.description == other.description and self.quantity == other.quantity and self.thumbnail_url == other.thumbnail_url and self.granted_products == other.granted_products + + def __ne__(self, other): + return not self.__eq__(other) + + +class TargetAudienceOffer(object): + + def __init__(self, title, description, last_issued, expiry, thumbnail_url, contents, price, comparison_price, overlays, notification_types): + self._title = title + self._description = description + self._last_issued = last_issued + self._expiry = expiry + self._thumbnail_url = thumbnail_url + self._contents = contents + self._price = price + self._comparison_price = comparison_price + self._overlays = overlays + self._notification_types = notification_types + + @property + def title(self): + return self._title + + @property + def description(self): + return self._description + + @property + def last_issued(self): + return self._last_issued + + @property + def expiry(self): + return self._expiry + + @property + def thumbnail_url(self): + return self._thumbnail_url + + @property + def contents(self): + return self._contents + + @property + def price(self): + return self._price + + @property + def comparison_price(self): + return self._comparison_price + + @property + def overlays(self): + return self._overlays + + @property + def notification_types(self): + return self._notification_types + + def has_comparison_price(self): + return self.comparison_price is not None + + def get_type_ids(self): + return [ type_id for content in self.contents for type_id in content.get_type_ids() ] + + @classmethod + def build_from_proto(cls, payload): + has_comparison_price = payload.WhichOneof('comparison_price_details') == 'comparison_price' + return TargetAudienceOffer(title=_build_localized_text_from_proto(payload.title), description=_build_localized_text_from_proto(payload.description), last_issued=datetime.fromtimestamp(payload.last_issued.ToSeconds()) if payload.HasField('last_issued') else None, expiry=datetime.fromtimestamp(payload.expiry.ToSeconds()) if payload.HasField('expiry') else None, thumbnail_url=payload.nes_thumbnail.signed_cdn_url, contents=[ TargetAudienceOfferContent.build_from_proto(x) for x in payload.contents ], price=TargetAudienceOfferPrice.build_from_proto(payload.price), comparison_price=TargetAudienceOfferPrice.build_from_proto(payload.comparison_price) if has_comparison_price else None, overlays=[ (x.name, + _build_localized_text_from_proto(x.displayed_text), + x.overlay_type, + x.display_type) for x in payload.overlays ], notification_types=[ x for x in payload.notification_types ]) + + @classmethod + def to_proto(cls, offer): + payload = OfferAttributes(title=_localized_text_to_proto(offer.title), description=_localized_text_to_proto(offer.description), nes_thumbnail=ImageResource(signed_cdn_url=offer.thumbnail_url), contents=[ TargetAudienceOfferContent.to_proto(x) for x in offer.contents ], price=TargetAudienceOfferPrice.to_proto(offer.price), overlays=[ Overlay(name=name, displayed_text=_localized_text_to_proto(displayed_text), overlay_type=overlay_type, display_type=display_type) for name, displayed_text, overlay_type, display_type in offer.overlays ], notification_types=offer.notification_types) + if offer.last_issued is not None: + payload.last_issued.FromDatetime(offer.last_issued) + if offer.expiry is not None: + payload.expiry.FromDatetime(offer.expiry) + if offer.has_comparison_price(): + payload.comparison_price.CopyFrom(TargetAudienceOfferPrice.to_proto(offer.comparison_price)) + else: + payload.no_comparison_price = True + return payload + + def __eq__(self, other): + return other is not None and self.title == other.title and self.description == other.description and self.last_issued == other.last_issued and self.expiry == other.expiry and self.thumbnail_url == other.thumbnail_url and self.contents == other.contents and self.price == other.price and self.comparison_price == other.comparison_price and self.overlays == other.overlays and self.notification_types == other.notification_types + + def __ne__(self, other): + return not self.__eq__(other) diff --git a/store/client/targetaudience/offer_identifier.py b/store/client/targetaudience/offer_identifier.py @@ -0,0 +1,39 @@ +#Embedded file name: C:\BuildAgent\work\20d73f1b24eed06e\eve\release\V24.01\packages\store\client\targetaudience\offer_identifier.py +from __future__ import absolute_import, division, print_function +from eveProto.generated.eve_public.store.targetaudience.catalogue.entry.entry_pb2 import Identifier as CatalogueEntryIdentifier +from eveProto.generated.eve_public.store.targetaudience.offer.offer_pb2 import Identifier as OfferIdentifier +from eveProto.generated.eve_public.user.user_pb2 import Identifier as UserIdentifier + +class TargetAudienceOfferIdentifier(object): + + def __init__(self, user_id, catalogue_entry_name): + self._user_id = user_id + self._catalogue_entry_name = catalogue_entry_name + + @property + def user_id(self): + return self._user_id + + @property + def catalogue_entry_name(self): + return self._catalogue_entry_name + + @classmethod + def build_from_proto(cls, payload): + return TargetAudienceOfferIdentifier(user_id=payload.user_id.sequential, catalogue_entry_name=payload.catalogue_entry.name) + + @classmethod + def to_proto(cls, offer_identifier): + return OfferIdentifier(user_id=UserIdentifier(sequential=offer_identifier.user_id), catalogue_entry=CatalogueEntryIdentifier(name=offer_identifier.catalogue_entry_name)) + + def __str__(self): + return '%s/%s' % (self.user_id, self.catalogue_entry_name) + + def __eq__(self, other): + return other is not None and self.user_id == other.user_id and self.catalogue_entry_name == other.catalogue_entry_name + + def __ne__(self, other): + return not self == other + + def __hash__(self): + return hash((self.user_id, self.catalogue_entry_name)) diff --git a/store/client/targetaudience/tao_signals.py b/store/client/targetaudience/tao_signals.py @@ -0,0 +1,3 @@ +#Embedded file name: C:\BuildAgent\work\20d73f1b24eed06e\eve\release\V24.01\packages\store\client\targetaudience\tao_signals.py +from signals import Signal +on_tao_enabled_changed = Signal('taget_audience_offers.on_enabled_changed')