
bacommon package¶
Subpackages¶
Submodules¶
bacommon.app module¶
Common high level values/functionality related to apps.
- class bacommon.app.AppArchitecture(*values)[source]¶
Bases:
Enum
Processor architecture the App is running on.
- ARM = 'arm'¶
- ARM64 = 'arm64'¶
- X86 = 'x86'¶
- X86_64 = 'x86_64'¶
- class bacommon.app.AppExperience(*values)[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 0x7efe1afbf9b0>], locale: ~typing.Annotated[str, <efro.dataclassio.IOAttrs object at 0x7efe1afbcf50>], device: ~typing.Annotated[str | None, <efro.dataclassio.IOAttrs object at 0x7efe1afbc560>])[source]¶
Bases:
object
General info about an individual running app.
- architecture¶
alias of
Annotated
[AppArchitecture
, <efro.dataclassio.IOAttrs object at 0x7efe1c7972f0>]
- device: IOAttrs object at 0x7efe1afbde20>]¶
- engine_build¶
alias of
Annotated
[int
, <efro.dataclassio.IOAttrs object at 0x7efe1c796f60>]
- engine_version¶
alias of
Annotated
[str
, <efro.dataclassio.IOAttrs object at 0x7efe1c797c20>]
- interface_idiom: IOAttrs object at 0x7efe1afdd070>]¶
- locale: IOAttrs object at 0x7efe1afdc590>]¶
- name¶
alias of
Annotated
[str
, <efro.dataclassio.IOAttrs object at 0x7efe207fa5a0>]
- os_version¶
alias of
Annotated
[str
|None
, <efro.dataclassio.IOAttrs object at 0x7efe1c797d70>]
- platform¶
alias of
Annotated
[AppPlatform
, <efro.dataclassio.IOAttrs object at 0x7efe1c795cd0>]
- variant¶
alias of
Annotated
[AppVariant
, <efro.dataclassio.IOAttrs object at 0x7efe1c7966c0>]
- class bacommon.app.AppInterfaceIdiom(*values)[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(*values)[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(*values)[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 0x7efe1ae627e0>] = <factory>, initial_build_count: ~typing.Annotated[int, <efro.dataclassio.IOAttrs object at 0x7efe1ae62900>] = 0, error: ~typing.Annotated[str | None, <efro.dataclassio.IOAttrs object at 0x7efe1ae629c0>] = None)[source]¶
Bases:
object
Contains info about an in-progress asset cloud build.
- error: IOAttrs object at 0x7efe1ae42300>] = None¶
- in_progress_builds: IOAttrs object at 0x7efe1ae415e0>]¶
- initial_build_count: IOAttrs object at 0x7efe1ae414c0>] = 0¶
- class bacommon.assets.AssetPackageFlavor(*values)[source]¶
Bases:
Enum
Flavors for asset package outputs for different platforms/etc.
- DESKTOP = 'desktop'¶
- MOBILE = 'mobile'¶
bacommon.bacloud module¶
Functionality related to the bacloud tool.
- class bacommon.bacloud.RequestData(command: ~typing.Annotated[str, <efro.dataclassio.IOAttrs object at 0x7efe1aea4f50>], token: ~typing.Annotated[str | None, <efro.dataclassio.IOAttrs object at 0x7efe1aea5040>], payload: ~typing.Annotated[dict, <efro.dataclassio.IOAttrs object at 0x7efe1aea51c0>], tzoffset: ~typing.Annotated[float, <efro.dataclassio.IOAttrs object at 0x7efe1aea5220>], isatty: ~typing.Annotated[bool, <efro.dataclassio.IOAttrs object at 0x7efe1aea5310>])[source]¶
Bases:
object
Request sent to bacloud server.
- command: IOAttrs object at 0x7efe1aea7ce0>]¶
- isatty: IOAttrs object at 0x7efe1aea6780>]¶
- payload: IOAttrs object at 0x7efe1aea4c20>]¶
- token: IOAttrs object at 0x7efe1aea4740>]¶
- tzoffset: IOAttrs object at 0x7efe1afdc140>]¶
- 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 0x7efe1abee5d0>], args: ~typing.Annotated[dict[str, str], <efro.dataclassio.IOAttrs object at 0x7efe1abee4b0>])[source]¶
Bases:
object
Individual download.
- args: IOAttrs object at 0x7efe1ac04740>]¶
- path: IOAttrs object at 0x7efe1ac04920>]¶
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(*values)[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(*values)[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 0x7efe1aba7650>], game: ~typing.Annotated[str, <efro.dataclassio.IOAttrs object at 0x7efe1afdd400>], players: ~typing.Annotated[int, <efro.dataclassio.IOAttrs object at 0x7efe1ac1c140>], rank: ~typing.Annotated[int, <efro.dataclassio.IOAttrs object at 0x7efe1afddf70>], trophy: ~typing.Annotated[str | None, <efro.dataclassio.IOAttrs object at 0x7efe1ac1c290>], prizes: ~typing.Annotated[list[~bacommon.bs.DisplayItemWrapper], <efro.dataclassio.IOAttrs object at 0x7efe1afbe390>])[source]¶
Bases:
BasicClientUIComponent
Show info about a classic tourney.
- game: IOAttrs object at 0x7efe1abee450>]¶
- classmethod get_type_id() BasicClientUIComponentTypeID [source]¶
Return the type-id for this subclass.
- players: IOAttrs object at 0x7efe1ac1c8c0>]¶
- prizes: IOAttrs object at 0x7efe1ac05490>]¶
- rank: IOAttrs object at 0x7efe1ac1ede0>]¶
- tournament_id: IOAttrs object at 0x7efe1ac05910>]¶
- trophy: IOAttrs object at 0x7efe1ac1f830>]¶
- 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 0x7efe1abefe00>], label: ~typing.Annotated[str, <efro.dataclassio.IOAttrs object at 0x7efe1abee8a0>], subs: ~typing.Annotated[list[str], <efro.dataclassio.IOAttrs object at 0x7efe1aea64e0>] = <factory>, spacing_top: ~typing.Annotated[float, <efro.dataclassio.IOAttrs object at 0x7efe1aea6630>] = 0.0, spacing_bottom: ~typing.Annotated[float, <efro.dataclassio.IOAttrs object at 0x7efe1aea6960>] = 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 0x7efe1ac06f00>]¶
- spacing_bottom: IOAttrs object at 0x7efe1aea7d40>] = 0.0¶
- spacing_top: IOAttrs object at 0x7efe1ac31040>] = 0.0¶
- subs: IOAttrs object at 0x7efe1aa99700>]¶
- url: IOAttrs object at 0x7efe1aad87d0>]¶
- class bacommon.bs.BasicClientUIComponentText(text: ~typing.Annotated[str, <efro.dataclassio.IOAttrs object at 0x7efe1aad86e0>], subs: ~typing.Annotated[list[str], <efro.dataclassio.IOAttrs object at 0x7efe1afbfe30>] = <factory>, scale: ~typing.Annotated[float, <efro.dataclassio.IOAttrs object at 0x7efe1aba73e0>] = 1.0, color: ~typing.Annotated[tuple[float, float, float, float], <efro.dataclassio.IOAttrs object at 0x7efe1afbf1a0>] = (1.0, 1.0, 1.0, 1.0), spacing_top: ~typing.Annotated[float, <efro.dataclassio.IOAttrs object at 0x7efe1aba7260>] = 0.0, spacing_bottom: ~typing.Annotated[float, <efro.dataclassio.IOAttrs object at 0x7efe1ac1c290>] = 0.0)[source]¶
Bases:
BasicClientUIComponent
Show some text in the inbox message.
- color: IOAttrs object at 0x7efe1aba47d0>] = (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 0x7efe1ac1d250>] = 1.0¶
- spacing_bottom: IOAttrs object at 0x7efe1abee840>] = 0.0¶
- spacing_top: IOAttrs object at 0x7efe1ac1e060>] = 0.0¶
- subs: IOAttrs object at 0x7efe1ac1e330>]¶
- text: IOAttrs object at 0x7efe1aad8bc0>]¶
- class bacommon.bs.BasicClientUIComponentTypeID(*values)[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 0x7efe1aad9bb0>], width: ~typing.Annotated[float, <efro.dataclassio.IOAttrs object at 0x7efe1aad9cd0>] = 100.0, spacing_top: ~typing.Annotated[float, <efro.dataclassio.IOAttrs object at 0x7efe1ae42d80>] = 0.0, spacing_bottom: ~typing.Annotated[float, <efro.dataclassio.IOAttrs object at 0x7efe1ac05670>] = 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 0x7efe1aada510>]¶
- spacing_bottom: IOAttrs object at 0x7efe1abeffe0>] = 0.0¶
- spacing_top: IOAttrs object at 0x7efe1aea6630>] = 0.0¶
- width: IOAttrs object at 0x7efe1aadad50>] = 100.0¶
- class bacommon.bs.BasicClientUIExpireTime(time: ~typing.Annotated[~datetime.datetime, <efro.dataclassio.IOAttrs object at 0x7efe1aadb380>], spacing_top: ~typing.Annotated[float, <efro.dataclassio.IOAttrs object at 0x7efe1aadb2c0>] = 0.0, spacing_bottom: ~typing.Annotated[float, <efro.dataclassio.IOAttrs object at 0x7efe1abeffb0>] = 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 0x7efe1aea7320>] = 0.0¶
- spacing_top: IOAttrs object at 0x7efe1aad9a30>] = 0.0¶
- time: IOAttrs object at 0x7efe1aadb680>]¶
- 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(*values)[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 0x7efe1abefef0>] = 0, contents: ~typing.Annotated[list[~bacommon.bs.DisplayItemWrapper] | None, <efro.dataclassio.IOAttrs object at 0x7efe1ac30c20>] = None, prizeindex: ~typing.Annotated[int, <efro.dataclassio.IOAttrs object at 0x7efe1ac30b60>] = 0, error: ~typing.Annotated[str | None, <efro.dataclassio.IOAttrs object at 0x7efe1ac05790>] = None, warning: ~typing.Annotated[str | None, <efro.dataclassio.IOAttrs object at 0x7efe1aadb920>] = None, success_msg: ~typing.Annotated[str | None, <efro.dataclassio.IOAttrs object at 0x7efe1aad9ee0>] = None)[source]¶
Bases:
Response
Here’s the results of that action you asked for, boss.
- contents: IOAttrs object at 0x7efe1a97cda0>] = None¶
- error: IOAttrs object at 0x7efe1afddf70>] = None¶
- prizeindex: IOAttrs object at 0x7efe1afdc470>] = 0¶
- success_msg: IOAttrs object at 0x7efe1abecc80>] = None¶
- tokens_charged: IOAttrs object at 0x7efe1a97dbe0>] = 0¶
- warning: IOAttrs object at 0x7efe1abede20>] = None¶
- class bacommon.bs.ChestDisplayItem(appearance: ~typing.Annotated[~bacommon.bs.ClassicChestAppearance, <efro.dataclassio.IOAttrs object at 0x7efe1a97e210>])[source]¶
Bases:
DisplayItem
Display a chest.
- appearance: IOAttrs object at 0x7efe1a97c9b0>]¶
- 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 0x7efe1a97c7d0>])[source]¶
Bases:
Message
Request info about a chest.
- chest_id: IOAttrs object at 0x7efe1a97e630>]¶
- 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 0x7efe1aad9700>], contents: ~typing.Annotated[list[~bacommon.bs.DisplayItemWrapper], <efro.dataclassio.IOAttrs object at 0x7efe1ac04a10>])[source]¶
Bases:
object
A possible set of prizes for this chest.
- contents: IOAttrs object at 0x7efe1ac1ed20>]¶
- weight: IOAttrs object at 0x7efe1a9846b0>]¶
- 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 0x7efe1aad9700>], unlock_time: ~typing.Annotated[~datetime.datetime, <efro.dataclassio.IOAttrs object at 0x7efe1a97e6c0>], ad_allow_time: ~typing.Annotated[~datetime.datetime | None, <efro.dataclassio.IOAttrs object at 0x7efe1ac1db50>])[source]¶
Bases:
object
A lovely chest.
- ad_allow_time: IOAttrs object at 0x7efe1aea5640>]¶
- appearance: IOAttrs object at 0x7efe1a987500>]¶
- unlock_time: IOAttrs object at 0x7efe1a9874a0>]¶
- class LeagueType(*values)[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(*values)[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 0x7efe1a9ba3f0>])[source]¶
Bases:
ClientEffect
Delay effect processing.
- classmethod get_type_id() ClientEffectTypeID [source]¶
Return the type-id for this subclass.
- seconds: IOAttrs object at 0x7efe1a9ba9c0>]¶
- class bacommon.bs.ClientEffectScreenMessage(message: ~typing.Annotated[str, <efro.dataclassio.IOAttrs object at 0x7efe1a9bac60>], subs: ~typing.Annotated[list[str], <efro.dataclassio.IOAttrs object at 0x7efe1a9bbe00>], color: ~typing.Annotated[tuple[float, float, float], <efro.dataclassio.IOAttrs object at 0x7efe1a97f6b0>] = (1.0, 1.0, 1.0))[source]¶
Bases:
ClientEffect
Display a screen-message.
- color: IOAttrs object at 0x7efe1ac1eb10>] = (1.0, 1.0, 1.0)¶
- classmethod get_type_id() ClientEffectTypeID [source]¶
Return the type-id for this subclass.
- message: IOAttrs object at 0x7efe1ac1e810>]¶
- subs: IOAttrs object at 0x7efe1aadb3e0>]¶
- 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(*values)[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(*values)[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(*values)[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 0x7efe1a845970>], action: ~typing.Annotated[~bacommon.bs.ClientUIAction, <efro.dataclassio.IOAttrs object at 0x7efe1a845a00>])[source]¶
Bases:
Message
Do something to a client ui.
- action: IOAttrs object at 0x7efe1a984c80>]¶
- 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 0x7efe1a8467b0>]¶
- 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(*values)[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(*values)[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 0x7efe1a845f10>], createtime: ~typing.Annotated[~datetime.datetime, <efro.dataclassio.IOAttrs object at 0x7efe1a845e80>], ui: ~typing.Annotated[~bacommon.bs.ClientUI, <efro.dataclassio.IOAttrs object at 0x7efe1a9b9970>])[source]¶
Bases:
object
Wrapper for a ClientUI and its common data.
- createtime: IOAttrs object at 0x7efe1a985d60>]¶
- id: IOAttrs object at 0x7efe1a8541a0>]¶
- ui: IOAttrs object at 0x7efe1a9860c0>]¶
- 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(*values)[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 0x7efe1a854e00>], description: ~typing.Annotated[str, <efro.dataclassio.IOAttrs object at 0x7efe1a854da0>], description_subs: ~typing.Annotated[list[str] | None, <efro.dataclassio.IOAttrs object at 0x7efe1a9860f0>])[source]¶
Bases:
object
Wraps a DisplayItem and common info.
- description: IOAttrs object at 0x7efe1ac1d5e0>]¶
- description_subs: IOAttrs object at 0x7efe1a986990>]¶
- classmethod for_display_item(item: DisplayItem) DisplayItemWrapper [source]¶
Convenience method to wrap a DisplayItem.
- item: IOAttrs object at 0x7efe1a847dd0>]¶
- class bacommon.bs.InboxRequestResponse(wrappers: ~typing.Annotated[list[~bacommon.bs.ClientUIWrapper], <efro.dataclassio.IOAttrs object at 0x7efe1a855af0>], error: ~typing.Annotated[str | None, <efro.dataclassio.IOAttrs object at 0x7efe1a855640>] = None)[source]¶
Bases:
Response
Here’s that inbox contents you asked for, boss.
- error: IOAttrs object at 0x7efe1a987770>] = None¶
- wrappers: IOAttrs object at 0x7efe1a855f70>]¶
- class bacommon.bs.PrivatePartyMessage(need_datacode: ~typing.Annotated[bool, <efro.dataclassio.IOAttrs object at 0x7efe1a8561b0>])[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 0x7efe1a856690>]¶
- class bacommon.bs.PrivatePartyResponse(success: ~typing.Annotated[bool, <efro.dataclassio.IOAttrs object at 0x7efe1a856870>], tokens: ~typing.Annotated[int, <efro.dataclassio.IOAttrs object at 0x7efe1a8567e0>], gold_pass: ~typing.Annotated[bool, <efro.dataclassio.IOAttrs object at 0x7efe1a9b9be0>], datacode: ~typing.Annotated[str | None, <efro.dataclassio.IOAttrs object at 0x7efe1a9b8140>])[source]¶
Bases:
Response
Here’s that private party UI info you asked for, boss.
- datacode: IOAttrs object at 0x7efe1a9ba1e0>]¶
- gold_pass: IOAttrs object at 0x7efe1a9ba330>]¶
- success: IOAttrs object at 0x7efe1a856f60>]¶
- tokens: IOAttrs object at 0x7efe1a9bbfe0>]¶
- class bacommon.bs.ScoreSubmitMessage(score_token: ~typing.Annotated[str, <efro.dataclassio.IOAttrs object at 0x7efe1a8571a0>])[source]¶
Bases:
Message
Let the server know we got some score in something.
- 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.
- score_token: IOAttrs object at 0x7efe1a97e540>]¶
- class bacommon.bs.ScoreSubmitResponse(effects: ~typing.Annotated[list[~bacommon.bs.ClientEffect], <efro.dataclassio.IOAttrs object at 0x7efe1a9b9d90>])[source]¶
Bases:
Response
Did something to that inbox entry, boss.
- effects: IOAttrs object at 0x7efe1a857620>]¶
- 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 0x7efe1a9b8b90>])[source]¶
Bases:
DisplayItem
Some amount of tickets.
- count: IOAttrs object at 0x7efe1a987fe0>]¶
- 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 0x7efe1a855b50>])[source]¶
Bases:
DisplayItem
Some amount of tokens.
- count: IOAttrs object at 0x7efe1aada6f0>]¶
- 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 0x7efe1a393b60>], size: ~typing.Annotated[int, <efro.dataclassio.IOAttrs object at 0x7efe1a393a40>], version: ~typing.Annotated[str, <efro.dataclassio.IOAttrs object at 0x7efe1a8468d0>], build_number: ~typing.Annotated[int, <efro.dataclassio.IOAttrs object at 0x7efe1a846810>], checksum: ~typing.Annotated[str, <efro.dataclassio.IOAttrs object at 0x7efe1a782db0>], createtime: ~typing.Annotated[~datetime.datetime, <efro.dataclassio.IOAttrs object at 0x7efe1a845f70>])[source]¶
Bases:
object
Info about a particular app build.
- build_number: IOAttrs object at 0x7efe1a986900>]¶
- checksum: IOAttrs object at 0x7efe1a3cd070>]¶
- createtime: IOAttrs object at 0x7efe1a856510>]¶
- filename: IOAttrs object at 0x7efe1a3cd400>]¶
- size: IOAttrs object at 0x7efe1a856d50>]¶
- version: IOAttrs object at 0x7efe1a9b80b0>]¶
bacommon.cloud module¶
Functionality related to cloud functionality.
- class bacommon.cloud.LoginProxyCompleteMessage(proxyid: ~typing.Annotated[str, <efro.dataclassio.IOAttrs object at 0x7efe1a1fe510>])[source]¶
Bases:
Message
Just so you know, we’re done with this proxy.
- proxyid: IOAttrs object at 0x7efe1a1fe840>]¶
- 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 0x7efe1a392360>], url_overlay: ~typing.Annotated[str, <efro.dataclassio.IOAttrs object at 0x7efe1a392330>], proxyid: ~typing.Annotated[str, <efro.dataclassio.IOAttrs object at 0x7efe1a9ba2a0>], proxykey: ~typing.Annotated[str, <efro.dataclassio.IOAttrs object at 0x7efe1a9b9400>])[source]¶
Bases:
Response
Response to a request for a login proxy.
- proxyid: IOAttrs object at 0x7efe1a857440>]¶
- proxykey: IOAttrs object at 0x7efe1a857d10>]¶
- url: IOAttrs object at 0x7efe1a1fc500>]¶
- url_overlay: IOAttrs object at 0x7efe1ae403b0>]¶
- class bacommon.cloud.LoginProxyStateQueryMessage(proxyid: ~typing.Annotated[str, <efro.dataclassio.IOAttrs object at 0x7efe1a392c90>], proxykey: ~typing.Annotated[str, <efro.dataclassio.IOAttrs object at 0x7efe1a392720>])[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 0x7efe1a1fdc70>]¶
- proxykey: IOAttrs object at 0x7efe1a1fdf40>]¶
- 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 0x7efe1a1ff800>] = 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 0x7efe1a1ffa10>] = 'e'¶
- class bacommon.cloud.ManageAccountResponse(url: ~typing.Annotated[str | None, <efro.dataclassio.IOAttrs object at 0x7efe1a1fef30>])[source]¶
Bases:
Response
Here’s that sign-in result you asked for, boss.
- url: IOAttrs object at 0x7efe1a1ffa40>]¶
- class bacommon.cloud.MerchAvailabilityResponse(url: ~typing.Annotated[str | None, <efro.dataclassio.IOAttrs object at 0x7efe1a1fef00>])[source]¶
Bases:
Response
About that merch…
- url: IOAttrs object at 0x7efe1a264350>]¶
- class bacommon.cloud.SendInfoMessage(description: ~typing.Annotated[str, <efro.dataclassio.IOAttrs object at 0x7efe1a264980>])[source]¶
Bases:
Message
User is using the send-info function
- description: IOAttrs object at 0x7efe1a264b30>]¶
- class bacommon.cloud.SendInfoResponse(handled: ~typing.Annotated[bool, <efro.dataclassio.IOAttrs object at 0x7efe1a264f50>], message: ~typing.Annotated[str | None, <efro.dataclassio.IOAttrs object at 0x7efe1a265190>] = None, legacy_code: ~typing.Annotated[str | None, <efro.dataclassio.IOAttrs object at 0x7efe1a854e30>] = None)[source]¶
Bases:
Response
Response to sending into the server.
- handled: IOAttrs object at 0x7efe1a265730>]¶
- legacy_code: IOAttrs object at 0x7efe1a97d6d0>] = None¶
- message: IOAttrs object at 0x7efe1a265b50>] = None¶
- class bacommon.cloud.SignInMessage(login_type: ~typing.Annotated[~bacommon.login.LoginType, <efro.dataclassio.IOAttrs object at 0x7efe1a265fa0>], sign_in_token: ~typing.Annotated[str, <efro.dataclassio.IOAttrs object at 0x7efe1a265f40>], description: ~typing.Annotated[str, <efro.dataclassio.IOAttrs object at 0x7efe1aad9f10>], apptime: ~typing.Annotated[float, <efro.dataclassio.IOAttrs object at 0x7efe1aad8e30>])[source]¶
Bases:
Message
Can I sign in please?
- apptime: IOAttrs object at 0x7efe1a9b8500>]¶
- description: IOAttrs object at 0x7efe1a3cd7f0>]¶
- 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 0x7efe1a3cce30>]¶
- sign_in_token: IOAttrs object at 0x7efe1a9b86e0>]¶
- class bacommon.cloud.SignInResponse(credentials: ~typing.Annotated[str | None, <efro.dataclassio.IOAttrs object at 0x7efe1a2674d0>])[source]¶
Bases:
Response
Here’s that sign-in result you asked for, boss.
- credentials: IOAttrs object at 0x7efe1a267cb0>]¶
- 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 bacommon.cloud.TestMessage(testfoo: ~typing.Annotated[int, <efro.dataclassio.IOAttrs object at 0x7efe1a28c050>])[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 0x7efe1a28d940>]¶
- class bacommon.cloud.TestResponse(testfoo: ~typing.Annotated[int, <efro.dataclassio.IOAttrs object at 0x7efe1a28db50>])[source]¶
Bases:
Response
Here’s that workspace you asked for, boss.
- testfoo: IOAttrs object at 0x7efe1a2646b0>]¶
- class bacommon.cloud.WebLocation(*values)[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 0x7efe1a28e1b0>], state: ~typing.Annotated[~bacommon.cloud.WorkspaceFetchState, <efro.dataclassio.IOAttrs object at 0x7efe1a28e150>])[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 0x7efe1a28e600>]¶
- workspaceid: IOAttrs object at 0x7efe1a28e810>]¶
- class bacommon.cloud.WorkspaceFetchResponse(state: ~typing.Annotated[~bacommon.cloud.WorkspaceFetchState, <efro.dataclassio.IOAttrs object at 0x7efe1a28e990>], deletes: ~typing.Annotated[list[str], <efro.dataclassio.IOAttrs object at 0x7efe1a28eab0>] = <factory>, downloads_inline: ~typing.Annotated[dict[str, bytes], <efro.dataclassio.IOAttrs object at 0x7efe1a857440>] = <factory>, done: ~typing.Annotated[bool, <efro.dataclassio.IOAttrs object at 0x7efe1a856de0>] = False)[source]¶
Bases:
Response
Here’s that workspace you asked for, boss.
- deletes: IOAttrs object at 0x7efe1a1fd6d0>]¶
- done: IOAttrs object at 0x7efe1a1fdf10>] = False¶
- downloads_inline: IOAttrs object at 0x7efe1a9baf00>]¶
- state: IOAttrs object at 0x7efe1a1ff0e0>]¶
- class bacommon.cloud.WorkspaceFetchState(manifest: ~typing.Annotated[~bacommon.transfer.DirectoryManifest, <efro.dataclassio.IOAttrs object at 0x7efe1a1fee70>], iteration: ~typing.Annotated[int, <efro.dataclassio.IOAttrs object at 0x7efe1a264080>] = 0, total_deletes: ~typing.Annotated[int, <efro.dataclassio.IOAttrs object at 0x7efe1a2641d0>] = 0, total_downloads: ~typing.Annotated[int, <efro.dataclassio.IOAttrs object at 0x7efe1a1fd250>] = 0, total_up_to_date: ~typing.Annotated[int | None, <efro.dataclassio.IOAttrs object at 0x7efe1a2646e0>] = None)[source]¶
Bases:
object
Common state data for a workspace fetch.
- iteration: IOAttrs object at 0x7efe1a2653a0>] = 0¶
- manifest: IOAttrs object at 0x7efe1a2b5070>]¶
- total_deletes: IOAttrs object at 0x7efe1a265f70>] = 0¶
- total_downloads: IOAttrs object at 0x7efe1a2666c0>] = 0¶
- total_up_to_date: IOAttrs object at 0x7efe1a9872c0>] = None¶
bacommon.loggercontrol module¶
System for managing loggers.
- class bacommon.loggercontrol.LoggerControlConfig(levels: ~typing.Annotated[dict[str, int], <efro.dataclassio.IOAttrs object at 0x7efe1a05d2b0>] = <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 0x7efe1a05c8c0>]¶
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.
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 0x7efe19f3f980>] = None, address6: ~typing.Annotated[str | None, <efro.dataclassio.IOAttrs object at 0x7efe19f3f860>] = 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 0x7efe19f3c560>] = None¶
- address6: IOAttrs object at 0x7efe19f3fdd0>] = 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 0x7efe19f84bc0>], latlong: ~typing.Annotated[tuple[float, float] | None, <efro.dataclassio.IOAttrs object at 0x7efe19f84b30>], address: ~typing.Annotated[str, <efro.dataclassio.IOAttrs object at 0x7efe1a28c200>], port: ~typing.Annotated[int, <efro.dataclassio.IOAttrs object at 0x7efe1a28d760>])[source]¶
Bases:
object
Information about a specific server.
- address: IOAttrs object at 0x7efe1a1fe480>]¶
- latlong: IOAttrs object at 0x7efe19ef5430>]¶
- port: IOAttrs object at 0x7efe1a28f5c0>]¶
- zone: IOAttrs object at 0x7efe19ef5c10>]¶
- class bacommon.net.ServerNodeQueryResponse(time: ~typing.Annotated[~datetime.datetime, <efro.dataclassio.IOAttrs object at 0x7efe19ef40b0>], latlong: ~typing.Annotated[tuple[float, float] | None, <efro.dataclassio.IOAttrs object at 0x7efe19ef4350>], ping_per_dist: ~typing.Annotated[float, <efro.dataclassio.IOAttrs object at 0x7efe1a28fbc0>], max_dist: ~typing.Annotated[float, <efro.dataclassio.IOAttrs object at 0x7efe1a1fd700>], debug_log_seconds: ~typing.Annotated[float | None, <efro.dataclassio.IOAttrs object at 0x7efe1a1fd8e0>] = None, error: ~typing.Annotated[str | None, <efro.dataclassio.IOAttrs object at 0x7efe1a05f6e0>] = None, servers: ~typing.Annotated[list[~bacommon.net.ServerNodeEntry], <efro.dataclassio.IOAttrs object at 0x7efe1a05f260>] = <factory>)[source]¶
Bases:
object
A response to a query about server-nodes.
- debug_log_seconds: IOAttrs object at 0x7efe19f86f00>] = None¶
- error: IOAttrs object at 0x7efe1a05c8c0>] = None¶
- latlong: IOAttrs object at 0x7efe19f87c50>]¶
- max_dist: IOAttrs object at 0x7efe19fa0710>]¶
- ping_per_dist: IOAttrs object at 0x7efe19fa0c80>]¶
- servers: IOAttrs object at 0x7efe19f84b00>]¶
- time: IOAttrs object at 0x7efe19fa1a90>]¶
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(*values)[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 0x7efe19b10a40>], exists: ~typing.Annotated[bool, <efro.dataclassio.IOAttrs object at 0x7efe19b109e0>])[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 0x7efe19ca3e00>]¶
- files: IOAttrs object at 0x7efe19ca33b0>]¶
- class bacommon.transfer.DirectoryManifestFile(hash_sha256: ~typing.Annotated[str, <efro.dataclassio.IOAttrs object at 0x7efe19ca2ed0>], size: ~typing.Annotated[int, <efro.dataclassio.IOAttrs object at 0x7efe19ca2b70>])[source]¶
Bases:
object
Describes a file in a manifest.
- hash_sha256: IOAttrs object at 0x7efe19ca2630>]¶
- size: IOAttrs object at 0x7efe19ca1a60>]¶
Module contents¶
Functionality and data common to ballistica client and server components.