diff src/lib/Facebook.luan @ 0:8f4df159f06b

start public repo
author Franklin Schmidt <fschmidt@gmail.com>
date Fri, 11 Jul 2025 20:57:49 -0600
parents
children
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/lib/Facebook.luan	Fri Jul 11 20:57:49 2025 -0600
@@ -0,0 +1,101 @@
+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