Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Add "custom_fields" to events, typed the public facing api, and formatted code #126

Merged
merged 7 commits into from
Jun 13, 2024
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
8 changes: 8 additions & 0 deletions aftman.toml
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
# This file lists tools managed by Aftman, a cross-platform toolchain manager.
# For more information, see https://github.com/LPGhatguy/aftman

# To add a new tool, add an entry to this table.
[tools]
rojo = "rojo-rbx/rojo@7.4.1"
selene = "kampfkarren/selene@0.25.0"
stylua = "johnnymorganz/stylua@0.19.1"
151 changes: 131 additions & 20 deletions gameanalytics-sdk/GameAnalytics/Events.lua
Original file line number Diff line number Diff line change
Expand Up @@ -30,6 +30,28 @@ local CategorySdkError = "sdk_error"
local MAX_EVENTS_TO_SEND_IN_ONE_BATCH = 500
local MAX_AGGREGATED_EVENTS = 2000

local function addCustomFieldsToEvent(eventData, customFields)
if not (eventData and customFields) then
return
end

local fields = {}

for key, value in pairs(customFields) do
local v = tostring(value)
if #v > 256 then
logger:w("Custom field value is too long. Max length is 256 characters. Field: " .. key)
v = string.sub(v, 1, 256)
end

fields[key] = v
end

if fields and next(fields) then
eventData["custom_fields"] = fields
end
end

local function addDimensionsToEvent(playerId, eventData)
if not eventData or not playerId then
return
Expand Down Expand Up @@ -71,7 +93,7 @@ local DUMMY_SESSION_ID = HTTP:GenerateGUID(false):lower()
local function Length(Table)
local counter = 0
for _, _ in pairs(Table) do
counter =counter + 1
counter += 1
end
return counter
end
Expand All @@ -90,7 +112,7 @@ local function getEventAnnotations(playerId)
Platform = "uwp_desktop",
SessionID = DUMMY_SESSION_ID,
Sessions = 1,
CustomUserId = "Server"
CustomUserId = "Server",
}
end

Expand All @@ -115,7 +137,7 @@ local function getEventAnnotations(playerId)
-- Session identifier
["session_id"] = PlayerData.SessionID,
-- Session number
["session_num"] = PlayerData.Sessions
["session_num"] = PlayerData.Sessions,
}

if not utilities:isStringNullOrEmpty(PlayerData.CountryCode) then
Expand Down Expand Up @@ -168,7 +190,12 @@ local function dequeueMaxEvents()
store.EventsQueue = {}
return eventsQueue
else
logger:w(("More than %d events queued! Sending %d."):format(MAX_EVENTS_TO_SEND_IN_ONE_BATCH, MAX_EVENTS_TO_SEND_IN_ONE_BATCH))
logger:w(
("More than %d events queued! Sending %d."):format(
MAX_EVENTS_TO_SEND_IN_ONE_BATCH,
MAX_EVENTS_TO_SEND_IN_ONE_BATCH
)
)

