91 lines
		
	
	
		
			2.9 KiB
		
	
	
	
		
			Lua
		
	
	
	
	
	
			
		
		
	
	
			91 lines
		
	
	
		
			2.9 KiB
		
	
	
	
		
			Lua
		
	
	
	
	
	
-- ------------------------------------------------------------------------------ --
 | 
						|
--                                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
 |