diff --git a/project/project.godot b/project/project.godot index e66e467..7fb5cfb 100644 --- a/project/project.godot +++ b/project/project.godot @@ -26,6 +26,7 @@ DataSaver="*res://the_gates/scripts/data_saver.gd" FileDownloader="*res://the_gates/scripts/loading/file_downloader.gd" Debug="*res://the_gates/scripts/debug-log/debug.gd" Analytics="*res://the_gates/scripts/analytics/analytics.gd" +AnalyticsEvents="*res://the_gates/scripts/analytics/analytics_events.gd" [display] diff --git a/project/the_gates/scripts/analytics/analytics.gd b/project/the_gates/scripts/analytics/analytics.gd index 106ec2c..0ce5119 100644 --- a/project/the_gates/scripts/analytics/analytics.gd +++ b/project/the_gates/scripts/analytics/analytics.gd @@ -2,20 +2,26 @@ extends Node #class_name Analitycs var backend := preload("res://the_gates/resources/backend.tres") -var user_id := "none" +var analytics_senders = [ + AnalyticsSenderGate.new(), + AnalyticsSenderApp.new() +] func _ready() -> void: await get_user_id() - send_event({ - "event_name" : "application_enter", - "user_id" : user_id - }) + for sender in analytics_senders: + add_child(sender) -func send_event(body: Variant = []) -> void: +func _exit_tree() -> void: + for sender in analytics_senders: + sender.exit() + + +func send_event(body: Dictionary = {}) -> void: var url = backend.analytics_event - var callback = func(result, code, headers, body): + var callback = func(_result, code, _headers, _body): if code != 200: Debug.logerr("Request send_event failed. Code " + str(code)) var err = await request(url, callback, body, HTTPClient.METHOD_POST) @@ -24,10 +30,10 @@ func send_event(body: Variant = []) -> void: func get_user_id() -> void: var url = backend.get_user_id + OS.get_unique_id() - var callback = func(result, code, headers, body): + var callback = func(_result, code, _headers, body): if code == 200: - user_id = body.get_string_from_utf8() - Debug.logr("User id recieved: " + user_id) + AnalyticsEvents.user_id = body.get_string_from_utf8() + Debug.logr("User id recieved: " + AnalyticsEvents.user_id) else: Debug.logerr("Request get_user_id failed. Code " + str(code)) var err = await request(url, callback) @@ -35,7 +41,7 @@ func get_user_id() -> void: func request(url: String, callback: Callable, - body: Variant = [], method: int = HTTPClient.METHOD_GET) -> Error: + body: Dictionary = {}, method: int = HTTPClient.METHOD_GET) -> Error: var data = JSON.stringify(body) var headers = [] diff --git a/project/the_gates/scripts/analytics/analytics_events.gd b/project/the_gates/scripts/analytics/analytics_events.gd new file mode 100644 index 0000000..76a51b4 --- /dev/null +++ b/project/the_gates/scripts/analytics/analytics_events.gd @@ -0,0 +1,51 @@ +extends Node +#class_name AnalyticsEvents + +var user_id := "none" + + +func base(event_name: String) -> Dictionary: + var event = {} + event.event_name = event_name + event.user_id = user_id + return event + + +# APP + +func app_open() -> Dictionary: + return base("application_open") + + +func heartbeat(time_spend: int) -> Dictionary: + var event = base("heartbeat") + event.time_spend = time_spend + return event + + +func app_exit(time_spend: int) -> Dictionary: + var event = base("application_exit") + event.time_spend = time_spend + return event + + +# GATE + +func gate_open(url: String) -> Dictionary: + var event = base("gate_open") + event.gate_url = url + return event + + +func gate_enter(url: String, download_time: int) -> Dictionary: + var event = base("gate_enter") + event.gate_url = url + event.download_time = download_time + return event + + +func gate_exit(url: String, time_spend: int) -> Dictionary: + var event = base("gate_exit") + event.gate_url = url + event.time_spend = time_spend + return event diff --git a/project/the_gates/scripts/analytics/analytics_sender_app.gd b/project/the_gates/scripts/analytics/analytics_sender_app.gd new file mode 100644 index 0000000..1f66adb --- /dev/null +++ b/project/the_gates/scripts/analytics/analytics_sender_app.gd @@ -0,0 +1,27 @@ +extends Node +class_name AnalyticsSenderApp + +const HEARTBEAT_DELAY = 60 +var heartbeat_timer: Timer + + +func _ready() -> void: + Analytics.send_event(AnalyticsEvents.app_open()) + start_heartbeat() + + +func start_heartbeat() -> void: + heartbeat_timer = Timer.new() + add_child(heartbeat_timer) + heartbeat_timer.timeout.connect(send_hearbeat) + heartbeat_timer.start(HEARTBEAT_DELAY) + + +func send_hearbeat() -> void: + var time_spend = int(Time.get_ticks_msec() / 1000) + Analytics.send_event(AnalyticsEvents.heartbeat(time_spend)) + + +func exit() -> void: + var time_spend = int(Time.get_ticks_msec() / 1000) + Analytics.send_event(AnalyticsEvents.app_exit(time_spend)) diff --git a/project/the_gates/scripts/analytics/analytics_sender_gate.gd b/project/the_gates/scripts/analytics/analytics_sender_gate.gd new file mode 100644 index 0000000..aec8235 --- /dev/null +++ b/project/the_gates/scripts/analytics/analytics_sender_gate.gd @@ -0,0 +1,36 @@ +extends Node +class_name AnalyticsSenderGate + +var gate_events := preload("res://the_gates/resources/gate_events.res") + +var gate_open_time: int +var gate_url: String + + +func _ready() -> void: + gate_events.open_gate.connect(send_gate_open) + gate_events.gate_entered.connect(send_gate_enter) + gate_events.exit_gate.connect(send_gate_exit) + + +func send_gate_open(url: String) -> void: + gate_url = url + gate_open_time = int(Time.get_ticks_msec() / 1000) + Analytics.send_event(AnalyticsEvents.gate_open(url)) + + +func send_gate_enter() -> void: + var download_time = int(Time.get_ticks_msec() / 1000) - gate_open_time + gate_open_time = int(Time.get_ticks_msec() / 1000) + Analytics.send_event(AnalyticsEvents.gate_enter(gate_url, download_time)) + + +func send_gate_exit() -> void: + var time_spend = int(Time.get_ticks_msec() / 1000) - gate_open_time + Analytics.send_event(AnalyticsEvents.gate_exit(gate_url, time_spend)) + gate_url = "" + + +func exit() -> void: + if gate_url.is_empty(): return + send_gate_exit() diff --git a/project/the_gates/scripts/app.gd b/project/the_gates/scripts/app.gd index 8294504..0d2a15f 100644 --- a/project/the_gates/scripts/app.gd +++ b/project/the_gates/scripts/app.gd @@ -6,7 +6,7 @@ extends Node func _ready() -> void: - gate_events.open_gate.connect(switch_scene.bind(world_scene)) + gate_events.open_gate.connect(func(_url): switch_scene(world_scene)) gate_events.exit_gate.connect(switch_scene.bind(menu_scene)) $Scenes.add_child(menu_scene.instantiate()) diff --git a/project/the_gates/scripts/resources/gate_events.gd b/project/the_gates/scripts/resources/gate_events.gd index b5335ff..ce4abdf 100644 --- a/project/the_gates/scripts/resources/gate_events.gd +++ b/project/the_gates/scripts/resources/gate_events.gd @@ -13,7 +13,7 @@ var current_gate: Gate func open_gate_emit(url: String) -> void: current_gate_url = Url.fix_gate_url(url) - open_gate.emit() + open_gate.emit(url) func gate_info_loaded_emit(gate: Gate) -> void: