Package: earnalliance-python
Official Earn Alliance SDKs for PythonLinksContentsSupported PlatformsInstallation and UsageSupported PlatformsAny platform capable of running python3Prerequisitespython 3.11+Installation and UsageTo install a SDK, simply run the build commandpython3-mpipinstall.To build a ready-to-publish distribution, simply run the build command (ensure build command is available for your environment)python3-mbuildTo run tests - simply run (ensure pytest is available for your environment)./run_test.shInitializeSetup client so it can start sending events!alliance=sdk.init(options.NodeOptions(clientId="[clientId]",clientSecret="[clientSecret]",gameId="[gameId]",dsn="[dsn]",...))The client configuration can also be read from environment variables if not
provided as an option.# If the client id, secret, game id and dsn are not specific, the init# function will by default look for the environment variables# `ALLIANCE_CLIENT_ID`, `ALLIANCE_CLIENT_SECRET`, `ALLIANCE_GAME_ID` and# `ALLIANCE_DSN`.alliance=sdk.init()Set User IdentifiersWhenever a new user identifier is set, or a new user is registered, you can add or update the identifiers associated with the internal user id.This is used to tell us the user has installed the app and enrich information when more game platform accounts or social accounts are added to help us map the user to the game events.# This shows all of our currently supported platforms, but you only need to# provide the identifiers that are relevant for your game.properties=IdentifyingProperties(email="test@test.com",discordId="123456")awaitalliance.set_user_identifiers("1234",properties)Note that if you pass any falsey value identifier toset_user_identifiers, it will be ignored.
This is the avoid unintentionally removing previously set identifiers. If you want
to remove previously set identifiers, use theremove_identifiersfunction.frommodel.identifier_prop_namesimportIdentifierPropNamesasipnawaitalliance.remove_identifiers(identifier,ipn.DISCORD_ID,ipn.EMAIL)Track User Start SessionSends standard TRACK event for launching a game. This let's us know that the user
has the game launched and is ready to start a challenge.alliance.start_game("[internal user id]")Track EventsTracking events that happens in a game. Tracked events are batched together and sent after 30 seconds interval, or when a batch size of 100 events have
accumulated, whichever comes first. Both the interval and the batch size are
configurable in the client options.The name of the events can be almost anything, but we recommend sticking to
common terms as shown in the following examples.# An event without any specific value, commonly used for counting event# instances, i.e. "Kill X Zombies".awaitalliance.track("[internal user id]","KILL_ZOMBIE")# An event with an associated value, commonly used for accumulating or# checking min / max values, i.e. "Score a total of X" or "Achieve a# highscore of at least X".awaitalliance.track_with_value("[internal user id]","SCORE",100)# The client can track events for multiple users in parallel.awaitalliance.track_with_value("[internal user id]","DAMAGE_DONE",500)awaitalliance.track_with_value("[another user id]","DAMAGE_TAKEN",500)# Additional traits can be added to the event, which can be used to# create more detailed challenges, i.e. "Kill X monsters with a knife".weaponTrait={"weapon":"knife"}mobTrait={"mob":"zombie"}awaitalliance.track_with_traits("[internal user id]","KILL",weaponTrait,mobTrait)Group Tracked EventsYou can group events together, i.e. a game round or a match, whichever makes
sense for your game. This allows for natural challenge scopes like "Kill X players
in a match".# Generates unique group id which will be associated with all the eventsround=alliance.start_round("[group id]")awaitround.track("[internal user id]","KILL_ZOMBIE")Flush event queueFor events that have higher priority (i.e. setUserIdentifiers), instead of
initiating a scheduled batch, they trigger the use of an event queue flush.
This means that as long as the client has not been flushed prior to the event,
the event will be sent to the api right away.Once the queue has been has been flushed, the client enters a 10 second cooldown
period, during which any subsequent calls to flush, will wait for the cooldown
to finish, before it's triggered. Not that any normal procedures, like the queue
size reaches the batch limit, will still send the events to the api.Theflushfunction can also be called manually on the client instance, but
it is still restricted by the same cooldown mechanic.awaitalliance.flush();