if #store.EventsQueue > MAX_AGGREGATED_EVENTS then
logger:w(("DROPPING EVENTS: More than %d events queued!"):format(MAX_AGGREGATED_EVENTS))
Expand Down Expand Up @@ -224,7 +251,13 @@ local function processEvents()
end
else
if statusCode == http_api.EGAHTTPApiResponse.BadRequest and responseBody then
logger:w("Event queue: " .. tostring(#queue) .. " events sent. " .. tostring(#responseBody) .. " events failed GA server validation.")
logger:w(
"Event queue: "
.. tostring(#queue)
.. " events sent. "
.. tostring(#responseBody)
.. " events failed GA server validation."
)
else
logger:w("Event queue: Failed to send events.")
end
Expand Down Expand Up @@ -267,7 +300,7 @@ function events:setAvailableResourceItemTypes(availableResourceItemTypes)
logger:i("Set available resource item types: (" .. table.concat(availableResourceItemTypes, ", ") .. ")")
end

function events:addSessionStartEvent(playerId, teleportData)
function events:addSessionStartEvent(playerId, teleportData, customFields)
local PlayerData = store:GetPlayerDataFromCache(playerId)

if teleportData then
Expand All @@ -286,14 +319,15 @@ function events:addSessionStartEvent(playerId, teleportData)

-- Add to store
addEventToStore(playerId, eventDict)
addCustomFieldsToEvent(eventDict, customFields)

logger:i("Add SESSION START event")

processEvents()
end
end

function events:addSessionEndEvent(playerId)
function events:addSessionEndEvent(playerId, customFields)
local PlayerData = store:GetPlayerDataFromCache(playerId)
local session_start_ts = PlayerData.SessionStart
local client_ts_adjusted = getClientTsAdjusted(playerId)
Expand All @@ -317,6 +351,7 @@ function events:addSessionEndEvent(playerId)

-- Add custom dimensions
addDimensionsToEvent(playerId, eventDict)
addCustomFieldsToEvent(eventDict, customFields)

-- Add to store
addEventToStore(playerId, eventDict)
Expand All @@ -327,7 +362,7 @@ function events:addSessionEndEvent(playerId)
processEvents()
end

function events:addBusinessEvent(playerId, currency, amount, itemType, itemId, cartType)
function events:addBusinessEvent(playerId, currency, amount, itemType, itemId, cartType, customFields)
-- Validate event params
if not validation:validateBusinessEvent(currency, amount, cartType, itemType, itemId) then
-- TODO: add sdk error event
Expand Down Expand Up @@ -355,16 +390,40 @@ function events:addBusinessEvent(playerId, currency, amount, itemType, itemId, c

-- Add custom dimensions
addDimensionsToEvent(playerId, eventDict)

logger:i("Add BUSINESS event: {currency:" .. currency .. ", amount:" .. tostring(amount) .. ", itemType:" .. itemType .. ", itemId:" .. itemId .. ", cartType:" .. cartType .. "}")
addCustomFieldsToEvent(eventDict, customFields)

logger:i(
"Add BUSINESS event: {currency:"
.. currency
.. ", amount:"
.. tostring(amount)
.. ", itemType:"
.. itemType
.. ", itemId:"
.. itemId
.. ", cartType:"
.. cartType
.. "}"
)

-- Send to store
addEventToStore(playerId, eventDict)
end

function events:addResourceEvent(playerId, flowType, currency, amount, itemType, itemId)
function events:addResourceEvent(playerId, flowType, currency, amount, itemType, itemId, customFields)
-- Validate event params
if not validation:validateResourceEvent(GAResourceFlowType, flowType, currency, amount, itemType, itemId, self._availableResourceCurrencies, self._availableResourceItemTypes) then
if
not validation:validateResourceEvent(
GAResourceFlowType,
flowType,
currency,
amount,
itemType,
itemId,
self._availableResourceCurrencies,
self._availableResourceItemTypes
)
then
-- TODO: add sdk error event
return
end
Expand All @@ -385,16 +444,43 @@ function events:addResourceEvent(playerId, flowType, currency, amount, itemType,

-- Add custom dimensions
addDimensionsToEvent(playerId, eventDict)

logger:i("Add RESOURCE event: {currency:" .. currency .. ", amount:" .. tostring(amount) .. ", itemType:" .. itemType .. ", itemId:" .. itemId .. "}")
addCustomFieldsToEvent(eventDict, customFields)

logger:i(
"Add RESOURCE event: {currency:"
.. currency
.. ", amount:"
.. tostring(amount)
.. ", itemType:"
.. itemType
.. ", itemId:"
.. itemId
.. "}"
)

-- Send to store
addEventToStore(playerId, eventDict)
end

function events:addProgressionEvent(playerId, progressionStatus, progression01, progression02, progression03, score)
function events:addProgressionEvent(
playerId,
progressionStatus,
progression01,
progression02,
progression03,
score,
customFields
)
-- Validate event params
if not validation:validateProgressionEvent(GAProgressionStatus, progressionStatus, progression01, progression02, progression03) then
if
not validation:validateProgressionEvent(
GAProgressionStatus,
progressionStatus,
progression01,
progression02,
progression03
)
then
-- TODO: add sdk error event
return
end
Expand Down Expand Up @@ -451,6 +537,7 @@ function events:addProgressionEvent(playerId, progressionStatus, progression01,

-- Add custom dimensions
addDimensionsToEvent(playerId, eventDict)
addCustomFieldsToEvent(eventDict, customFields)

local progression02String = ""
if not utilities:isStringNullOrEmpty(progression02) then
Expand All @@ -462,13 +549,27 @@ function events:addProgressionEvent(playerId, progressionStatus, progression01,
progression03String = progression03
end

logger:i("Add PROGRESSION event: {status:" .. statusString .. ", progression01:" .. progression01 .. ", progression02:" .. progression02String .. ", progression03:" .. progression03String .. ", score:" .. tostring(score) .. ", attempt:" .. tostring(attempt_num) .. "}")
logger:i(
"Add PROGRESSION event: {status:"
.. statusString
.. ", progression01:"
.. progression01
.. ", progression02:"
.. progression02String
.. ", progression03:"
.. progression03String
.. ", score:"
.. tostring(score)
.. ", attempt:"
.. tostring(attempt_num)
.. "}"
)

-- Send to store
addEventToStore(playerId, eventDict)
end

function events:addDesignEvent(playerId, eventId, value)
function events:addDesignEvent(playerId, eventId, value, customFields)
-- Validate
if not validation:validateDesignEvent(eventId) then
-- TODO: add sdk error event
Expand All @@ -488,14 +589,15 @@ function events:addDesignEvent(playerId, eventId, value)

-- Add custom dimensions
addDimensionsToEvent(playerId, eventData)
addCustomFieldsToEvent(eventData, customFields)

logger:i("Add DESIGN event: {eventId:" .. eventId .. ", value:" .. tostring(value) .. "}")

-- Send to store
addEventToStore(playerId, eventData)
end

function events:addErrorEvent(playerId, severity, message)
function events:addErrorEvent(playerId, severity, message, customFields)
-- Validate
if not validation:validateErrorEvent(GAErrorSeverity, severity, message) then
-- TODO: add sdk error event
Expand All @@ -513,6 +615,7 @@ function events:addErrorEvent(playerId, severity, message)

-- Add custom dimensions
addDimensionsToEvent(playerId, eventData)
addCustomFieldsToEvent(eventData, customFields)

local messageString = ""
if not utilities:isStringNullOrEmpty(message) then
Expand Down Expand Up @@ -542,7 +645,15 @@ function events:addSdkErrorEvent(playerId, category, area, action, parameter, re
eventData["reason"] = reason
end

logger:i("Add SDK ERROR event: {error_category:" .. category .. ", error_area:" .. area .. ", error_action:" .. action .. "}")
logger:i(
"Add SDK ERROR event: {error_category:"
.. category
.. ", error_area:"
.. area
.. ", error_action:"
.. action
.. "}"
)

-- Send to store
addEventToStore(playerId, eventData)
Expand Down
16 changes: 5 additions & 11 deletions gameanalytics-sdk/GameAnalytics/HttpApi/HashLib/Base64.lua
Original file line number Diff line number Diff line change
Expand Up @@ -68,11 +68,8 @@ function Base64.Encode(Input)
NewLength = NewLength + 1
IndexAdd4096Sub1 = Index + 4096 - 1

NewOutput[NewLength] = string.char(table.unpack(
Output,
Index,
IndexAdd4096Sub1 > Length and Length or IndexAdd4096Sub1
))
NewOutput[NewLength] =
string.char(table.unpack(Output, Index, IndexAdd4096Sub1 > Length and Length or IndexAdd4096Sub1))
end

return table.concat(NewOutput)
Expand Down Expand Up @@ -121,14 +118,11 @@ function Base64.Decode(Input)
NewLength = NewLength + 1
IndexAdd4096Sub1 = Index + 4096 - 1

NewOutput[NewLength] = string.char(table.unpack(
Output,
Index,
IndexAdd4096Sub1 > Length and Length or IndexAdd4096Sub1
))
NewOutput[NewLength] =
string.char(table.unpack(Output, Index, IndexAdd4096Sub1 > Length and Length or IndexAdd4096Sub1))
end

return table.concat(NewOutput)
end

return Base64
return Base64
Loading