view src/lib/Facebook.luan @ 3:b016e4b7c8da default tip

add read_me
author Franklin Schmidt <fschmidt@gmail.com>
date Sat, 12 Jul 2025 12:51:36 -0600
parents 8f4df159f06b
children
line wrap: on
line source

local Luan = require "luan:Luan.luan"
local error = Luan.error
local ipairs = Luan.ipairs or error()
local to_string = Luan.to_string or error()
local stringify = Luan.stringify or error()
local String = require "luan:String.luan"
local trim = String.trim or error()
local to_lower = String.lower or error()
local digest_message = String.digest_message or error()
local Time = require "luan:Time.luan"
local time_now = Time.now or error()
local Number = require "luan:Number.luan"
local long = Number.long or error()
local Parsers = require "luan:Parsers.luan"
local json_string = Parsers.json_string or error()
local json_parse = Parsers.json_parse or error()
local Io = require "luan:Io.luan"
local uri = Io.uri or error()
local Config = require "site:/private/Config.luan"
local access_token = Config.facebook.access_token or error()
local Shared = require "site:/lib/Shared.luan"
local is_test = not Shared.is_production
local Logging = require "luan:logging/Logging.luan"
local logger = Logging.logger "Facebook"


local pixel_id = "667025338202310"
local url = "https://graph.facebook.com/v17.0/"..pixel_id.."/events"


local Facebook = {}

local function call(events)
	local user_data = events[1].user_data  -- assume they are all the same
	local em = user_data.em
	if em ~= nil then
		em = to_lower(trim(em))
		user_data.em = digest_message("SHA-256",em)
	end
	local external_id = user_data.external_id
	if external_id ~= nil then
		external_id = to_string(external_id)
		if is_test then
			external_id = "test_"..external_id
		end
		user_data.external_id = digest_message("SHA-256",external_id)
	end
	if is_test then
		for _, event in ipairs(events) do
			event.event_name = "test_"..event.event_name
		end
	end
	logger.info(json_string(events))
	local parameters = {
		access_token = access_token
		data = json_string(events)
	}
	if is_test then
		parameters.test_event_code = "TEST"
	end
	local options = {
		method = "POST"
		parameters = parameters
	}
	return uri(url,options).read_text()
end
Facebook.call = call

function Facebook.track_visit(user)
	local user_data = {
		em = user.email or error()
		external_id = user.id or error()
	}
	local event_time = long( time_now() // 1000 )
	local events = {
		{
			event_name = "Contact"
			event_time = event_time
			user_data = user_data
			action_source = "other"
		}
		{
			event_name = "Purchase"
			event_time = event_time
			user_data = user_data
			action_source = "other"
			custom_data = {
				value = 1
				currency = "USD"
			}
		}
	}
	try
		local result = call(events)
		logger.info(result)
	catch e
		logger.error(e.."\n"..e.response_content.."\nevents = "..stringify(events))
	end
end

return Facebook