comparison 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
comparison
equal deleted inserted replaced
-1:000000000000 0:8f4df159f06b
1 local Luan = require "luan:Luan.luan"
2 local error = Luan.error
3 local ipairs = Luan.ipairs or error()
4 local to_string = Luan.to_string or error()
5 local stringify = Luan.stringify or error()
6 local String = require "luan:String.luan"
7 local trim = String.trim or error()
8 local to_lower = String.lower or error()
9 local digest_message = String.digest_message or error()
10 local Time = require "luan:Time.luan"
11 local time_now = Time.now or error()
12 local Number = require "luan:Number.luan"
13 local long = Number.long or error()
14 local Parsers = require "luan:Parsers.luan"
15 local json_string = Parsers.json_string or error()
16 local json_parse = Parsers.json_parse or error()
17 local Io = require "luan:Io.luan"
18 local uri = Io.uri or error()
19 local Config = require "site:/private/Config.luan"
20 local access_token = Config.facebook.access_token or error()
21 local Shared = require "site:/lib/Shared.luan"
22 local is_test = not Shared.is_production
23 local Logging = require "luan:logging/Logging.luan"
24 local logger = Logging.logger "Facebook"
25
26
27 local pixel_id = "667025338202310"
28 local url = "https://graph.facebook.com/v17.0/"..pixel_id.."/events"
29
30
31 local Facebook = {}
32
33 local function call(events)
34 local user_data = events[1].user_data -- assume they are all the same
35 local em = user_data.em
36 if em ~= nil then
37 em = to_lower(trim(em))
38 user_data.em = digest_message("SHA-256",em)
39 end
40 local external_id = user_data.external_id
41 if external_id ~= nil then
42 external_id = to_string(external_id)
43 if is_test then
44 external_id = "test_"..external_id
45 end
46 user_data.external_id = digest_message("SHA-256",external_id)
47 end
48 if is_test then
49 for _, event in ipairs(events) do
50 event.event_name = "test_"..event.event_name
51 end
52 end
53 logger.info(json_string(events))
54 local parameters = {
55 access_token = access_token
56 data = json_string(events)
57 }
58 if is_test then
59 parameters.test_event_code = "TEST"
60 end
61 local options = {
62 method = "POST"
63 parameters = parameters
64 }
65 return uri(url,options).read_text()
66 end
67 Facebook.call = call
68
69 function Facebook.track_visit(user)
70 local user_data = {
71 em = user.email or error()
72 external_id = user.id or error()
73 }
74 local event_time = long( time_now() // 1000 )
75 local events = {
76 {
77 event_name = "Contact"
78 event_time = event_time
79 user_data = user_data
80 action_source = "other"
81 }
82 {
83 event_name = "Purchase"
84 event_time = event_time
85 user_data = user_data
86 action_source = "other"
87 custom_data = {
88 value = 1
89 currency = "USD"
90 }
91 }
92 }
93 try
94 local result = call(events)
95 logger.info(result)
96 catch e
97 logger.error(e.."\n"..e.response_content.."\nevents = "..stringify(events))
98 end
99 end
100
101 return Facebook