From 98e35df0e5ea6e30acda4d2accb3ef243dfc916c Mon Sep 17 00:00:00 2001 From: Tim Bruce Date: Thu, 13 Mar 2025 21:28:15 -0400 Subject: [PATCH 1/4] Godot 4 AWS Plugin v 1.0.0 --- GodotSample/AWSGameSDK/AWSGameSDK.gd | 439 ------------------ .../AmazonGameLiftIntegration.gd.uid | 1 + .../AmazonGameLiftIntegration.tscn | 2 +- GodotSample/README.md | 166 +++++-- .../Samples/FacebookLogin/FacebookLogin.gd | 33 +- .../FacebookLogin/FacebookLogin.gd.uid | 1 + .../Samples/FacebookLogin/FacebookLogin.tscn | 11 +- .../GuestIdentityAndRestApiBackend.gd | 112 ++--- .../GuestIdentityAndRestApiBackend.gd.uid | 1 + .../GuestIdentityAndRestApiBackend.tscn | 18 +- .../Samples/SteamIdLogin/SteamIdLogin.gd | 45 +- .../Samples/SteamIdLogin/SteamIdLogin.gd.uid | 1 + .../Samples/SteamIdLogin/SteamIdLogin.tscn | 11 +- GodotSample/addons/AWSGameSDK/AWSGameSDK.gd | 20 + .../addons/AWSGameSDK/AWSGameSDK.gd.uid | 1 + GodotSample/addons/AWSGameSDK/plugin.cfg | 20 + GodotSample/addons/AWSGameSDK/readme.MD.txt | 97 ++++ .../AWSGameSDK/scripts/AWSAuthorization.gd | 309 ++++++++++++ .../scripts/AWSAuthorization.gd.uid | 1 + .../addons/AWSGameSDK/scripts/AWSBackend.gd | 98 ++++ .../AWSGameSDK/scripts/AWSBackend.gd.uid | 1 + .../addons/AWSGameSDK/scripts/user_info.gd | 20 + .../AWSGameSDK/scripts/user_info.gd.uid | 1 + GodotSample/addons/gd_data_binding/plugin.cfg | 7 + .../scripts/base_binding_source.gd | 187 ++++++++ .../scripts/base_binding_source.gd.uid | 1 + .../addons/gd_data_binding/scripts/binding.gd | 85 ++++ .../gd_data_binding/scripts/binding.gd.uid | 1 + .../scripts/binding_converter.gd | 9 + .../scripts/binding_converter.gd.uid | 1 + .../scripts/binding_converter_pipeline.gd | 58 +++ .../scripts/binding_converter_pipeline.gd.uid | 1 + .../gd_data_binding/scripts/binding_source.gd | 307 ++++++++++++ .../scripts/binding_source.gd.uid | 1 + .../gd_data_binding/scripts/binding_utils.gd | 9 + .../scripts/binding_utils.gd.uid | 1 + .../converters/case_binding_converter.gd | 18 + .../converters/case_binding_converter.gd.uid | 1 + .../invert_bool_binding_converter.gd | 10 + .../invert_bool_binding_converter.gd.uid | 1 + .../scripts/converters/plus_one_converter.gd | 10 + .../converters/plus_one_converter.gd.uid | 1 + .../addons/gd_data_binding/scripts/plugin.gd | 12 + .../gd_data_binding/scripts/plugin.gd.uid | 1 + GodotSample/addons/gd_uuid/base_random.gd | 7 + GodotSample/addons/gd_uuid/base_random.gd.uid | 1 + GodotSample/addons/gd_uuid/build_in_random.gd | 26 ++ .../addons/gd_uuid/build_in_random.gd.uid | 1 + GodotSample/addons/gd_uuid/crypto_random.gd | 8 + .../addons/gd_uuid/crypto_random.gd.uid | 1 + GodotSample/addons/gd_uuid/uuid.gd | 41 ++ GodotSample/addons/gd_uuid/uuid.gd.uid | 1 + GodotSample/icon.svg.import | 2 +- .../add_aws_nodes_to_your_scene.png | Bin 0 -> 67353 bytes .../add_aws_nodes_to_your_scene.png.import | 34 ++ .../images_readme/folder_structure.png | Bin 0 -> 35652 bytes .../images_readme/folder_structure.png.import | 34 ++ .../images_readme/project_settings.png | Bin 0 -> 55828 bytes .../images_readme/project_settings.png.import | 34 ++ .../images_readme/scene_tree_with_plugins.png | Bin 0 -> 40815 bytes .../scene_tree_with_plugins.png.import | 34 ++ .../images_readme/setting_auth_endpoint.png | Bin 0 -> 62998 bytes .../setting_auth_endpoint.png.import | 34 ++ .../setting_backend_endpoint.png | Bin 0 -> 103884 bytes .../setting_backend_endpoint.png.import | 34 ++ GodotSample/project.godot | 12 +- 66 files changed, 1845 insertions(+), 590 deletions(-) delete mode 100644 GodotSample/AWSGameSDK/AWSGameSDK.gd create mode 100644 GodotSample/BackendFeatures/AmazonGameLiftIntegration/AmazonGameLiftIntegration.gd.uid create mode 100644 GodotSample/Samples/FacebookLogin/FacebookLogin.gd.uid create mode 100644 GodotSample/Samples/GuestIdentityAndRestApiBackend/GuestIdentityAndRestApiBackend.gd.uid create mode 100644 GodotSample/Samples/SteamIdLogin/SteamIdLogin.gd.uid create mode 100644 GodotSample/addons/AWSGameSDK/AWSGameSDK.gd create mode 100644 GodotSample/addons/AWSGameSDK/AWSGameSDK.gd.uid create mode 100644 GodotSample/addons/AWSGameSDK/plugin.cfg create mode 100644 GodotSample/addons/AWSGameSDK/readme.MD.txt create mode 100644 GodotSample/addons/AWSGameSDK/scripts/AWSAuthorization.gd create mode 100644 GodotSample/addons/AWSGameSDK/scripts/AWSAuthorization.gd.uid create mode 100644 GodotSample/addons/AWSGameSDK/scripts/AWSBackend.gd create mode 100644 GodotSample/addons/AWSGameSDK/scripts/AWSBackend.gd.uid create mode 100644 GodotSample/addons/AWSGameSDK/scripts/user_info.gd create mode 100644 GodotSample/addons/AWSGameSDK/scripts/user_info.gd.uid create mode 100644 GodotSample/addons/gd_data_binding/plugin.cfg create mode 100644 GodotSample/addons/gd_data_binding/scripts/base_binding_source.gd create mode 100644 GodotSample/addons/gd_data_binding/scripts/base_binding_source.gd.uid create mode 100644 GodotSample/addons/gd_data_binding/scripts/binding.gd create mode 100644 GodotSample/addons/gd_data_binding/scripts/binding.gd.uid create mode 100644 GodotSample/addons/gd_data_binding/scripts/binding_converter.gd create mode 100644 GodotSample/addons/gd_data_binding/scripts/binding_converter.gd.uid create mode 100644 GodotSample/addons/gd_data_binding/scripts/binding_converter_pipeline.gd create mode 100644 GodotSample/addons/gd_data_binding/scripts/binding_converter_pipeline.gd.uid create mode 100644 GodotSample/addons/gd_data_binding/scripts/binding_source.gd create mode 100644 GodotSample/addons/gd_data_binding/scripts/binding_source.gd.uid create mode 100644 GodotSample/addons/gd_data_binding/scripts/binding_utils.gd create mode 100644 GodotSample/addons/gd_data_binding/scripts/binding_utils.gd.uid create mode 100644 GodotSample/addons/gd_data_binding/scripts/converters/case_binding_converter.gd create mode 100644 GodotSample/addons/gd_data_binding/scripts/converters/case_binding_converter.gd.uid create mode 100644 GodotSample/addons/gd_data_binding/scripts/converters/invert_bool_binding_converter.gd create mode 100644 GodotSample/addons/gd_data_binding/scripts/converters/invert_bool_binding_converter.gd.uid create mode 100644 GodotSample/addons/gd_data_binding/scripts/converters/plus_one_converter.gd create mode 100644 GodotSample/addons/gd_data_binding/scripts/converters/plus_one_converter.gd.uid create mode 100644 GodotSample/addons/gd_data_binding/scripts/plugin.gd create mode 100644 GodotSample/addons/gd_data_binding/scripts/plugin.gd.uid create mode 100644 GodotSample/addons/gd_uuid/base_random.gd create mode 100644 GodotSample/addons/gd_uuid/base_random.gd.uid create mode 100644 GodotSample/addons/gd_uuid/build_in_random.gd create mode 100644 GodotSample/addons/gd_uuid/build_in_random.gd.uid create mode 100644 GodotSample/addons/gd_uuid/crypto_random.gd create mode 100644 GodotSample/addons/gd_uuid/crypto_random.gd.uid create mode 100644 GodotSample/addons/gd_uuid/uuid.gd create mode 100644 GodotSample/addons/gd_uuid/uuid.gd.uid create mode 100644 GodotSample/images_readme/add_aws_nodes_to_your_scene.png create mode 100644 GodotSample/images_readme/add_aws_nodes_to_your_scene.png.import create mode 100644 GodotSample/images_readme/folder_structure.png create mode 100644 GodotSample/images_readme/folder_structure.png.import create mode 100644 GodotSample/images_readme/project_settings.png create mode 100644 GodotSample/images_readme/project_settings.png.import create mode 100644 GodotSample/images_readme/scene_tree_with_plugins.png create mode 100644 GodotSample/images_readme/scene_tree_with_plugins.png.import create mode 100644 GodotSample/images_readme/setting_auth_endpoint.png create mode 100644 GodotSample/images_readme/setting_auth_endpoint.png.import create mode 100644 GodotSample/images_readme/setting_backend_endpoint.png create mode 100644 GodotSample/images_readme/setting_backend_endpoint.png.import diff --git a/GodotSample/AWSGameSDK/AWSGameSDK.gd b/GodotSample/AWSGameSDK/AWSGameSDK.gd deleted file mode 100644 index 9ca22cc..0000000 --- a/GodotSample/AWSGameSDK/AWSGameSDK.gd +++ /dev/null @@ -1,439 +0,0 @@ -# Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. -# SPDX-License-Identifier: MIT-0 - -extends Node - -# Class to manage user info -class UserInfo: - var user_id = ""; - var guest_secret = ""; - var auth_token = ""; - var apple_id = ""; - var steam_id = ""; - var google_play_id = ""; - var facebook_id = ""; - var refresh_token = ""; - var auth_token_expires_in = ""; - var refresh_token_expires_in = ""; - - func _to_string(): - return("user_id: " + user_id + "\nguest_secret: " + guest_secret + "\nauth_token: " + auth_token + - "\napple_id: " + apple_id + "\nsteam_id: " + steam_id + "\ngoogle_play_id: " + google_play_id - + "\nfacebook_id: " + facebook_id - + "\nrefresh_token: " + refresh_token + "\nauth_token_expires_in: " + str(auth_token_expires_in) - + "\nrefresh_token_expires_in: " + str(refresh_token_expires_in)) - -var login_endpoint = null # Endpoint for custom identity component passed in Init -var login_error_callback = null # Callback passed in Init for all login errors -var login_callback = null # Callback for the latest login request - -var user_info = null # User info for the logged in user - -var unix_time_for_auth_token_expiration = null # Set when login successful to do refreshes automatically - -# Called when the node enters the scene tree for the first time. -func _ready(): - pass - -# Called every frame. 'delta' is the elapsed time since the previous frame. -func _process(delta): - - # If we have a expiration time for auth token, check if we need to refresh - if(self.unix_time_for_auth_token_expiration != null): - var seconds_difference = self.unix_time_for_auth_token_expiration - Time.get_unix_time_from_system() - - # if it's less than 5 seconds to to expiration, renew - if(seconds_difference < 5): - self.unix_time_for_auth_token_expiration = null - print("Refresh the access token") - self.login_with_refresh_token(self.user_info.refresh_token) - -func init(login_endpoint, login_error_callback): - - self.login_endpoint = login_endpoint - self.login_error_callback = login_error_callback - - print("AWS Game SDK initialized") - -# Logs in as a new guest user -func login_as_new_guest_user(login_callback): - # Set the login callback - self.login_callback = login_callback - - # Create an HTTP request node and connect its completion signal. - var http_request = HTTPRequest.new() - add_child(http_request) - http_request.request_completed.connect(self.sdk_login_callback) - - # Perform a GET request to login as a new guest - var error = http_request.request(login_endpoint+"/login-as-guest") - - # In case of error, trigger the error callback - if error != OK: - self.login_error_callback.call("Error making request to login endpoint") - -# Logs in with existing user -func login_as_guest(user_id, guest_secret, login_callback): - - # Set the login callback - self.login_callback = login_callback - - # Create an HTTP request node and connect its completion signal. - var http_request = HTTPRequest.new() - add_child(http_request) - http_request.request_completed.connect(self.sdk_login_callback) - - # Add the query parameters to the request - var params = "?" - params += "user_id" + "=" + user_id.uri_encode() - params += "&guest_secret" + "=" + guest_secret.uri_encode() - - # Perform a GET request to login as a new guest - var error = http_request.request(login_endpoint+"/login-as-guest"+params) - - # In case of error, trigger the error callback - if error != OK: - self.login_error_callback.call("Error making request to login endpoint") - -# Refresh the access token with a refresh token -func login_with_refresh_token(refresh_token, login_callback = null): - - # Set the login callback - if(login_callback != null): - self.login_callback = login_callback - - # Create an HTTP request node and connect its completion signal. - var http_request = HTTPRequest.new() - add_child(http_request) - http_request.request_completed.connect(self.sdk_login_callback) - - # Add the query parameters to the request - var params = "?" - params += "refresh_token" + "=" + refresh_token.uri_encode() - - # Perform a GET request to login as a new guest - var error = http_request.request(login_endpoint+"/refresh-access-token"+params) - - # In case of error, trigger the error callback - if error != OK: - self.login_error_callback.call("Error making request to login endpoint") - - -# Called to link an existing authenticated user to a Steam ID -func link_steam_id_to_current_user(steam_token, login_callback_steam): - - # Set the login callback - if(login_callback_steam != null): - self.login_callback = login_callback_steam - - if(self.user_info == null): - self.login_error_callback.call("No user info, can't link existing user to Steam ID") - return - - self.login_with_steam(steam_token, self.user_info.auth_token, true) - -# Called to create a new user with steam ID, or to login with existing user linked to Steam ID -func login_with_steam_token(steam_token, login_callback): - - # Set the login callback - if(login_callback != null): - self.login_callback = login_callback - - self.login_with_steam(steam_token, null, false) - -# Logs in with steam either linking existing user or as a steam only / new user -# Called internally by the different Steam login functions -func login_with_steam(steam_token, auth_token, link_to_existing_user): - - # Create an HTTP request node and connect its completion signal. - var http_request = HTTPRequest.new() - add_child(http_request) - http_request.request_completed.connect(self.sdk_login_callback) - - # Add the steam token to request - var params = "?" - params += "steam_auth_token" + "=" + steam_token.uri_encode() - - # If we're linking to existing user, add the relevant parameters - if(auth_token != null and link_to_existing_user == true): - - print("Linking Steam ID to existing user") - params += "&auth_token" + "=" + auth_token.uri_encode() - params += "&link_to_existing_user=Yes" - - print(login_endpoint+"/login-with-steam"+params) - - # Perform a GET request to login as a new guest - var error = http_request.request(login_endpoint+"/login-with-steam"+params) - - # In case of error, trigger the error callback - if error != OK: - self.login_error_callback.call("Error making request to login endpoint for login-with-steam") - -# Called to link an existing authenticated user to a Apple ID -func link_apple_id_to_current_user(apple_auth_token, login_callback_apple): - - # Set the login callback - if(login_callback_apple != null): - self.login_callback = login_callback_apple - - if(self.user_info == null): - self.login_error_callback.call("No user info, can't link existing user to Apple ID") - return - - self.login_with_apple_id(apple_auth_token, self.user_info.auth_token, true) - -# Called to create a new user with Apple ID, or to login with existing user linked to AppleID -func login_with_apple_id_token(apple_auth_token, login_callback): - - # Set the login callback - if(login_callback != null): - self.login_callback = login_callback - - self.login_with_apple_id(apple_auth_token, null, false) - -# Logs in with Apple ID either linking existing user or as a Apple ID only / new user -# Called internally by the different Apple ID login functions -func login_with_apple_id(apple_auth_token, auth_token, link_to_existing_user): - - # Create an HTTP request node and connect its completion signal. - var http_request = HTTPRequest.new() - add_child(http_request) - http_request.request_completed.connect(self.sdk_login_callback) - - # Add the apple auth token to request - var params = "?" - params += "apple_auth_token" + "=" + apple_auth_token.uri_encode() - - # If we're linking to existing user, add the relevant parameters - if(auth_token != null and link_to_existing_user == true): - - print("Linking Apple ID to existing user") - params += "&auth_token" + "=" + auth_token.uri_encode() - params += "&link_to_existing_user=Yes" - - print(login_endpoint+"/login-with-apple-id"+params) - - # Perform a GET request to login as a new guest - var error = http_request.request(login_endpoint+"/login-with-apple-id"+params) - - # In case of error, trigger the error callback - if error != OK: - self.login_error_callback.call("Error making request to login endpoint for login-with-apple-id") - -# Called to link an existing authenticated user to a Google Play ID -func link_google_play_id_to_current_user(google_play_auth_token, login_callback_google): - - # Set the login callback - if(login_callback_google != null): - self.login_callback = login_callback_google - - if(self.user_info == null): - self.login_error_callback.call("No user info, can't link existing user to Google Play ID") - return - - self.login_with_google_play(google_play_auth_token, self.user_info.auth_token, true) - -# Called to create a new user with Google Play ID, or to login with existing user linked to Google Play -func login_with_google_play_token(google_play_auth_token, login_callback): - - # Set the login callback - if(login_callback != null): - self.login_callback = login_callback - - self.login_with_google_play(google_play_auth_token, null, false) - -# Logs in with Google Play ID either linking existing user or as a Google Play ID only / new user -# Called internally by the different Google Play ID login functions -func login_with_google_play(google_play_auth_token, auth_token, link_to_existing_user): - - # Create an HTTP request node and connect its completion signal. - var http_request = HTTPRequest.new() - add_child(http_request) - http_request.request_completed.connect(self.sdk_login_callback) - - # Add the google play auth token to request - var params = "?" - params += "google_play_auth_token" + "=" + google_play_auth_token.uri_encode() - - # If we're linking to existing user, add the relevant parameters - if(auth_token != null and link_to_existing_user == true): - - print("Linking Google Play ID to existing user") - params += "&auth_token" + "=" + auth_token.uri_encode() - params += "&link_to_existing_user=Yes" - - print(login_endpoint+"/login-with-google-play"+params) - - # Perform a GET request to login as a new guest - var error = http_request.request(login_endpoint+"/login-with-google-play"+params) - - # In case of error, trigger the error callback - if error != OK: - self.login_error_callback.call("Error making request to login endpoint for login-with-google-play") - -# Called to link an existing authenticated user to a Facebook ID -func link_facebook_id_to_current_user(facebook_access_token, facebook_user_id, login_callback_facebook): - - # Set the login callback - if(login_callback_facebook != null): - self.login_callback = login_callback_facebook - - if(self.user_info == null): - self.login_error_callback.call("No user info, can't link existing user to Facebook ID") - return - - self.login_with_facebook(facebook_access_token, facebook_user_id, self.user_info.auth_token, true) - -# Called to create a new user with Facebook ID, or to login with existing user linked to Facebook -func login_with_facebook_access_token(facebook_access_token, facebook_user_id, login_callback): - - # Set the login callback - if(login_callback != null): - self.login_callback = login_callback - - self.login_with_facebook(facebook_access_token, facebook_user_id, null, false) - -# Logs in with Facebook ID either linking existing user or as a Facebook ID only / new user -# Called internally by the different Facebook ID login functions -func login_with_facebook(facebook_access_token, facebook_user_id, auth_token, link_to_existing_user): - - # Create an HTTP request node and connect its completion signal. - var http_request = HTTPRequest.new() - add_child(http_request) - http_request.request_completed.connect(self.sdk_login_callback) - - # Add the Facebook auth token and user ID to request - var params = "?" - params += "facebook_access_token" + "=" + facebook_access_token.uri_encode() - params += "&facebook_user_id" + "=" + facebook_user_id.uri_encode() - - # If we're linking to existing user, add the relevant parameters - if(auth_token != null and link_to_existing_user == true): - - print("Linking Facebook ID to existing user") - params += "&auth_token" + "=" + auth_token.uri_encode() - params += "&link_to_existing_user=Yes" - - print(login_endpoint+"/login-with-facebook"+params) - - # Perform a GET request to login as a new guest - var error = http_request.request(login_endpoint+"/login-with-facebook"+params) - - # In case of error, trigger the error callback - if error != OK: - self.login_error_callback.call("Error making request to login endpoint for login-with-facebook") - - - -# callback for login or refresh requests -func sdk_login_callback(result, response_code, headers, body): - var json_string = body.get_string_from_utf8() # Retrieve data - var json = JSON.new() - var error = json.parse(json_string) - - # trigger error if we didn't get a proper response code - if(response_code >= 400): - self.login_error_callback.call(json_string) - return - - # Check we got no error - if error == OK: - var data_received = json.data - # Check that we got a user_id (valid response) - if(!data_received.has("user_id")): - self.login_error_callback.call(json_string) - return - - # We got valid response, let's parse values to UserInfo object - #print(data_received) - if(self.user_info == null): - self.user_info = UserInfo.new() - self.user_info.user_id = data_received["user_id"] - if(data_received.has("guest_secret")): - self.user_info.guest_secret = data_received["guest_secret"] - if(data_received.has("auth_token")): - self.user_info.auth_token = data_received["auth_token"] - if(data_received.has("refresh_token")): - self.user_info.refresh_token = data_received["refresh_token"] - if(data_received.has("auth_token_expires_in")): - self.user_info.auth_token_expires_in = data_received["auth_token_expires_in"] - if(data_received.has("refresh_token_expires_in")): - self.user_info.refresh_token_expires_in = data_received["refresh_token_expires_in"] - if(data_received.has("steam_id")): - self.user_info.steam_id = data_received["steam_id"] - if(data_received.has("apple_id")): - self.user_info.apple_id = data_received["apple_id"] - if(data_received.has("google_play_id")): - self.user_info.google_play_id = data_received["google_play_id"] - if(data_received.has("facebook_id")): - self.user_info.facebook_id = data_received["facebook_id"] - - # Get the current UNIX time, and add the seconds for auth_token expiration - self.unix_time_for_auth_token_expiration = Time.get_unix_time_from_system() + self.user_info.auth_token_expires_in - #print(self.user_info) - - # Send the login info back to original requester - if(self.login_callback != null): - self.login_callback.call(self.user_info) - - else: - print("JSON Parse Error: ", json.get_error_message(), " in ", json_string, " at line ", json.get_error_line()) - # Trigger callback from client side - self.login_error_callback.call(json.get_error_message()) - -# Function to make an authenticated GET request to a backend API -# Called by your custom code to access backend functionality -func backend_get_request(url, resource, query_parameters, callback): - - if(self.user_info == null): - callback.call("Error: no user info set yet, login first") - return - - if(self.user_info.auth_token == ""): - callback.call("No auth token set yet, login first") - return - - # Add the query parameters to the request - if(query_parameters != null): - resource += "?" - for key in query_parameters: - resource += "&" + key + "=" + query_parameters[key].uri_encode() - - # Create an HTTP request node and connect its completion signal. - var http_request = HTTPRequest.new() - add_child(http_request) - http_request.request_completed.connect(callback) - - print(url+resource) - # Perform a GET request to login as a new guest - var error = http_request.request(url+resource, ["Authorization: " + self.user_info.auth_token], HTTPClient.METHOD_GET) - - if error != OK: - callback.call("Error with HTTP request") - - - -# Function to make an authenticated POST request to a backend API -# Called by your custom code to access backend functionality -func backend_post_request(url, resource, request_body, callback): - - if(self.user_info == null): - callback.call("Error: no user info set yet, login first") - return - - if(self.user_info.auth_token == ""): - callback.call("No auth token set yet, login first") - return - - # Create an HTTP request node and connect its completion signal. - var http_request = HTTPRequest.new() - add_child(http_request) - http_request.request_completed.connect(callback) - - print(url+resource) - # Perform a GET request to login as a new guest - var error = http_request.request(url+resource, ["Authorization: " + self.user_info.auth_token, "Content-Type: application/json"], HTTPClient.METHOD_POST, request_body) - - if error != OK: - callback.call("Error with HTTP request") diff --git a/GodotSample/BackendFeatures/AmazonGameLiftIntegration/AmazonGameLiftIntegration.gd.uid b/GodotSample/BackendFeatures/AmazonGameLiftIntegration/AmazonGameLiftIntegration.gd.uid new file mode 100644 index 0000000..cc208a4 --- /dev/null +++ b/GodotSample/BackendFeatures/AmazonGameLiftIntegration/AmazonGameLiftIntegration.gd.uid @@ -0,0 +1 @@ +uid://bj1uupijq8a0p diff --git a/GodotSample/BackendFeatures/AmazonGameLiftIntegration/AmazonGameLiftIntegration.tscn b/GodotSample/BackendFeatures/AmazonGameLiftIntegration/AmazonGameLiftIntegration.tscn index b9c3ac8..78a7d94 100644 --- a/GodotSample/BackendFeatures/AmazonGameLiftIntegration/AmazonGameLiftIntegration.tscn +++ b/GodotSample/BackendFeatures/AmazonGameLiftIntegration/AmazonGameLiftIntegration.tscn @@ -1,6 +1,6 @@ [gd_scene load_steps=2 format=3 uid="uid://d2rykx55ylfax"] -[ext_resource type="Script" path="res://BackendFeatures/AmazonGameLiftIntegration/AmazonGameLiftIntegration.gd" id="1_f5d5y"] +[ext_resource type="Script" uid="uid://bj1uupijq8a0p" path="res://BackendFeatures/AmazonGameLiftIntegration/AmazonGameLiftIntegration.gd" id="1_f5d5y"] [node name="Node2D" type="Node2D"] diff --git a/GodotSample/README.md b/GodotSample/README.md index add1cc8..512180d 100644 --- a/GodotSample/README.md +++ b/GodotSample/README.md @@ -2,48 +2,156 @@ The AWS Game Backend Framework Godot 4 SDK provides integrations to the custom identity component, managed refreshing of access tokens, helper methods for calling custom backend features, and samples for integrating with different game platforms. -# SDK Overview +# SDK Overview - Now a Godot Plugin -## Initializing the SDK +The AWS Game SDK has been updated to now be installed and used as a plugin in Godot 4.x. -The AWS Game SDK has to be configured in your Godot 4 project in _Project Settings -> Autoload_ with the name _AwsGameSdk_. +To begin using the plugin, copy the ./addons/AWSGameSDK directory to your projects ./addons directory. It should appear as it does in the picture below. -The Initializing and accessing the AWS Game SDK within Godot 4 (see the Godot 4 Integration Samples for sample code): +![Godot4 Folder Structure with AWS Games SDK Plugin](images_readme/folder_structure.png) +Next, go to Project -> Project Settings... from your menu and enable the AWS Games SDK plugin by checking the checkbox. + +![AWS for Games SDK Plugin enabled for a Godot project](images_readme/project_settings.png) + +## Adding nodes for the AWS for Games SDK to your scenes + +The AWS Game SDK contains two components that can be added to your projects. These are `AWSGameSDKAuth` and `AWSGameSDKBackend`. The AWSGameSDKAuth component allows you to login as guest, refresh your access token, and link accounts to Facebook, Apple, Google Play, and Steam via an API endpoint. The AWSGameSDKBackend component allows you to make calls to a backend endpoint to save and retrieve player data. You can add the necessary nodes to an appropriate scene for your project. The AWSGameSDKBackend requires the AWSGameSDKAuth component, as access tokens are required to save and retrrieve data. These components can be added by adding child nodes to your scene. + +![Adding AWSGameSDK nodes to your Godot scene](images_readme/add_aws_nodes_to_your_scene.png) + +Once added, your scene tree should look similar to this. + +![A Godot scene with nodes added for AWSGameSDKAuth and AWSGameSDKBackend](images_readme/scene_tree_with_plugins.png) + +The plugin also uses signals. This removes the need to register callbacks and you can setup appropriate listeners to features enabled via the plugin. + +## Initializing the SDK and Login + +Initialization of the SDKs has been moved to property sheets to make it easier for developers to make calls. + +To complete setup of the AWSGameSDKAuth component, highlight the component in your scene tree and view the properties in the Inspector window. Update the `Login Endpoint` value with your API Gateway Login Endpoint, as shown below. + +![Setting your authentication endpoint property for the AWSGameSDKAuth component](images_readme/setting_auth_endpoint.png) + +To complete setup of the AWSGameSDKBackend component, highlight the component in your scene tree and view the properties in the Inspector window. Update the `Backend Endpoint` value with your API Gateway Backend Endpoint, as shown below. You can leave the URIs as default. + +![Setting your backend endpoint property for the AWSGameSDKAuth component](images_readme/setting_backend_endpoint.png) + +In your scene's code, you will need to set a variable for each of the SDK components you enable + +```python +@onready var aws_games_sdk_auth = get_node("AWSGameSDKAuth") +@onready var aws_games_sdk_backend = get_node("AWSGameSDKBackend") +``` + +Within the `_ready` function, connect your local functions to the signals from the SDK: + +```python +func _ready(): + # Get the SDK and Init + aws_games_sdk_auth.init() #initialize the Auth SDK + aws_games_sdk_auth.aws_login_success.connect(_on_login_success) #handle successful logins + aws_games_sdk_auth.aws_login_error.connect(_on_login_error) #handle login errors + aws_games_sdk_auth.aws_sdk_error.connect(_on_aws_sdk_error) #handle general SDK errors + aws_games_sdk_backend.aws_backend_request_successful.connect(_on_backend_request_success) #handle successful backend requests + aws_games_sdk_backend.aws_sdk_error.connect(_on_aws_sdk_error) #handle errors from backend requests +``` + +To begin the login process, call login on the AWSGameSDKAuth component, as such: + +```python + aws_games_sdk_auth.login() +``` + +Errors for login can be managed with similar functions to those below: + +``` +func _on_login_error(message): + print("Login error: " + message) + + +# Receives a UserInfo object after successful login +func _on_login_success(): + print("Received login success") +``` + +## Set and Get Data from your custom backend + +Setting and getting data to and from your backend uses the AWSGameSDKBackend with the `backend_set_request` and `backend_get_request` functions. Both of these functions use HTTP GET requests. To set data, use the following syntax: + +```python + aws_games_sdk_backend.backend_set_request(aws_games_sdk_auth.get_auth_token(), {"player_name" : "John Doe"}) +``` + +In this case, the auth_token to make the call is retrieved from the aws_games_sdk_auth component and the `player_name` is set to `John Doe`. Multiple values can be set in a single dictionary request. + +To retrieve data, use the following syntax: + ```python -# Get the SDK and Init -self.aws_game_sdk = get_node("/root/AwsGameSdk") -self.aws_game_sdk.init(self.login_endpoint, self.on_login_error) + aws_games_sdk_backend.backend_get_request(aws_games_sdk_auth.get_auth_token()) +``` + +This call only requires the auth_token from the aws_games_sdk_auth component. + +Success and errors of both calls are handled through signal connections that were added to the `_ready` function above. A sample success function is as follows: + +```python +func _on_backend_request_success(): + print("Backend request successful") + print("Data returned from action: ", aws_games_sdk_backend.get_response_data()) ``` ## SDK Public API -The public API for the SDK includes the following methods. Most of them will require you to provide a callback for results (see the Godot 4 Integration Samples for sample code): +The public API for the AWSGameSDKAuth component includes the following methods. Most of them will require you to provide a callback for results (see the Godot 4 Integration Samples for sample code): ```text -func init(login_endpoint, login_error_callback) -func login_as_new_guest_user(login_callback) -func login_as_guest(user_id, guest_secret, login_callback) -func login_with_refresh_token(refresh_token, login_callback = null) -func link_steam_id_to_current_user(steam_token, login_callback_steam) -func login_with_steam_token(steam_token, login_callback) -func link_apple_id_to_current_user(apple_auth_token, login_callback_apple) -func login_with_apple_id_token(apple_auth_token, login_callback) -func link_google_play_id_to_current_user(google_play_auth_token, login_callback_google) -func login_with_google_play_token(google_play_auth_token, login_callback) -func link_facebook_id_to_current_user(facebook_access_token, facebook_user_id, login_callback_facebook) -func login_with_facebook_access_token(facebook_access_token, facebook_user_id, login_callback) -func backend_get_request(url, resource, query_parameters, callback) -func backend_post_request(url, resource, request_body, callback): +func init() +func login() +func login_with_refresh_token() +func get_auth_token() String +func link_steam_id_to_current_user(steam_token) +func login_with_steam_token(steam_token) +func link_apple_id_to_current_user(apple_auth_token) +func login_with_apple_id_token(apple_auth_token) +func link_google_play_id_to_current_user(google_play_auth_token) +func login_with_google_play_token(google_play_auth_token) +func link_facebook_id_to_current_user(facebook_access_token, facebook_user_id) +func login_with_facebook_access_token(facebook_access_token, facebook_user_id) ``` -## Adding the SDK to an existing project +Supported signals are: -To add the SDK to an existing project: +```text +aws_login_success +aws_login_error +aws_sdk_error +steam_link +steam_login +fb_link +fb_login +apple_link +apple_login +goog_link +goog_login +```` + +The public API for the AWSGameSDKBackend component includes the following methods. -1. Drag and drop the folder `AWSGameSDK` to your Godot 4 project -2. Open _Project Settings -> Autoload_, select the script `AWSGameSDK.gd` with the directory search and select _Open_. Make sure the name is _AwsGameSdk_ and select _Add_. -3. Integrate with the SDK from your custom code (see Godot 4 Integration Samples for example integrations) +```python +func backend_get_request(auth_token) +func backend_set_request(auth_token, query_parameters) +func backend_post_request(auth_token, request_body) +func get_response_data() String +``` + +Supported signals are: + +```text +aws_backend_request_successful +aws_sdk_error +``` # Godot 4 Integration Samples @@ -95,7 +203,3 @@ func login_with_apple_id_token(apple_auth_token, login_callback) func link_google_play_id_to_current_user(google_play_auth_token, login_callback_google) func login_with_google_play_token(google_play_auth_token, login_callback) ``` - - - - diff --git a/GodotSample/Samples/FacebookLogin/FacebookLogin.gd b/GodotSample/Samples/FacebookLogin/FacebookLogin.gd index a107bb4..723dda7 100644 --- a/GodotSample/Samples/FacebookLogin/FacebookLogin.gd +++ b/GodotSample/Samples/FacebookLogin/FacebookLogin.gd @@ -3,14 +3,22 @@ extends Node -# TODO: Add the login endpoint here -const login_endpoint = "https://YOURENDPOINT.execute-api.us-east-1.amazonaws.com/prod/" -var aws_game_sdk +@onready var aws_games_sdk_auth = get_node("AWSGameSDKAuth") + # Called when the node enters the scene tree for the first time. func _ready(): + #init sdk and setup signal listeners + aws_games_sdk_auth.init() + aws_games_sdk_auth.aws_login_success.connect(_on_login_success) + aws_games_sdk_auth.aws_login_error.connect(_on_login_error) + aws_games_sdk_auth.fb_link.conect(on_link_facebook_id_response) + aws_games_sdk_auth.fb_login.conect(on_login_with_facebook_response) + aws_games_sdk_auth.aws_sdk_error.connect(_on_aws_sdk_error) + #login + aws_games_sdk_auth.login() # Get the SDK and Init self.aws_game_sdk = get_node("/root/AwsGameSdk") self.aws_game_sdk.init(self.login_endpoint, self.on_login_error) @@ -19,30 +27,35 @@ func _ready(): self.aws_game_sdk.login_as_new_guest_user(self.login_as_guest_callback) # Called on any login or token refresh failures -func on_login_error(message): +func _on_login_error(message): print("Login error: " + message) + +func _on_aws_sdk_error(message): + print("AWS SDK error: ", message) + + # Receives a UserInfo object after successful guest login -func login_as_guest_callback(user_info): +func _on_login_success(): print("Received guest login info.") - print(user_info) + print(aws_games_sdk_auth.user_info) # Try linking Facebook ID to existing user # NOTE: You'll need to use a community Facebook integration such as https://github.com/DrMoriarty/godot-facebook # Once you've logged in with Facebook, send the access_token and user_id here self.aws_game_sdk.link_facebook_id_to_current_user("AcceessTokenHere", "UserIdHere", self.on_link_facebook_id_response) -func on_link_facebook_id_response(user_info): +func on_link_facebook_id_response(): print("Received Facebook ID linking info") - print(user_info) + print(aws_games_sdk_auth.user_info.to_string()) # Let's now try to login with Facebook acccess token directly to access the same user self.aws_game_sdk.login_with_facebook_access_token("AccessTokenHere", "UserIdHere", self.on_login_with_facebook_response) -func on_login_with_facebook_response(user_info): +func on_login_with_facebook_response(): print("Received Facebook ID login info") - print(user_info) + print(aws_games_sdk_auth.user_info.to_string()) # Called every frame. 'delta' is the elapsed time since the previous frame. func _process(delta): diff --git a/GodotSample/Samples/FacebookLogin/FacebookLogin.gd.uid b/GodotSample/Samples/FacebookLogin/FacebookLogin.gd.uid new file mode 100644 index 0000000..8b506aa --- /dev/null +++ b/GodotSample/Samples/FacebookLogin/FacebookLogin.gd.uid @@ -0,0 +1 @@ +uid://cno7al5g886tr diff --git a/GodotSample/Samples/FacebookLogin/FacebookLogin.tscn b/GodotSample/Samples/FacebookLogin/FacebookLogin.tscn index 47b694b..bd4e2a8 100644 --- a/GodotSample/Samples/FacebookLogin/FacebookLogin.tscn +++ b/GodotSample/Samples/FacebookLogin/FacebookLogin.tscn @@ -1,8 +1,11 @@ -[gd_scene load_steps=2 format=3 uid="uid://qknp5wwmrjlu"] +[gd_scene load_steps=3 format=3 uid="uid://qknp5wwmrjlu"] -[ext_resource type="Script" path="res://Samples/FacebookLogin/FacebookLogin.gd" id="1_gobne"] +[ext_resource type="Script" uid="uid://cno7al5g886tr" path="res://Samples/FacebookLogin/FacebookLogin.gd" id="1_gobne"] +[ext_resource type="Script" uid="uid://dxp7lgvaxrjry" path="res://addons/AWSGameSDK/scripts/AWSAuthorization.gd" id="2_jnwcp"] [node name="Node2D" type="Node2D"] - -[node name="Test" type="Node" parent="."] script = ExtResource("1_gobne") + +[node name="AWSGameSDKAuth" type="Node" parent="."] +script = ExtResource("2_jnwcp") +metadata/_custom_type_script = "uid://dxp7lgvaxrjry" diff --git a/GodotSample/Samples/GuestIdentityAndRestApiBackend/GuestIdentityAndRestApiBackend.gd b/GodotSample/Samples/GuestIdentityAndRestApiBackend/GuestIdentityAndRestApiBackend.gd index c2c6090..d3fdd2f 100644 --- a/GodotSample/Samples/GuestIdentityAndRestApiBackend/GuestIdentityAndRestApiBackend.gd +++ b/GodotSample/Samples/GuestIdentityAndRestApiBackend/GuestIdentityAndRestApiBackend.gd @@ -1,87 +1,61 @@ # Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. # SPDX-License-Identifier: MIT-0 -extends Node +extends Node2D -# TODO: Add the login endpoint here -const login_endpoint = "https://YOURENDPOINTHERE/prod/" -# TODO: Add your backend component endpoint here -const backend_endpoint = "https://YOURENDPOINTHERE/prod" +@onready var aws_games_sdk_auth = get_node("AWSGameSDKAuth") +@onready var aws_games_sdk_backend = get_node("AWSGameSDKBackend") -var aws_game_sdk - -func save_login_data(user_id, guest_secret): - var file = FileAccess.open("user://save_game.dat", FileAccess.WRITE) - file.store_pascal_string(user_id) - file.store_pascal_string(guest_secret) - file = null - -func load_login_data(): - var file = FileAccess.open("user://save_game.dat", FileAccess.READ) - if(file == null or file.get_length() == 0): - return null; - - var user_id = file.get_pascal_string() - var guest_secret = file.get_pascal_string() - return [user_id, guest_secret] +var logged_in: bool = false +var actions: Array +var current_action: String # Called when the node enters the scene tree for the first time. func _ready(): - # Get the SDK and Init - self.aws_game_sdk = get_node("/root/AwsGameSdk") - self.aws_game_sdk.init(self.login_endpoint, self.on_login_error) - - # Try to load existing user info - var stored_user_info = self.load_login_data() - - # If we have stored user info, login with existing user - if(stored_user_info != null): - print("Logging in with existing user: " + stored_user_info[0]) - self.aws_game_sdk.login_as_guest(stored_user_info[0], stored_user_info[1], self.login_callback) - # Else we login as new user - else: - self.aws_game_sdk.login_as_new_guest_user(self.login_callback) + aws_games_sdk_auth.init() + aws_games_sdk_auth.aws_login_success.connect(_on_login_success) + aws_games_sdk_auth.aws_login_error.connect(_on_login_error) + aws_games_sdk_auth.aws_sdk_error.connect(_on_aws_sdk_error) + aws_games_sdk_backend.aws_backend_request_successful.connect(_on_backend_request_success) + aws_games_sdk_backend.aws_sdk_error.connect(_on_aws_sdk_error) + print("calling login") + aws_games_sdk_auth.login() # Called on any login or token refresh failures -func on_login_error(message): +func _on_login_error(message): print("Login error: " + message) + # Receives a UserInfo object after successful login -func login_callback(user_info): - print("Received login info.") - print(user_info) - - # Store the login info for future logins - self.save_login_data(user_info.user_id, user_info.guest_secret) - +func _on_login_success(): + print("Received login success") + logged_in = true + actions = ['setdata', 'getdata'] + current_action = actions.pop_front() + #you can inspect the user_info with this line + #print(aws_games_sdk_auth.user_info.to_string()) # Try setting player data - self.aws_game_sdk.backend_get_request(self.backend_endpoint, "/set-player-data", {"player_name" : "John Doe"}, self.set_player_data_callback) - -# We need to use the exact format of the callback required for HTTPRequest -func set_player_data_callback(result, response_code, headers, body): - - var string_response = body.get_string_from_utf8() - - if(response_code >= 400): - print("Error code " + str(response_code) + " Message: " + string_response) - return - - print("Successfully set player data: " + string_response) - - # Test getting the same date next - self.aws_game_sdk.backend_get_request(self.backend_endpoint, "/get-player-data", null, self.get_player_data_callback) -# We need to use the exact format of the callback required for HTTPRequest -func get_player_data_callback(result, response_code, headers, body): - - var string_response = body.get_string_from_utf8() - - if(response_code >= 400): - print("Error code " + str(response_code) + " Message: " + string_response) - return - - print("Success received player data: " + string_response) + +func _on_backend_request_success(): + print("Backend request successful") + print("Data returned from action: ", aws_games_sdk_backend.get_response_data()) + if len(actions) > 0: + current_action = actions.pop_front() + # Called every frame. 'delta' is the elapsed time since the previous frame. func _process(delta): - pass + if logged_in and current_action != "": + if current_action == "setdata": + current_action = "" + print("setting player data") + aws_games_sdk_backend.backend_set_request(aws_games_sdk_auth.get_auth_token(), {"player_name" : "John Doe"}) + if current_action == "getdata": + current_action = "" + print("getting player data") + aws_games_sdk_backend.backend_get_request(aws_games_sdk_auth.get_auth_token()) + return + +func _on_aws_sdk_error(error_text): + print("Error received from AWS SDK: ", error_text) diff --git a/GodotSample/Samples/GuestIdentityAndRestApiBackend/GuestIdentityAndRestApiBackend.gd.uid b/GodotSample/Samples/GuestIdentityAndRestApiBackend/GuestIdentityAndRestApiBackend.gd.uid new file mode 100644 index 0000000..1b147f8 --- /dev/null +++ b/GodotSample/Samples/GuestIdentityAndRestApiBackend/GuestIdentityAndRestApiBackend.gd.uid @@ -0,0 +1 @@ +uid://bf2280tko4u2w diff --git a/GodotSample/Samples/GuestIdentityAndRestApiBackend/GuestIdentityAndRestApiBackend.tscn b/GodotSample/Samples/GuestIdentityAndRestApiBackend/GuestIdentityAndRestApiBackend.tscn index 55d8fb9..6d3d42b 100644 --- a/GodotSample/Samples/GuestIdentityAndRestApiBackend/GuestIdentityAndRestApiBackend.tscn +++ b/GodotSample/Samples/GuestIdentityAndRestApiBackend/GuestIdentityAndRestApiBackend.tscn @@ -1,8 +1,18 @@ -[gd_scene load_steps=2 format=3 uid="uid://dpdmqpyoy6pg"] +[gd_scene load_steps=4 format=3 uid="uid://dpdmqpyoy6pg"] -[ext_resource type="Script" path="res://Samples/GuestIdentityAndRestApiBackend/GuestIdentityAndRestApiBackend.gd" id="1_xv65c"] +[ext_resource type="Script" uid="uid://bf2280tko4u2w" path="res://Samples/GuestIdentityAndRestApiBackend/GuestIdentityAndRestApiBackend.gd" id="1_rr0aj"] +[ext_resource type="Script" uid="uid://dxp7lgvaxrjry" path="res://addons/AWSGameSDK/scripts/AWSAuthorization.gd" id="2_fx0df"] +[ext_resource type="Script" uid="uid://c1iyo651ktydf" path="res://addons/AWSGameSDK/scripts/AWSBackend.gd" id="3_rr0aj"] [node name="Node2D" type="Node2D"] +script = ExtResource("1_rr0aj") -[node name="Test" type="Node" parent="."] -script = ExtResource("1_xv65c") +[node name="AWSGameSDKAuth" type="Node" parent="."] +script = ExtResource("2_fx0df") +login_endpoint = "https://xxxxxxxxx.execute-api.us-west-2.amazonaws.com/prod" +metadata/_custom_type_script = "uid://dxp7lgvaxrjry" + +[node name="AWSGameSDKBackend" type="Node" parent="."] +script = ExtResource("3_rr0aj") +backend_endpoint = "https://xxxxxxxx.execute-api.us-west-2.amazonaws.com/prod" +metadata/_custom_type_script = "uid://c1iyo651ktydf" diff --git a/GodotSample/Samples/SteamIdLogin/SteamIdLogin.gd b/GodotSample/Samples/SteamIdLogin/SteamIdLogin.gd index b0006cd..afacf2c 100644 --- a/GodotSample/Samples/SteamIdLogin/SteamIdLogin.gd +++ b/GodotSample/Samples/SteamIdLogin/SteamIdLogin.gd @@ -3,47 +3,54 @@ extends Node -# TODO: Add the login endpoint here -const login_endpoint = "https://YOURENDPOINTHERE/prod/" +@onready var aws_games_sdk_auth = get_node("AWSGameSDKAuth") -var aws_game_sdk # Called when the node enters the scene tree for the first time. func _ready(): - - # Get the SDK and Init - self.aws_game_sdk = get_node("/root/AwsGameSdk") - self.aws_game_sdk.init(self.login_endpoint, self.on_login_error) - - # Log in as new guest user first - self.aws_game_sdk.login_as_new_guest_user(self.login_as_guest_callback) + + #init sdk and setup signal listeners + aws_games_sdk_auth.init() + aws_games_sdk_auth.aws_login_success.connect(_on_login_success) + aws_games_sdk_auth.aws_login_error.connect(_on_login_error) + aws_games_sdk_auth.steam_link.conect(on_link_steam_id_response) + aws_games_sdk_auth.steam_login.conect(on_login_with_steam_response) + aws_games_sdk_auth.aws_sdk_error.connect(_on_aws_sdk_error) + #login + aws_games_sdk_auth.login() + # Called on any login or token refresh failures -func on_login_error(message): - print("Login error: " + message) +func _on_login_error(message): + print("Login error: ", message) + + +func _on_aws_sdk_error(message): + print("AWS SDK error: ", message) + # Receives a UserInfo object after successful guest login -func login_as_guest_callback(user_info): +func _on_login_success(): print("Received guest login info.") - print(user_info) + print(aws_games_sdk_auth.user_info.to_string()) # Try linking Steam ID to existing user # NOTE: You need to use the Godot Steamworks SDK (https://godotsteam.com/) to integrate with Steam # Use the GetAuthTicketForWebAPI to get the steam auth token (https://godotsteam.com/functions/users/#getauthticketforwebapi) - self.aws_game_sdk.link_steam_id_to_current_user("YourTokenHere", self.on_link_steam_id_response) + aws_games_sdk_auth.link_steam_id_to_current_user("YourTokenHere", self.on_link_steam_id_response) -func on_link_steam_id_response(user_info): +func on_link_steam_id_response(): print("Received steam ID linking info") - print(user_info) + print(aws_games_sdk_auth.user_info.to_string()) # Let's now try to login with Steam token directly to access the same user # NOTE: You need to use the Godot Steamworks SDK (https://godotsteam.com/) to integrate with Steam # Use the GetAuthTicketForWebAPI to get the steam auth token (https://godotsteam.com/functions/users/#getauthticketforwebapi) self.aws_game_sdk.login_with_steam_token("YourTokenHere", self.on_login_with_steam_response) -func on_login_with_steam_response(user_info): +func on_login_with_steam_response(): print("Received steam ID login info") - print(user_info) + print(aws_games_sdk_auth.user_info.to_string()) # Called every frame. 'delta' is the elapsed time since the previous frame. func _process(delta): diff --git a/GodotSample/Samples/SteamIdLogin/SteamIdLogin.gd.uid b/GodotSample/Samples/SteamIdLogin/SteamIdLogin.gd.uid new file mode 100644 index 0000000..28cdc86 --- /dev/null +++ b/GodotSample/Samples/SteamIdLogin/SteamIdLogin.gd.uid @@ -0,0 +1 @@ +uid://ba368vjxpctom diff --git a/GodotSample/Samples/SteamIdLogin/SteamIdLogin.tscn b/GodotSample/Samples/SteamIdLogin/SteamIdLogin.tscn index 90e57ee..1bf914a 100644 --- a/GodotSample/Samples/SteamIdLogin/SteamIdLogin.tscn +++ b/GodotSample/Samples/SteamIdLogin/SteamIdLogin.tscn @@ -1,8 +1,11 @@ -[gd_scene load_steps=2 format=3 uid="uid://b8blf3o26rhc3"] +[gd_scene load_steps=3 format=3 uid="uid://b8blf3o26rhc3"] -[ext_resource type="Script" path="res://Samples/SteamIdLogin/SteamIdLogin.gd" id="1_kitbl"] +[ext_resource type="Script" uid="uid://ba368vjxpctom" path="res://Samples/SteamIdLogin/SteamIdLogin.gd" id="1_kitbl"] +[ext_resource type="Script" uid="uid://dxp7lgvaxrjry" path="res://addons/AWSGameSDK/scripts/AWSAuthorization.gd" id="2_nmo6t"] [node name="Node2D" type="Node2D"] - -[node name="Test" type="Node" parent="."] script = ExtResource("1_kitbl") + +[node name="AWSGameSDKAuth" type="Node" parent="."] +script = ExtResource("2_nmo6t") +metadata/_custom_type_script = "uid://dxp7lgvaxrjry" diff --git a/GodotSample/addons/AWSGameSDK/AWSGameSDK.gd b/GodotSample/addons/AWSGameSDK/AWSGameSDK.gd new file mode 100644 index 0000000..bcb6c67 --- /dev/null +++ b/GodotSample/addons/AWSGameSDK/AWSGameSDK.gd @@ -0,0 +1,20 @@ +@tool +extends EditorPlugin + +const AUTOLOAD_NAME = "AWSGameSDK" + +static var AWSGameSDKAuth = preload("./scripts/AWSAuthorization.gd") +static var AWSGameSDKBackend = preload("./scripts/AWSBackend.gd") + + +func _enable_plugin(): + add_autoload_singleton(AUTOLOAD_NAME, "res://addons/AWSGameSDK/AWSAuthorization.gd") + add_autoload_singleton(AUTOLOAD_NAME, "res://addons/AWSGameSDK/AWSBackend.gd") + + +func _disable_plugin(): + remove_autoload_singleton(AUTOLOAD_NAME) + + +func _init() -> void: + pass diff --git a/GodotSample/addons/AWSGameSDK/AWSGameSDK.gd.uid b/GodotSample/addons/AWSGameSDK/AWSGameSDK.gd.uid new file mode 100644 index 0000000..f7270c3 --- /dev/null +++ b/GodotSample/addons/AWSGameSDK/AWSGameSDK.gd.uid @@ -0,0 +1 @@ +uid://g4ac3hmyqh5o diff --git a/GodotSample/addons/AWSGameSDK/plugin.cfg b/GodotSample/addons/AWSGameSDK/plugin.cfg new file mode 100644 index 0000000..46d4e9a --- /dev/null +++ b/GodotSample/addons/AWSGameSDK/plugin.cfg @@ -0,0 +1,20 @@ +[plugin] +name="AWSGameSDK" +description="AWS Game SDK for Godot v.0.1.0. This plugin allows developers to offer players the + ability to login to an AWS API Gateway endpoint as guests and link their Facebook, Apple, Steam, + and/or Google Play accounts to the guest identity. + + Also, using the data management backend, developers can read and write data to the cloud, developing + backend features. + + This plugin requires the deployment of the custom identity components and backend components from + https://github.com/aws-solutions-library-samples/guidance-for-custom-game-backend-hosting-on-aws. + + Full documentation of this plugin and related services are at: + https://github.com/aws-solutions-library-samples/guidance-for-custom-game-backend-hosting-on-aws + + This plugin and code are copyrighted by Amazon Web Services and released under the + MIT-0 license." +author="Amazon Web Services" +version="1.0.0" +script="AWSGameSDK.gd" diff --git a/GodotSample/addons/AWSGameSDK/readme.MD.txt b/GodotSample/addons/AWSGameSDK/readme.MD.txt new file mode 100644 index 0000000..b7ea812 --- /dev/null +++ b/GodotSample/addons/AWSGameSDK/readme.MD.txt @@ -0,0 +1,97 @@ +# AWS Game Backend Framework Godot 4 SDK + +The AWS Game Backend Framework Godot 4 SDK provides integrations to the custom identity component, managed refreshing of access tokens, helper methods for calling custom backend features, and samples for integrating with different game platforms. + +# SDK Overview + +## Initializing the SDK + +The AWS Game SDK has to be configured in your Godot 4 project in _Project Settings -> Autoload_ with the name _AwsGameSdk_. + +The Initializing and accessing the AWS Game SDK within Godot 4 (see the Godot 4 Integration Samples for sample code): + +```python +# Get the SDK and Init +self.aws_game_sdk = get_node("/root/AwsGameSdk") +self.aws_game_sdk.init(self.login_endpoint, self.on_login_error) +``` + +## SDK Public API + +The public API for the SDK includes the following methods. Most of them will require you to provide a callback for results (see the Godot 4 Integration Samples for sample code): + +```text +func init(login_endpoint, login_error_callback) +func login_as_new_guest_user(login_callback) +func login_as_guest(user_id, guest_secret, login_callback) +func login_with_refresh_token(refresh_token, login_callback = null) +func link_steam_id_to_current_user(steam_token, login_callback_steam) +func login_with_steam_token(steam_token, login_callback) +func link_apple_id_to_current_user(apple_auth_token, login_callback_apple) +func login_with_apple_id_token(apple_auth_token, login_callback) +func link_google_play_id_to_current_user(google_play_auth_token, login_callback_google) +func login_with_google_play_token(google_play_auth_token, login_callback) +func link_facebook_id_to_current_user(facebook_access_token, facebook_user_id, login_callback_facebook) +func login_with_facebook_access_token(facebook_access_token, facebook_user_id, login_callback) +func backend_get_request(url, resource, query_parameters, callback) +func backend_post_request(url, resource, request_body, callback): +``` + +## Adding the SDK to an existing project + +To add the SDK to an existing project: + +1. Drag and drop the folder `AWSGameSDK` to your Godot 4 project +2. Open _Project Settings -> Autoload_, select the script `AWSGameSDK.gd` with the directory search and select _Open_. Make sure the name is _AwsGameSdk_ and select _Add_. +3. Integrate with the SDK from your custom code (see Godot 4 Integration Samples for example integrations) + +# Godot 4 Integration Samples + +To test the integrations with Godot 4, open the Godot 4 sample project (`GodotSample`) with Godot 4. + +## Guest Identity and Rest API test scene + +* Open the scene `Samples/GuestIdentityAndRestApiBackend/GuestIdentityAndRestApiBackend.tscn` + +This is a simple test scene that will login as a new guest user if a save file is not present, or login using the user_id and guest_secret found in the save file if available to login as an existing user. It will then use the logged in user to set player name and get player name in sequence to test the HTTP API integration + +Configure the `Samples/GuestIdentityAndRestApiBackend/GuestIdentityAndRestApiBackend.gd` script to set up API endpoints. Set `const login_endpoint` value to the `LoginEndpoint` value found in the CustomIdentityComponentStack Outputs, and the `const backend_endpoint` to the `BackendEndpointUrl` value found in the PythonServerlessHttpApiStack Outputs or the `FargateSampleNodeJsServiceServiceURL` found in the NodeJsFargateApiStack Outputs. Both backend sample integrations support the same functionality to validate tokens and set and get player data. + +Press "Run current scene" to test the integration. You'll see the login and backend call activity in the Output console. + +## Steam test scene + +* Open the scene `Samples/SteamIdLogin/SteamIdLogin.tscn` + +This is a simple test scene that will login a guest user, upgrade the guest user to authenticated by linking a Steam ID to it, and then finally test logging in directly with Steam. It doesn't call any custom backend functionalities. + +To use this sample, you will need a valid Steam ID token. This requires you to sign up as a Steam Developer, create an App and the [Godot Steam SDK](https://godotsteam.com/) to integrate with Steam. You'll then use either _GetAuthTicketForWebApi_ (new) or _GetAuthSessionTicket_ (old) to retrieve a ticket to validate with the identity component API. + +Configure the `Samples/SteamIdLogin/SteamLogin.gd` script to set up the login API endpoint. Set `const login_endpoint` value to the `LoginEndpoint` value found in the CustomIdentityComponentStack Outputs. + +You will need to pass a valid Steam token to the `self.aws_game_sdk.link_steam_id_to_current_user("YourTokenHere", self.on_link_steam_id_response)` and `self.aws_game_sdk.login_with_steam_token("YourTokenHere", self.on_login_with_steam_response)` found in `Samples/SteamIdLogin/SteamLogin.gd`. + +## Facebook test scene + +* Open the scene `Samples/FacebookLogin/FacebookLogin.tscn` + +This is a simple test scene that will login a guest user, upgrade the guest user to authenticated by linking a Facebook ID to it, and then finally test logging in directly with Facebook. It doesn't call any custom backend functionalities. + +To use this sample, you will need a valid Facebook access token and Facebook User ID. This requires you to sign up as a Facebook Developer, create an App and using one of the community integrations with Facebook to login (such as [this](https://github.com/DrMoriarty/godot-facebook)). After calling _Login_ with Facebook you'll receive and access token and user ID which need to be passed to the SDK integrations. + +Configure the `Samples/FacebookLogin/FacebookLogin.gd` script to set up the login API endpoint. Set `const login_endpoint` value to the `LoginEndpoint` value found in the CustomIdentityComponentStack Outputs. + +You will need to pass a valid Facebook access token and User ID to the `self.aws_game_sdk.link_facebook_id_to_current_user("AcceessTokenHere", "UserIdHere", self.on_link_facebook_id_response)` and `self.aws_game_sdk.login_with_facebook_access_token("AccessTokenHere", "UserIdHere", self.on_login_with_facebook_response)` found in `Samples/FacebookLign/FacebookLogin.gd`. + +## Google Play and Sign in with Apple testing + +The sample project does not come with Google Play or Sign in with Apple sample scenes and scripts. Currently, Godot 4 integrations with Apple ID or Google Play are not easily available. If you build such integration yourself, you can use the APIs provided in the SDK to log in with Google Play and Apple ID, as these functionalities are fully supported by the SDK. + +The following SDK functions can be used for this in a very similar fashion as with the Steam and Facebook integrations: + +```text +func link_apple_id_to_current_user(apple_auth_token, login_callback_apple) +func login_with_apple_id_token(apple_auth_token, login_callback) +func link_google_play_id_to_current_user(google_play_auth_token, login_callback_google) +func login_with_google_play_token(google_play_auth_token, login_callback) +``` diff --git a/GodotSample/addons/AWSGameSDK/scripts/AWSAuthorization.gd b/GodotSample/addons/AWSGameSDK/scripts/AWSAuthorization.gd new file mode 100644 index 0000000..cb50835 --- /dev/null +++ b/GodotSample/addons/AWSGameSDK/scripts/AWSAuthorization.gd @@ -0,0 +1,309 @@ +# Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. +# SPDX-License-Identifier: MIT-0 +extends Node +class_name AWSGameSDKAuth + +signal aws_login_success +signal aws_login_error +signal aws_sdk_error +signal steam_link +signal steam_login +signal fb_link +signal fb_login +signal apple_link +signal apple_login +signal goog_link +signal goog_login + +#only used for internal signalling for the SDK +signal _new_login_succesful + +@export var login_endpoint: String = "" # Endpoint for custom identity component + +const UserInfo = preload("user_info.gd") + +var user_info: UserInfo = null # User info for the logged in user +var refresh_timer: Timer #used to check on refresh for access token +var http_request: HTTPRequest +var error_string: String = "" +var new_user_login: bool = false + +var linking: Dictionary = { "steam_link": false, "steam_login": false, "fb_link": false, + "fb_login": false, "apple_link": false, "apple_login": false, + "goog_link": false, "goog_login": false} + +# Called when the node enters the scene tree for the first time. +func _ready(): + refresh_timer = Timer.new() + refresh_timer.one_shot = true + add_child(refresh_timer) + refresh_timer.timeout.connect(_on_timer_timeout) + pass + + +func _save_login_data(): + var file = FileAccess.open("user://save_game.dat", FileAccess.WRITE) + file.store_pascal_string(user_info.user_id) + file.store_pascal_string(user_info.guest_secret) + file.close() + file = null + + +func _load_login_data(): + var file = FileAccess.open("user://save_game.dat", FileAccess.READ) + if file == null: + return + if file.get_length() == 0: + file.close() + return null; + user_info.user_id = file.get_pascal_string() + user_info.guest_secret = file.get_pascal_string() + file.close() + +func get_auth_token() -> String: + if user_info != null: + return user_info.auth_token + else: + return "" + + +func login(): + if user_info.user_id == "" or user_info.guest_secret == "": + _login_as_new_guest() + else: + _login_as_guest() + + +func _on_timer_timeout(): + login_with_refresh_token(user_info.refresh_token) + + +func init(): + _new_login_succesful.connect(_save_login_data) + user_info = UserInfo.new() + _load_login_data() + print("AWS Game SDK initialized") + + +func _make_auth_http_request(url: String, method: HTTPClient.Method = HTTPClient.METHOD_GET, form_data: Dictionary = {}) -> void: + # Create an HTTP request node and connect its completion signal. + http_request = HTTPRequest.new() + add_child(http_request) + http_request.request_completed.connect(_auth_request_completed) + + var error = http_request.request(url) + #send signal on failure + if error != OK: + print(error) + aws_login_error.emit("Error making request to login endpoint") + + +func _auth_request_completed(result, response_code, headers, body): + http_request.queue_free() + var json_string = body.get_string_from_utf8() # Retrieve data + var json = JSON.new() + var error = json.parse(json_string) + + # trigger error if we didn't get a proper response code + if(response_code >= 400): + error_string = json_string + return + + # Check we got no error + if error == OK: + var data_received = json.data + # Check that we got a user_id (valid response) + if(!data_received.has("user_id")): + error_string = json_string + return + + # We got valid response, let's parse values to UserInfo object + if(user_info == null): + user_info = UserInfo.new() + user_info.user_id = data_received["user_id"] + if(data_received.has("guest_secret")): + user_info.guest_secret = data_received["guest_secret"] + if(data_received.has("auth_token")): + user_info.auth_token = data_received["auth_token"] + if(data_received.has("refresh_token")): + user_info.refresh_token = data_received["refresh_token"] + if(data_received.has("auth_token_expires_in")): + user_info.auth_token_expires_in = data_received["auth_token_expires_in"] + if(data_received.has("refresh_token_expires_in")): + user_info.refresh_token_expires_in = data_received["refresh_token_expires_in"] + if(data_received.has("steam_id")): + user_info.steam_id = data_received["steam_id"] + if(data_received.has("apple_id")): + user_info.apple_id = data_received["apple_id"] + if(data_received.has("google_play_id")): + user_info.google_play_id = data_received["google_play_id"] + if(data_received.has("facebook_id")): + user_info.facebook_id = data_received["facebook_id"] + if new_user_login: + _new_login_succesful.emit() + new_user_login = false + # Send the appropriate signal back for login succes + var signal_emitted = false + for key in linking: + if linking[key]: + linking[key] = false + signal_emitted = true + emit_signal(key) + if !signal_emitted: + refresh_timer.wait_time = user_info.auth_token_expires_in - 15 + # Set the token refresh timer for 15 seconds before token expiration + refresh_timer.start() + aws_login_success.emit() + + + + else: + print("JSON Parse Error: ", json.get_error_message(), " in ", json_string, " at line ", json.get_error_line()) + # Trigger callback from client side + aws_login_error.emit(json.get_error_message()) + error_string = json.get_error_message() + + +# Logs in as a new guest user +func _login_as_new_guest(): + new_user_login = true + # Perform a GET request to login as a new guest + _make_auth_http_request(login_endpoint+"/login-as-guest") + + +# Logs in with existing user +func _login_as_guest(): + # Add the query parameters to the request + var params = login_endpoint + "/login-as-guest?" + \ + "user_id" + "=" + user_info.user_id.uri_encode() + \ + "&guest_secret" + "=" + user_info.guest_secret.uri_encode() + # Perform a GET request to login as a new guest + _make_auth_http_request(params) + + +# Refresh the access token with a refresh token +func login_with_refresh_token(refresh_token): + print('refreshing token') + var params = login_endpoint + "/refresh-access-token?" + \ + "refresh_token" + "=" + refresh_token.uri_encode() + _make_auth_http_request(params) + + +# Called to link an existing authenticated user to a Steam ID +func link_steam_id_to_current_user(steam_token, login_callback_steam): + if user_info == null: + aws_sdk_error.emit("No user info, can't link existing user to Steam ID") + return + linking["steam_link"] = true + _login_with_steam(steam_token, user_info.auth_token, true) + + +# Called to create a new user with steam ID, or to login with existing user linked to Steam ID +func login_with_steam_token(steam_token): + # Set the login callback + linking["steam_login"] = true + _login_with_steam(steam_token, null, false) + + +# Logs in with steam either linking existing user or as a steam only / new user +# Called internally by the different Steam login functions +func _login_with_steam(steam_token, auth_token, link_to_existing_user): + # Add the steam token to request + var params = login_endpoint+"/login-with-steam?" + \ + "steam_auth_token=" + steam_token.uri_encode() + # If we're linking to existing user, add the relevant parameters + if auth_token != null and link_to_existing_user == true: + print("Linking Steam ID to existing user") + params += "&auth_token" + "=" + auth_token.uri_encode() + \ + "&link_to_existing_user=Yes" + _make_auth_http_request(params) + + +# Called to link an existing authenticated user to a Apple ID +func link_apple_id_to_current_user(apple_auth_token): + if user_info == null: + aws_sdk_error.emit("No user info, can't link existing user to Apple ID") + return + linking["apple_link"] = true + _login_with_apple_id(apple_auth_token, user_info.auth_token, true) + + +# Called to create a new user with Apple ID, or to login with existing user linked to AppleID +func login_with_apple_id_token(apple_auth_token): + linking["apple_login"] = true + _login_with_apple_id(apple_auth_token, null, false) + + +# Logs in with Apple ID either linking existing user or as a Apple ID only / new user +# Called internally by the different Apple ID login functions +func _login_with_apple_id(apple_auth_token, auth_token, link_to_existing_user): + # Add the apple auth token to request + var params = login_endpoint + "/login-with-apple-id?" + \ + "apple_auth_token=" + apple_auth_token.uri_encode() + # If we're linking to existing user, add the relevant parameters + if auth_token != null and link_to_existing_user == true: + print("Linking Apple ID to existing user") + params += "&auth_token" + "=" + auth_token.uri_encode() + \ + "&link_to_existing_user=Yes" + # Perform a GET request to login as a new guest + _make_auth_http_request(params) + + +# Called to link an existing authenticated user to a Google Play ID +func link_google_play_id_to_current_user(google_play_auth_token): + if user_info == null: + aws_sdk_error.emit("No user info, can't link existing user to Google Play ID") + return + linking["goog_link"] = true + _login_with_google_play(google_play_auth_token, user_info.auth_token, true) + + +# Called to create a new user with Google Play ID, or to login with existing user linked to Google Play +func login_with_google_play_token(google_play_auth_token): + linking["goog_login"] = true + _login_with_google_play(google_play_auth_token, null, false) + + +# Logs in with Google Play ID either linking existing user or as a Google Play ID only / new user +# Called internally by the different Google Play ID login functions +func _login_with_google_play(google_play_auth_token, auth_token, link_to_existing_user): + # Add the google play auth token to request + var params = login_endpoint+"/login-with-google-play?" + \ + "google_play_auth_token" + "=" + google_play_auth_token.uri_encode() + # If we're linking to existing user, add the relevant parameters + if auth_token != null and link_to_existing_user == true: + print("Linking Google Play ID to existing user") + params += "&auth_token" + "=" + auth_token.uri_encode() + \ + "&link_to_existing_user=Yes" + _make_auth_http_request(params) + + +# Called to link an existing authenticated user to a Facebook ID +func link_facebook_id_to_current_user(facebook_access_token, facebook_user_id): + if(user_info == null): + aws_sdk_error.emit("No user info, can't link existing user to Facebook ID") + return + linking["fb_link"] = true + _login_with_facebook(facebook_access_token, facebook_user_id, user_info.auth_token, true) + + +# Called to create a new user with Facebook ID, or to login with existing user linked to Facebook +func login_with_facebook_access_token(facebook_access_token, facebook_user_id): + linking["fb_login"] = true + _login_with_facebook(facebook_access_token, facebook_user_id, null, false) + + +# Logs in with Facebook ID either linking existing user or as a Facebook ID only / new user +# Called internally by the different Facebook ID login functions +func _login_with_facebook(facebook_access_token, facebook_user_id, auth_token, link_to_existing_user): + # Add the Facebook auth token and user ID to request + var params = login_endpoint+"/login-with-facebook?" + \ + "facebook_access_token" + "=" + facebook_access_token.uri_encode() + \ + "&facebook_user_id" + "=" + facebook_user_id.uri_encode() + # If we're linking to existing user, add the relevant parameters + if auth_token != null and link_to_existing_user == true: + print("Linking Facebook ID to existing user") + params += "&auth_token" + "=" + auth_token.uri_encode() + \ + "&link_to_existing_user=Yes" + # Perform a GET request to login as a new guest + _make_auth_http_request(params) diff --git a/GodotSample/addons/AWSGameSDK/scripts/AWSAuthorization.gd.uid b/GodotSample/addons/AWSGameSDK/scripts/AWSAuthorization.gd.uid new file mode 100644 index 0000000..504c691 --- /dev/null +++ b/GodotSample/addons/AWSGameSDK/scripts/AWSAuthorization.gd.uid @@ -0,0 +1 @@ +uid://dxp7lgvaxrjry diff --git a/GodotSample/addons/AWSGameSDK/scripts/AWSBackend.gd b/GodotSample/addons/AWSGameSDK/scripts/AWSBackend.gd new file mode 100644 index 0000000..445eb4c --- /dev/null +++ b/GodotSample/addons/AWSGameSDK/scripts/AWSBackend.gd @@ -0,0 +1,98 @@ +# Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. +# SPDX-License-Identifier: MIT-0 +extends Node +class_name AWSGameSDKBackend + +signal aws_backend_request_successful +signal aws_sdk_error + +@export var backend_endpoint: String = "" #Endpoint for backend operations +@export var get_player_data_uri: String = "/get-player-data" +@export var set_player_data_uri: String = "/set-player-data" +@export var post_player_data_uri: String = "/pots-to-uri" + +var http_request: HTTPRequest +var error_string: String +#data cannot be a forced type at this time, as some data is returned as text and some as json +#you will need to evaluate the data returned for typing +var data_received + + +func get_response_data(): + return data_received + + +# Functions to make an authenticated GET request to a backend API +# Called by your custom code to access backend functionality +func backend_set_request(auth_token: String, query_parameters: Dictionary = {}): + _backend_get_request(set_player_data_uri, auth_token, query_parameters) + return + + +func backend_get_request(auth_token:String, query_parameters: Dictionary = {}): + _backend_get_request(get_player_data_uri, auth_token, query_parameters) + return + + +func _backend_get_request(resource: String, auth_token: String, query_parameters: Dictionary = {}): + var params: String = "" + if(auth_token == ""): + aws_sdk_error.emit("No auth token set yet, login first") + return + # Add the query parameters to the request + params += backend_endpoint + resource + if query_parameters != null and query_parameters != {}: + params += "?" + for key in query_parameters: + params += key + "=" + query_parameters[key].uri_encode() + "&" + # Perform a GET request to login as a new guest + _make_backend_http_request(params, HTTPClient.Method.METHOD_GET, auth_token) + + +# Function to make an authenticated POST request to a backend API +# Called by your custom code to access backend functionality +func backend_post_request(auth_token, request_body: Dictionary = {}): + if auth_token == "": + aws_sdk_error.emit("No auth token set yet, login first") + return + # Create an HTTP request node and connect its completion signal. + var params = backend_endpoint + post_player_data_uri + # Perform a GET request to login as a new guest + _make_backend_http_request(params, HTTPClient.Method.METHOD_GET, auth_token, request_body) + + +func _make_backend_http_request(url, method: HTTPClient.Method, auth_token: String, request_body: Dictionary = {}): + var error + #clear out prior data + data_received = {} + http_request = HTTPRequest.new() + http_request.request_completed.connect(_backend_reqeust_completed) + add_child(http_request) + var headers = ["Authorization: " + auth_token] + if method == HTTPClient.Method.METHOD_POST: + error = http_request.request(url, headers, method, str(request_body)) + elif method == HTTPClient.Method.METHOD_GET: + error = http_request.request(url, headers, method) + else: + #unsupported method at this time + aws_sdk_error.emit("Unsupported HTTP verb in request") + if error != OK: + print(error) + aws_sdk_error.emit("Error making backend request") + + +func _backend_reqeust_completed(result, response_code, headers, body): + http_request.queue_free() + var json_string = body.get_string_from_utf8() # Retrieve data + var json = JSON.new() + var error = json.parse(json_string) + + # trigger error if we didn't get a proper response code + if(response_code >= 400): + error_string = json_string + return + # Check we got no error + if error == OK: + data_received = json.data + aws_backend_request_successful.emit() + pass diff --git a/GodotSample/addons/AWSGameSDK/scripts/AWSBackend.gd.uid b/GodotSample/addons/AWSGameSDK/scripts/AWSBackend.gd.uid new file mode 100644 index 0000000..8c31f2b --- /dev/null +++ b/GodotSample/addons/AWSGameSDK/scripts/AWSBackend.gd.uid @@ -0,0 +1 @@ +uid://c1iyo651ktydf diff --git a/GodotSample/addons/AWSGameSDK/scripts/user_info.gd b/GodotSample/addons/AWSGameSDK/scripts/user_info.gd new file mode 100644 index 0000000..d8316bf --- /dev/null +++ b/GodotSample/addons/AWSGameSDK/scripts/user_info.gd @@ -0,0 +1,20 @@ +class_name UserInfo + +# Class to manage user info +var user_id = ""; +var guest_secret = ""; +var auth_token = ""; +var apple_id = ""; +var steam_id = ""; +var google_play_id = ""; +var facebook_id = ""; +var refresh_token = ""; +var auth_token_expires_in = ""; +var refresh_token_expires_in = ""; + +func to_string(): + return("user_id: " + user_id + "\nguest_secret: " + guest_secret + "\nauth_token: " + auth_token + + "\napple_id: " + apple_id + "\nsteam_id: " + steam_id + "\ngoogle_play_id: " + google_play_id + + "\nfacebook_id: " + facebook_id + + "\nrefresh_token: " + refresh_token + "\nauth_token_expires_in: " + str(auth_token_expires_in) + + "\nrefresh_token_expires_in: " + str(refresh_token_expires_in)) diff --git a/GodotSample/addons/AWSGameSDK/scripts/user_info.gd.uid b/GodotSample/addons/AWSGameSDK/scripts/user_info.gd.uid new file mode 100644 index 0000000..1ca1702 --- /dev/null +++ b/GodotSample/addons/AWSGameSDK/scripts/user_info.gd.uid @@ -0,0 +1 @@ +uid://cb0us4elk7if5 diff --git a/GodotSample/addons/gd_data_binding/plugin.cfg b/GodotSample/addons/gd_data_binding/plugin.cfg new file mode 100644 index 0000000..a3e957d --- /dev/null +++ b/GodotSample/addons/gd_data_binding/plugin.cfg @@ -0,0 +1,7 @@ +[plugin] + +name="GDDataBinding" +description="A plugin to provide data binding features." +author="Hotari" +version="1.0.0" +script="scripts/plugin.gd" diff --git a/GodotSample/addons/gd_data_binding/scripts/base_binding_source.gd b/GodotSample/addons/gd_data_binding/scripts/base_binding_source.gd new file mode 100644 index 0000000..d99d1a7 --- /dev/null +++ b/GodotSample/addons/gd_data_binding/scripts/base_binding_source.gd @@ -0,0 +1,187 @@ +class_name BaseBindingSource + +var _source_object +var _property_list: Array[Dictionary] + +var _target_dict = {} + + +func _init(source_object = self, source_value_change_notify_signal = null): + assert(source_object != null, "The source object must not be null.") + assert( + source_object is not Object or source_object != self or BaseBindingSource != get_script(), + "The source object must be passed unless the class inherits BindingSource." + ) + assert( + source_object is not Object or source_object != self, + "Currently, initialize by self is not supported." + ) + + _source_object = source_object + + if source_object is Object: + _property_list = source_object.get_property_list() + + elif source_object is Dictionary: + _property_list = _get_dict_property_list(source_object) + + else: + push_error("The source object must be an object or a dict.") + + var signal_instance = _get_signal(source_object, source_value_change_notify_signal) + if signal_instance is Signal: + signal_instance.connect(_on_source_value_change_notified) + + +func _get_property_list(): + return _property_list + + +func _get(property): + if property in _source_object: + return _source_object[property] + + return null + + +func _set(property, value): + _source_object[property] = value + _update_target(property, value) + return true + + +func bind_to( + source_property: StringName, + target_object, + target_property: StringName, + converter_pipeline: BindingConverterPipeline = null, + target_value_change_signal = null +): + var binding_dict = _target_dict.get_or_add(source_property, {}) as Dictionary + var binding_key = _get_binding_key(target_object, target_property) + + assert( + not binding_dict.has(binding_key), + ( + "The source property %s has already been bound to the target property %s." + % [source_property, target_property] + ) + ) + + var binding = BindingWithTargetSignal.new( + self, + source_property, + target_object, + target_property, + converter_pipeline, + _get_signal(target_object, target_value_change_signal) + ) + binding_dict[binding_key] = binding + + +func unbind_from(source_property: StringName, target_object, target_property: StringName): + assert( + _target_dict.has(source_property), + "The source property %s has not been bound to any target properties." % source_property + ) + + var binding_dict = _target_dict.get(source_property) as Dictionary + var binding_key = _get_binding_key(target_object, target_property) + + assert( + binding_dict.has(binding_key), + ( + "The source property %s has not been bound to the target property %s." + % [source_property, target_property] + ) + ) + + binding_dict.erase(binding_key) + + +func _on_source_value_change_notified(source_property: StringName): + var source_value = _source_object[source_property] + _update_target(source_property, source_value) + + +func _update_target(source_property: StringName, source_value: Variant): + var binding_dict_or_null = _target_dict.get(source_property) + if binding_dict_or_null == null: + return + + var binding_dict = binding_dict_or_null as Dictionary + + for binding_key in binding_dict.keys(): + var binding = binding_dict[binding_key] as Binding + if binding.is_valid: + binding.pass_source_value(source_value) + else: + binding_dict.erase(binding_key) + + +static func _get_dict_property_list(dict: Dictionary): + var property_list: Array[Dictionary] = [] + + for key in dict: + var value = dict[key] + var type = typeof(value) + + var property = { + "name": key, + "type": type, + "class_name": value.get_class() if type == TYPE_OBJECT else "", + } + property_list.append(property) + + return property_list + + +static func _get_signal(object, signal_ref): + if signal_ref == null: + return null + + if signal_ref is String or signal_ref is StringName: + assert( + object.has_signal(signal_ref), + "The signal name must refer to an existing signal of the specified object." + ) + return Signal(object, signal_ref) + + if signal_ref is Signal: + return signal_ref + + push_error("The arg signal_ref must be null, String, StringName, or Signal.") + + +static func _get_binding_key(target_object, target_property: StringName): + if target_object is Object: + return "%s.%s" % [target_object.get_instance_id(), target_property] + + if target_object is Dictionary: + var id = target_object.get_or_add("__BINDING_ID__", UUID.v7()) + return "%s.%s" % [id, target_property] + + push_error("The target object must be an object or a dict.") + + +class BindingWithTargetSignal: + extends Binding + + func _init( + source_object, + source_property: StringName, + target_object, + target_property: StringName, + converter_pipeline: BindingConverterPipeline, + target_value_change_signal + ): + super(source_object, source_property, target_object, target_property, converter_pipeline) + + var source_value = source_object[source_property] + pass_source_value(source_value) + + if target_value_change_signal is Signal: + target_value_change_signal.connect(_on_target_value_changed) + + func _on_target_value_changed(target_value: Variant): + pass_target_value(target_value) diff --git a/GodotSample/addons/gd_data_binding/scripts/base_binding_source.gd.uid b/GodotSample/addons/gd_data_binding/scripts/base_binding_source.gd.uid new file mode 100644 index 0000000..228132c --- /dev/null +++ b/GodotSample/addons/gd_data_binding/scripts/base_binding_source.gd.uid @@ -0,0 +1 @@ +uid://dskn3ld5efsoy diff --git a/GodotSample/addons/gd_data_binding/scripts/binding.gd b/GodotSample/addons/gd_data_binding/scripts/binding.gd new file mode 100644 index 0000000..e1370d8 --- /dev/null +++ b/GodotSample/addons/gd_data_binding/scripts/binding.gd @@ -0,0 +1,85 @@ +class_name Binding + +var is_valid: bool: + get: + return _source_validator.call(_source_object) and _target_validator.call(_target_object) + +var _source_object +var _source_property: StringName +var _source_validator: Callable + +var _target_object +var _target_property: StringName +var _target_validator: Callable + +var _converter_pipeline: BindingConverterPipeline + + +func _init( + source_object, + source_property: StringName, + target_object, + target_property: StringName, + converter_pipeline: BindingConverterPipeline = null +): + assert( + source_object is Object or source_object is Dictionary, + "The source object must be an object or a dict." + ) + assert(source_object != null, "The source object must not be null.") + assert( + source_property in source_object, + "The source property %s was not in the source object." % source_property + ) + + assert( + target_object is Object or target_object is Dictionary, + "The target object must be an object or a dict." + ) + assert(target_object != null, "The target object must not be null.") + assert( + target_property in target_object, + "The target property %s was not in the target object." % target_property + ) + + _source_object = source_object + _source_property = source_property + _source_validator = _get_validator(source_object) + + _target_object = target_object + _target_property = target_property + _target_validator = _get_validator(target_object) + + if converter_pipeline == null: + _converter_pipeline = BindingConverterPipeline.new() + else: + _converter_pipeline = converter_pipeline + + +func pass_source_value(source_value: Variant): + var prev_target_value = _target_object[_target_property] + var next_target_value = _converter_pipeline.source_to_target(source_value) + if prev_target_value == next_target_value: + return + + _target_object[_target_property] = next_target_value + + +func pass_target_value(target_value: Variant): + var prev_source_value = _source_object[_source_property] + var next_source_value = _converter_pipeline.target_to_source(target_value) + if prev_source_value == next_source_value: + return + + _source_object[_source_property] = next_source_value + + +static func _get_validator(object) -> Callable: + if object is Object: + return is_instance_valid + + return _none_object_validator + + +static func _none_object_validator(_p) -> bool: + return true diff --git a/GodotSample/addons/gd_data_binding/scripts/binding.gd.uid b/GodotSample/addons/gd_data_binding/scripts/binding.gd.uid new file mode 100644 index 0000000..32c174b --- /dev/null +++ b/GodotSample/addons/gd_data_binding/scripts/binding.gd.uid @@ -0,0 +1 @@ +uid://dde4vq75mralw diff --git a/GodotSample/addons/gd_data_binding/scripts/binding_converter.gd b/GodotSample/addons/gd_data_binding/scripts/binding_converter.gd new file mode 100644 index 0000000..dfa9727 --- /dev/null +++ b/GodotSample/addons/gd_data_binding/scripts/binding_converter.gd @@ -0,0 +1,9 @@ +class_name BindingConverter + + +func source_to_target(source_value: Variant) -> Variant: + return source_value + + +func target_to_source(target_value: Variant) -> Variant: + return target_value diff --git a/GodotSample/addons/gd_data_binding/scripts/binding_converter.gd.uid b/GodotSample/addons/gd_data_binding/scripts/binding_converter.gd.uid new file mode 100644 index 0000000..58d5cce --- /dev/null +++ b/GodotSample/addons/gd_data_binding/scripts/binding_converter.gd.uid @@ -0,0 +1 @@ +uid://lo1iyi0isxo diff --git a/GodotSample/addons/gd_data_binding/scripts/binding_converter_pipeline.gd b/GodotSample/addons/gd_data_binding/scripts/binding_converter_pipeline.gd new file mode 100644 index 0000000..188d27a --- /dev/null +++ b/GodotSample/addons/gd_data_binding/scripts/binding_converter_pipeline.gd @@ -0,0 +1,58 @@ +class_name BindingConverterPipeline + +var _source_to_target_funcs: Array[Callable] = [] +var _target_to_source_funcs: Array[Callable] = [] + +var _converters: Array[BindingConverter] = [] + + +func _init( + source_to_target_funcs: Array[Callable] = [], target_to_source_funcs: Array[Callable] = [] +): + _source_to_target_funcs = source_to_target_funcs + _target_to_source_funcs = target_to_source_funcs + + +func copy(): + var converter_pipeline = BindingConverterPipeline.new( + _source_to_target_funcs.duplicate(), _target_to_source_funcs.duplicate() + ) + converter_pipeline._converters = _converters.duplicate() + return converter_pipeline + + +func append(converter): + if converter is BindingConverter: + _source_to_target_funcs.push_back(converter.source_to_target) + _target_to_source_funcs.push_front(converter.target_to_source) + + _converters.append(converter) + + elif converter is Callable: + _source_to_target_funcs.push_back(converter) + + elif converter is Array: + _source_to_target_funcs.push_back(converter[0]) + _target_to_source_funcs.push_front(converter[1]) + + else: + push_error("The arg converter must be BindingConverter, Callable, or [Callable, Callable].") + breakpoint + + +func source_to_target(source_value: Variant) -> Variant: + var converted_value = source_value + + for source_to_target_func in _source_to_target_funcs: + converted_value = source_to_target_func.call(converted_value) + + return converted_value + + +func target_to_source(target_value: Variant) -> Variant: + var converted_value = target_value + + for target_to_source_func in _target_to_source_funcs: + converted_value = target_to_source_func.call(converted_value) + + return converted_value diff --git a/GodotSample/addons/gd_data_binding/scripts/binding_converter_pipeline.gd.uid b/GodotSample/addons/gd_data_binding/scripts/binding_converter_pipeline.gd.uid new file mode 100644 index 0000000..3d4c866 --- /dev/null +++ b/GodotSample/addons/gd_data_binding/scripts/binding_converter_pipeline.gd.uid @@ -0,0 +1 @@ +uid://dsagymlfrfb72 diff --git a/GodotSample/addons/gd_data_binding/scripts/binding_source.gd b/GodotSample/addons/gd_data_binding/scripts/binding_source.gd new file mode 100644 index 0000000..a455289 --- /dev/null +++ b/GodotSample/addons/gd_data_binding/scripts/binding_source.gd @@ -0,0 +1,307 @@ +class_name BindingSource +extends BaseBindingSource + +enum LineEditTrigger { ON_SUBMITTED, ON_FOCUS_EXITED, ON_CHANGED } +enum TextEditTrigger { ON_FOCUS_EXITED, ON_CHANGED } + +var _wrapper_dict = {} + + +func bind(source_property: StringName) -> Binder: + return Binder.new(self, source_property) + + +func unbind(source_property: StringName) -> Unbinder: + return Unbinder.new(self, source_property) + + +func _add_wrapper(source_property: StringName, wrapper: Wrapper): + var wrappers = _wrapper_dict.get_or_add(source_property, []) as Array[Wrapper] + wrappers.append(wrapper) + + +func _remove_wrapper(source_property: StringName, wrapped_object: Object): + var wrappers = _wrapper_dict.get(source_property, []) as Array[Wrapper] + _wrapper_dict[source_property] = wrappers.filter( + func(wrapper): return not wrapper.wraps(wrapped_object) + ) + + +# gdlint:ignore = max-public-methods +class Binder: + var _source: BindingSource + var _source_property: StringName + var _converter_pipeline: BindingConverterPipeline + + func _init( + source: BindingSource, + source_property: StringName, + converter_pipeline: BindingConverterPipeline = null + ): + _source = source + _source_property = source_property + + if converter_pipeline == null: + _converter_pipeline = BindingConverterPipeline.new() + else: + _converter_pipeline = converter_pipeline + + func using(converter) -> Binder: + var converter_pipeline = _converter_pipeline.copy() + converter_pipeline.append(converter) + return Binder.new(_source, _source_property, converter_pipeline) + + func to(target_object, target_property: StringName, target_value_change_signal = null): + _source.bind_to( + _source_property, + target_object, + target_property, + _converter_pipeline, + target_value_change_signal + ) + + func to_toggle_button(toggle_button: BaseButton): + assert(_convert_to(TYPE_BOOL), "A value bound to Button must be a bool.") + assert(toggle_button.toggle_mode, "The button must be toggle mode.") + to(toggle_button, &"button_pressed", toggle_button.toggled) + + func to_check_box(check_box: CheckBox): + assert(_convert_to(TYPE_BOOL), "A value bound to CheckBox must be a bool.") + to_toggle_button(check_box) + + func to_check_button(check_button: CheckButton): + assert(_convert_to(TYPE_BOOL), "A value bound to CheckButton must be a bool.") + to_toggle_button(check_button) + + func to_color_picker_button(color_picker_button: ColorPickerButton): + assert(_convert_to(TYPE_COLOR), "A value bound to ColorPickerButton must be a color.") + to(color_picker_button, &"color", color_picker_button.color_changed) + + func to_option_button(option_button: OptionButton): + assert(_convert_to(TYPE_INT), "A value bound to OptionButton must be an int.") + to(option_button, &"selected", option_button.item_selected) + + func to_texture_button(texture_button: TextureButton): + assert(_convert_to(TYPE_BOOL), "A value bound to TextureButton must be a bool.") + to_toggle_button(texture_button) + + func to_color_rect(color_rect: ColorRect): + assert(_convert_to(TYPE_COLOR), "A value bound to ColorRect must be a color.") + to(color_rect, &"color") + + func to_color_picker(color_picker: ColorPicker): + assert(_convert_to(TYPE_COLOR), "A value bound to ColorPicker must be a color.") + to(color_picker, &"color", color_picker.color_changed) + + func to_split_container(split_container: SplitContainer): + assert(_convert_to(TYPE_INT), "A value bound to SplitContainer must be an int.") + to(split_container, &"split_offset", split_container.dragged) + + func to_tab_container(tab_container: TabContainer): + assert(_convert_to(TYPE_INT), "A value bound to TabContainer must be an int.") + to(tab_container, &"current_tab", tab_container.tab_selected) + + func to_label(label: Label): + assert(_convert_to(TYPE_STRING), "A value bound to Label must be a string.") + to(label, &"text") + + func to_line_edit( + line_edit: LineEdit, trigger: LineEditTrigger = LineEditTrigger.ON_FOCUS_EXITED + ): + assert(_convert_to(TYPE_STRING), "A value bound to LineEdit must be a string.") + var target_value_change_signal: Signal + + match trigger: + LineEditTrigger.ON_SUBMITTED: + target_value_change_signal = line_edit.text_submitted + LineEditTrigger.ON_FOCUS_EXITED: + var edit_wrapper = EditWrapper.new(line_edit) + target_value_change_signal = edit_wrapper.focus_exited_without_ui_cancel + # gdlint:ignore = private-method-call + _source._add_wrapper(_source_property, edit_wrapper) + LineEditTrigger.ON_CHANGED: + target_value_change_signal = line_edit.text_changed + + to(line_edit, &"text", target_value_change_signal) + + func to_range(range: Range, target_value_change_signal = range.value_changed): + assert(_convert_to(TYPE_FLOAT), "A value bound to Range must be a float.") + to(range, &"value", target_value_change_signal) + + func to_progress_bar(progress_bar: ProgressBar): + assert(_convert_to(TYPE_FLOAT), "A value bound to ProgressBar must be a float.") + to_range(progress_bar, null) + + func to_slider(slider: Slider): + assert(_convert_to(TYPE_FLOAT), "A value bound to Slider must be a float.") + to_range(slider) + + func to_spin_box(spin_box: SpinBox): + assert(_convert_to(TYPE_FLOAT), "A value bound to SpinBox must be a float.") + to_range(spin_box) + + func to_texture_progress_bar(texture_progress_bar: TextureProgressBar): + assert(_convert_to(TYPE_FLOAT), "A value bound to TextureProgressBar must be a float.") + to_range(texture_progress_bar, null) + + func to_tab_bar(tab_bar: TabBar): + assert(_convert_to(TYPE_INT), "A value bound to TabBar must be an int.") + to(tab_bar, &"current_tab", tab_bar.tab_selected) + + func to_text_edit( + text_edit: TextEdit, trigger: TextEditTrigger = TextEditTrigger.ON_FOCUS_EXITED + ): + assert(_convert_to(TYPE_STRING), "A value bound to TextEdit must be a string.") + + var target_value_change_signal: Signal + + match trigger: + TextEditTrigger.ON_FOCUS_EXITED: + var edit_wrapper = EditWrapper.new(text_edit) + target_value_change_signal = edit_wrapper.focus_exited_without_ui_cancel + # gdlint:ignore = private-method-call + _source._add_wrapper(_source_property, edit_wrapper) + TextEditTrigger.ON_CHANGED: + var text_edit_wrapper = TextEditWrapper.new(text_edit) + target_value_change_signal = text_edit_wrapper.text_changed + # gdlint:ignore = private-method-call + _source._add_wrapper(_source_property, text_edit_wrapper) + + to(text_edit, &"text", target_value_change_signal) + + func to_code_edit( + code_edit: CodeEdit, trigger: TextEditTrigger = TextEditTrigger.ON_FOCUS_EXITED + ): + assert(_convert_to(TYPE_STRING), "A value bound to CodeEdit must be a string.") + to_text_edit(code_edit, trigger) + + func _convert_to(target_type: Variant.Type): + assert( + _source_property in _source, + "The source property %s was not in the source object." % _source_property + ) + var source_value = _source[_source_property] + var target_value = _converter_pipeline.source_to_target(source_value) + return typeof(target_value) == target_type + + +# gdlint:ignore = max-public-methods +class Unbinder: + var _source: BindingSource + var _source_property: StringName + + func _init(source: BindingSource, source_property: StringName): + _source = source + _source_property = source_property + + func from(target_object, target_property: StringName): + _source.unbind_from(_source_property, target_object, target_property) + + func from_toggle_button(button: BaseButton): + from(button, &"button_pressed") + + func from_check_box(check_box: CheckBox): + from_toggle_button(check_box) + + func from_check_button(check_button: CheckButton): + from_toggle_button(check_button) + + func from_color_picker_button(color_picker_button: ColorPickerButton): + from(color_picker_button, &"color") + + func from_option_button(option_button: OptionButton): + from(option_button, &"selected") + + func from_texture_button(texture_button: TextureButton): + from_toggle_button(texture_button) + + func from_color_rect(color_rect: ColorRect): + from(color_rect, &"color") + + func from_color_picker(color_picker: ColorPicker): + from(color_picker, &"color") + + func from_split_container(split_container: SplitContainer): + from(split_container, &"split_offset") + + func from_tab_container(tab_container: TabContainer): + from(tab_container, &"current_tab") + + func from_label(label: Label): + from(label, &"text") + + func from_line_edit(line_edit: LineEdit): + # gdlint:ignore = private-method-call + _source._remove_wrapper(_source_property, line_edit) + from(line_edit, &"text") + + func from_range(range: Range): + from(range, &"value") + + func from_progress_bar(progress_bar: ProgressBar): + from_range(progress_bar) + + func from_slider(slider: Slider): + from_range(slider) + + func from_spin_box(spin_box: SpinBox): + from_range(spin_box) + + func from_texture_progress_bar(texture_progress_bar: TextureProgressBar): + from_range(texture_progress_bar) + + func from_tab_bar(tab_bar: TabBar): + from(tab_bar, &"current_tab") + + func from_text_edit(text_edit: TextEdit): + # gdlint:ignore = private-method-call + _source._remove_wrapper(_source_property, text_edit) + from(text_edit, &"text") + + func from_code_edit(code_edit: CodeEdit): + from_text_edit(code_edit) + + +class Wrapper: + var _object: Object + + func _init(object: Object): + _object = object + + func wraps(object: Object): + return _object == object + + +class EditWrapper: + extends Wrapper + + signal focus_exited_without_ui_cancel(new_text: String) + + var _is_canceled: bool = false + + func _init(edit): + super(edit) + + assert(edit is LineEdit or edit is TextEdit) + + edit.focus_exited.connect(_on_focus_exited) + + func _on_focus_exited(): + if Input.is_action_pressed("ui_cancel"): + return + + focus_exited_without_ui_cancel.emit(_object.text) + + +class TextEditWrapper: + extends Wrapper + + signal text_changed(new_text: String) + + func _init(text_edit: TextEdit): + super(text_edit) + + text_edit.text_changed.connect(_on_text_changed) + + func _on_text_changed(): + text_changed.emit(_object.text) diff --git a/GodotSample/addons/gd_data_binding/scripts/binding_source.gd.uid b/GodotSample/addons/gd_data_binding/scripts/binding_source.gd.uid new file mode 100644 index 0000000..de33166 --- /dev/null +++ b/GodotSample/addons/gd_data_binding/scripts/binding_source.gd.uid @@ -0,0 +1 @@ +uid://bbalwvok7gyfu diff --git a/GodotSample/addons/gd_data_binding/scripts/binding_utils.gd b/GodotSample/addons/gd_data_binding/scripts/binding_utils.gd new file mode 100644 index 0000000..629b3d4 --- /dev/null +++ b/GodotSample/addons/gd_data_binding/scripts/binding_utils.gd @@ -0,0 +1,9 @@ +class_name BindingUtils + + +static func to_int(value: Variant): + return int(value) + + +static func to_float(value: Variant): + return float(value) diff --git a/GodotSample/addons/gd_data_binding/scripts/binding_utils.gd.uid b/GodotSample/addons/gd_data_binding/scripts/binding_utils.gd.uid new file mode 100644 index 0000000..0f9a899 --- /dev/null +++ b/GodotSample/addons/gd_data_binding/scripts/binding_utils.gd.uid @@ -0,0 +1 @@ +uid://ciw5e0wh8oyy3 diff --git a/GodotSample/addons/gd_data_binding/scripts/converters/case_binding_converter.gd b/GodotSample/addons/gd_data_binding/scripts/converters/case_binding_converter.gd new file mode 100644 index 0000000..022af75 --- /dev/null +++ b/GodotSample/addons/gd_data_binding/scripts/converters/case_binding_converter.gd @@ -0,0 +1,18 @@ +class_name CaseBindingConverter +extends BindingConverter + +var _case_value: Variant +var _last_source_value: Variant + + +func _init(case_value: Variant): + _case_value = case_value + + +func source_to_target(source_value: Variant) -> Variant: + _last_source_value = source_value + return source_value == _case_value + + +func target_to_source(target_value: Variant) -> Variant: + return _case_value if target_value else _last_source_value diff --git a/GodotSample/addons/gd_data_binding/scripts/converters/case_binding_converter.gd.uid b/GodotSample/addons/gd_data_binding/scripts/converters/case_binding_converter.gd.uid new file mode 100644 index 0000000..2077e5d --- /dev/null +++ b/GodotSample/addons/gd_data_binding/scripts/converters/case_binding_converter.gd.uid @@ -0,0 +1 @@ +uid://buw5ejg0g6l72 diff --git a/GodotSample/addons/gd_data_binding/scripts/converters/invert_bool_binding_converter.gd b/GodotSample/addons/gd_data_binding/scripts/converters/invert_bool_binding_converter.gd new file mode 100644 index 0000000..2a150b3 --- /dev/null +++ b/GodotSample/addons/gd_data_binding/scripts/converters/invert_bool_binding_converter.gd @@ -0,0 +1,10 @@ +class_name InvertBoolBindingConverter +extends BindingConverter + + +func source_to_target(source_value: Variant) -> Variant: + return not source_value + + +func target_to_source(target_value: Variant) -> Variant: + return not target_value diff --git a/GodotSample/addons/gd_data_binding/scripts/converters/invert_bool_binding_converter.gd.uid b/GodotSample/addons/gd_data_binding/scripts/converters/invert_bool_binding_converter.gd.uid new file mode 100644 index 0000000..4f9f376 --- /dev/null +++ b/GodotSample/addons/gd_data_binding/scripts/converters/invert_bool_binding_converter.gd.uid @@ -0,0 +1 @@ +uid://cmnfyf20qvj4c diff --git a/GodotSample/addons/gd_data_binding/scripts/converters/plus_one_converter.gd b/GodotSample/addons/gd_data_binding/scripts/converters/plus_one_converter.gd new file mode 100644 index 0000000..85f0a39 --- /dev/null +++ b/GodotSample/addons/gd_data_binding/scripts/converters/plus_one_converter.gd @@ -0,0 +1,10 @@ +class_name PlusOneConverter +extends BindingConverter + + +func source_to_target(source_value: Variant) -> Variant: + return source_value + 1 + + +func target_to_source(target_value: Variant) -> Variant: + return target_value - 1 diff --git a/GodotSample/addons/gd_data_binding/scripts/converters/plus_one_converter.gd.uid b/GodotSample/addons/gd_data_binding/scripts/converters/plus_one_converter.gd.uid new file mode 100644 index 0000000..f2829bf --- /dev/null +++ b/GodotSample/addons/gd_data_binding/scripts/converters/plus_one_converter.gd.uid @@ -0,0 +1 @@ +uid://db8juyrm270qk diff --git a/GodotSample/addons/gd_data_binding/scripts/plugin.gd b/GodotSample/addons/gd_data_binding/scripts/plugin.gd new file mode 100644 index 0000000..45a417e --- /dev/null +++ b/GodotSample/addons/gd_data_binding/scripts/plugin.gd @@ -0,0 +1,12 @@ +@tool +extends EditorPlugin + + +func _enter_tree(): + # Initialization of the plugin goes here. + pass + + +func _exit_tree(): + # Clean-up of the plugin goes here. + pass diff --git a/GodotSample/addons/gd_data_binding/scripts/plugin.gd.uid b/GodotSample/addons/gd_data_binding/scripts/plugin.gd.uid new file mode 100644 index 0000000..6cfed9e --- /dev/null +++ b/GodotSample/addons/gd_data_binding/scripts/plugin.gd.uid @@ -0,0 +1 @@ +uid://vntg37hvqli1 diff --git a/GodotSample/addons/gd_uuid/base_random.gd b/GodotSample/addons/gd_uuid/base_random.gd new file mode 100644 index 0000000..44e7e63 --- /dev/null +++ b/GodotSample/addons/gd_uuid/base_random.gd @@ -0,0 +1,7 @@ +class_name BaseRandom + + +func bytes(size: int) -> PackedByteArray: + var result = PackedByteArray() + result.resize(size) + return result diff --git a/GodotSample/addons/gd_uuid/base_random.gd.uid b/GodotSample/addons/gd_uuid/base_random.gd.uid new file mode 100644 index 0000000..7847ec0 --- /dev/null +++ b/GodotSample/addons/gd_uuid/base_random.gd.uid @@ -0,0 +1 @@ +uid://cc4ryiy6ophec diff --git a/GodotSample/addons/gd_uuid/build_in_random.gd b/GodotSample/addons/gd_uuid/build_in_random.gd new file mode 100644 index 0000000..55a5396 --- /dev/null +++ b/GodotSample/addons/gd_uuid/build_in_random.gd @@ -0,0 +1,26 @@ +class_name BuildInRandom +extends CryptoRandom + +var _random = RandomNumberGenerator.new() + + +func _init(): + var seed = 0 + var seed_bytes = _crypto.generate_random_bytes(4) + seed |= seed_bytes[0] << 24 + seed |= seed_bytes[1] << 16 + seed |= seed_bytes[2] << 8 + seed |= seed_bytes[3] + _random.seed = seed + + +func bytes(size: int) -> PackedByteArray: + var len_ints = (size + 3) / 4 + + var ints = PackedInt32Array() + ints.resize(len_ints) + + for index in range(len_ints): + ints[index] = _random.randi() + + return ints.to_byte_array() diff --git a/GodotSample/addons/gd_uuid/build_in_random.gd.uid b/GodotSample/addons/gd_uuid/build_in_random.gd.uid new file mode 100644 index 0000000..4fadc42 --- /dev/null +++ b/GodotSample/addons/gd_uuid/build_in_random.gd.uid @@ -0,0 +1 @@ +uid://cfj61fgxpvhb diff --git a/GodotSample/addons/gd_uuid/crypto_random.gd b/GodotSample/addons/gd_uuid/crypto_random.gd new file mode 100644 index 0000000..ba7365b --- /dev/null +++ b/GodotSample/addons/gd_uuid/crypto_random.gd @@ -0,0 +1,8 @@ +class_name CryptoRandom +extends BaseRandom + +static var _crypto = Crypto.new() + + +func bytes(size: int) -> PackedByteArray: + return _crypto.generate_random_bytes(size) diff --git a/GodotSample/addons/gd_uuid/crypto_random.gd.uid b/GodotSample/addons/gd_uuid/crypto_random.gd.uid new file mode 100644 index 0000000..45ee0fc --- /dev/null +++ b/GodotSample/addons/gd_uuid/crypto_random.gd.uid @@ -0,0 +1 @@ +uid://dhds538hp8nj4 diff --git a/GodotSample/addons/gd_uuid/uuid.gd b/GodotSample/addons/gd_uuid/uuid.gd new file mode 100644 index 0000000..ad840ca --- /dev/null +++ b/GodotSample/addons/gd_uuid/uuid.gd @@ -0,0 +1,41 @@ +class_name UUID + +static var fallback_random = BuildInRandom.new() + + +static func v7(random: BaseRandom = fallback_random) -> String: + var bytes = PackedByteArray() + bytes.resize(16) + + var unix_time_ms = get_unix_time_ms() + var rands = random.bytes(10) + + bytes[0] = (unix_time_ms >> 40) & 0xff + bytes[1] = (unix_time_ms >> 32) & 0xff + bytes[2] = (unix_time_ms >> 24) & 0xff + bytes[3] = (unix_time_ms >> 16) & 0xff + + bytes[4] = (unix_time_ms >> 8) & 0xff + bytes[5] = unix_time_ms & 0xff + bytes[6] = 0x70 | (rands[0] & 0x0f) + bytes[7] = rands[1] + + bytes[8] = 0x80 | rands[2] & 0x3f + bytes[9] = rands[3] + bytes[10] = rands[4] + bytes[11] = rands[5] + + bytes[12] = rands[6] + bytes[13] = rands[7] + bytes[14] = rands[8] + bytes[15] = rands[9] + + return format(bytes) + + +static func get_unix_time_ms() -> int: + return int(Time.get_unix_time_from_system() * 1000) + + +static func format(bytes: PackedByteArray) -> String: + return "%02x%02x%02x%02x-%02x%02x-%02x%02x-%02x%02x-%02x%02x%02x%02x%02x%02x" % Array(bytes) diff --git a/GodotSample/addons/gd_uuid/uuid.gd.uid b/GodotSample/addons/gd_uuid/uuid.gd.uid new file mode 100644 index 0000000..46d6ea4 --- /dev/null +++ b/GodotSample/addons/gd_uuid/uuid.gd.uid @@ -0,0 +1 @@ +uid://djjeq75105vu3 diff --git a/GodotSample/icon.svg.import b/GodotSample/icon.svg.import index 8f49f5a..4936167 100644 --- a/GodotSample/icon.svg.import +++ b/GodotSample/icon.svg.import @@ -2,7 +2,7 @@ importer="texture" type="CompressedTexture2D" -uid="uid://bf67bersrmkrg" +uid="uid://cjlov1q5qfmjc" path="res://.godot/imported/icon.svg-218a8f2b3041327d8a5756f3a245f83b.ctex" metadata={ "vram_texture": false diff --git a/GodotSample/images_readme/add_aws_nodes_to_your_scene.png b/GodotSample/images_readme/add_aws_nodes_to_your_scene.png new file mode 100644 index 0000000000000000000000000000000000000000..4790539d89b4ec943b30da3b57ae9c049bdd3491 GIT binary patch literal 67353 zcmeEuby$?!7WaUZ0fIqFC?E~eFtoIkbc0AUguu`(ilBtjH8c#3w6uuQ9W(Tx0s{;~ zcYfnJ_Z~U-oa6oe_@3wc=fVTC+3#LE)?VwkV(*u*$Exy#S17Ll002To1sM$h03TDt zrXj$?d^B!TX#xOODr}{tA1g{r(>-=^va+?e1OODm;u7$+VkT|`uAf6+y&xr!eUzU` zFnpPg@dar;_&rH9Ac*)W9djt5zENv6-97Br8AbQ5l;Xbq62eSM`X$6qN=DY0>}pol z*4f9qt7{_bP1}p9UA{@Z5E0jb0M|wQz~VNNH!t7w04TET6<@Rna&U?Vg;3!=c#MTJ zhsP&0&Cbm$DoRer<8aPNyADvWax&<0IXzxK*VghpVdn%q7W$;v$nJ>use|OS^R`k2 zmL&DV6FH^IFFehW?~`#@h`&O4RFl4`@u((S@Y(X*XMO(i0U;DVLyYHDiM=xzh;y2m09_> zjHE6u=L6pl5YcyIRoA8DV`Et_he{T+x>%`=@CMJbKe|GgVuj_z;~%Y=i#0UT+xL`F z*){$_v{;{Lq}p52s0VzW$uYS8TjWv#B6i7#`pxe~*t^2tuBWh@aYK{nlM1AgX*l+w zTN7I+UIpsqBdPSEm*e2^G!%R{+oF#dhY7s6eBZU~_cr@)xpsCQDXnAI_&T`TX$79# z5#rt5mhDYS)py>S^z@}gBqiE-H404`HYezjb4DSro-Ujfrz#vy+RuMY)u-Z=Xya3T za=>?qv=ir{3}YbP^LI|-0E_Je%N|NI%h#@q&tpgJDR0&}_);2vu1-^_tSooMk#zTf z(nRc!c8Oe8FY7&kQ3B@DM7X(!#J^vCxHej@2_Rk{I9QSfFq>e_4ZD|WMe{C5_lQ3T zB!~^99K`niNRWud_5?rm?KuJ0+*NET@=)x}CnR&vwcZA4HQ$;K=Fh-1?0Z6$kHi1u zx)6XUI6DKkD%f@I-iIrt!BcZsOZd`rx5=?+TZM3>ghH>W({U)!@&vKp6$!=il5Bqb z;1<>w>9EIF7@p@m7Ox^@4SJOMD4(?Om4A@xLu5wJV=nM@%D|9Jk3lkW+?Xf)dSn7G zksq%mUdC@#-*_m5Yl4kzeYqj`0lPH#dTZZ?@BynY)!Hl5)@DSqo7f1K2jB_kwG0BK`;PF*(b{-RVL#kshf2@ zBV`D(l(K}iLvSP#5_+{#;;FIYNO+fqLoeVlH;W+wi$T#q$A(yblu z$@g;G@r7~1ame`nRegIdcVdy(ZC|UN#S3{Dkw*siwBP>fK1cMmf6j3(e=h*fn;B=ZY&%GAB-GO9Uu>!pYyc7n0rJ(zd=y*^H)C0QBbeav0&S}rOTqjBEUBL*f(3|F^~FFRt}AB zO;%lC9$00$nn!9vD=D{E-K4-M*H@!X%}eWL*3+UJdC{2_QVSW~mT_c-LfV?zrrK$C znJYA7+l9fmZhZ;;l=X}S#Nxw3#w=~8$6rrr$e~gqgMM!iH5po8SRd>ie#EoOx~sWz zsDwma`iK}x=Sfk(b6ADBOp(l=t4GJ;Z&ubt1@*4uWA{|$c%pA*P`D9iTHE*Io5 zWH;oU69KCkOoKLQ`6TS&qT!XJR&{;f`dQQ5z%V~*y^e=W53TF^X&{aebz?E(0ORsC zqM7abvfX@d6K`8@OK<3I$S%tf%@Ot~&nfQ_m+cDQeHDeG47XvqYv60x*K+Wx@x<`H zhk)B`+OXU1x5>-N(1)m3s3)nv8VW6Mb`EuJb`IY3yZQWb8^f4IgJMEgBFhXP3=FY- zvwXGwK15|8TX2vz`CXrAUwqrlpGUH3Z6L=T4h@b%_EP;%@v8CIJ&^dO zO72Qyt2b8gzO~AG`rIWh#gxT(#Rafd7%q$h=CnvYpqN-`sR~bB7l;&in9?M0-Co<_ zlEYQ|DSO0({yuqEn+oBjYSnV~1X8@$KSD zac0_p^rz`GrrHP_#3Mw9e~3SeKcPSUS>##I=>Xmn?C01uI6LKT6GrZ0J`97x&t#ui z6SFY$A*%B=^Z3|hA)Z{U3zH#2Obc{$RS@ZubJU4+ZmWUSGe zq=w{>#Q0ro=a+Z*^b&Gj@(!=Pi5*BeBGy9HU+WWV((;m`ZW>Zf(F!s-%1)1YqCKU2 zLD-yk@0*!^TJl94PAy*NcxLptYOep`(I?BRTwKE@3`StP^5Lib-^{}jKaYP74l@-t zO9l4Z+z=@M+P>)d=7?*rv*PzGm(t%QI&0*xJ|c6oTCwEpS-oxe`pxH4C8Gp;L!Nt=qgQ*L zSCCp&TNT}v)~Fp-J_-iYb^C`3{neeu>Bpi2TO;Ik z&=$VV1KrWm7drP#R`o2a3ZIP)+MSQ#!-(NIWrrmn^D?UD+9t=V9bVSIEV_yxuyLN5 zsZg$qL-_v~FJ zt3bT&l{VWDjxFiAf_lHa5=V_YRviJqtt&{8M35xl_k%&)Ez-$k)dk zzk@987SOEgg?V<6mEAFO5ib#^)vd`fy=+5Gjcv=?C;Kx7=aY-Tk@_vMaWP?^G<3wo z)GqILn2yfQz=Mr3gsN0ZQDjB?yFMTJ>ls|n=!p983$Hj z>_~;E#uLWP1QGe*NcTJDcR-?!E{#Vx3o_2Uqp4G(!_kw&2uj4H56^~$e2U>zm}yDC z48n2H#O=}PXx_-@k(W@W{&@(67@PR-`;&mNDV7O60@Amr7)(oN4P% z-63`J{spHMsD&6^a$SQ`ps~Z6`>Ob6%6BIw?^N&PGGS9t)0#_DiHGC*GF6&j|IALE z*Cy#PY-}pC)@NM?Q8!haQFhL`zV^oFlaJFna+)^a{n6b;vrYO1`GqJq8u+Q>nU7|R z=6L~Dde9ovJ2jeXF8HQmecnfI`5P36`iHKk$X%{gld9{-gr)()=L>^un?;*&*?{~L z_0#s%zD%p_H9l)nI^w!9-^+QEeQU2`N?vZi zMlR}kK_OPCTC z<{N-T3BdiW3;;aBqWYt(fyMl`39!u zMF#f2TjK*VF8#ZVO@ny`kkXV^RK$F0n!8w9I=b38fw4#QUSKLNKU2_m1pr7HfBax6 zYA|eIJn(T_Ej_TFiZamL$$`_%!s)3cr>DcSAN>GCJ%N~_gC*FE&eOr((G}<^cJH?q zKuq~ZHP=15-ye_}JFd(q2!-)&aw6%+$oW1%-J;e;em7kABYdcT#OvOBZP;2Mi@x z{O4xQh|0MivO#Po@^7H*^$O}&{Q2tm0P{Y#I$=>Y;549a_!QvRQzpMUFD*c~i z;@o_E|023r`=1nge@k((_CG1qTx>CXF#9nzaqfSOaIx-R?M1nM?EM8<_+8L`tHnr~ z_!UvEKcrUtigzqNM)4#8iZW7Ko>;3h_+TTrA97Q|n+u0P=l%YyOu68@d$Q^kg_eaM zm|bFSb-ZqxI9R>k;3FVD5mOm<(+O5?ZtYO_x{yKEElk_~>3Y*^YPunxnf-uKA77^j zuEw};0aUL}3>$nNzh zd`zjtxwxuIxx2eNH!n|a1%=8jC{U-Qq|B|WoA5+1aC37n7CCAXO9HTPe(~#LZQvs4 zD4S700Co_@?f;EI+$7)z1Ea7$4-YQ`8?WY#m>Y~N-0Fpeg_hfS5iZ|8U#9O-O4#YO zS5#1rPW+n9M8!P=$tW$%QZ8g=W8mP>r}17Q>FVx|?tcBKP9NMuaN3>o$umG?2edWw zDDqw)0GojBpMOaX;_%Ta^L%Ql8s+Qi?T&4nHd0hkiPNBOGienEH!O$%zIhuc>8jz z>8oC0ieIu85cKw{4KX<_EtjycSZ{&U@y;?mlUmwa&n8#xxbn1g?k%Uq;v^o&6VE!& zO;__#(=aU^Z3@sa|BFWF>0j>}<|*+0pgsEzRB3;v(Mzc?Vp#$NLRpLte!XF8stYPU z)aA^UkK$=-=}F*v6M0lrS{k2sA9jc$=e4H)XZHWt9AXnJNMB`E*0;Ulv|;x0+m?*c z$*Ih)$i9Rk-BQJZ@>x?A6~eEkp6ORTq<=lhk4{+B5;miH1@97F$$G(E$? z=mW#v+A?oWeN8(#k=~;NvOBtVQoo*e#t6<+suarHy!sy`jD3B55E!vz_^-zTUQ|;T?=fGW-XRiN+56>Bh4K+3C`Kzm?3M1|Q zYv;VU-#{R{;O0HV(kMgH+cb81&6}1_G_vLyKPUOI7dyocfKc;V+K@Y?`R{IOLvD&j z_C>`gO5d=E-2@78>1=0hmsrt8)z7EF5gUP&{9QvfY3NeQh1<|A) zB3iCGX|!Zqhh3XIB5c~MR4EopigEVrrLoy@{QV;j_xwL)cODX_CsX( z5O)wX&HK@}Z;t2R9}(*CKepq6f%kPZG&L8>J7_Aek5L4y`|OVCqS0%6auSA`P}S;` z(+TVJt^!Tys>6UFuXTSc3BBBSgU9+T2a{^*``WfmtBtwV8?>}eh(~SC*pey1f*06K zNBlJCpgm;ng&~^@@4S*2Z(m@Um;)^EnU`a|@`HzMwNCL}4Yd!Cx$e@|izw10CE4Kl zqV3X2K8igMQ@npYGGR;vWq~dojMQ1>W|MWXf+k{_`bJ0j!YrUAyB#`U8sb;hS3U*Be9U}EZUTx^e^ zTG(3X*>lfFT%!h#y1f}5*3fV9Zvv%PXG*PRNCg+G*b)pQj#sa=oyg5VPKO2$bz6?& zV&mex92D1Qn~ag^!mjNouT_~pY41I4x|&Sx4O`Cir8pME3Osw}Yx+%1d7PDM1Nr=J z&Fz?lh91pH>NDY~OnU5HgA#hJTx6Ek^63+UhBgUn5wJ{#Ns-&*i%Wuj9L`np3km42 zu^~R_Ga66*C?<)bzNM`S-wIZ&|Bd2G4YFQAh>4L=md5|U zEG*1cxKfE>CrbR!W-jQ;XS^dWDYtoqW>Y2OUD$bx=W?~dE7;=rCyMrwqa_wEidUL~<5{%vNE17)~nJO5ALW z$?R5wYwl;19zsX_@ot<=pm`rkmY}91+A~Tn=Y!6ctI~sB1n3-B5tS6}d0zry8!$Ki zwCgXFpG;I(a;(f&gA(k=-?#G5%ses{s3;mSgB@>>L$zV8W7j)+c^P=ewzl`)D$D87ZcJmN zsOzJFl@&V{X66S0;74i$0Sv-kTNbWpv4ISSgN?6Q^g~s5#Jsia?505}ObiT(n(2G! zDP0~Oo}8gXKiOlCvlB02kG0gY`!&aU-rn^Tg{217g)?x^v~iLi8Zqw=a@0CnTAf`n zOvc(P27dkTyzq(cJUDiQ?e7&#%DIJ~orMe^GVSX-t0w<@-9mt#}hp(a+@jmoU&;g7z!by#c zY*%3$G&ulUfh|i`_h-kgwFuR^`x_pUsXf~Gt$yrBeH&SDrQ=f!X0_y<+L!nNsq!v->opuv(u;Bi+xt_v+gEqgLg9UIF6!7@UM~6 zVVs0oq9m!v$kk*qpPDAMOJZz*Q51Nk!})vrL|>4F=0RQKWh?AW-EnVmg$K;nFQ zw$`HS#*laM7R=D;kQ!h|OXD?9a=5@1z*1dJZCGm@Ji(OiTQNowOX<>bxR_!^=TJR% zSa>@6ex#D!=)+^3G81&&6v|ylg2{yHqw1fyt{0>i;3EL!S6sBl4=AK4(L@ndg=6fX z?Dw0OO7gz!8bD#xHi{I9bQCeqTS_xv1#TDJX@a=G$iyvnr;1JEnBlgz zyy$W$i<7MUqOBy%U}!M6dPA)&EFyycQhvF4M@|0Ih3+`J38(YdckAHEdjovHZU@j7A1a^|GDGXs48bDFl*6QCkcv1oE6Vz9*+~}4Wl8bh&g;EPW=v6|^_Msbq;E2C z;-E)>)s7d9Vdjlzs)+pkL3R7)yl10B&Jt&vQN|LCjEp8JP^`4bl`S1`eFuwX-UlMv znOE0oeIqs(MKU_`yM$Bi*cH5w2d@jV`Hl<8xsVU41E+bMz70mX`tNIhv$LRZMw z!aa}W;ar%diRmuyd=VIi{H&WI6mrq$d&fApPZ>zB8NAJ<-QinD!cig3C@bi>Kgz!apgAsj<_(hTz$@ve)AwI%oszOVN2F0d|Rbt?|fCNyye# zc9b}eQ%P%PWPasyk(o4Z^ANG!`MK6$W6-5EA?Hu2tfO|dcn^X61=>4JcyA2+Pf?~R zWf;w9th=9CXLcgLUV>`EXm~8;nx1T%deiI`=4xt6V!Pui8y|k7VdC;^%f4j(twHJQ z6G6$P3Hc*B&D;GV;zd_RHQ>`D8^f$XJ58}_p*C^U2UXXC)3IeUh*>5Ly#9oxzBB{R z3$_gdR;?#+8s9L!I;=ZnJ%31{!&{>Hrc|sToslhnR6QB^Wu@K?)%!hLE}|kmy{_$G zpxN)(0tG8s1O@^*>$@d7s*|$wT`^nkm;Lk~sy~7zD!u2Zh z2wMf4+k^?Te*4Ct5#O=u&0=Efj!5dQf%B7ry{OWgOYEv;9vFSEFz?^Va;pWGqg%E(Nu^o-1Np+PPA5I*J$++?TZ6n-1IlV zrktC>PQmJ(GF zOAZhhr@PtKq2JJQ{eZ{v9m{<0`ro~nE#34;$1|aP;2mExS>Ui!yVNNUxw2!3IEtsR zuoI)yS?0_Bv8<9gRcQBU7M7i=Y9t0}sF#5@Q{qMGkWJz8wLZ2B@dANNR3HND ziJ4#ae8-_*otjyR$e@PaFvFo&CPi+(8@>T$IPiuvA7MUB<)WLXg$*3btXv`xfRJjz z8@6@$p6S1T5`-FD>`Up}9X1k)Aawegp7xz%kcEqDACoBwP?INFA>c>4)%!mI(YNu* zRKn&#>Sp-vHe!?hph@*6ty;I7C{T2O`w(jncXNTPoz%DWUVBkjwSI4ZUOC{=GCdHbTl$&&tfjCegcw2uiv86+mw zd;DglFoxHN`I<4{2Q%!hQc9Bo>}GCVu+^lt&wg~j7ssH7`Q1`ffq$KreMGl zgn*{|uS`0E+IVFed=D!cPqum-jIC(*jmXrFGw3_Ow~|#+LS~&)#l@NrkXrSUmAtQJW@edey`#4BY7pQ; zq4a*WPGj|5qx2Zq#K|CPG%n4}tEQYjUdI@dSt}g~o zPRfiMtZ1+9M5xvsZg$Yt7EunIVOBoI|5`0rX<+wwhqp*7JDy6=@xxm7*BV!Y#}F&6 zOU|ZWDha=yq#oFjbzBI&Bt! z*zu(fx`@C8D5&~9dz*YMBO`l!4&ayX-EnLS5RX|Bu{_iyhtY?@J6+aex&{WUP_=Xc zsQpfAjrygu62sbL`uaSz^tJl_`q^#mOB~ioJeIG8(FGyW=>cbT6vWF4qR7!i@5snI zQ!N24wpkr(E$9AlW+`+VCV))UKHfE%s`cKr^V*xR_EWW`49ykyDOw_E-u&KSn6g(? zdTxE&uWTg1n{;NqxM%x=#MJQ~npa*bl16M2xsW!%j0v4+d{()K2697uk9tKfnK!kw zQu+hm;PnoOZig=k1M8hI5zx2P$WgD--PzyRtmiQICk?!3_;DSuA){Sl&r%S*P`4~~ zdl*=~CfUPnjx*Oz@3!@ECr7f##kdT^)1dg30aWhElL(6e<=;4uaSs0kQnA=Rd#fbW z)$>OCD)8nJ2c-Cbz|v^SS%@(RR{Rd5nv*8!9865|&3n~lUbCNOXUolBQSjL2XKVTa z)z_bp0GpH^6G%1A^N+}Ma%{V1OPlHVGLVB(mZo&&4 zvR`lFlhLoXi$l=2fafPsWi5_sUzSkKKKpC830X=i{EppS88WKThXy)2i*-d`YDy{c z=^K4-Q;+3+O~!*b#9^Y`p=t!UzV`{Kn>Z$99bmmwUd6gc`fXW330aj+`Px9!+5o;> zR11Q1ocfh%zA0=e8+z%jEdOZb)_aHB=r{gWkO76`{B&v4k@3QoT7ScR)Rpv`MI0Am zcDg`Giz}ZOuHQM4I6)hj`2{cGJct>IVeCJEHwVQYHEr;%N>^-85Zzr(!sDgdSAc)msFAoKk5XS_xD^f6oG@{#>|^Kq#!MsG?%yFiG01tvANxRU}jP=8a3^}%6EK-hC50~7&tLNjx52?n!4 zhPBp9M&26SjZ&2;(Dbt#dWOWLam*( zsG@vHkKs_D!?(|2driBdgi;VpTv0?+J;F~088C*w0*gx!D!;l$@l>1(1w>=w>6DT_ z_ofxTEQ2WR9o|8MKS;)0v}@&(KAt9$hjU9oOA;Wn;WUZ7dr${YojE5!xy>Xig~2$?^?Oi$nDD|b{k_H0ymWk9!yg@q+c!eFPqMlQ^|sHnkLwXquF zcR`Qn2KjNH-vHRbb>^))6TGb+`MY#z2tf9>(J7W&YbAqcj0c$wG4t<|!lKj3;F(OB zBmSkc`b;2?m+ltEQTi;=ydttUeB6rtfN1NXJv)|JXQXMgdwy{0ue15Y>eyH+SSztY z#>PxY&`NIWK}Y3j^f$)xh@rr^2$hOiz4i66=X0vZ%l0wbr(J9jE_>cFeB_#zdjnxH zpK%b`Xx5^Xh3rdiTOEC^kiC(K`^e+u9zqSD8FD)t!2S7lC3`9~h;LH2rnddgZbwzR zs^aX0w9Q`+Xofh5t4IP>+lLAid0O?zo>|ysT~mG(+xTKCd-4j3YGHd4D6Fl`^oq@H zUPjwSeoT03-d93ELiIkO;#>80)Lf%pS5I?Oq+DkCeZ5uNEY1b6cO^)>`b%3L7^$jzJQYW}*%Ay!EMd5Kz@|1X(H zAd>^YdLkpP1AKWguK!Ed#3k4`fkQ|0%YqkF;xDcKH@UxZ=l>VyB*TY_7DHDlAP@ge zFn`w3UBUgaT)PcEA-=7y3$1yJ6JSduOa zH-w0Sfu&2)otDeA?tZT2!kz%8{wGNPsq~x;17Ai1Z%6kQI%r~Lw~@(ix^S%?HUFcl zbuPQ!3Tv{t1ax!hk~%thJDvT}FJ5@^=5Vn$GV)iy*e$Hv3VX%aVk$wkw}2>%Hul+@ znrgg|VEfZR!~~_1dY3*P$8$#GubEDk(u~64J*H=40U&tYJOAPEWlc0^9s{)V^JVkP z00)v;xEbQHQ;vRO5-SKsZ)2PRnEk?|-Kjwrv zx5BoE2x*4#6(xyrd3c5wj=B6bk9N_hY8ZLgJAc2UL20?AqF6CIgmC|G9-f zHNW*10SG|e8zQf1%ysSd`)M%GWD~=|0vzPxikvcn2eyRuwKV1gMjSpx9TM*JxuC- zwa-o^{1H}g>%I>~eXc@SSUA{ZONg?laB8t`?V<9UOqQ=m`gL{Tp{4jj;7&=``q}WE zYlmQzD!gu}d1!o;9F4O>`wv_tD3FBW1>)igE}UK$1m_2DZf>@7!SEIR&zsx1CU_aR z?@HO(q2?F+3|+QH_3ONf@@4(9GNp zj!Y7d?em?rG0o&;OeCNtpja{_h&=TEw!j9Lf#SNw+tWWw6!m)Eq=cdsw908JaT+c(=^r4Z?U%xT3 zFgGsOXL*!~CIJ`RMfTSu7>+11=muwScDC2p1+QFPK%AXg+S=7`Ung_-t&unJa)=10 zDK6Y<{5-oT@;Psg@E=5P zu<*wYmDF_iU=etOk9{*@avJ(n$78lie!PRx z+^(LMfU#NkX0MZSe8W`KHGmtWDOZWKv*``l2iQX8O1@Kmf^oxs7gZ60yG;btvhB8T z^SY9Mi~nM26wE1>-zk9Zdq+fknb@hNqMA~z+8E&Rn{D42|HJ(v3wYY;kq)@z^UH1P z6am!)6ECl=ZyxEq1LbGi*)6B#vBJ-#(LGz1Z!9;n>g4E>o|B6ok7zygTwr5y#uxG)t*fzkLf^gzbE1esj2pdL#BRe(aoOzb_X5-=Qmjd zU~D;bgAg1I&FKJ>*RNkUVNNLsXe7KQL2&HTZL&^}tT8&Ihmue8n;qb`$lyU`gXgBN zqMAx&p-YpFmQJTr#QJ!4hg#j9Ayu`T+t%Fc+=|s%Sq|9ClA^M>TDTuGm4H*FYOU!Z zQ8|le@SptJpN{Lnt`6U=e;gS+BVi@nKr15VSMnUdO* z{T$-HwuO*uUXF}i_eY^hH`IblL^R{Z9=anhfSDX z#Pm_V8)ueV(}HPy0n6*f8P<-GjXPwBO^UPSLqG4`iZW_(@O$dBW$u!Ir9r8q_~(+f zH<;PVo>hA!ZcfmM+602q%OWJtPi$v`e3`sKh8PA`&2ahe>w7J=E@0MY;9+2p%zd;U zUptj}Oxl~m(UZXGNOHE^`uPQe*U1o9*J=_6ly6ZaM_YsFC!_vc;tX=U30Mhjb`Wt- zihw^;hEE+?v{@Z)d?$2SO!e^=qc#?FZRcyqeie0xjQZWv+tg?Q$6}vTPB8(mZ$k7! zjW@5&ve#QGpL_M!E3dUUl`G$ofX%`Lfd&gJ)u8rKk6P$v6_MS>?rxd?7owKp)3mZ+ zJfgSOEzK2QxIVG5vWltg)*EXYvH`nGN57xhTEOW`5)3v)I7dh|)b)9h zA;V(~a8x}#j3x!q3h)VZj-lYjh#=@dTFgUpgGJcuGigGOqbBFgVN3Jwfp`QVTX;a~ zoPML9spk~Zi~64oh-B5}X~hO$CQ?|e!ZMyd-&H^g{%)ARAa&upnt)Pk#KVcE^$aZv z(3)^hZTfMc@X^2|6g25D<1g}Hv^p2u-RnczTS?TzXHE@-aE|I1S1%X)iAYR=)clgH zinnV$hajlkRIy{CPFfQ$&6V)wRj`35x@Sa9+%ZyS^gBk#`GVW&<<*w*;5W#qm~2gz zvprT;^@UyLU&O}8Q;uA&Np%@9#HDmxiJCnwQWG;v&jKBswn>~7HKBd8QDmHk^__J} z{-;~%7Kos>J3 z{OyX>45qT!S`W6ZwO7_XvfP@st4r4JQ4bX(F7>;d%(EQ!Iq6cIfBfbin2?rsUo)aw z!D-gMj-(|x2c%!xI&OH#W~~V?^=Xj>GUn;5%_ZmoHb&ckUR|t3j`h&8f@x>RYz& z6ntX?@Rjke?RMzSJ}9d#y}E#U;cVV(yI1UE#4Yy#*d{R(u(G2s?D6&aHEPjuQ4T>S z`K>LN+>JN3r*>k`BPJ@>;x*fCx+;;J$w<(W$NaeBcGE5`|IzotT8l9hsLzGtiely+bNY%=S}IKwQ17cjbAS;=dRMTfYn zD*KQ5zLKk8JHWVirGZ2iJ(@3cWeQrm*|X25sH(~X-|ksQz}?=3`1EIGUv?|3le)Ck zH`5iS$TORW2R?75U)-Bl{4OK^QE%aM!H9;I(Nl-+x2>1Z`$ux}rOTZX11?J&&bk1h zVrtN|t>>~4Xt1*XiPQBhy&~l{Q73xt64QReeYo3sF<@hK*|nXyTO`|!kM88_zUc#~ z`An5p%AE&tx(4*;#i$b9=MqZK;cM&}>FbCS$GB7>ulCd%G0098`0!}Nl*G7p zO|7i7rmghJ$)W3PCt_X3ni}R~ijcj8w^OUiYs$Y-D|c2$RAnxGuKohKujH&)pas`z zfHCZz(9{-UoQUW@pITjr5jHpn9k3-&WjCUI7Q3b=cx9j=+tAhNx+x;S?ool}{Yk8h zW{-GCyN$SYSMRfPmzMW&ENhOlE^2-WW=7DKjQtbK+Db=i2eSU?xaGAskz18=M~8Ou zh2{>tgzQiR{}%$mkPnO+Br7F|R6x%ENTJxr0#*ZvG9Kcl3N5?K3A;M1bE z^`f1GuRye+p=IlI633^O2*a9gsG&s6^G_*@S}_>w_SQ-KIDDY6Fk*-iKjO)Nfi)}l z-7dXKr`V-V0pw1)&mJ{jfckoIabx4BI$LG26)~CZlLdcG*O*aQ4d!~4wtk`@D_fC~ z$0(hS{DW$3PNT+oplmuKxfYQ?m{QZ7by#V+mP)}PC!vzWr@lBKJhd_zQF>)UG9%@x z&0vfB48F_SiLBR|A>zGHOmZ~q>GAIEQ{G$Q5&^A8s#R3uk%DO`e{X+yb@r9x*u^}n zW3gYvyIg|>SWkQ!cwywSi437qFE89@skx2iB0Wh5 zGAc}4#M7XOQ>VxE`v{&qoL&A?DE!gG#>&t1;4wOzFhpo3-Q$lzgPfakhSBa{hKuDA{23&ZF)}j3T@}YaoM3^m@{dom=$Cn)xU&8yi=5 zP9k%Db~^dtdE0+PdO!b!FcMGc3$Atgjf@N%K}|n+PE?mr^|Oc?-T|))Ij@A@x=l9a zv$cKP9e8rKw>JiY&woR5pd?&&Uid{eQvfaA&Mz#~?=9a-@<51~H$CXn(~TIFEm*QgiSZ&x?g)Y;qoQI9##>C0 zm|b~h+=+*6tTmU3zaHb&9txkgSRWy>rbO9W1TsHsy3Ask{ z@rYXJ*+#?Fowu5Doy*tgd@K+YyE(`NN_w1X8$Su(Wv{Mv51;wL+#cQebWETT@avL5An||DuTQY}V zP0wpH)B<`v6nxT2k$<0em#n%9egoL(o!I8_o+migC#2%hJ39+FBdgQaVi$`rtw9|b z^c_i<>lf&m-!d_@?6CH+JgoTAURGw#AcpQ|hP3C&9oi3^>2RH&(wZim?<8=Iw_x%t z3DzgrCj$mz0muEuCh|9Hyrls6KLXzssukHb(W2s$E&418ox_BHQxA+KC)PUN8s2Yq z*q6Q3M(cm>RZviL8wW(Y2KeM82wDCh29Dp>>VPt zfN-R*#YPX`&@HhouwAqfAv~{YJX@TSdkY?QQw34gbEel82=j*)=I7g^d3bw|`GZ>7- zFhh?b{&@?!V6?$RtYEl4I#%Uiy9_*!P6tj`=+9D-OdiHcP*kIIND>8OjmSE&_{>Cs~2HiS%;`YOeO>HH4V)!pMU5F#P3{eF^!Q@of;x|IodK^Vr|(mUf_& zzI^=rNpMV*ZvYP9GM~?hN8#eSY|T?_i=9hlh+J;mgo*HYsAejY3mR-SCq9BtoQ1UG z3ELJ6)|-9T85(G+z0sN8^7uzwn~fAdtvu;D-^WklH&0#~?KwT#+ZFwiYT_9~;td-c zs}&+$B5Ib#zCG{#_bz)VX;31?c0AQhYxnf%xHy)kZEwmERRM}@>>e5UZ8sf7h0ugl z8ZntEEnQvfQmjP~j@gIF0`w1GG$)54g`QIBQFl&7VK)-(#*kJzlMokY7V@fEF5vYW zC1rC{vK6gNF;`bcety}f=H|WpEnto+mni90EYwr(Tr{PWK;uT&N?6!klS(rq*5k zdoBHA(*I-LPrvq$(*KzEH&XL|FL{!_%#NC#-(8psbAP=GHSjK}=Xr-I(Gt-YSzIh*#01%X=ko1mH=kPd8qVH%#$l=@xk1LRxFQ7zdU6%a zN5F7!b?;_|_`fwPdf~M1-~S8XkG=d|IWo+#sR^+gd^V5;Hx-DW!!%x&JaS@g2-U=7co<8|WE73-+|+nJ3B9m&q!>qHRR-f&@(whr(5jLo|bNBnPpo$ zmQM7g)H=E?uVLgj!C#b*=vStYphVJMIoubWRMxp~a-xcP<8BJ#>b>)pws9xRE28%M zyTWlc1jb)4M1C+2f1HlF-wgYv+_JD9e#}hYCxSd!6@gz1RNP=}~v1 zSEc3G6X6@Q0Zb;tpr|`yoX2~#SIpQ%T2{!-W9P3TPV**+{mxH3(qh)n=j4Z{r>74i zwuhgKsCD*8x&M9m^X~;QS8JCq_{cY>*_>!&Q z^%iE#LEThG`sw6|%iJ7^t({%PzU*WQCb*1#M;|gVLn-F+VY;r{-F62&F&w-x^7;COA*+6L#He^iq|U4sL3&9x$o{tyuVo z4A17|<#kq?2Gq;ep7o9=L`M%l4bUBz0*v2I!*=-R0Wc8tiTxQyCNT*aTZw_RhPg?k zgS7NVj&w&4>SW4RtT|1#7Iv|U^>EKBU|P(GblORGHq0u)n-Q?85f$A2OYQwiLeBRr z5G9uq0eIge3&#h?ziWF16r^8lD)qzsw?{Su^nm$w31&?6Z@24dO^pErcCWQJ|7QB% zbq&svR5Qm(sWhr{@2gwhK3!nbHSXZ$88)7p@sozj-w|}L!kl3ZDEa#O7R?N8@1#1L z%Y`+sv*zxSdc=_q6a9+UfS`=4KQz+bDAjbgz5PQ+;+OU#-6&JR>#efOwzfR(y$Te9 zj^W|7f;w^$ zsBS*4gq1dm3@Q=tYue*5t$b=^4ifcyNT{)?{x{#D_Z zYOt;Q(_E|lS{sE+9ZadVMf=4(&YqWzG|ZO^neTiLW{dB7e>eCN(RriW<4a#M|IIk}DyHHP7dbEHVMC|P+ z>ZLJ49T2m)xcHV|7j*^=I80h<`lOHXh70)mtcLu*4&5?0%aFCAcd{514$(p}WKFa=ZJzyJNaX5mmSQv3|Sy=FE7;$3=VimA9mG z*$qmoYDUoeav_uO@#%45fuAn?>{YTx{MSO;6ANzMKs-739o@)YW~aGR^;Y2NxLa6n zRN-WR;8bN@#XR%gIIBLTsTSMCvm{g>S}XqDSpRx_5CBz*h(2X6XGJL8~7?b`SKqPvzdYABth}W+8$ZK zB*%lWE3$fkR0n9VqzPpD0UJ$I+L|cjfh7dn?g9-KmfGY18piNyW&;-5A0#F&o&p|} z-PP^r=sbk+Eg*pxNsB#o41)W4e1cZFdj0G?VHGO`qOapRuxiNv@#ls?i#X5zY3 z;h@#Dbkl{*>4ACkKhMWWU_Qz+h&&&1$>CjHYxt8kcIQa;!&_he>CXU+sL0lLr>QGU zo=l#oOh<)t5F)#om^|=DiS^z0@;6=v8j*&PbUmi9ya054_@mhM?0d4}mw{hH=rCe3 z5x}Mf_<$13co{bEU`mb{?vKqO@|jew-prM8aeZq3`0?}XoSe#G)>Y>9>4vL2e{NFr zTAh@Zw4x5+OK*sY>C5ig*B`9Xm3XCe=jP<9nwqALo73)9x=wNzn)~T?r^>itiR;9D zWyYvUEf&b;Rhaksoi~w<^e}++Q?;>)1H0PQ!TOWCtEG1SwM)srALZ9vq`VXZ(U5WO zgZ_}HI8Q&?##gVDP@fz^>wvQY^VoZfM1vML9`2!uI1sR_E#j0}1GM$|8Vvwt*p1PT zGfNfA<|QYQnq*B+R6wkM@*!-h6e1Mm&zn{U=4NMa7~#9AH(FAhW|b5k)g}il>qj3f z5fAmvjkaD%?=}g&0fkXH8&F=o{f6Ww#YeqAlOjEb6y52yY;yR$k^{$Q_iS?NHkM2R z%r38lJ`Og!y7k9n0_-Vy^vSa%Ugx(S_C!w(?n~)FL4FJP)u2u83GcxxM`+}OZqvTprCjpx zZnRd(@5c&EPthd8tDI8ba%en{ykft%mmr0(qXmQy*mLr1KPX3x$#4E3U0^$A!UE;L z(cGl8|0efX^3OfX&T0U=u6MJ1@n7o4|6_v!j|0^I2iJ3hkA2^tzv#UItiFa;O2eNw z``tQVGyUJ-{yzJFmH5Az`4$au$tnBkB_J` zvw$HnU!3s=d_~jQ*FP2K@tq$vlW$kTNuKn*c>3;aM$ea90+lvke$5R~NaZhzbEV7P zyGHa0#~NY}PhiMU!V7z#e$<0E2oQa~jaVxzC~&P9kKv4T+cNxk<}|CA;i^UDw<5w% zE&2QBx#q_>txTE|FI=lt7#6N*9KFpK{qmcd^7x$5cC%@YZaUqsEc zgq2rqg%9=i3=0+Yd!AAb|BD0ci&jyxeRUsH78{q)iB5pF?a?H3ZP)T_41X*s6yMog zh_<210{Vhx_f~5uD7?QSu-t;TWc=8bKS)Dok5hvL!Y)vuY4 zaS!qg=K(Zwhb}l5*rYobZwDM?&%)DOyezvCAG8?zt@i=JMcma-2+lZPbVdEf#_V^j ztX)Q)TfknfBg5*c~w<+)liV5qtoonR?1v(q!<&-8WcK1 zPQ96sr!UJxj>DN;Df2QFea!(9BGD`aF!_L+@ zjm+u;`e(70-O1TEGjo1|(sp42VP%CW|0{HM#yTM`)1I+7SS{P=3GOrj;=OdBj@pW1 zoIm5CK%%%wyr9|GwS)f9^Yrg#*OeP@l-X6Lrt6Ka9e6ifrQ>TvI_>5mof=u{AW70Y z;hgur-mzOuO1Un0_}$z86~s3n!@S-U2}nGK&k#4OC#?QQ8U3p-`(+b&Tn3J-EAFE` z7w~pAK_>UU1ENf0o4yyHhfMIE2i3iRDX?^1UZ|Mi)Vi#zvww!f^X_CNb8VLspo2J~ zkv7_2!8fK`FVA+ta9-p496)(Zl7v-qeMxSmzQ+p_2cM*Rtx0>Cn#sNXfnn>6vd4Sp z8Krz|EO0Y_!Bfq(&t@QityJF5eqaTW$u*57Qv(n8yhL^ z{H`8Pr|R<^(;IP*{rd+%&!}TQQ3{^eHbUdx9ycHNNOMUrZ?#^ET@944qQ9@M9{W`} zqFsh&KFKA+k|OX{N%2z+4T-^9hv?|6RyfXM)7<1=B*+gR)@l;BK^CIQL?bEB;=1Bd zH|ke__FH_!!_=1X{ggq5?-$AMrgB(T!ny^<1)b6r=F#gQm^QcDuDg*k34QmrV{{tm zL6~fB;X2_A9#=qb0n&&#Kz$&LB=n0?HUcF#?#O}mZEl&;GPvi?ksR0Ys2IgYjRDoV z1uwB6#H1!%2?9{o$dfnQ@6*Q@d*!~87t;de=bpaM~r6e=NS zSgXjJio(!?(Ibq&A-H3QdtHHb~-AYfNFxB3`wwlw^=otA~l_uRwukYx~|TY`{1!^pRv_u zR#{iNXH}}u^SUFsZ>{L2l>16H?gFkJ%D&tB(5<}yiA)|HG5@uT-7iPvsCZ`eAik=$ zB6a)7|C`-sla=jGOvjZ=4B9xV7NAN2qMr8`d zZ^oatqA+)NfAN*sKd=E*TTy^GEg6$)uTEYAh!^Ma z+%aw?FY_+@YJ$P_j8jR}-~;90&+I#0F|abb*P3yROYbnZo`1@mvX!qYSK9K?*E!O! zrqRE*wXv<%L_P=@x-W+$jSL@%z2Jw~PV=+gC)#0Ur?Lu4sUtFOydb&yBI3}= z#}Tzri&vSC^TYaK@k--#At2XQuf9(KGRRxwJ>WwXRh4*bo~HQnsTRAF+PB zT(8K2zOSXjYyh;7*>;N0q@lypZP4m*wxdTZ?Pi6D4S!nYw^(AAM*r!?T5R<_frho` ze9eu*?n)vt+K>a(X7VaO=G)1gacMVJ881GBRY!tg0{WJueDEjD{?iS}iD$|Isj|9# znz<4oW*O1v9(L8d{yIB<4*4t$jNc9_?CZ9RNfO(T zCkyygX^ao1?tp40)$cZFq)a^zG=@Y^e^r*&EHRGZQj6z!b_G{CQ&hE(s-`BzJ*k<> zBW&9p-%wxE=_6Bf-~OdGy8O@?nOm{B^!e(j=p`A+vg6R|1$t7l!0)s7o~E2&)0U=) zNZMK&f{wDmQ^Y=t7um?~Jk;_UucJDlH7isI^$FdSNNwiTFOC;%NS<98K|H5gkmeAU zqNZcnxUH9^RMbj94WrzKPI$O6wWSEVy~n?oc43uHy_m@NF!RB~xPT@wGjysdNzG~HFTVs<^5-tB5i`avHHXZ`1FsWQ#{J3vyCZUr3|`}L)kblp0eUZC z%By>jJ0-j;=Vpqi%Z=vd#W$l&*^+Y51dpX2fs|gx5V~An+pUL%#t(gyHa=X`nBtY> z(J2qJkK>8M1YXRQ&X4EzG!CR_!&HrPnMqbvfeXLiRZAJ-pUu5o60OX-SGXLIN+9f- zHa;p_K~*6{A3jO4WCSmV_hkl{9UU@xTN?T+b<-n{&Le9>T45=!b;hqOykE9|b9P2r zddM+8kQf6SoJl;bkhhphC-)>z+QVWW@pWgC+osc&^`>Xb`f)7c1$I)^z)Lw*&Gi5X zeRKByEq1;t*HMlNr=iVf>4Q!~Z{knDT}&Du#fZ3!wGGxQ)Yk~DvRbioOWgZ#t?>TK zjf=Bk1O#7MUQo-*$dFuRC>5({)O>m2E8261Pe(dS>e<`d@%Mrwgdr){$@jNBHC1vx zsR|v8@S5RY)<12L?rF^kxVkguQ%FHch3a(Z*=VR$?)*&OdQa^|JTJqw={TOGHS2v4 zq{^?L)g_MCpqoN0<$i)D^X$N)ZmGA$yDL&&>O2om#qh*km);jJsr*tg*+p^Msimc6 z+i9@qss@vIo9@(*XyX5NKKfVFG#Elk-c2fvogb;XPrJ%<$1BRh&eCYQ5iFvA3)U$`@o4VM4;I)+$Hmj~mz9^JytznUhItkn+N8a0UD9Z#wMl)Mm7C z68G+St&A;t;C2VjrxEc>CK6At!Dp)FyniqVCfKF>8QCJz1oK0LIy`DDX5^O?{A2^# z-FLp0T27xgYJ8fNDhnE!sV*yP-34!9tbJyR>F#DA9e_7`lMWhz0+(prdRkxBd0Y*& zHXj99&E^&Bx2+e8Fyr;bmh?B7fH%CYM%H^P-9`e@XG7zkw6>;to}SsJ!zf+MD2SS! zn_I#Hw8Zp$u<-l+y^Xoqp7&pKQ|A>V{AXVyU|+uQs9MLJF!2)R=ZD9i8WhU2D|5I6 z$Rin8SU7BgJ3H3tId8DrG*+y6vKsS<@CfPf=y3@K1(CWR?4Cr~t>_3Bhc3v5Fp0Vj z$d^|-{-_BD)S)Un{m#d=6}e{~NMaccxi`i}c4AjIvzm(J(4oon7)wJ!#%>aLK9e1P zxZ!c^M}GbyM;&-9x8Jn1z;R^e&)p&4eu<65uyj&T>yL>-Hth}ogT$9IbkF>mgN$_s z+{yn9?-%EAG|m4vd%v2Ze{S6W=k{KZ5IcVTndA|6wIuWNcHk;()z(|y|=^X(xwfB2O_RmOCHI9U|Ne2)|83K+(C6f)3buAAjacm7- zpu9Q72HtLnf&}+L-QqZs?;k$(ZMA&TwE)N%%O7nP3E6jJHnGZ@yZZUp9zD8<0cGd1 zyaRgRmV(gGJ3azrfiJ&wWFIp@|Cp~FGqxKy?k0;nU7MbsX1Nd@{qQd2ae-22!Qh*t z%aI~+l;c-P47C+nj;!`euCt>>YFE3v2abIx?Bej}{hcu{&n?h%2q`J)`SUvZ&!6`x zg7P%eVrN>l?gRbeT>_shmQo=9f;gWg*$lY`I`Y&3m)O?OcG|herMFLUO&!2oT*-rs zw{?YyBD)6f?@*pRefr6`f~DmrTB@UFnpC7f7uR{Ddu9-n_w!FdkoFCVRO0IkZ&Ic? zj$KM=3U|C+bA!q%574P5vWos$ za0Zz0yFiliQZK_-mt#-SPv{j(5k$gDH@%!1`A8!58c8Dg*}UH;BmbUHE=@8DlFlv=$fq7}GJZZY^EQx?=hJix_4~6(OP-Ay@YNC|Pmci8@o5K=pywwk zo-wXs5))kaZr>%j$!dT4_tNLTACvj zE>Hjb*(lMM(v^Kz6)78^olJWlkj8Z0hO9t2k|p8A z;Ii6+?uOy-53{z;5zvVhZ~u8dl`_GdN<#auuIk8UJ42<($jP&{kd=Kf4Pl?dtP&ek z0WFNlU_{c)vz>(T0@AF~d6FF&?o(7QBa1jjZunh2P?RJTMKj|CylT)21=Z#f-_C^p zJ!mjw6{p9=dTnRYH*Qm^BpCmw(Z$! z^5~D-+kqz-1N~`$RSi1NmYD=WS`5jlwIkr8UhRUo__nv-G@$1*&P`v;v5DC~kE~A{ zhzNfwQy))LzrGPvD(=w8XMveiZz73t`0KAkg12VDJ>`y%%Yrcpgu|re5tIuBCFRJ| z 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%0A@oS#jD6435xT`mZ~hrnu4gwfL|1rjwH|%O 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 GKl?w=-X9GB literal 0 HcmV?d00001 diff --git a/GodotSample/images_readme/add_aws_nodes_to_your_scene.png.import b/GodotSample/images_readme/add_aws_nodes_to_your_scene.png.import new file mode 100644 index 0000000..a373815 --- /dev/null +++ b/GodotSample/images_readme/add_aws_nodes_to_your_scene.png.import @@ -0,0 +1,34 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://cdesyoonww2fg" +path="res://.godot/imported/add_aws_nodes_to_your_scene.png-69f4916ec05e646f1c112d4aeaad76a7.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://images_readme/add_aws_nodes_to_your_scene.png" +dest_files=["res://.godot/imported/add_aws_nodes_to_your_scene.png-69f4916ec05e646f1c112d4aeaad76a7.ctex"] + +[params] + +compress/mode=0 +compress/high_quality=false +compress/lossy_quality=0.7 +compress/hdr_compression=1 +compress/normal_map=0 +compress/channel_pack=0 +mipmaps/generate=false +mipmaps/limit=-1 +roughness/mode=0 +roughness/src_normal="" +process/fix_alpha_border=true +process/premult_alpha=false +process/normal_map_invert_y=false +process/hdr_as_srgb=false +process/hdr_clamp_exposure=false +process/size_limit=0 +detect_3d/compress_to=1 diff --git a/GodotSample/images_readme/folder_structure.png b/GodotSample/images_readme/folder_structure.png new file mode 100644 index 0000000000000000000000000000000000000000..2abb6026f05f9a91d70e0884d07ee956c637c9bc GIT binary patch literal 35652 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%0AmD(%Fo1VZCe+{7P&k>-{vJcN0p}ouR79kt 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 W@@i`@r0QP)KMJy{uZmxqzW*O73|8y_ literal 0 HcmV?d00001 diff --git a/GodotSample/images_readme/project_settings.png.import b/GodotSample/images_readme/project_settings.png.import new file mode 100644 index 0000000..37d7809 --- /dev/null +++ b/GodotSample/images_readme/project_settings.png.import @@ -0,0 +1,34 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://dy8yiiqs3rxxw" +path="res://.godot/imported/project_settings.png-70a1e49961f1c56bf70d7ca4949ed256.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://images_readme/project_settings.png" +dest_files=["res://.godot/imported/project_settings.png-70a1e49961f1c56bf70d7ca4949ed256.ctex"] + +[params] + +compress/mode=0 +compress/high_quality=false +compress/lossy_quality=0.7 +compress/hdr_compression=1 +compress/normal_map=0 +compress/channel_pack=0 +mipmaps/generate=false +mipmaps/limit=-1 +roughness/mode=0 +roughness/src_normal="" +process/fix_alpha_border=true +process/premult_alpha=false +process/normal_map_invert_y=false +process/hdr_as_srgb=false +process/hdr_clamp_exposure=false +process/size_limit=0 +detect_3d/compress_to=1 diff --git a/GodotSample/images_readme/scene_tree_with_plugins.png b/GodotSample/images_readme/scene_tree_with_plugins.png new file mode 100644 index 0000000000000000000000000000000000000000..181b65fc71a8862ef31b663a5caa24ffcff97e49 GIT binary patch literal 40815 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 Am;e9( literal 0 HcmV?d00001 diff --git a/GodotSample/images_readme/scene_tree_with_plugins.png.import b/GodotSample/images_readme/scene_tree_with_plugins.png.import new file mode 100644 index 0000000..2289f61 --- /dev/null +++ b/GodotSample/images_readme/scene_tree_with_plugins.png.import @@ -0,0 +1,34 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://www8uydfo0tk" +path="res://.godot/imported/scene_tree_with_plugins.png-87ca49001a3091fe89f97cfde03455a1.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://images_readme/scene_tree_with_plugins.png" +dest_files=["res://.godot/imported/scene_tree_with_plugins.png-87ca49001a3091fe89f97cfde03455a1.ctex"] + +[params] + +compress/mode=0 +compress/high_quality=false +compress/lossy_quality=0.7 +compress/hdr_compression=1 +compress/normal_map=0 +compress/channel_pack=0 +mipmaps/generate=false +mipmaps/limit=-1 +roughness/mode=0 +roughness/src_normal="" +process/fix_alpha_border=true +process/premult_alpha=false +process/normal_map_invert_y=false +process/hdr_as_srgb=false +process/hdr_clamp_exposure=false +process/size_limit=0 +detect_3d/compress_to=1 diff --git a/GodotSample/images_readme/setting_auth_endpoint.png b/GodotSample/images_readme/setting_auth_endpoint.png new file mode 100644 index 0000000000000000000000000000000000000000..55284c27377307c358a43a7c7c4091e0d242f825 GIT binary patch literal 62998 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 literal 0 HcmV?d00001 diff --git a/GodotSample/images_readme/setting_auth_endpoint.png.import b/GodotSample/images_readme/setting_auth_endpoint.png.import new file mode 100644 index 0000000..458de38 --- /dev/null +++ b/GodotSample/images_readme/setting_auth_endpoint.png.import @@ -0,0 +1,34 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://djjvfvvp4miuy" +path="res://.godot/imported/setting_auth_endpoint.png-3d3fe78510d22003c31d4dd721c085e4.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://images_readme/setting_auth_endpoint.png" +dest_files=["res://.godot/imported/setting_auth_endpoint.png-3d3fe78510d22003c31d4dd721c085e4.ctex"] + +[params] + +compress/mode=0 +compress/high_quality=false +compress/lossy_quality=0.7 +compress/hdr_compression=1 +compress/normal_map=0 +compress/channel_pack=0 +mipmaps/generate=false +mipmaps/limit=-1 +roughness/mode=0 +roughness/src_normal="" +process/fix_alpha_border=true +process/premult_alpha=false +process/normal_map_invert_y=false +process/hdr_as_srgb=false +process/hdr_clamp_exposure=false +process/size_limit=0 +detect_3d/compress_to=1 diff --git a/GodotSample/images_readme/setting_backend_endpoint.png b/GodotSample/images_readme/setting_backend_endpoint.png new file mode 100644 index 0000000000000000000000000000000000000000..205433302b4b5e76defc9ce8cae481a95cd6f64a GIT binary patch literal 103884 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⋘iYI5}8g9|N zB1x)R8Ds)AjyZ7}&V80xJ9oDvU$5-_YpR7&@zUjF;!l5FZV`opN5-!1p2uTJ8rufH;Q+jSz6TPrMzH!j|PzWnD>E3E%mb3(Bf;k4P!IZK2* z9v)Xxj8zvUNK`&V?3UK=ZHtX=$A(VR30p%Pzn2Q(?$kjkd|%8o)kV2f*zQ2aFH;(2 zE-Ns1d zaZ9)#G>BICOyXxlLIEP|UEKcX`AS+bldcIbhp+cP)8^f^q{~}*wA9;}gj5yv@Hn5*8AVP9!RN4J59mRTIMyYqSyW*^#$AT z*z69ERHy4);N~fx8c7@^)cs&vnQ;%m3N9|?C&&}2 zpH=UDEkIl@C61I?#K{K7oYzq3?7ZbooAaE*a3WPEMFtyh79f6oZcp|8X=@@@8!{fb z_p<zd)p^GB=oAMfDrTO za?N7z^xyAsux$e|e>MiqpB&${pWdpTfsCybZuX3VifU}WUd}qP31@~xoC_{NW?_kA zGB_Xpmp!Li{wTa`-_lj}c9+%G6LXu#(KiwDF=tVc)@`Mqq^WO%@N9!GAq`E8^{yCc z)q8rgyEyjy5b83gu$)%S=|R>eE}?9bTG+cC4

%^U9E2I;)i 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 Date: Wed, 30 Apr 2025 08:58:45 -0400 Subject: [PATCH 2/4] Changes from PR feedback --- .../AmazonGameLiftIntegration.gd | 101 ++++++++---------- .../AmazonGameLiftIntegration.tscn | 14 ++- GodotSample/README.md | 17 ++- .../Samples/FacebookLogin/FacebookLogin.gd | 19 ++-- .../GuestIdentityAndRestApiBackend.gd | 1 - .../Samples/SteamIdLogin/SteamIdLogin.gd | 13 ++- .../Samples/SteamIdLogin/SteamIdLogin.tscn | 1 + .../AWSGameSDK/scripts/AWSAuthorization.gd | 6 +- .../addons/AWSGameSDK/scripts/AWSBackend.gd | 31 +++++- 9 files changed, 122 insertions(+), 81 deletions(-) diff --git a/GodotSample/BackendFeatures/AmazonGameLiftIntegration/AmazonGameLiftIntegration.gd b/GodotSample/BackendFeatures/AmazonGameLiftIntegration/AmazonGameLiftIntegration.gd index ced6e03..7a12b14 100644 --- a/GodotSample/BackendFeatures/AmazonGameLiftIntegration/AmazonGameLiftIntegration.gd +++ b/GodotSample/BackendFeatures/AmazonGameLiftIntegration/AmazonGameLiftIntegration.gd @@ -3,33 +3,21 @@ extends Node -# TODO: Add the login endpoint here -const login_endpoint = "https://YOUR_ENDPOINT/prod/" -# TODO: Add your Amazon GameLift backend component endpoint here -const gamelift_integration_backend_endpoint = "https://YOUR_ENDPOINT/prod" +# TODO: set your gamelift_integration_backend_endpoint on the AWSGameSDKBackend property page -var aws_game_sdk +@onready var aws_games_sdk_auth = get_node("AWSGameSDKAuth") +@onready var aws_games_sdk_backend = get_node("AWSGameSDKBackend") var ticket_id var total_tries = 0 # The amount of tries to get match status var latency_data # The JSON latency data for requesting matchmaking - -func save_login_data(user_id, guest_secret): - var file = FileAccess.open("user://save_game.dat", FileAccess.WRITE) - file.store_pascal_string(user_id) - file.store_pascal_string(guest_secret) - file = null - -func load_login_data(): - var file = FileAccess.open("user://save_game2.dat", FileAccess.READ) - if(file == null or file.get_length() == 0): - return null; - - var user_id = file.get_pascal_string() - var guest_secret = file.get_pascal_string() - return [user_id, guest_secret] - + +var logged_in: bool = false +var actions: Array +var current_action: String + + # Measures TCP latency to an endpoint with 3 requests (1 for establishing HTTPS, 2 for average TCP) func measure_tcp_latency(endpoint): @@ -124,7 +112,7 @@ func measure_latencies(): var latencydata = { "latencyInMs": { "us-east-1": region1latency, "us-west-2": region2latency, "eu-west-1": region3latency}} return JSON.stringify(latencydata) -#func _http_request_completed(result, response_code, headers, body): + # Called when the node enters the scene tree for the first time. func _ready(): @@ -135,46 +123,47 @@ func _ready(): print("Got latency data: " + self.latency_data) # Get the SDK and Init - self.aws_game_sdk = get_node("/root/AwsGameSdk") - self.aws_game_sdk.init(self.login_endpoint, self.on_login_error) + aws_games_sdk_auth.init() + aws_games_sdk_auth.aws_login_success.connect(_on_login_success) + aws_games_sdk_auth.aws_login_error.connect(_on_login_error) + aws_games_sdk_auth.aws_sdk_error.connect(_on_aws_sdk_error) + aws_games_sdk_backend.aws_backend_request_successful.connect(_on_gamelift_backend_post_response) + aws_games_sdk_backend.aws_sdk_error.connect(_on_aws_sdk_error) + print("calling login") + aws_games_sdk_auth.login() - # Try to load existing user info - var stored_user_info = self.load_login_data() - - # If we have stored user info, login with existing user - if(stored_user_info != null): - print("Logging in with existing user: " + stored_user_info[0]) - self.aws_game_sdk.login_as_guest(stored_user_info[0], stored_user_info[1], self.login_callback) - # Else we login as new user - else: - print("Logging in as new user") - self.aws_game_sdk.login_as_new_guest_user(self.login_callback) # Called on any login or token refresh failures -func on_login_error(message): +func _on_login_error(message): print("Login error: " + message) + +func _on_aws_sdk_error(error_text): + print("Error received from AWS SDK: ", error_text) + # Receives a UserInfo object after successful login -func login_callback(user_info): - print("Received login info.") - print(user_info) - - # Store the login info for future logins - self.save_login_data(user_info.user_id, user_info.guest_secret) - +func _on_login_success(): + print("Received login success") + logged_in = true + actions = ['create_ticket', 'get_ticket_data'] + current_action = actions.pop_front() + #you can inspect the user_info with this line + #print(aws_games_sdk_auth.user_info.to_string()) # Start matchmaking - self.aws_game_sdk.backend_post_request(self.gamelift_integration_backend_endpoint, "/request-matchmaking", - self.latency_data, self.matchmaking_request_callback) + self.aws_games_sdk_backend.gamelift_backend_post_request(aws_games_sdk_auth.get_auth_token(), + self.latency_data) + +func _on_gamelift_backend_post_response(body): + if current_action == 'create_ticket': + matchmaking_request_callback(body) + current_action = actions.pop_front() + elif current_action == 'get_ticket_data': + get_match_status_callback(body) # We need to use the exact format of the callback required for HTTPRequest -func matchmaking_request_callback(result, response_code, headers, body): - +func matchmaking_request_callback(body): var string_response = body.get_string_from_utf8() - if(response_code >= 400): - print("Error code " + str(response_code) + " Message: " + string_response) - return - print("Matchmaking request response: " + string_response) # Extract the ticket ID from the response @@ -187,10 +176,11 @@ func matchmaking_request_callback(result, response_code, headers, body): self.ticket_id = dict_response.data["TicketId"] print("Ticket id: " + self.ticket_id) # Call the get match status - self.aws_game_sdk.backend_get_request(self.gamelift_integration_backend_endpoint, "/get-match-status", { "ticketId" : self.ticket_id}, self.get_match_status_callback) + self.aws_game_sdk.gamelift_backend_get_request(aws_games_sdk_auth.get_auth_token(), + { "ticketId" : self.ticket_id}) # We need to use the exact format of the callback required for HTTPRequest -func get_match_status_callback(result, response_code, headers, body): +func get_match_status_callback(body): var string_response = body.get_string_from_utf8() @@ -213,14 +203,15 @@ func get_match_status_callback(result, response_code, headers, body): print("Couldn't get a valid response from matchmaking") else: await get_tree().create_timer(1.5).timeout - self.aws_game_sdk.backend_get_request(self.gamelift_integration_backend_endpoint, "/get-match-status", { "ticketId" : self.ticket_id}, self.get_match_status_callback) + #TODO: change this call + self.aws_game_sdk.gamelift_backend_get_request(aws_games_sdk_auth.get_auth_token(), + { "ticketId" : self.ticket_id}) elif ticket_status == "MatchmakingSucceeded": print("Matchmaking done, connect to server...") # TODO: Connect self.connect_to_server(dict_response.data["IpAddress"], dict_response.data["Port"], dict_response.data["PlayerSessionId"]) else: print("Matchmaking failed or timed out.") - self.total_tries += 1 func connect_to_server(host, port, player_session_id): diff --git a/GodotSample/BackendFeatures/AmazonGameLiftIntegration/AmazonGameLiftIntegration.tscn b/GodotSample/BackendFeatures/AmazonGameLiftIntegration/AmazonGameLiftIntegration.tscn index 78a7d94..0cc9824 100644 --- a/GodotSample/BackendFeatures/AmazonGameLiftIntegration/AmazonGameLiftIntegration.tscn +++ b/GodotSample/BackendFeatures/AmazonGameLiftIntegration/AmazonGameLiftIntegration.tscn @@ -1,8 +1,16 @@ -[gd_scene load_steps=2 format=3 uid="uid://d2rykx55ylfax"] +[gd_scene load_steps=4 format=3 uid="uid://d2rykx55ylfax"] [ext_resource type="Script" uid="uid://bj1uupijq8a0p" path="res://BackendFeatures/AmazonGameLiftIntegration/AmazonGameLiftIntegration.gd" id="1_f5d5y"] +[ext_resource type="Script" uid="uid://dxp7lgvaxrjry" path="res://addons/AWSGameSDK/scripts/AWSAuthorization.gd" id="2_6och4"] +[ext_resource type="Script" uid="uid://c1iyo651ktydf" path="res://addons/AWSGameSDK/scripts/AWSBackend.gd" id="3_tqorc"] [node name="Node2D" type="Node2D"] - -[node name="Test" type="Node" parent="."] script = ExtResource("1_f5d5y") + +[node name="AWSGameSDKAuth" type="Node" parent="."] +script = ExtResource("2_6och4") +metadata/_custom_type_script = "uid://dxp7lgvaxrjry" + +[node name="AWSGameSDKBackend" type="Node" parent="."] +script = ExtResource("3_tqorc") +metadata/_custom_type_script = "uid://c1iyo651ktydf" diff --git a/GodotSample/README.md b/GodotSample/README.md index 512180d..ef05152 100644 --- a/GodotSample/README.md +++ b/GodotSample/README.md @@ -16,7 +16,7 @@ Next, go to Project -> Project Settings... from your menu and enable the AWS Gam ## Adding nodes for the AWS for Games SDK to your scenes -The AWS Game SDK contains two components that can be added to your projects. These are `AWSGameSDKAuth` and `AWSGameSDKBackend`. The AWSGameSDKAuth component allows you to login as guest, refresh your access token, and link accounts to Facebook, Apple, Google Play, and Steam via an API endpoint. The AWSGameSDKBackend component allows you to make calls to a backend endpoint to save and retrieve player data. You can add the necessary nodes to an appropriate scene for your project. The AWSGameSDKBackend requires the AWSGameSDKAuth component, as access tokens are required to save and retrrieve data. These components can be added by adding child nodes to your scene. +The AWS Game SDK contains two components that can be added to your projects. These are `AWSGameSDKAuth` and `AWSGameSDKBackend`. The AWSGameSDKAuth component allows you to login as guest, refresh your access token, and link accounts to Facebook, Apple, Google Play, and Steam via an API endpoint. The AWSGameSDKBackend component allows you to make calls to a backend endpoint to save and retrieve player data. You can add the necessary nodes to an appropriate scene for your project. The AWSGameSDKBackend requires the AWSGameSDKAuth component, as access tokens are required to save and retrieve data. These components can be added by adding child nodes to your scene. ![Adding AWSGameSDK nodes to your Godot scene](images_readme/add_aws_nodes_to_your_scene.png) @@ -153,6 +153,20 @@ aws_backend_request_successful aws_sdk_error ``` +# Migrating from prior version + +This section describes the actions you will need to take if you had integrated the prior version of this sample with your Godot project. You should take these steps prior to integrating the new plugin. Before you make any changes, it is important to backup your project in case any errors are made. + +## Unregister the AWSGameSDK Autoload +1. Open _Project Settings -> Autoload_ and select the "Globals" tab. +2. Under the "Autoload" tab, uncheck the _AWSGameSDK_ and click "Close." + +## Remove the AWSGameSDK folder from your project +This step assumes you have not added any folders, functionality, or code to the proir AWSGameSDK or the folder thereof. Highlight the folder in the File System viewer in your Godot project, right click, and choose "Delete." + +## Remove the code used to integrate the AWSGameSDK from your code +This code should be highlighted in your project via the Godot IDE. The new plug-in code will operate very similar to the prior version, so it will be good to denote these areas with a comment, such as `#TODO: Add AWSGameSDK Plugin Code Here` while removing the code. + # Godot 4 Integration Samples To test the integrations with Godot 4, open the Godot 4 sample project (`GodotSample`) with Godot 4. @@ -203,3 +217,4 @@ func login_with_apple_id_token(apple_auth_token, login_callback) func link_google_play_id_to_current_user(google_play_auth_token, login_callback_google) func login_with_google_play_token(google_play_auth_token, login_callback) ``` + diff --git a/GodotSample/Samples/FacebookLogin/FacebookLogin.gd b/GodotSample/Samples/FacebookLogin/FacebookLogin.gd index 723dda7..1380a62 100644 --- a/GodotSample/Samples/FacebookLogin/FacebookLogin.gd +++ b/GodotSample/Samples/FacebookLogin/FacebookLogin.gd @@ -14,17 +14,12 @@ func _ready(): aws_games_sdk_auth.init() aws_games_sdk_auth.aws_login_success.connect(_on_login_success) aws_games_sdk_auth.aws_login_error.connect(_on_login_error) - aws_games_sdk_auth.fb_link.conect(on_link_facebook_id_response) - aws_games_sdk_auth.fb_login.conect(on_login_with_facebook_response) + aws_games_sdk_auth.fb_link.connect(on_link_facebook_id_response) + aws_games_sdk_auth.fb_login.connect(on_login_with_facebook_id_response) aws_games_sdk_auth.aws_sdk_error.connect(_on_aws_sdk_error) #login aws_games_sdk_auth.login() - # Get the SDK and Init - self.aws_game_sdk = get_node("/root/AwsGameSdk") - self.aws_game_sdk.init(self.login_endpoint, self.on_login_error) - - # Log in as new guest user first - self.aws_game_sdk.login_as_new_guest_user(self.login_as_guest_callback) + # Called on any login or token refresh failures func _on_login_error(message): @@ -43,20 +38,22 @@ func _on_login_success(): # Try linking Facebook ID to existing user # NOTE: You'll need to use a community Facebook integration such as https://github.com/DrMoriarty/godot-facebook # Once you've logged in with Facebook, send the access_token and user_id here - self.aws_game_sdk.link_facebook_id_to_current_user("AcceessTokenHere", "UserIdHere", self.on_link_facebook_id_response) + aws_games_sdk_auth.link_facebook_id_to_current_user("AcceessTokenHere", "UserIdHere") + func on_link_facebook_id_response(): print("Received Facebook ID linking info") print(aws_games_sdk_auth.user_info.to_string()) # Let's now try to login with Facebook acccess token directly to access the same user - self.aws_game_sdk.login_with_facebook_access_token("AccessTokenHere", "UserIdHere", self.on_login_with_facebook_response) + aws_games_sdk_auth.login_with_facebook_access_token("AccessTokenHere", "UserIdHere") -func on_login_with_facebook_response(): +func on_login_with_facebook_id_response(): print("Received Facebook ID login info") print(aws_games_sdk_auth.user_info.to_string()) + # Called every frame. 'delta' is the elapsed time since the previous frame. func _process(delta): pass diff --git a/GodotSample/Samples/GuestIdentityAndRestApiBackend/GuestIdentityAndRestApiBackend.gd b/GodotSample/Samples/GuestIdentityAndRestApiBackend/GuestIdentityAndRestApiBackend.gd index d3fdd2f..f04be83 100644 --- a/GodotSample/Samples/GuestIdentityAndRestApiBackend/GuestIdentityAndRestApiBackend.gd +++ b/GodotSample/Samples/GuestIdentityAndRestApiBackend/GuestIdentityAndRestApiBackend.gd @@ -35,7 +35,6 @@ func _on_login_success(): current_action = actions.pop_front() #you can inspect the user_info with this line #print(aws_games_sdk_auth.user_info.to_string()) - # Try setting player data func _on_backend_request_success(): diff --git a/GodotSample/Samples/SteamIdLogin/SteamIdLogin.gd b/GodotSample/Samples/SteamIdLogin/SteamIdLogin.gd index afacf2c..874fd58 100644 --- a/GodotSample/Samples/SteamIdLogin/SteamIdLogin.gd +++ b/GodotSample/Samples/SteamIdLogin/SteamIdLogin.gd @@ -13,8 +13,8 @@ func _ready(): aws_games_sdk_auth.init() aws_games_sdk_auth.aws_login_success.connect(_on_login_success) aws_games_sdk_auth.aws_login_error.connect(_on_login_error) - aws_games_sdk_auth.steam_link.conect(on_link_steam_id_response) - aws_games_sdk_auth.steam_login.conect(on_login_with_steam_response) + aws_games_sdk_auth.steam_link.connect(on_link_steam_id_response) + aws_games_sdk_auth.steam_login.connect(on_login_with_steam_id_response) aws_games_sdk_auth.aws_sdk_error.connect(_on_aws_sdk_error) #login aws_games_sdk_auth.login() @@ -37,7 +37,8 @@ func _on_login_success(): # Try linking Steam ID to existing user # NOTE: You need to use the Godot Steamworks SDK (https://godotsteam.com/) to integrate with Steam # Use the GetAuthTicketForWebAPI to get the steam auth token (https://godotsteam.com/functions/users/#getauthticketforwebapi) - aws_games_sdk_auth.link_steam_id_to_current_user("YourTokenHere", self.on_link_steam_id_response) + aws_games_sdk_auth.link_steam_id_to_current_user("YourTokenHere") + func on_link_steam_id_response(): print("Received steam ID linking info") @@ -46,12 +47,14 @@ func on_link_steam_id_response(): # Let's now try to login with Steam token directly to access the same user # NOTE: You need to use the Godot Steamworks SDK (https://godotsteam.com/) to integrate with Steam # Use the GetAuthTicketForWebAPI to get the steam auth token (https://godotsteam.com/functions/users/#getauthticketforwebapi) - self.aws_game_sdk.login_with_steam_token("YourTokenHere", self.on_login_with_steam_response) + aws_games_sdk_auth.login_with_steam_token("YourTokenHere") + -func on_login_with_steam_response(): +func on_login_with_steam_id_response(): print("Received steam ID login info") print(aws_games_sdk_auth.user_info.to_string()) + # Called every frame. 'delta' is the elapsed time since the previous frame. func _process(delta): pass diff --git a/GodotSample/Samples/SteamIdLogin/SteamIdLogin.tscn b/GodotSample/Samples/SteamIdLogin/SteamIdLogin.tscn index 1bf914a..b4221db 100644 --- a/GodotSample/Samples/SteamIdLogin/SteamIdLogin.tscn +++ b/GodotSample/Samples/SteamIdLogin/SteamIdLogin.tscn @@ -4,6 +4,7 @@ [ext_resource type="Script" uid="uid://dxp7lgvaxrjry" path="res://addons/AWSGameSDK/scripts/AWSAuthorization.gd" id="2_nmo6t"] [node name="Node2D" type="Node2D"] +visible = false script = ExtResource("1_kitbl") [node name="AWSGameSDKAuth" type="Node" parent="."] diff --git a/GodotSample/addons/AWSGameSDK/scripts/AWSAuthorization.gd b/GodotSample/addons/AWSGameSDK/scripts/AWSAuthorization.gd index cb50835..6d57e5c 100644 --- a/GodotSample/addons/AWSGameSDK/scripts/AWSAuthorization.gd +++ b/GodotSample/addons/AWSGameSDK/scripts/AWSAuthorization.gd @@ -52,10 +52,10 @@ func _save_login_data(): func _load_login_data(): var file = FileAccess.open("user://save_game.dat", FileAccess.READ) if file == null: - return + return null if file.get_length() == 0: file.close() - return null; + return null user_info.user_id = file.get_pascal_string() user_info.guest_secret = file.get_pascal_string() file.close() @@ -190,7 +190,7 @@ func login_with_refresh_token(refresh_token): # Called to link an existing authenticated user to a Steam ID -func link_steam_id_to_current_user(steam_token, login_callback_steam): +func link_steam_id_to_current_user(steam_token): if user_info == null: aws_sdk_error.emit("No user info, can't link existing user to Steam ID") return diff --git a/GodotSample/addons/AWSGameSDK/scripts/AWSBackend.gd b/GodotSample/addons/AWSGameSDK/scripts/AWSBackend.gd index 445eb4c..bbe9682 100644 --- a/GodotSample/addons/AWSGameSDK/scripts/AWSBackend.gd +++ b/GodotSample/addons/AWSGameSDK/scripts/AWSBackend.gd @@ -7,9 +7,12 @@ signal aws_backend_request_successful signal aws_sdk_error @export var backend_endpoint: String = "" #Endpoint for backend operations +@export var gamelift_backend_endpoint: String = "" #Endpoint for GameLift Backend @export var get_player_data_uri: String = "/get-player-data" @export var set_player_data_uri: String = "/set-player-data" -@export var post_player_data_uri: String = "/pots-to-uri" +@export var post_player_data_uri: String = "/post-to-uri" +@export var gamelift_request_match_uri: String = "/request-matchmaking" +@export var gamelift_match_status_uri: String = "/get-match-status" var http_request: HTTPRequest var error_string: String @@ -34,6 +37,11 @@ func backend_get_request(auth_token:String, query_parameters: Dictionary = {}): return +func backend_gamelift_request(auth_token: String, query_parameters: Dictionary = {}): + pass + + + func _backend_get_request(resource: String, auth_token: String, query_parameters: Dictionary = {}): var params: String = "" if(auth_token == ""): @@ -49,6 +57,25 @@ func _backend_get_request(resource: String, auth_token: String, query_parameters _make_backend_http_request(params, HTTPClient.Method.METHOD_GET, auth_token) +func gamelift_backend_post_request(auth_token, request_body: Dictionary = {}): + if auth_token == "": + aws_sdk_error.emit("No auth token set yet, login first") + return + # Create an HTTP request node and connect its completion signal. + var params = gamelift_backend_endpoint + gamelift_request_match_uri + # Perform a GET request to login as a new guest + _make_backend_http_request(params, HTTPClient.Method.METHOD_POST, auth_token, request_body) + + +func gamelift_backend_get_request(auth_token, request_body: Dictionary = {}): + if auth_token == "": + aws_sdk_error.emit("No auth token set yet, login first") + return + # Create an HTTP request node and connect its completion signal. + var params = gamelift_backend_endpoint + gamelift_request_match_uri + # Perform a GET request to login as a new guest + _make_backend_http_request(params, HTTPClient.Method.METHOD_GET, auth_token, request_body) + # Function to make an authenticated POST request to a backend API # Called by your custom code to access backend functionality func backend_post_request(auth_token, request_body: Dictionary = {}): @@ -58,7 +85,7 @@ func backend_post_request(auth_token, request_body: Dictionary = {}): # Create an HTTP request node and connect its completion signal. var params = backend_endpoint + post_player_data_uri # Perform a GET request to login as a new guest - _make_backend_http_request(params, HTTPClient.Method.METHOD_GET, auth_token, request_body) + _make_backend_http_request(params, HTTPClient.Method.METHOD_POST, auth_token, request_body) func _make_backend_http_request(url, method: HTTPClient.Method, auth_token: String, request_body: Dictionary = {}): From 35de5181bee3ec5283d2b042338f16dcdf89f127 Mon Sep 17 00:00:00 2001 From: Tim Bruce Date: Wed, 30 Apr 2025 10:42:02 -0400 Subject: [PATCH 3/4] Cleanup + Readme updates --- GodotSample/README.md | 20 +++++++++++++++++++ .../addons/AWSGameSDK/scripts/AWSBackend.gd | 12 +++++------ 2 files changed, 26 insertions(+), 6 deletions(-) diff --git a/GodotSample/README.md b/GodotSample/README.md index ef05152..22e690d 100644 --- a/GodotSample/README.md +++ b/GodotSample/README.md @@ -137,6 +137,12 @@ goog_link goog_login ```` +Parameters for the plugin are: + +```text +login_endpoint # Endpoint for custom identity component +``` + The public API for the AWSGameSDKBackend component includes the following methods. ```python @@ -144,6 +150,8 @@ func backend_get_request(auth_token) func backend_set_request(auth_token, query_parameters) func backend_post_request(auth_token, request_body) func get_response_data() String +func gamelift_backend_post_request(auth_token, request_body) +func gamelift_backend_get_request(auth_token, request_body) ``` Supported signals are: @@ -153,6 +161,18 @@ aws_backend_request_successful aws_sdk_error ``` +Parameters for the plugin are: + +```text +backend_endpoint #Endpoint for backend operations +gamelift_backend_endpoint #Endpoint for Amazon GameLift Backend +get_player_data_uri #Backend URI to retrieve player data +set_player_data_uri #Backend URI to set player data +post_player_data_uri #Backend URI to POST data to - this is not yet used +gamelift_request_match_uri #Amazon GameLift URI to request matchmaking +gamelift_match_status_uri #Amazon GameLift URI to get matchmaking status +``` + # Migrating from prior version This section describes the actions you will need to take if you had integrated the prior version of this sample with your Godot project. You should take these steps prior to integrating the new plugin. Before you make any changes, it is important to backup your project in case any errors are made. diff --git a/GodotSample/addons/AWSGameSDK/scripts/AWSBackend.gd b/GodotSample/addons/AWSGameSDK/scripts/AWSBackend.gd index bbe9682..815fb8e 100644 --- a/GodotSample/addons/AWSGameSDK/scripts/AWSBackend.gd +++ b/GodotSample/addons/AWSGameSDK/scripts/AWSBackend.gd @@ -7,12 +7,12 @@ signal aws_backend_request_successful signal aws_sdk_error @export var backend_endpoint: String = "" #Endpoint for backend operations -@export var gamelift_backend_endpoint: String = "" #Endpoint for GameLift Backend -@export var get_player_data_uri: String = "/get-player-data" -@export var set_player_data_uri: String = "/set-player-data" -@export var post_player_data_uri: String = "/post-to-uri" -@export var gamelift_request_match_uri: String = "/request-matchmaking" -@export var gamelift_match_status_uri: String = "/get-match-status" +@export var gamelift_backend_endpoint: String = "" #Endpoint for Amazon GameLift Backend +@export var get_player_data_uri: String = "/get-player-data" #Backend URI to retrieve player data +@export var set_player_data_uri: String = "/set-player-data" #Backend URI to set player data +@export var post_player_data_uri: String = "/post-to-uri" #Backend URI to POST data to - this is not yet used +@export var gamelift_request_match_uri: String = "/request-matchmaking" #Amazon GameLift URI to request matchmaking +@export var gamelift_match_status_uri: String = "/get-match-status" #Amazon GameLift URI to get matchmaking status var http_request: HTTPRequest var error_string: String From d18015a5693fd1f80d13b53fb5031d5a1b6e513b Mon Sep 17 00:00:00 2001 From: Tim Bruce Date: Mon, 9 Jun 2025 11:06:34 -0400 Subject: [PATCH 4/4] updates from PR feedback --- GodotSample/README.md | 67 +++++++++---- GodotSample/addons/AWSGameSDK/AWSGameSDK.gd | 10 +- GodotSample/addons/AWSGameSDK/readme.MD.txt | 97 ------------------- .../AWSGameSDK/scripts/AWSAuthorization.gd | 6 ++ .../addons/AWSGameSDK/scripts/AWSBackend.gd | 5 +- .../addons/AWSGameSDK/scripts/user_info.gd | 4 +- 6 files changed, 63 insertions(+), 126 deletions(-) delete mode 100644 GodotSample/addons/AWSGameSDK/readme.MD.txt diff --git a/GodotSample/README.md b/GodotSample/README.md index 22e690d..95ccaae 100644 --- a/GodotSample/README.md +++ b/GodotSample/README.md @@ -124,18 +124,17 @@ func login_with_facebook_access_token(facebook_access_token, facebook_user_id) Supported signals are: ```text -aws_login_success -aws_login_error -aws_sdk_error -steam_link -steam_login -fb_link -fb_login -apple_link -apple_login -goog_link -goog_login -```` +aws_login_success: Emitted when login is successful. +aws_login_error(message: String): Emitted when login fails. Provides an error message.aws_sdk_error(message: String): Emitted when a general SDK error occurs. Provides an error message. +steam_link: Emitted when Steam account linking is successful. +steam_login: Emitted when Steam login is successful. +fb_link: Emitted when Facebook account linking is successful. +fb_login: Emitted when Facebook login is successful. +apple_link: Emitted when Apple account linking is successful. +apple_login: Emitted when Apple login is successful. +goog_link: Emitted when Google Play account linking is successful. +goog_login: Emitted when Google Play login is successful. +``` Parameters for the plugin are: @@ -157,26 +156,52 @@ func gamelift_backend_get_request(auth_token, request_body) Supported signals are: ```text -aws_backend_request_successful -aws_sdk_error +aws_backend_request_successful: Emitted when a backend request completes successfully. +aws_sdk_error(message: String): Emitted when a backend request fails. Provides an error message. ``` Parameters for the plugin are: ```text -backend_endpoint #Endpoint for backend operations -gamelift_backend_endpoint #Endpoint for Amazon GameLift Backend -get_player_data_uri #Backend URI to retrieve player data -set_player_data_uri #Backend URI to set player data -post_player_data_uri #Backend URI to POST data to - this is not yet used -gamelift_request_match_uri #Amazon GameLift URI to request matchmaking -gamelift_match_status_uri #Amazon GameLift URI to get matchmaking status +backend_endpoint: Endpoint for backend operations +gamelift_backend_endpoint: Endpoint for Amazon GameLift Backend +get_player_data_uri: Backend URI to retrieve player data +set_player_data_uri: Backend URI to set player data +post_player_data_uri: Backend URI to POST data to - this is not yet used +gamelift_request_match_uri: Amazon GameLift URI to request matchmaking +gamelift_match_status_uri: Amazon GameLift URI to get matchmaking status ``` # Migrating from prior version This section describes the actions you will need to take if you had integrated the prior version of this sample with your Godot project. You should take these steps prior to integrating the new plugin. Before you make any changes, it is important to backup your project in case any errors are made. +## Migrating from Callback-based to Signal-based Approach + +When migrating from the previous version's callback-based approach to the new signal-based approach, you'll need to replace callback function registrations with signal connections: + +### Old (Callback-based): +```python +self.aws_game_sdk.login_as_new_guest_user(self.login_callback) +``` + +### New (Signal-based) +```python +@onready var aws_games_sdk_auth = get_node("AWSGameSDKAuth") + +func _ready(): + aws_games_sdk_auth.aws_login_success.connect(_on_login_success) + aws_games_sdk_auth.aws_login_error.connect(_on_login_error) + aws_games_sdk_auth.login() + +func _on_login_success(): + print("Login successful!") + +func _on_login_error(message): + print("Login failed: " + message) +``` + + ## Unregister the AWSGameSDK Autoload 1. Open _Project Settings -> Autoload_ and select the "Globals" tab. 2. Under the "Autoload" tab, uncheck the _AWSGameSDK_ and click "Close." diff --git a/GodotSample/addons/AWSGameSDK/AWSGameSDK.gd b/GodotSample/addons/AWSGameSDK/AWSGameSDK.gd index bcb6c67..c74defd 100644 --- a/GodotSample/addons/AWSGameSDK/AWSGameSDK.gd +++ b/GodotSample/addons/AWSGameSDK/AWSGameSDK.gd @@ -1,19 +1,21 @@ @tool extends EditorPlugin -const AUTOLOAD_NAME = "AWSGameSDK" +const AUTOLOAD_NAME_SDK = "AWSGameSDK" +const AUTOLOAD_NAME_AUTH = "AWSGameSDKAuth" static var AWSGameSDKAuth = preload("./scripts/AWSAuthorization.gd") static var AWSGameSDKBackend = preload("./scripts/AWSBackend.gd") func _enable_plugin(): - add_autoload_singleton(AUTOLOAD_NAME, "res://addons/AWSGameSDK/AWSAuthorization.gd") - add_autoload_singleton(AUTOLOAD_NAME, "res://addons/AWSGameSDK/AWSBackend.gd") + add_autoload_singleton(AUTOLOAD_NAME_AUTH, "res://addons/AWSGameSDK/AWSAuthorization.gd") + add_autoload_singleton(AUTOLOAD_NAME_SDK, "res://addons/AWSGameSDK/AWSBackend.gd") func _disable_plugin(): - remove_autoload_singleton(AUTOLOAD_NAME) + remove_autoload_singleton(AUTOLOAD_NAME_SDK) + remove_autoload_singleton(AUTOLOAD_NAME_AUTH) func _init() -> void: diff --git a/GodotSample/addons/AWSGameSDK/readme.MD.txt b/GodotSample/addons/AWSGameSDK/readme.MD.txt deleted file mode 100644 index b7ea812..0000000 --- a/GodotSample/addons/AWSGameSDK/readme.MD.txt +++ /dev/null @@ -1,97 +0,0 @@ -# AWS Game Backend Framework Godot 4 SDK - -The AWS Game Backend Framework Godot 4 SDK provides integrations to the custom identity component, managed refreshing of access tokens, helper methods for calling custom backend features, and samples for integrating with different game platforms. - -# SDK Overview - -## Initializing the SDK - -The AWS Game SDK has to be configured in your Godot 4 project in _Project Settings -> Autoload_ with the name _AwsGameSdk_. - -The Initializing and accessing the AWS Game SDK within Godot 4 (see the Godot 4 Integration Samples for sample code): - -```python -# Get the SDK and Init -self.aws_game_sdk = get_node("/root/AwsGameSdk") -self.aws_game_sdk.init(self.login_endpoint, self.on_login_error) -``` - -## SDK Public API - -The public API for the SDK includes the following methods. Most of them will require you to provide a callback for results (see the Godot 4 Integration Samples for sample code): - -```text -func init(login_endpoint, login_error_callback) -func login_as_new_guest_user(login_callback) -func login_as_guest(user_id, guest_secret, login_callback) -func login_with_refresh_token(refresh_token, login_callback = null) -func link_steam_id_to_current_user(steam_token, login_callback_steam) -func login_with_steam_token(steam_token, login_callback) -func link_apple_id_to_current_user(apple_auth_token, login_callback_apple) -func login_with_apple_id_token(apple_auth_token, login_callback) -func link_google_play_id_to_current_user(google_play_auth_token, login_callback_google) -func login_with_google_play_token(google_play_auth_token, login_callback) -func link_facebook_id_to_current_user(facebook_access_token, facebook_user_id, login_callback_facebook) -func login_with_facebook_access_token(facebook_access_token, facebook_user_id, login_callback) -func backend_get_request(url, resource, query_parameters, callback) -func backend_post_request(url, resource, request_body, callback): -``` - -## Adding the SDK to an existing project - -To add the SDK to an existing project: - -1. Drag and drop the folder `AWSGameSDK` to your Godot 4 project -2. Open _Project Settings -> Autoload_, select the script `AWSGameSDK.gd` with the directory search and select _Open_. Make sure the name is _AwsGameSdk_ and select _Add_. -3. Integrate with the SDK from your custom code (see Godot 4 Integration Samples for example integrations) - -# Godot 4 Integration Samples - -To test the integrations with Godot 4, open the Godot 4 sample project (`GodotSample`) with Godot 4. - -## Guest Identity and Rest API test scene - -* Open the scene `Samples/GuestIdentityAndRestApiBackend/GuestIdentityAndRestApiBackend.tscn` - -This is a simple test scene that will login as a new guest user if a save file is not present, or login using the user_id and guest_secret found in the save file if available to login as an existing user. It will then use the logged in user to set player name and get player name in sequence to test the HTTP API integration - -Configure the `Samples/GuestIdentityAndRestApiBackend/GuestIdentityAndRestApiBackend.gd` script to set up API endpoints. Set `const login_endpoint` value to the `LoginEndpoint` value found in the CustomIdentityComponentStack Outputs, and the `const backend_endpoint` to the `BackendEndpointUrl` value found in the PythonServerlessHttpApiStack Outputs or the `FargateSampleNodeJsServiceServiceURL` found in the NodeJsFargateApiStack Outputs. Both backend sample integrations support the same functionality to validate tokens and set and get player data. - -Press "Run current scene" to test the integration. You'll see the login and backend call activity in the Output console. - -## Steam test scene - -* Open the scene `Samples/SteamIdLogin/SteamIdLogin.tscn` - -This is a simple test scene that will login a guest user, upgrade the guest user to authenticated by linking a Steam ID to it, and then finally test logging in directly with Steam. It doesn't call any custom backend functionalities. - -To use this sample, you will need a valid Steam ID token. This requires you to sign up as a Steam Developer, create an App and the [Godot Steam SDK](https://godotsteam.com/) to integrate with Steam. You'll then use either _GetAuthTicketForWebApi_ (new) or _GetAuthSessionTicket_ (old) to retrieve a ticket to validate with the identity component API. - -Configure the `Samples/SteamIdLogin/SteamLogin.gd` script to set up the login API endpoint. Set `const login_endpoint` value to the `LoginEndpoint` value found in the CustomIdentityComponentStack Outputs. - -You will need to pass a valid Steam token to the `self.aws_game_sdk.link_steam_id_to_current_user("YourTokenHere", self.on_link_steam_id_response)` and `self.aws_game_sdk.login_with_steam_token("YourTokenHere", self.on_login_with_steam_response)` found in `Samples/SteamIdLogin/SteamLogin.gd`. - -## Facebook test scene - -* Open the scene `Samples/FacebookLogin/FacebookLogin.tscn` - -This is a simple test scene that will login a guest user, upgrade the guest user to authenticated by linking a Facebook ID to it, and then finally test logging in directly with Facebook. It doesn't call any custom backend functionalities. - -To use this sample, you will need a valid Facebook access token and Facebook User ID. This requires you to sign up as a Facebook Developer, create an App and using one of the community integrations with Facebook to login (such as [this](https://github.com/DrMoriarty/godot-facebook)). After calling _Login_ with Facebook you'll receive and access token and user ID which need to be passed to the SDK integrations. - -Configure the `Samples/FacebookLogin/FacebookLogin.gd` script to set up the login API endpoint. Set `const login_endpoint` value to the `LoginEndpoint` value found in the CustomIdentityComponentStack Outputs. - -You will need to pass a valid Facebook access token and User ID to the `self.aws_game_sdk.link_facebook_id_to_current_user("AcceessTokenHere", "UserIdHere", self.on_link_facebook_id_response)` and `self.aws_game_sdk.login_with_facebook_access_token("AccessTokenHere", "UserIdHere", self.on_login_with_facebook_response)` found in `Samples/FacebookLign/FacebookLogin.gd`. - -## Google Play and Sign in with Apple testing - -The sample project does not come with Google Play or Sign in with Apple sample scenes and scripts. Currently, Godot 4 integrations with Apple ID or Google Play are not easily available. If you build such integration yourself, you can use the APIs provided in the SDK to log in with Google Play and Apple ID, as these functionalities are fully supported by the SDK. - -The following SDK functions can be used for this in a very similar fashion as with the Steam and Facebook integrations: - -```text -func link_apple_id_to_current_user(apple_auth_token, login_callback_apple) -func login_with_apple_id_token(apple_auth_token, login_callback) -func link_google_play_id_to_current_user(google_play_auth_token, login_callback_google) -func login_with_google_play_token(google_play_auth_token, login_callback) -``` diff --git a/GodotSample/addons/AWSGameSDK/scripts/AWSAuthorization.gd b/GodotSample/addons/AWSGameSDK/scripts/AWSAuthorization.gd index 6d57e5c..0384365 100644 --- a/GodotSample/addons/AWSGameSDK/scripts/AWSAuthorization.gd +++ b/GodotSample/addons/AWSGameSDK/scripts/AWSAuthorization.gd @@ -50,6 +50,8 @@ func _save_login_data(): func _load_login_data(): + if user_info == null: + aws_sdk_error.emit("Please call init instead of _load_login_data()") var file = FileAccess.open("user://save_game.dat", FileAccess.READ) if file == null: return null @@ -68,6 +70,9 @@ func get_auth_token() -> String: func login(): + if user_info == null: + aws_login_error.emit("user_info not initialized. Please call init() before login.") + return if user_info.user_id == "" or user_info.guest_secret == "": _login_as_new_guest() else: @@ -107,6 +112,7 @@ func _auth_request_completed(result, response_code, headers, body): # trigger error if we didn't get a proper response code if(response_code >= 400): error_string = json_string + aws_login_error.emit("HTTP Error: " + str(response_code) + " - " + error_string) return # Check we got no error diff --git a/GodotSample/addons/AWSGameSDK/scripts/AWSBackend.gd b/GodotSample/addons/AWSGameSDK/scripts/AWSBackend.gd index 815fb8e..921e86b 100644 --- a/GodotSample/addons/AWSGameSDK/scripts/AWSBackend.gd +++ b/GodotSample/addons/AWSGameSDK/scripts/AWSBackend.gd @@ -93,7 +93,7 @@ func _make_backend_http_request(url, method: HTTPClient.Method, auth_token: Stri #clear out prior data data_received = {} http_request = HTTPRequest.new() - http_request.request_completed.connect(_backend_reqeust_completed) + http_request.request_completed.connect(_backend_request_completed) add_child(http_request) var headers = ["Authorization: " + auth_token] if method == HTTPClient.Method.METHOD_POST: @@ -108,7 +108,7 @@ func _make_backend_http_request(url, method: HTTPClient.Method, auth_token: Stri aws_sdk_error.emit("Error making backend request") -func _backend_reqeust_completed(result, response_code, headers, body): +func _backend_request_completed(result, response_code, headers, body): http_request.queue_free() var json_string = body.get_string_from_utf8() # Retrieve data var json = JSON.new() @@ -117,6 +117,7 @@ func _backend_reqeust_completed(result, response_code, headers, body): # trigger error if we didn't get a proper response code if(response_code >= 400): error_string = json_string + aws_sdk_error.emit("HTTP Error: " + str(response_code) + " - " + error_string) return # Check we got no error if error == OK: diff --git a/GodotSample/addons/AWSGameSDK/scripts/user_info.gd b/GodotSample/addons/AWSGameSDK/scripts/user_info.gd index d8316bf..e1d54ec 100644 --- a/GodotSample/addons/AWSGameSDK/scripts/user_info.gd +++ b/GodotSample/addons/AWSGameSDK/scripts/user_info.gd @@ -9,8 +9,8 @@ var steam_id = ""; var google_play_id = ""; var facebook_id = ""; var refresh_token = ""; -var auth_token_expires_in = ""; -var refresh_token_expires_in = ""; +var auth_token_expires_in = 0; +var refresh_token_expires_in = 0; func to_string(): return("user_id: " + user_id + "\nguest_secret: " + guest_secret + "\nauth_token: " + auth_token +