bacommon package¶
Subpackages¶
Submodules¶
bacommon.app module¶
Common high level values/functionality related to apps.
- class bacommon.app.AppArchitecture(value, names=<not given>, *values, module=None, qualname=None, type=None, start=1, boundary=None)[source]¶
Bases:
Enum
Processor architecture the App is running on.
- ARM = 'arm'¶
- ARM64 = 'arm64'¶
- X86 = 'x86'¶
- X86_64 = 'x86_64'¶
- class bacommon.app.AppExperience(value, names=<not given>, *values, module=None, qualname=None, type=None, start=1, boundary=None)[source]¶
Bases:
Enum
A particular experience that can be provided by a Ballistica app.
This is one metric used to isolate different playerbases from each other where there might be no technical barriers doing so. For example, a casual one-hand-playable phone game and an augmented reality tabletop game may both use the same scene-versions and networking-protocols and whatnot, but it would make no sense to allow players of one to join servers of the other. AppExperience can be used to keep these player bases separate.
Generally a single Ballistica app targets a single AppExperience. This is not a technical requirement, however. A single app may support multiple experiences, or there may be multiple apps targeting one experience. Cloud components such as leagues are generally associated with an AppExperience so that they are only visible to client apps designed for that play style.
- EMPTY = 'empty'¶
- MELEE = 'melee'¶
- REMOTE = 'remote'¶
- class bacommon.app.AppInstanceInfo(interface_idiom: ~typing.Annotated[~bacommon.app.AppInterfaceIdiom, <efro.dataclassio.IOAttrs object at 0x7fa8a651aae0>], locale: ~typing.Annotated[str, <efro.dataclassio.IOAttrs object at 0x7fa8a651b0e0>], device: ~typing.Annotated[str | None, <efro.dataclassio.IOAttrs object at 0x7fa8a651b290>])[source]¶
Bases:
object
General info about an individual running app.
- architecture¶
alias of
Annotated
[AppArchitecture
, <efro.dataclassio.IOAttrs object at 0x7fa8a7b66cc0>]
- device: IOAttrs object at 0x7fa8a65194c0>]¶
- engine_build¶
alias of
Annotated
[int
, <efro.dataclassio.IOAttrs object at 0x7fa8a7b678c0>]
- engine_version¶
alias of
Annotated
[str
, <efro.dataclassio.IOAttrs object at 0x7fa8a7b67ad0>]
- interface_idiom: IOAttrs object at 0x7fa8a64e24b0>]¶
- locale: IOAttrs object at 0x7fa8a64e42f0>]¶
- name¶
alias of
Annotated
[str
, <efro.dataclassio.IOAttrs object at 0x7fa8a8672390>]
- os_version¶
alias of
Annotated
[str
|None
, <efro.dataclassio.IOAttrs object at 0x7fa8a7b677d0>]
- platform¶
alias of
Annotated
[AppPlatform
, <efro.dataclassio.IOAttrs object at 0x7fa8a7b675f0>]
- variant¶
alias of
Annotated
[AppVariant
, <efro.dataclassio.IOAttrs object at 0x7fa8a7b67ec0>]
- class bacommon.app.AppInterfaceIdiom(value, names=<not given>, *values, module=None, qualname=None, type=None, start=1, boundary=None)[source]¶
Bases:
Enum
A general form-factor or method of experiencing a Ballistica app.
Note that it is possible for a running app to switch idioms (for instance if a mobile device or computer is connected to a TV).
- DESKTOP = 'desktop'¶
- PHONE = 'phone'¶
- TABLET = 'tablet'¶
- TV = 'tv'¶
- XR = 'xr'¶
- class bacommon.app.AppPlatform(value, names=<not given>, *values, module=None, qualname=None, type=None, start=1, boundary=None)[source]¶
Bases:
Enum
Overall platform a Ballistica build is targeting.
Each distinct flavor of an app has a unique combination of AppPlatform and AppVariant. Generally platform describes a set of hardware, while variant describes a destination or purpose for the build.
- ANDROID = 'android'¶
- IOS = 'ios'¶
- LINUX = 'linux'¶
- MAC = 'mac'¶
- TVOS = 'tvos'¶
- WINDOWS = 'windows'¶
- class bacommon.app.AppVariant(value, names=<not given>, *values, module=None, qualname=None, type=None, start=1, boundary=None)[source]¶
Bases:
Enum
A unique Ballistica build type within a single platform.
Each distinct flavor of an app has a unique combination of AppPlatform and AppVariant. Generally platform describes a set of hardware, while variant describes a destination or purpose for the build.
- AMAZON_APPSTORE = 'amazon_appstore'¶
- APP_STORE = 'app_store'¶
- ARCADE = 'arcade'¶
- DEMO = 'demo'¶
- EPIC_GAMES_STORE = 'epic_games_store'¶
- GENERIC = 'generic'¶
- GOOGLE_PLAY = 'google_play'¶
- META = 'meta'¶
- STEAM = 'steam'¶
- TEST = 'test'¶
- WINDOWS_STORE = 'windows_store'¶
bacommon.assets module¶
Functionality related to cloud based assets.
- class bacommon.assets.AssetPackageBuildState(in_progress_builds: ~typing.Annotated[list[str], <efro.dataclassio.IOAttrs object at 0x7fa8a6336600>] = <factory>, initial_build_count: ~typing.Annotated[int, <efro.dataclassio.IOAttrs object at 0x7fa8a63367b0>] = 0, error: ~typing.Annotated[str | None, <efro.dataclassio.IOAttrs object at 0x7fa8a6336870>] = None)[source]¶
Bases:
object
Contains info about an in-progress asset cloud build.
- error: IOAttrs object at 0x7fa8a6337980>] = None¶
- in_progress_builds: IOAttrs object at 0x7fa8a63d81d0>]¶
- initial_build_count: IOAttrs object at 0x7fa8a63d88c0>] = 0¶
- class bacommon.assets.AssetPackageFlavor(value, names=<not given>, *values, module=None, qualname=None, type=None, start=1, boundary=None)[source]¶
Bases:
Enum
Flavors for asset package outputs for different platforms/etc.
- DESKTOP = 'desktop'¶
- MOBILE = 'mobile'¶
- class bacommon.assets.AssetPackageFlavorManifest(cloudfiles: ~typing.Annotated[dict[str, str], <efro.dataclassio.IOAttrs object at 0x7fa8a63d90a0>] = <factory>)[source]¶
Bases:
object
A manifest of asset info for a specific flavor of an asset package.
- cloudfiles: IOAttrs object at 0x7fa8a63d9d60>]¶
- class bacommon.assets.AssetType(value, names=<not given>, *values, module=None, qualname=None, type=None, start=1, boundary=None)[source]¶
Bases:
Enum
Types for individual assets within a package.
- COLLISION_MESH = 'collision_mesh'¶
- CUBE_TEXTURE = 'cube_texture'¶
- DATA = 'data'¶
- MESH = 'mesh'¶
- SOUND = 'sound'¶
- TEXTURE = 'texture'¶
bacommon.bacloud module¶
Functionality related to the bacloud tool.
- class bacommon.bacloud.RequestData(command: ~typing.Annotated[str, <efro.dataclassio.IOAttrs object at 0x7fa8a64125d0>], token: ~typing.Annotated[str | None, <efro.dataclassio.IOAttrs object at 0x7fa8a64126c0>], payload: ~typing.Annotated[dict, <efro.dataclassio.IOAttrs object at 0x7fa8a6412840>], tzoffset: ~typing.Annotated[float, <efro.dataclassio.IOAttrs object at 0x7fa8a64128a0>], isatty: ~typing.Annotated[bool, <efro.dataclassio.IOAttrs object at 0x7fa8a6412990>])[source]¶
Bases:
object
Request sent to bacloud server.
- command: IOAttrs object at 0x7fa8a6413fb0>]¶
- isatty: IOAttrs object at 0x7fa8a6428e30>]¶
- payload: IOAttrs object at 0x7fa8a6429ac0>]¶
- token: IOAttrs object at 0x7fa8a6429fa0>]¶
- tzoffset: IOAttrs object at 0x7fa8a64e0e30>]¶
- class bacommon.bacloud.ResponseData(message: Annotated[str | None, IOAttrs('m', store_default=False)] = None, message_end: Annotated[str, IOAttrs('m_end', store_default=False)] = '\n', error: Annotated[str | None, IOAttrs('e', store_default=False)] = None, delay_seconds: Annotated[float, IOAttrs('d', store_default=False)] = 0.0, login: Annotated[str | None, IOAttrs('l', store_default=False)] = None, logout: Annotated[bool, IOAttrs('lo', store_default=False)] = False, dir_manifest: Annotated[str | None, IOAttrs('man', store_default=False)] = None, uploads: Annotated[tuple[list[str], str, dict] | None, IOAttrs('u', store_default=False)] = None, uploads_inline: Annotated[list[str] | None, IOAttrs('uinl', store_default=False)] = None, deletes: Annotated[list[str] | None, IOAttrs('dlt', store_default=False)] = None, downloads: Annotated[Downloads | None, IOAttrs('dl', store_default=False)] = None, downloads_inline: Annotated[dict[str, bytes] | None, IOAttrs('dinl', store_default=False)] = None, dir_prune_empty: Annotated[str | None, IOAttrs('dpe', store_default=False)] = None, open_url: Annotated[str | None, IOAttrs('url', store_default=False)] = None, input_prompt: Annotated[tuple[str, bool] | None, IOAttrs('inp', store_default=False)] = None, end_message: Annotated[str | None, IOAttrs('em', store_default=False)] = None, end_message_end: Annotated[str, IOAttrs('eme', store_default=False)] = '\n', end_command: Annotated[tuple[str, dict] | None, IOAttrs('ec', store_default=False)] = None)[source]¶
Bases:
object
Response sent from the bacloud server to the client.
- message¶
If present, client should print this message before any other response processing (including error handling) occurs.
- Type:
Annotated[str | None, IOAttrs(‘m’, store_default=False)]
- message_end¶
end arg for message print() call.
- Type:
Annotated[str, IOAttrs(‘m_end’, store_default=False)]
- error¶
If present, client should abort with this error message.
- Type:
Annotated[str | None, IOAttrs(‘e’, store_default=False)]
- delay_seconds¶
How long to wait before proceeding with remaining response (can be useful when waiting for server progress in a loop).
- Type:
Annotated[float, IOAttrs(‘d’, store_default=False)]
- login¶
If present, a token that should be stored client-side and passed with subsequent commands.
- Type:
Annotated[str | None, IOAttrs(‘l’, store_default=False)]
- logout¶
If True, any existing client-side token should be discarded.
- Type:
Annotated[bool, IOAttrs(‘lo’, store_default=False)]
- dir_manifest¶
If present, client should generate a manifest of this dir. It should be added to end_command args as ‘manifest’.
- Type:
Annotated[str | None, IOAttrs(‘man’, store_default=False)]
- uploads¶
If present, client should upload the requested files (arg1) individually to a server command (arg2) with provided args (arg3).
- Type:
Annotated[tuple[list[str], str, dict] | None, IOAttrs(‘u’, store_default=False)]
- uploads_inline¶
If present, a list of pathnames that should be gzipped and uploaded to an ‘uploads_inline’ bytes dict in end_command args. This should be limited to relatively small files.
- Type:
Annotated[list[str] | None, IOAttrs(‘uinl’, store_default=False)]
- deletes¶
If present, file paths that should be deleted on the client.
- Type:
Annotated[list[str] | None, IOAttrs(‘dlt’, store_default=False)]
- downloads¶
If present, describes files the client should individually request from the server if not already present on the client.
- downloads_inline¶
If present, pathnames mapped to gzipped data to be written to the client. This should only be used for relatively small files as they are all included inline as part of the response.
- Type:
Annotated[dict[str, bytes] | None, IOAttrs(‘dinl’, store_default=False)]
- dir_prune_empty¶
If present, all empty dirs under this one should be removed.
- Type:
Annotated[str | None, IOAttrs(‘dpe’, store_default=False)]
- open_url¶
If present, url to display to the user.
- Type:
Annotated[str | None, IOAttrs(‘url’, store_default=False)]
- input_prompt¶
If present, a line of input is read and placed into end_command args as ‘input’. The first value is the prompt printed before reading and the second is whether it should be read as a password (without echoing to the terminal).
- Type:
Annotated[tuple[str, bool] | None, IOAttrs(‘inp’, store_default=False)]
- end_message¶
If present, a message that should be printed after all other response processing is done.
- Type:
Annotated[str | None, IOAttrs(‘em’, store_default=False)]
- end_message_end¶
end arg for end_message print() call.
- Type:
Annotated[str, IOAttrs(‘eme’, store_default=False)]
- end_command¶
If present, this command is run with these args at the end of response processing.
- Type:
Annotated[tuple[str, dict] | None, IOAttrs(‘ec’, store_default=False)]
- class Downloads(basepath: Annotated[str | None, IOAttrs('p')], cmd: Annotated[str, IOAttrs('c')], baseargs: Annotated[dict[str, str], IOAttrs('a')], entries: Annotated[list[Entry], IOAttrs('e')])[source]¶
Bases:
object
Info about downloads included in a response.
- class Entry(path: ~typing.Annotated[str, <efro.dataclassio.IOAttrs object at 0x7fa8a642ba10>], args: ~typing.Annotated[dict[str, str], <efro.dataclassio.IOAttrs object at 0x7fa8a642b980>])[source]¶
Bases:
object
Individual download.
- args: IOAttrs object at 0x7fa8a61488c0>]¶
- path: IOAttrs object at 0x7fa8a6148ec0>]¶
bacommon.bs module¶
BombSquad specific bits.
- class bacommon.bs.BasicClientUI(components: Annotated[list[BasicClientUIComponent], IOAttrs('s')], interaction_style: Annotated[InteractionStyle, IOAttrs('i', enum_fallback=InteractionStyle.UNKNOWN)] = InteractionStyle.BUTTON_POSITIVE, button_label_positive: Annotated[ButtonLabel, IOAttrs('p', enum_fallback=ButtonLabel.UNKNOWN)] = ButtonLabel.OK, button_label_negative: Annotated[ButtonLabel, IOAttrs('n', enum_fallback=ButtonLabel.UNKNOWN)] = ButtonLabel.CANCEL)[source]¶
Bases:
ClientUI
A basic UI for the client.
- class ButtonLabel(value, names=<not given>, *values, module=None, qualname=None, type=None, start=1, boundary=None)[source]¶
Bases:
Enum
Distinct button labels we support.
- ACCEPT = 'ac'¶
- APPLY = 'a'¶
- CANCEL = 'c'¶
- CLAIM = 'cl'¶
- DECLINE = 'dn'¶
- DISCARD = 'd'¶
- IGNORE = 'ig'¶
- OK = 'o'¶
- UNKNOWN = 'u'¶
- class InteractionStyle(value, names=<not given>, *values, module=None, qualname=None, type=None, start=1, boundary=None)[source]¶
Bases:
Enum
Overall interaction styles we support.
- BUTTON_POSITIVE = 'p'¶
- BUTTON_POSITIVE_NEGATIVE = 'pn'¶
- UNKNOWN = 'u'¶
- button_label_negative: Annotated[ButtonLabel, IOAttrs('n', enum_fallback=ButtonLabel.UNKNOWN)] = 'c'¶
- button_label_positive: Annotated[ButtonLabel, IOAttrs('p', enum_fallback=ButtonLabel.UNKNOWN)] = 'o'¶
- components: Annotated[list[BasicClientUIComponent], IOAttrs('s')]¶
- classmethod get_type_id() ClientUITypeID [source]¶
Return the type-id for this subclass.
- interaction_style: Annotated[InteractionStyle, IOAttrs('i', enum_fallback=InteractionStyle.UNKNOWN)] = 'p'¶
- class bacommon.bs.BasicClientUIBsClassicTourneyResult(tournament_id: ~typing.Annotated[str, <efro.dataclassio.IOAttrs object at 0x7fa8a6010fb0>], game: ~typing.Annotated[str, <efro.dataclassio.IOAttrs object at 0x7fa8a6010fe0>], players: ~typing.Annotated[int, <efro.dataclassio.IOAttrs object at 0x7fa8a614ca40>], rank: ~typing.Annotated[int, <efro.dataclassio.IOAttrs object at 0x7fa8a614c890>], trophy: ~typing.Annotated[str | None, <efro.dataclassio.IOAttrs object at 0x7fa8a64e2810>], prizes: ~typing.Annotated[list[~bacommon.bs.DisplayItemWrapper], <efro.dataclassio.IOAttrs object at 0x7fa8a64e2a80>])[source]¶
Bases:
BasicClientUIComponent
Show info about a classic tourney.
- game: IOAttrs object at 0x7fa8a63d2990>]¶
- classmethod get_type_id() BasicClientUIComponentTypeID [source]¶
Return the type-id for this subclass.
- players: IOAttrs object at 0x7fa8a614ed20>]¶
- prizes: IOAttrs object at 0x7fa8a61491f0>]¶
- rank: IOAttrs object at 0x7fa8a6149940>]¶
- tournament_id: IOAttrs object at 0x7fa8a6164650>]¶
- trophy: IOAttrs object at 0x7fa8a61641d0>]¶
- class bacommon.bs.BasicClientUIComponent[source]¶
Bases:
IOMultiType
[BasicClientUIComponentTypeID
]Top level class for our multitype.
- classmethod get_type(type_id: BasicClientUIComponentTypeID) type[BasicClientUIComponent] [source]¶
Return the subclass for each of our type-ids.
- classmethod get_type_id() BasicClientUIComponentTypeID [source]¶
Return the type-id for this subclass.
- classmethod get_unknown_type_fallback() BasicClientUIComponent [source]¶
Return a fallback object in cases of unrecognized types.
This can allow newer data to remain readable in older environments. Use caution with this option, however, as it effectively modifies data.
- class bacommon.bs.BasicClientUIComponentLink(url: ~typing.Annotated[str, <efro.dataclassio.IOAttrs object at 0x7fa8a6109a00>], label: ~typing.Annotated[str, <efro.dataclassio.IOAttrs object at 0x7fa8a610a4b0>], subs: ~typing.Annotated[list[str], <efro.dataclassio.IOAttrs object at 0x7fa8a64292e0>] = <factory>, spacing_top: ~typing.Annotated[float, <efro.dataclassio.IOAttrs object at 0x7fa8a64280e0>] = 0.0, spacing_bottom: ~typing.Annotated[float, <efro.dataclassio.IOAttrs object at 0x7fa8a64284a0>] = 0.0)[source]¶
Bases:
BasicClientUIComponent
Show a link in the inbox message.
- classmethod get_type_id() BasicClientUIComponentTypeID [source]¶
Return the type-id for this subclass.
- label: IOAttrs object at 0x7fa8a6428860>]¶
- spacing_bottom: IOAttrs object at 0x7fa8a6429ee0>] = 0.0¶
- spacing_top: IOAttrs object at 0x7fa8a6166300>] = 0.0¶
- subs: IOAttrs object at 0x7fa8a6166870>]¶
- url: IOAttrs object at 0x7fa8a60114c0>]¶
- class bacommon.bs.BasicClientUIComponentText(text: ~typing.Annotated[str, <efro.dataclassio.IOAttrs object at 0x7fa8a6013bc0>], subs: ~typing.Annotated[list[str], <efro.dataclassio.IOAttrs object at 0x7fa8a6010b30>] = <factory>, scale: ~typing.Annotated[float, <efro.dataclassio.IOAttrs object at 0x7fa8a6010890>] = 1.0, color: ~typing.Annotated[tuple[float, float, float, float], <efro.dataclassio.IOAttrs object at 0x7fa8a64e2f30>] = (1.0, 1.0, 1.0, 1.0), spacing_top: ~typing.Annotated[float, <efro.dataclassio.IOAttrs object at 0x7fa8a64e35c0>] = 0.0, spacing_bottom: ~typing.Annotated[float, <efro.dataclassio.IOAttrs object at 0x7fa8a614d730>] = 0.0)[source]¶
Bases:
BasicClientUIComponent
Show some text in the inbox message.
- color: IOAttrs object at 0x7fa8a63d38f0>] = (1.0, 1.0, 1.0, 1.0)¶
- classmethod get_type_id() BasicClientUIComponentTypeID [source]¶
Return the type-id for this subclass.
- scale: IOAttrs object at 0x7fa8a6429790>] = 1.0¶
- spacing_bottom: IOAttrs object at 0x7fa8a63d82c0>] = 0.0¶
- spacing_top: IOAttrs object at 0x7fa8a6175fa0>] = 0.0¶
- subs: IOAttrs object at 0x7fa8a614f170>]¶
- text: IOAttrs object at 0x7fa8a61496d0>]¶
- class bacommon.bs.BasicClientUIComponentTypeID(value, names=<not given>, *values, module=None, qualname=None, type=None, start=1, boundary=None)[source]¶
Bases:
Enum
Type ID for each of our subclasses.
- BS_CLASSIC_TOURNEY_RESULT = 'ct'¶
- DISPLAY_ITEMS = 'di'¶
- EXPIRE_TIME = 'd'¶
- LINK = 'l'¶
- TEXT = 't'¶
- UNKNOWN = 'u'¶
- class bacommon.bs.BasicClientUIComponentUnknown[source]¶
Bases:
BasicClientUIComponent
An unknown basic client component type.
In practice these should never show up since the master-server generates these on the fly for the client and so should not send clients one they can’t digest.
- classmethod get_type_id() BasicClientUIComponentTypeID [source]¶
Return the type-id for this subclass.
- class bacommon.bs.BasicClientUIDisplayItems(items: ~typing.Annotated[list[~bacommon.bs.DisplayItemWrapper], <efro.dataclassio.IOAttrs object at 0x7fa8a6012720>], width: ~typing.Annotated[float, <efro.dataclassio.IOAttrs object at 0x7fa8a6164410>] = 100.0, spacing_top: ~typing.Annotated[float, <efro.dataclassio.IOAttrs object at 0x7fa8a614a540>] = 0.0, spacing_bottom: ~typing.Annotated[float, <efro.dataclassio.IOAttrs object at 0x7fa8a614a5a0>] = 0.0)[source]¶
Bases:
BasicClientUIComponent
Show some display-items.
- classmethod get_type_id() BasicClientUIComponentTypeID [source]¶
Return the type-id for this subclass.
- items: IOAttrs object at 0x7fa8a5e8ae10>]¶
- spacing_bottom: IOAttrs object at 0x7fa8a610a570>] = 0.0¶
- spacing_top: IOAttrs object at 0x7fa8a64280b0>] = 0.0¶
- width: IOAttrs object at 0x7fa8a5e8bb00>] = 100.0¶
- class bacommon.bs.BasicClientUIExpireTime(time: ~typing.Annotated[~datetime.datetime, <efro.dataclassio.IOAttrs object at 0x7fa8a5e8bf80>], spacing_top: ~typing.Annotated[float, <efro.dataclassio.IOAttrs object at 0x7fa8a5e8be90>] = 0.0, spacing_bottom: ~typing.Annotated[float, <efro.dataclassio.IOAttrs object at 0x7fa8a614bbf0>] = 0.0)[source]¶
Bases:
BasicClientUIComponent
Show expire-time.
- classmethod get_type_id() BasicClientUIComponentTypeID [source]¶
Return the type-id for this subclass.
- spacing_bottom: IOAttrs object at 0x7fa8a614c4a0>] = 0.0¶
- spacing_top: IOAttrs object at 0x7fa8a5e9c380>] = 0.0¶
- time: IOAttrs object at 0x7fa8a5e9cc50>]¶
- class bacommon.bs.ChestActionMessage(action: Annotated[Action, IOAttrs('a')], token_payment: Annotated[int, IOAttrs('t')], chest_id: Annotated[str, IOAttrs('i')])[source]¶
Bases:
Message
Request action about a chest.
- class Action(value, names=<not given>, *values, module=None, qualname=None, type=None, start=1, boundary=None)[source]¶
Bases:
Enum
Types of actions we can request.
- AD = 'ad'¶
- UNLOCK = 'u'¶
- class bacommon.bs.ChestActionResponse(tokens_charged: ~typing.Annotated[int, <efro.dataclassio.IOAttrs object at 0x7fa8a5e9e3f0>] = 0, contents: ~typing.Annotated[list[~bacommon.bs.DisplayItemWrapper] | None, <efro.dataclassio.IOAttrs object at 0x7fa8a5e9e120>] = None, prizeindex: ~typing.Annotated[int, <efro.dataclassio.IOAttrs object at 0x7fa8a5e9dcd0>] = 0, error: ~typing.Annotated[str | None, <efro.dataclassio.IOAttrs object at 0x7fa8a5e9e510>] = None, warning: ~typing.Annotated[str | None, <efro.dataclassio.IOAttrs object at 0x7fa8a6013800>] = None, success_msg: ~typing.Annotated[str | None, <efro.dataclassio.IOAttrs object at 0x7fa8a6013980>] = None)[source]¶
Bases:
Response
Here’s the results of that action you asked for, boss.
- contents: IOAttrs object at 0x7fa8a5e9efc0>] = None¶
- error: IOAttrs object at 0x7fa8a6010dd0>] = None¶
- prizeindex: IOAttrs object at 0x7fa8a64e3710>] = 0¶
- success_msg: IOAttrs object at 0x7fa8a5eb8140>] = None¶
- tokens_charged: IOAttrs object at 0x7fa8a5eb85c0>] = 0¶
- warning: IOAttrs object at 0x7fa8a5eb9340>] = None¶
- class bacommon.bs.ChestDisplayItem(appearance: ~typing.Annotated[~bacommon.bs.ClassicChestAppearance, <efro.dataclassio.IOAttrs object at 0x7fa8a6010770>])[source]¶
Bases:
DisplayItem
Display a chest.
- appearance: IOAttrs object at 0x7fa8a5eb9970>]¶
- get_description() tuple[str, list[tuple[str, str]]] [source]¶
Return a string description and subs for the item.
These decriptions are baked into the DisplayItemWrapper and should be accessed from there when available. This allows clients to give descriptions even for newer display items they don’t recognize.
- classmethod get_type_id() DisplayItemTypeID [source]¶
Return the type-id for this subclass.
- class bacommon.bs.ChestInfoMessage(chest_id: ~typing.Annotated[str, <efro.dataclassio.IOAttrs object at 0x7fa8a5eba120>])[source]¶
Bases:
Message
Request info about a chest.
- chest_id: IOAttrs object at 0x7fa8a5eba750>]¶
- class bacommon.bs.ChestInfoResponse(chest: Annotated[Chest | None, IOAttrs('c')], user_tokens: Annotated[int | None, IOAttrs('t')])[source]¶
Bases:
Response
Here’s that chest info you asked for, boss.
- class Chest(appearance: Annotated[ClassicChestAppearance, IOAttrs('a', enum_fallback=ClassicChestAppearance.UNKNOWN)], unlock_tokens: Annotated[int, IOAttrs('tk')], unlock_time: Annotated[datetime.datetime, IOAttrs('t')], prizesets: Annotated[list[PrizeSet], IOAttrs('p')], ad_allow: Annotated[bool, IOAttrs('aa')])[source]¶
Bases:
object
A lovely chest.
- class PrizeSet(weight: ~typing.Annotated[float, <efro.dataclassio.IOAttrs object at 0x7fa8a5edc440>], contents: ~typing.Annotated[list[~bacommon.bs.DisplayItemWrapper], <efro.dataclassio.IOAttrs object at 0x7fa8a5edc3e0>])[source]¶
Bases:
object
A possible set of prizes for this chest.
- contents: IOAttrs object at 0x7fa8a6149670>]¶
- weight: IOAttrs object at 0x7fa8a5edcb30>]¶
- appearance: Annotated[ClassicChestAppearance, IOAttrs('a', enum_fallback=ClassicChestAppearance.UNKNOWN)]¶
- class bacommon.bs.ClassicAccountLiveData(tickets: Annotated[int, IOAttrs('ti')], tokens: Annotated[int, IOAttrs('to')], gold_pass: Annotated[bool, IOAttrs('g')], remove_ads: Annotated[bool, IOAttrs('r')], achievements: Annotated[int, IOAttrs('a')], achievements_total: Annotated[int, IOAttrs('at')], league_type: Annotated[LeagueType | None, IOAttrs('lt')], league_num: Annotated[int | None, IOAttrs('ln')], league_rank: Annotated[int | None, IOAttrs('lr')], level: Annotated[int, IOAttrs('lv')], xp: Annotated[int, IOAttrs('xp')], xpmax: Annotated[int, IOAttrs('xpm')], inbox_count: Annotated[int, IOAttrs('ibc')], inbox_count_is_max: Annotated[bool, IOAttrs('ibcm')], chests: Annotated[dict[str, Chest], IOAttrs('c')])[source]¶
Bases:
object
Live account data fed to the client in the bs classic app mode.
- class Chest(appearance: ~typing.Annotated[~bacommon.bs.ClassicChestAppearance, <efro.dataclassio.IOAttrs object at 0x7fa8a5edec30>], unlock_time: ~typing.Annotated[~datetime.datetime, <efro.dataclassio.IOAttrs object at 0x7fa8a5eded50>], ad_allow_time: ~typing.Annotated[~datetime.datetime | None, <efro.dataclassio.IOAttrs object at 0x7fa8a5edee10>])[source]¶
Bases:
object
A lovely chest.
- ad_allow_time: IOAttrs object at 0x7fa8a5e9cd40>]¶
- appearance: IOAttrs object at 0x7fa8a5eec350>]¶
- unlock_time: IOAttrs object at 0x7fa8a64281a0>]¶
- class LeagueType(value, names=<not given>, *values, module=None, qualname=None, type=None, start=1, boundary=None)[source]¶
Bases:
Enum
Type of league we are in.
- BRONZE = 'b'¶
- DIAMOND = 'd'¶
- GOLD = 'g'¶
- SILVER = 's'¶
- league_type: Annotated[LeagueType | None, IOAttrs('lt')]¶
- class bacommon.bs.ClassicChestAppearance(value, names=<not given>, *values, module=None, qualname=None, type=None, start=1, boundary=None)[source]¶
Bases:
Enum
Appearances bombsquad classic chests can have.
- DEFAULT = 'd'¶
- L1 = 'l1'¶
- L2 = 'l2'¶
- L3 = 'l3'¶
- L4 = 'l4'¶
- L5 = 'l5'¶
- L6 = 'l6'¶
- UNKNOWN = 'u'¶
- property pretty_name: str¶
Pretty name for the chest in English.
- class bacommon.bs.ClientEffect[source]¶
Bases:
IOMultiType
[ClientEffectTypeID
]Something that can happen on the client.
This can include screen messages, sounds, visual effects, etc.
- classmethod get_type(type_id: ClientEffectTypeID) type[ClientEffect] [source]¶
Return the subclass for each of our type-ids.
- classmethod get_type_id() ClientEffectTypeID [source]¶
Return the type-id for this subclass.
- classmethod get_unknown_type_fallback() ClientEffect [source]¶
Return a fallback object in cases of unrecognized types.
This can allow newer data to remain readable in older environments. Use caution with this option, however, as it effectively modifies data.
- class bacommon.bs.ClientEffectDelay(seconds: ~typing.Annotated[float, <efro.dataclassio.IOAttrs object at 0x7fa8a5d3d3d0>])[source]¶
Bases:
ClientEffect
Delay effect processing.
- classmethod get_type_id() ClientEffectTypeID [source]¶
Return the type-id for this subclass.
- seconds: IOAttrs object at 0x7fa8a5d3d8b0>]¶
- class bacommon.bs.ClientEffectScreenMessage(message: ~typing.Annotated[str, <efro.dataclassio.IOAttrs object at 0x7fa8a5d3dca0>], subs: ~typing.Annotated[list[str], <efro.dataclassio.IOAttrs object at 0x7fa8a5d3da90>], color: ~typing.Annotated[tuple[float, float, float], <efro.dataclassio.IOAttrs object at 0x7fa8a5edc6e0>] = (1.0, 1.0, 1.0))[source]¶
Bases:
ClientEffect
Display a screen-message.
- color: IOAttrs object at 0x7fa8a5edcd40>] = (1.0, 1.0, 1.0)¶
- classmethod get_type_id() ClientEffectTypeID [source]¶
Return the type-id for this subclass.
- message: IOAttrs object at 0x7fa8a5edcef0>]¶
- subs: IOAttrs object at 0x7fa8a5edd220>]¶
- class bacommon.bs.ClientEffectSound(sound: Annotated[Sound, IOAttrs('s', enum_fallback=Sound.UNKNOWN)], volume: Annotated[float, IOAttrs('v')] = 1.0)[source]¶
Bases:
ClientEffect
Play a sound.
- class Sound(value, names=<not given>, *values, module=None, qualname=None, type=None, start=1, boundary=None)[source]¶
Bases:
Enum
Sounds that can be made alongside the message.
- CASH_REGISTER = 'c'¶
- ERROR = 'e'¶
- GUN_COCKING = 'g'¶
- POWER_DOWN = 'p'¶
- UNKNOWN = 'u'¶
- classmethod get_type_id() ClientEffectTypeID [source]¶
Return the type-id for this subclass.
- class bacommon.bs.ClientEffectTypeID(value, names=<not given>, *values, module=None, qualname=None, type=None, start=1, boundary=None)[source]¶
Bases:
Enum
Type ID for each of our subclasses.
- DELAY = 'd'¶
- SCREEN_MESSAGE = 'm'¶
- SOUND = 's'¶
- UNKNOWN = 'u'¶
- class bacommon.bs.ClientEffectUnknown[source]¶
Bases:
ClientEffect
Fallback substitute for types we don’t recognize.
- classmethod get_type_id() ClientEffectTypeID [source]¶
Return the type-id for this subclass.
- class bacommon.bs.ClientUI[source]¶
Bases:
IOMultiType
[ClientUITypeID
]Defines some user interface on the client.
- classmethod get_type(type_id: ClientUITypeID) type[ClientUI] [source]¶
Return the subclass for each of our type-ids.
- classmethod get_type_id() ClientUITypeID [source]¶
Return the type-id for this subclass.
- class bacommon.bs.ClientUIAction(value, names=<not given>, *values, module=None, qualname=None, type=None, start=1, boundary=None)[source]¶
Bases:
Enum
Types of actions we can run.
- BUTTON_PRESS_NEGATIVE = 'n'¶
- BUTTON_PRESS_POSITIVE = 'p'¶
- class bacommon.bs.ClientUIActionMessage(id: ~typing.Annotated[str, <efro.dataclassio.IOAttrs object at 0x7fa8a5d56ea0>], action: ~typing.Annotated[~bacommon.bs.ClientUIAction, <efro.dataclassio.IOAttrs object at 0x7fa8a5d56e40>])[source]¶
Bases:
Message
Do something to a client ui.
- action: IOAttrs object at 0x7fa8a5d57bc0>]¶
- classmethod get_response_types() list[type[Response] | None] [source]¶
Return all Response types this Message can return when sent.
The default implementation specifies a None return type.
- id: IOAttrs object at 0x7fa8a6164410>]¶
- class bacommon.bs.ClientUIActionResponse(error_type: Annotated[ErrorType | None, IOAttrs('et', enum_fallback=ErrorType.UNKNOWN)], error_message: Annotated[str | None, IOAttrs('em')], effects: Annotated[list[ClientEffect], IOAttrs('fx')])[source]¶
Bases:
Response
Did something to that inbox entry, boss.
- class ErrorType(value, names=<not given>, *values, module=None, qualname=None, type=None, start=1, boundary=None)[source]¶
Bases:
Enum
Types of errors that may have occurred.
- EXPIRED = 'e'¶
- INTERNAL = 'i'¶
- UNKNOWN = 'u'¶
- effects: Annotated[list[ClientEffect], IOAttrs('fx')]¶
- class bacommon.bs.ClientUITypeID(value, names=<not given>, *values, module=None, qualname=None, type=None, start=1, boundary=None)[source]¶
Bases:
Enum
Type ID for each of our subclasses.
- BASIC = 'b'¶
- UNKNOWN = 'u'¶
- class bacommon.bs.ClientUIWrapper(id: ~typing.Annotated[str, <efro.dataclassio.IOAttrs object at 0x7fa8a5d61ac0>], createtime: ~typing.Annotated[~datetime.datetime, <efro.dataclassio.IOAttrs object at 0x7fa8a5d61a60>], ui: ~typing.Annotated[~bacommon.bs.ClientUI, <efro.dataclassio.IOAttrs object at 0x7fa8a5edd970>])[source]¶
Bases:
object
Wrapper for a ClientUI and its common data.
- createtime: IOAttrs object at 0x7fa8a5eddc10>]¶
- id: IOAttrs object at 0x7fa8a5e8bda0>]¶
- ui: IOAttrs object at 0x7fa8a5edede0>]¶
- class bacommon.bs.DisplayItem[source]¶
Bases:
IOMultiType
[DisplayItemTypeID
]Some amount of something that can be shown or described.
Used to depict chest contents or other rewards or prices.
- get_description() tuple[str, list[tuple[str, str]]] [source]¶
Return a string description and subs for the item.
These decriptions are baked into the DisplayItemWrapper and should be accessed from there when available. This allows clients to give descriptions even for newer display items they don’t recognize.
- classmethod get_type(type_id: DisplayItemTypeID) type[DisplayItem] [source]¶
Return the subclass for each of our type-ids.
- classmethod get_type_id() DisplayItemTypeID [source]¶
Return the type-id for this subclass.
- classmethod get_unknown_type_fallback() DisplayItem [source]¶
Return a fallback object in cases of unrecognized types.
This can allow newer data to remain readable in older environments. Use caution with this option, however, as it effectively modifies data.
- class bacommon.bs.DisplayItemTypeID(value, names=<not given>, *values, module=None, qualname=None, type=None, start=1, boundary=None)[source]¶
Bases:
Enum
Type ID for each of our subclasses.
- CHEST = 'c'¶
- TEST = 's'¶
- TICKETS = 't'¶
- TOKENS = 'k'¶
- UNKNOWN = 'u'¶
- class bacommon.bs.DisplayItemWrapper(item: ~typing.Annotated[~bacommon.bs.DisplayItem, <efro.dataclassio.IOAttrs object at 0x7fa8a5db0080>], description: ~typing.Annotated[str, <efro.dataclassio.IOAttrs object at 0x7fa8a5edf050>], description_subs: ~typing.Annotated[list[str] | None, <efro.dataclassio.IOAttrs object at 0x7fa8a5d63f20>])[source]¶
Bases:
object
Wraps a DisplayItem and common info.
- description: IOAttrs object at 0x7fa8a5eef1a0>]¶
- description_subs: IOAttrs object at 0x7fa8a5eec470>]¶
- classmethod for_display_item(item: DisplayItem) DisplayItemWrapper [source]¶
Convenience method to wrap a DisplayItem.
- item: IOAttrs object at 0x7fa8a5db0c50>]¶
- class bacommon.bs.InboxRequestResponse(wrappers: ~typing.Annotated[list[~bacommon.bs.ClientUIWrapper], <efro.dataclassio.IOAttrs object at 0x7fa8a5db2090>], error: ~typing.Annotated[str | None, <efro.dataclassio.IOAttrs object at 0x7fa8a5d3df10>] = None)[source]¶
Bases:
Response
Here’s that inbox contents you asked for, boss.
- error: IOAttrs object at 0x7fa8a5db1d60>] = None¶
- wrappers: IOAttrs object at 0x7fa8a5db0e30>]¶
- class bacommon.bs.PrivatePartyMessage(need_datacode: ~typing.Annotated[bool, <efro.dataclassio.IOAttrs object at 0x7fa8a5db25d0>])[source]¶
Bases:
Message
Message asking about info we need for private-party UI.
- classmethod get_response_types() list[type[Response] | None] [source]¶
Return all Response types this Message can return when sent.
The default implementation specifies a None return type.
- need_datacode: IOAttrs object at 0x7fa8a5db3350>]¶
- class bacommon.bs.PrivatePartyResponse(success: ~typing.Annotated[bool, <efro.dataclassio.IOAttrs object at 0x7fa8a5eef6e0>], tokens: ~typing.Annotated[int, <efro.dataclassio.IOAttrs object at 0x7fa8a5eef800>], gold_pass: ~typing.Annotated[bool, <efro.dataclassio.IOAttrs object at 0x7fa8a5eed3d0>], datacode: ~typing.Annotated[str | None, <efro.dataclassio.IOAttrs object at 0x7fa8a5eed820>])[source]¶
Bases:
Response
Here’s that private party UI info you asked for, boss.
- datacode: IOAttrs object at 0x7fa8a5eee000>]¶
- gold_pass: IOAttrs object at 0x7fa8a5eba120>]¶
- success: IOAttrs object at 0x7fa8a5eee300>]¶
- tokens: IOAttrs object at 0x7fa8a5d3d7f0>]¶
- class bacommon.bs.TestDisplayItem[source]¶
Bases:
DisplayItem
Fills usable space for a display-item - good for calibration.
- get_description() tuple[str, list[tuple[str, str]]] [source]¶
Return a string description and subs for the item.
These decriptions are baked into the DisplayItemWrapper and should be accessed from there when available. This allows clients to give descriptions even for newer display items they don’t recognize.
- classmethod get_type_id() DisplayItemTypeID [source]¶
Return the type-id for this subclass.
- class bacommon.bs.TicketsDisplayItem(count: ~typing.Annotated[int, <efro.dataclassio.IOAttrs object at 0x7fa8a5eed9d0>])[source]¶
Bases:
DisplayItem
Some amount of tickets.
- count: IOAttrs object at 0x7fa8a5ded2e0>]¶
- get_description() tuple[str, list[tuple[str, str]]] [source]¶
Return a string description and subs for the item.
These decriptions are baked into the DisplayItemWrapper and should be accessed from there when available. This allows clients to give descriptions even for newer display items they don’t recognize.
- classmethod get_type_id() DisplayItemTypeID [source]¶
Return the type-id for this subclass.
- class bacommon.bs.TokensDisplayItem(count: ~typing.Annotated[int, <efro.dataclassio.IOAttrs object at 0x7fa8a5edc680>])[source]¶
Bases:
DisplayItem
Some amount of tokens.
- count: IOAttrs object at 0x7fa8a5dedf10>]¶
- get_description() tuple[str, list[tuple[str, str]]] [source]¶
Return a string description and subs for the item.
These decriptions are baked into the DisplayItemWrapper and should be accessed from there when available. This allows clients to give descriptions even for newer display items they don’t recognize.
- classmethod get_type_id() DisplayItemTypeID [source]¶
Return the type-id for this subclass.
- class bacommon.bs.UnknownClientUI[source]¶
Bases:
ClientUI
Fallback type for unrecognized entries.
- classmethod get_type_id() ClientUITypeID [source]¶
Return the type-id for this subclass.
- class bacommon.bs.UnknownDisplayItem[source]¶
Bases:
DisplayItem
Something we don’t know how to display.
- get_description() tuple[str, list[tuple[str, str]]] [source]¶
Return a string description and subs for the item.
These decriptions are baked into the DisplayItemWrapper and should be accessed from there when available. This allows clients to give descriptions even for newer display items they don’t recognize.
- classmethod get_type_id() DisplayItemTypeID [source]¶
Return the type-id for this subclass.
bacommon.build module¶
Functionality related to game builds.
- class bacommon.build.BuildInfoSet(builds: Annotated[list[Entry], IOAttrs('builds')] = <factory>)[source]¶
Bases:
object
Set of build infos.
- class Entry(filename: ~typing.Annotated[str, <efro.dataclassio.IOAttrs object at 0x7fa8a58ba3f0>], size: ~typing.Annotated[int, <efro.dataclassio.IOAttrs object at 0x7fa8a58ba390>], version: ~typing.Annotated[str, <efro.dataclassio.IOAttrs object at 0x7fa8a5d57050>], build_number: ~typing.Annotated[int, <efro.dataclassio.IOAttrs object at 0x7fa8a5d56de0>], checksum: ~typing.Annotated[str, <efro.dataclassio.IOAttrs object at 0x7fa8a5d57a40>], createtime: ~typing.Annotated[~datetime.datetime, <efro.dataclassio.IOAttrs object at 0x7fa8a5d57ad0>])[source]¶
Bases:
object
Info about a particular app build.
- build_number: IOAttrs object at 0x7fa8a5eeeb70>]¶
- checksum: IOAttrs object at 0x7fa8a5edf110>]¶
- createtime: IOAttrs object at 0x7fa8a5eef2f0>]¶
- filename: IOAttrs object at 0x7fa8a58e4260>]¶
- size: IOAttrs object at 0x7fa8a5db1340>]¶
- version: IOAttrs object at 0x7fa8a5eedb20>]¶
bacommon.cloud module¶
Functionality related to cloud functionality.
- class bacommon.cloud.LoginProxyCompleteMessage(proxyid: ~typing.Annotated[str, <efro.dataclassio.IOAttrs object at 0x7fa8a5928ec0>])[source]¶
Bases:
Message
Just so you know, we’re done with this proxy.
- proxyid: IOAttrs object at 0x7fa8a5929850>]¶
- class bacommon.cloud.LoginProxyRequestMessage[source]¶
Bases:
Message
Request send to the cloud to ask for a login-proxy.
- class bacommon.cloud.LoginProxyRequestResponse(url: ~typing.Annotated[str, <efro.dataclassio.IOAttrs object at 0x7fa8a592a600>], url_overlay: ~typing.Annotated[str, <efro.dataclassio.IOAttrs object at 0x7fa8a592a540>], proxyid: ~typing.Annotated[str, <efro.dataclassio.IOAttrs object at 0x7fa8a5db3590>], proxykey: ~typing.Annotated[str, <efro.dataclassio.IOAttrs object at 0x7fa8a5db3800>])[source]¶
Bases:
Response
Response to a request for a login proxy.
- proxyid: IOAttrs object at 0x7fa8a5eee330>]¶
- proxykey: IOAttrs object at 0x7fa8a5d3deb0>]¶
- url: IOAttrs object at 0x7fa8a592b6e0>]¶
- url_overlay: IOAttrs object at 0x7fa8a592bef0>]¶
- class bacommon.cloud.LoginProxyStateQueryMessage(proxyid: ~typing.Annotated[str, <efro.dataclassio.IOAttrs object at 0x7fa8a5738410>], proxykey: ~typing.Annotated[str, <efro.dataclassio.IOAttrs object at 0x7fa8a57383b0>])[source]¶
Bases:
Message
Soo.. how is that login proxy going?
- classmethod get_response_types() list[type[Response] | None] [source]¶
Return all Response types this Message can return when sent.
The default implementation specifies a None return type.
- proxyid: IOAttrs object at 0x7fa8a592b320>]¶
- proxykey: IOAttrs object at 0x7fa8a5eeea80>]¶
- class bacommon.cloud.LoginProxyStateQueryResponse(state: Annotated[State, IOAttrs('s')], credentials: Annotated[str | None, IOAttrs('tk')])[source]¶
Bases:
Response
Here’s the info on that login-proxy you asked about, boss.
- class bacommon.cloud.ManageAccountMessage(weblocation: ~typing.Annotated[~bacommon.cloud.WebLocation, <efro.dataclassio.IOAttrs object at 0x7fa8a573a900>] = WebLocation.ACCOUNT_EDITOR)[source]¶
Bases:
Message
Message asking for a manage-account url.
- classmethod get_response_types() list[type[Response] | None] [source]¶
Return all Response types this Message can return when sent.
The default implementation specifies a None return type.
- weblocation: IOAttrs object at 0x7fa8a573b440>] = 'e'¶
- class bacommon.cloud.ManageAccountResponse(url: ~typing.Annotated[str | None, <efro.dataclassio.IOAttrs object at 0x7fa8a573b770>])[source]¶
Bases:
Response
Here’s that sign-in result you asked for, boss.
- url: IOAttrs object at 0x7fa8a573b020>]¶
- class bacommon.cloud.MerchAvailabilityResponse(url: ~typing.Annotated[str | None, <efro.dataclassio.IOAttrs object at 0x7fa8a575c950>])[source]¶
Bases:
Response
About that merch…
- url: IOAttrs object at 0x7fa8a575d430>]¶
- class bacommon.cloud.SendInfoMessage(description: ~typing.Annotated[str, <efro.dataclassio.IOAttrs object at 0x7fa8a575e3c0>])[source]¶
Bases:
Message
User is using the send-info function
- description: IOAttrs object at 0x7fa8a575ec30>]¶
- class bacommon.cloud.SendInfoResponse(handled: ~typing.Annotated[bool, <efro.dataclassio.IOAttrs object at 0x7fa8a58e7e60>], message: ~typing.Annotated[str | None, <efro.dataclassio.IOAttrs object at 0x7fa8a58e7e30>] = None, legacy_code: ~typing.Annotated[str | None, <efro.dataclassio.IOAttrs object at 0x7fa8a5e8a4b0>] = None)[source]¶
Bases:
Response
Response to sending into the server.
- handled: IOAttrs object at 0x7fa8a59e36b0>]¶
- legacy_code: IOAttrs object at 0x7fa8a5edeed0>] = None¶
- message: IOAttrs object at 0x7fa8a575e240>] = None¶
- class bacommon.cloud.SignInMessage(login_type: ~typing.Annotated[~bacommon.login.LoginType, <efro.dataclassio.IOAttrs object at 0x7fa8a575d730>], sign_in_token: ~typing.Annotated[str, <efro.dataclassio.IOAttrs object at 0x7fa8a575c530>], description: ~typing.Annotated[str, <efro.dataclassio.IOAttrs object at 0x7fa8a5eef1a0>], apptime: ~typing.Annotated[float, <efro.dataclassio.IOAttrs object at 0x7fa8a5eef140>])[source]¶
Bases:
Message
Can I sign in please?
- apptime: IOAttrs object at 0x7fa8a5eef3b0>]¶
- description: IOAttrs object at 0x7fa8a58e4a10>]¶
- classmethod get_response_types() list[type[Response] | None] [source]¶
Return all Response types this Message can return when sent.
The default implementation specifies a None return type.
- login_type: IOAttrs object at 0x7fa8a578c620>]¶
- sign_in_token: IOAttrs object at 0x7fa8a5eecdd0>]¶
- class bacommon.cloud.SignInResponse(credentials: ~typing.Annotated[str | None, <efro.dataclassio.IOAttrs object at 0x7fa8a578cf80>])[source]¶
Bases:
Response
Here’s that sign-in result you asked for, boss.
- credentials: IOAttrs object at 0x7fa8a578d9a0>]¶
- class bacommon.cloud.StoreQueryMessage[source]¶
Bases:
Message
Message asking about purchasable stuff and store related state.
- class bacommon.cloud.StoreQueryResponse(result: Annotated[Result, IOAttrs('r')], tokens: Annotated[int, IOAttrs('t')], gold_pass: Annotated[bool, IOAttrs('g')], available_purchases: Annotated[list[Purchase], IOAttrs('p')], token_info_url: Annotated[str, IOAttrs('tiu')])[source]¶
Bases:
Response
Here’s that store info you asked for, boss.
- class Purchase(purchaseid: ~typing.Annotated[str, <efro.dataclassio.IOAttrs object at 0x7fa8a578eb10>])[source]¶
Bases:
object
Info about a purchasable thing.
- purchaseid: IOAttrs object at 0x7fa8a578e870>]¶
- class bacommon.cloud.TestMessage(testfoo: ~typing.Annotated[int, <efro.dataclassio.IOAttrs object at 0x7fa8a578f5f0>])[source]¶
Bases:
Message
Can I get some of that workspace action?
- classmethod get_response_types() list[type[Response] | None] [source]¶
Return all Response types this Message can return when sent.
The default implementation specifies a None return type.
- testfoo: IOAttrs object at 0x7fa8a5794c80>]¶
- class bacommon.cloud.TestResponse(testfoo: ~typing.Annotated[int, <efro.dataclassio.IOAttrs object at 0x7fa8a5795010>])[source]¶
Bases:
Response
Here’s that workspace you asked for, boss.
- testfoo: IOAttrs object at 0x7fa8a5795a30>]¶
- class bacommon.cloud.WebLocation(value, names=<not given>, *values, module=None, qualname=None, type=None, start=1, boundary=None)[source]¶
Bases:
Enum
Set of places we can be directed on ballistica.net.
- ACCOUNT_DELETE_SECTION = 'd'¶
- ACCOUNT_EDITOR = 'e'¶
- class bacommon.cloud.WorkspaceFetchMessage(workspaceid: ~typing.Annotated[str, <efro.dataclassio.IOAttrs object at 0x7fa8a5796090>], state: ~typing.Annotated[~bacommon.cloud.WorkspaceFetchState, <efro.dataclassio.IOAttrs object at 0x7fa8a5796030>])[source]¶
Bases:
Message
Can I get some of that workspace action?
- classmethod get_response_types() list[type[Response] | None] [source]¶
Return all Response types this Message can return when sent.
The default implementation specifies a None return type.
- state: IOAttrs object at 0x7fa8a5796f30>]¶
- workspaceid: IOAttrs object at 0x7fa8a57969f0>]¶
- class bacommon.cloud.WorkspaceFetchResponse(state: ~typing.Annotated[~bacommon.cloud.WorkspaceFetchState, <efro.dataclassio.IOAttrs object at 0x7fa8a5796960>], deletes: ~typing.Annotated[list[str], <efro.dataclassio.IOAttrs object at 0x7fa8a5795eb0>] = <factory>, downloads_inline: ~typing.Annotated[dict[str, bytes], <efro.dataclassio.IOAttrs object at 0x7fa8a5eedf40>] = <factory>, done: ~typing.Annotated[bool, <efro.dataclassio.IOAttrs object at 0x7fa8a5eecbc0>] = False)[source]¶
Bases:
Response
Here’s that workspace you asked for, boss.
- deletes: IOAttrs object at 0x7fa8a592b770>]¶
- done: IOAttrs object at 0x7fa8a57383b0>] = False¶
- downloads_inline: IOAttrs object at 0x7fa8a5738e30>]¶
- state: IOAttrs object at 0x7fa8a57b91f0>]¶
- class bacommon.cloud.WorkspaceFetchState(manifest: ~typing.Annotated[~bacommon.transfer.DirectoryManifest, <efro.dataclassio.IOAttrs object at 0x7fa8a57b9280>], iteration: ~typing.Annotated[int, <efro.dataclassio.IOAttrs object at 0x7fa8a57b94c0>] = 0, total_deletes: ~typing.Annotated[int, <efro.dataclassio.IOAttrs object at 0x7fa8a575d1c0>] = 0, total_downloads: ~typing.Annotated[int, <efro.dataclassio.IOAttrs object at 0x7fa8a575e3c0>] = 0, total_up_to_date: ~typing.Annotated[int | None, <efro.dataclassio.IOAttrs object at 0x7fa8a575e480>] = None)[source]¶
Bases:
object
Common state data for a workspace fetch.
- iteration: IOAttrs object at 0x7fa8a57b9ac0>] = 0¶
- manifest: IOAttrs object at 0x7fa8a57ba0c0>]¶
- total_deletes: IOAttrs object at 0x7fa8a575d7c0>] = 0¶
- total_downloads: IOAttrs object at 0x7fa8a58bb800>] = 0¶
- total_up_to_date: IOAttrs object at 0x7fa8a575f7a0>] = None¶
bacommon.loggercontrol module¶
System for managing loggers.
- class bacommon.loggercontrol.LoggerControlConfig(levels: ~typing.Annotated[dict[str, int], <efro.dataclassio.IOAttrs object at 0x7fa8a55b3080>] = <factory>)[source]¶
Bases:
object
A logging level configuration that applies to all loggers.
Any loggers not explicitly contained in the configuration will be set to NOTSET.
- apply(*, warn_unexpected_loggers: bool = False, warn_missing_loggers: bool = False, ignore_log_prefixes: list[str] | None = None) None [source]¶
Apply the config to all Python loggers.
If ‘warn_unexpected_loggers’ is True, warnings will be issues for any loggers not explicitly covered by the config. This is useful to help ensure controls for all possible loggers are present in a UI/etc.
If ‘warn_missing_loggers’ is True, warnings will be issued for any loggers present in the config that are not found at apply time. This can be useful for pruning settings for no longer used loggers.
Warnings for any log names beginning with any strings in ‘ignore_log_prefixes’ will be suppressed. This can allow ignoring loggers associated with submodules for a given package and instead presenting only a top level logger (or none at all).
- apply_diff(diffconfig: LoggerControlConfig) LoggerControlConfig [source]¶
Apply a diff config to ourself.
Note that values that resolve to NOTSET are left intact in the output config. This is so all loggers expected by either the base or diff config to exist can be created if desired/etc.
- diff(baseconfig: LoggerControlConfig) LoggerControlConfig [source]¶
Return a config containing only changes compared to a base config.
Note that this omits all NOTSET values that resolve to NOTSET in the base config.
This diffed config can later be used with apply_diff() against the base config to recreate the state represented by self.
- get_effective_level(logname: str) int [source]¶
Given a log name, predict its level if this config is applied.
- levels: IOAttrs object at 0x7fa8a61655e0>]¶
bacommon.logging module¶
Logging functionality.
- bacommon.logging.get_base_logger_control_config_client() LoggerControlConfig [source]¶
Return the logger-control-config used by the ballistica client.
This should remain consistent since local logger configurations are stored relative to this.
bacommon.login module¶
Functionality related to cloud based assets.
- class bacommon.login.LoginType(value, names=<not given>, *values, module=None, qualname=None, type=None, start=1, boundary=None)[source]¶
Bases:
Enum
Types of logins available.
- EMAIL = 'email'¶
- GAME_CENTER = 'game_center'¶
- GPGS = 'gpgs'¶
- property displayname: str¶
Human readable name for this value.
- property displaynameshort: str¶
Human readable name for this value.
bacommon.net module¶
Network related data and functionality.
- class bacommon.net.PrivateHostingConfig(session_type: str = 'ffa', playlist_name: str = 'Unknown', randomize: bool = False, tutorial: bool = False, custom_team_names: tuple[str, str] | None = None, custom_team_colors: tuple[tuple[float, float, float], tuple[float, float, float]] | None = None, playlist: list[dict[str, Any]] | None = None, exit_minutes: float = 120.0, exit_minutes_unclean: float = 180.0, exit_minutes_idle: float = 10.0)[source]¶
Bases:
object
Config provided when hosting a private party.
- custom_team_colors: tuple[tuple[float, float, float], tuple[float, float, float]] | None = None¶
- custom_team_names: tuple[str, str] | None = None¶
- exit_minutes: float = 120.0¶
- exit_minutes_idle: float = 10.0¶
- exit_minutes_unclean: float = 180.0¶
- playlist: list[dict[str, Any]] | None = None¶
- playlist_name: str = 'Unknown'¶
- randomize: bool = False¶
- session_type: str = 'ffa'¶
- tutorial: bool = False¶
- class bacommon.net.PrivateHostingState(unavailable_error: str | None = None, party_code: str | None = None, tickets_to_host_now: int = 0, tokens_to_host_now: int = 0, minutes_until_free_host: float | None = None, free_host_minutes_remaining: float | None = None)[source]¶
Bases:
object
Combined state of whether we’re hosting, whether we can, etc.
- free_host_minutes_remaining: float | None = None¶
- minutes_until_free_host: float | None = None¶
- party_code: str | None = None¶
- tickets_to_host_now: int = 0¶
- tokens_to_host_now: int = 0¶
- class bacommon.net.PrivatePartyConnectResult(error: str | None = None, address4: ~typing.Annotated[str | None, <efro.dataclassio.IOAttrs object at 0x7fa8a548d970>] = None, address6: ~typing.Annotated[str | None, <efro.dataclassio.IOAttrs object at 0x7fa8a548d850>] = None, port: int | None = None, password: str | None = None)[source]¶
Bases:
object
Info about a server we get back when connecting.
- address4: IOAttrs object at 0x7fa8a5443800>] = None¶
- address6: IOAttrs object at 0x7fa8a548d310>] = None¶
- error: str | None = None¶
- password: str | None = None¶
- port: int | None = None¶
- class bacommon.net.ServerNodeEntry(zone: ~typing.Annotated[str, <efro.dataclassio.IOAttrs object at 0x7fa8a548f290>], latlong: ~typing.Annotated[tuple[float, float] | None, <efro.dataclassio.IOAttrs object at 0x7fa8a548f200>], address: ~typing.Annotated[str, <efro.dataclassio.IOAttrs object at 0x7fa8a578c860>], port: ~typing.Annotated[int, <efro.dataclassio.IOAttrs object at 0x7fa8a5794ce0>])[source]¶
Bases:
object
Information about a specific server.
- address: IOAttrs object at 0x7fa8a5796e10>]¶
- latlong: IOAttrs object at 0x7fa8a5795e20>]¶
- port: IOAttrs object at 0x7fa8a592bb30>]¶
- zone: IOAttrs object at 0x7fa8a54a8ce0>]¶
- class bacommon.net.ServerNodeQueryResponse(time: ~typing.Annotated[~datetime.datetime, <efro.dataclassio.IOAttrs object at 0x7fa8a54a92e0>], latlong: ~typing.Annotated[tuple[float, float] | None, <efro.dataclassio.IOAttrs object at 0x7fa8a54a9250>], ping_per_dist: ~typing.Annotated[float, <efro.dataclassio.IOAttrs object at 0x7fa8a57b8530>], max_dist: ~typing.Annotated[float, <efro.dataclassio.IOAttrs object at 0x7fa8a57b87d0>], debug_log_seconds: ~typing.Annotated[float | None, <efro.dataclassio.IOAttrs object at 0x7fa8a58ba030>] = None, error: ~typing.Annotated[str | None, <efro.dataclassio.IOAttrs object at 0x7fa8a57b8a70>] = None, servers: ~typing.Annotated[list[~bacommon.net.ServerNodeEntry], <efro.dataclassio.IOAttrs object at 0x7fa8a57b8830>] = <factory>)[source]¶
Bases:
object
A response to a query about server-nodes.
- debug_log_seconds: IOAttrs object at 0x7fa8a57b94c0>] = None¶
- error: IOAttrs object at 0x7fa8a5e8a4b0>] = None¶
- latlong: IOAttrs object at 0x7fa8a57ba060>]¶
- max_dist: IOAttrs object at 0x7fa8a54b8260>]¶
- ping_per_dist: IOAttrs object at 0x7fa8a54b90a0>]¶
- servers: IOAttrs object at 0x7fa8a54ba450>]¶
- time: IOAttrs object at 0x7fa8a54badb0>]¶
bacommon.servermanager module¶
Functionality related to the server manager script.
- class bacommon.servermanager.ChatMessageCommand(message: str, clients: list[int] | None)[source]¶
Bases:
ServerCommand
Chat message from the server.
- clients: list[int] | None¶
- message: str¶
- class bacommon.servermanager.ClientListCommand[source]¶
Bases:
ServerCommand
Print a list of clients.
- class bacommon.servermanager.KickCommand(client_id: int, ban_time: int | None)[source]¶
Bases:
ServerCommand
Kick a client.
- ban_time: int | None¶
- client_id: int¶
- class bacommon.servermanager.ScreenMessageCommand(message: str, color: tuple[float, float, float] | None, clients: list[int] | None)[source]¶
Bases:
ServerCommand
Screen-message from the server.
- clients: list[int] | None¶
- color: tuple[float, float, float] | None¶
- message: str¶
- class bacommon.servermanager.ServerCommand[source]¶
Bases:
object
Base class for commands that can be sent to the server.
- class bacommon.servermanager.ServerConfig(party_name: str = 'FFA', party_is_public: bool = True, authenticate_clients: bool = True, admins: list[str] = <factory>, enable_default_kick_voting: bool = True, public_ipv4_address: str | None = None, public_ipv6_address: str | None = None, port: int = 43210, max_party_size: int = 6, session_max_players_override: int | None = None, session_type: str = 'ffa', playlist_code: int | None = None, playlist_inline: list[dict[str, ~typing.Any]] | None = None, playlist_shuffle: bool = True, auto_balance_teams: bool = True, coop_campaign: str = 'Easy', coop_level: str = 'Onslaught Training', enable_telnet: bool = False, teams_series_length: int = 7, ffa_series_length: int = 24, stats_url: str | None = None, clean_exit_minutes: float | None = None, unclean_exit_minutes: float | None = None, idle_exit_minutes: float | None = None, show_tutorial: bool = False, team_names: tuple[str, str] | None = None, team_colors: tuple[tuple[float, float, float], tuple[float, float, float]] | None = None, enable_queue: bool = True, protocol_version: int | None = None, stress_test_players: int | None = None, player_rejoin_cooldown: float = 10.0, log_levels: dict[str, str] | None = None)[source]¶
Bases:
object
Configuration for the server manager app (<appname>_server).
- admins: list[str]¶
- authenticate_clients: bool = True¶
- auto_balance_teams: bool = True¶
- clean_exit_minutes: float | None = None¶
- coop_campaign: str = 'Easy'¶
- coop_level: str = 'Onslaught Training'¶
- enable_default_kick_voting: bool = True¶
- enable_queue: bool = True¶
- enable_telnet: bool = False¶
- ffa_series_length: int = 24¶
- idle_exit_minutes: float | None = None¶
- log_levels: dict[str, str] | None = None¶
- max_party_size: int = 6¶
- party_is_public: bool = True¶
- party_name: str = 'FFA'¶
- player_rejoin_cooldown: float = 10.0¶
- playlist_code: int | None = None¶
- playlist_inline: list[dict[str, Any]] | None = None¶
- playlist_shuffle: bool = True¶
- port: int = 43210¶
- protocol_version: int | None = None¶
- public_ipv4_address: str | None = None¶
- public_ipv6_address: str | None = None¶
- session_max_players_override: int | None = None¶
- session_type: str = 'ffa'¶
- show_tutorial: bool = False¶
- stats_url: str | None = None¶
- stress_test_players: int | None = None¶
- team_colors: tuple[tuple[float, float, float], tuple[float, float, float]] | None = None¶
- team_names: tuple[str, str] | None = None¶
- teams_series_length: int = 7¶
- unclean_exit_minutes: float | None = None¶
- class bacommon.servermanager.ShutdownCommand(reason: ShutdownReason, immediate: bool)[source]¶
Bases:
ServerCommand
Tells the server to shut down.
- immediate: bool¶
- reason: ShutdownReason¶
- class bacommon.servermanager.ShutdownReason(value, names=<not given>, *values, module=None, qualname=None, type=None, start=1, boundary=None)[source]¶
Bases:
Enum
Reason a server is shutting down.
- NONE = 'none'¶
- RESTARTING = 'restarting'¶
- class bacommon.servermanager.StartServerModeCommand(config: ServerConfig)[source]¶
Bases:
ServerCommand
Tells the app to switch into ‘server’ mode.
- config: ServerConfig¶
bacommon.transfer module¶
Functionality related to transferring files/data.
- class bacommon.transfer.DirectoryManifest(files: ~typing.Annotated[dict[str, ~bacommon.transfer.DirectoryManifestFile], <efro.dataclassio.IOAttrs object at 0x7fa8a51ad220>], exists: ~typing.Annotated[bool, <efro.dataclassio.IOAttrs object at 0x7fa8a53b3080>])[source]¶
Bases:
object
Contains a summary of files in a directory.
- classmethod create_from_disk(path: Path) DirectoryManifest [source]¶
Create a manifest from a directory on disk.
- exists: IOAttrs object at 0x7fa8a548fe30>]¶
- files: IOAttrs object at 0x7fa8a5298830>]¶
- class bacommon.transfer.DirectoryManifestFile(hash_sha256: ~typing.Annotated[str, <efro.dataclassio.IOAttrs object at 0x7fa8a531b380>], size: ~typing.Annotated[int, <efro.dataclassio.IOAttrs object at 0x7fa8a5318980>])[source]¶
Bases:
object
Describes a file in a manifest.
- hash_sha256: IOAttrs object at 0x7fa8a531b9e0>]¶
- size: IOAttrs object at 0x7fa8a531b4d0>]¶
Module contents¶
Functionality and data common to ballistica client and server components.