TradeSkillMaster/LibTSM/Util/Analytics.lua

91 lines
2.9 KiB
Lua
Raw Normal View History

2020-11-13 14:13:12 -05:00
-- ------------------------------------------------------------------------------ --
-- TradeSkillMaster --
-- https://tradeskillmaster.com --
-- All Rights Reserved - Detailed license information included with addon. --
-- ------------------------------------------------------------------------------ --
local _, TSM = ...
local Analytics = TSM.Init("Util.Analytics")
local Debug = TSM.Include("Util.Debug")
local Log = TSM.Include("Util.Log")
local private = {
events = {},
lastEventTime = nil,
argsTemp = {},
session = time(),
sequenceNumber = 1,
}
local MAX_ANALYTICS_AGE = 14 * 24 * 60 * 60 -- 2 weeks
local HIT_TYPE_IS_VALID = {
AC = true,
}
-- ============================================================================
-- Module Functions
-- ============================================================================
function Analytics.Action(name, ...)
private.InsertHit("AC", name, ...)
end
function Analytics.Save(appDB)
appDB.analytics = appDB.analytics or {updateTime=0, data={}}
if private.lastEventTime then
appDB.analytics.updateTime = private.lastEventTime
end
-- remove any events which are too old
for i = #appDB.analytics.data, 1, -1 do
local _, _, timeStr = strsplit(",", appDB.analytics.data[i])
local eventTime = (tonumber(timeStr) or 0) / 1000
if eventTime < time() - MAX_ANALYTICS_AGE then
tremove(appDB.analytics.data, i)
end
end
for _, event in ipairs(private.events) do
tinsert(appDB.analytics.data, event)
end
end
-- ============================================================================
-- Private Helper Functions
-- ============================================================================
function private.InsertHit(hitType, ...)
assert(HIT_TYPE_IS_VALID[hitType])
wipe(private.argsTemp)
for i = 1, select("#", ...) do
local arg = select(i, ...)
local argType = type(arg)
if argType == "string" then
-- remove non-printable and non-ascii characters
arg = gsub(arg, "[^ -~]", "")
-- remove characters we don't want in the JSON
arg = gsub(arg, "[\\\"]", "")
arg = private.AddQuotes(arg)
elseif argType == "number" then
-- pass
elseif argType == "boolean" then
arg = tostring(arg)
else
error("Invalid arg type: "..argType)
end
tinsert(private.argsTemp, arg)
end
Log.Info("%s %s", hitType, strjoin(" ", tostringall(...)))
hitType = private.AddQuotes(hitType)
local version = private.AddQuotes(TSM.GetVersion() or "???")
local timeMs = Debug.GetTimeMilliseconds()
local jsonStr = strjoin(",", hitType, version, timeMs, private.session, private.sequenceNumber, unpack(private.argsTemp))
tinsert(private.events, "["..jsonStr.."]")
private.sequenceNumber = private.sequenceNumber + 1
private.lastEventTime = time()
end
function private.AddQuotes(str)
return "\""..str.."\""
end