Ouroboros/addons/silent_wolf/Players/Players.gd

172 lines
6.3 KiB
GDScript

extends Node
const SWUtils = preload("res://addons/silent_wolf/utils/SWUtils.gd")
const SWLogger = preload("res://addons/silent_wolf/utils/SWLogger.gd")
signal sw_save_player_data_complete
signal sw_get_player_data_complete
signal sw_delete_player_data_complete
var GetPlayerData = null
var SavePlayerData = null
var DeletePlayerData = null
# wekrefs
var wrGetPlayerData = null
var wrSavePlayerData = null
var wrDeletePlayerData = null
var player_name = null
var player_data = null
func save_player_data(player_name: String, player_data: Dictionary, overwrite: bool=true) -> Node:
if player_name == "":
SWLogger.error("player_name cannot be empty when calling SilentWolf.Players.save_player_data(player_name, player_data)")
elif typeof(player_data) != TYPE_DICTIONARY:
SWLogger.error("Player data should be of type Dictionary, instead it is of type: " + str(typeof(player_data)))
else:
var prepared_http_req = SilentWolf.prepare_http_request()
SavePlayerData = prepared_http_req.request
wrSavePlayerData = prepared_http_req.weakref
SavePlayerData.request_completed.connect(_on_SavePlayerData_request_completed)
SWLogger.info("Calling SilentWolf to post player data")
var payload = { "game_id": SilentWolf.config.game_id, "player_name": player_name, "player_data": player_data, "overwrite": overwrite }
var request_url = "https://api.silentwolf.com/push_player_data"
SilentWolf.send_post_request(SavePlayerData, request_url, payload)
return self
func _on_SavePlayerData_request_completed(result, response_code, headers, body) -> void:
var status_check = SWUtils.check_http_response(response_code, headers, body)
if is_instance_valid(SavePlayerData):
SilentWolf.free_request(wrSavePlayerData, SavePlayerData)
if status_check:
var json_body = JSON.parse_string(body.get_string_from_utf8())
var sw_result: Dictionary = SilentWolf.build_result(json_body)
if json_body.success:
SWLogger.info("SilentWolf save player data success for player: " + str(json_body.player_name))
var player_name = json_body.player_name
#sw_result["player_name"] = player_name
else:
SWLogger.error("SilentWolf save player data failure: " + str(json_body.error))
sw_save_player_data_complete.emit(sw_result)
func get_player_data(player_name: String) -> Node:
if player_name == "":
SWLogger.error("player_name cannot be empty when calling SilentWolf.Players.get_player_data(player_name)")
else:
var prepared_http_req = SilentWolf.prepare_http_request()
GetPlayerData = prepared_http_req.request
wrGetPlayerData = prepared_http_req.weakref
GetPlayerData.request_completed.connect(_on_GetPlayerData_request_completed)
SWLogger.info("Calling SilentWolf to get player data")
var request_url = "https://api.silentwolf.com/get_player_data/" + str(SilentWolf.config.game_id) + "/" + str(player_name)
SilentWolf.send_get_request(GetPlayerData, request_url)
return self
func _on_GetPlayerData_request_completed(result, response_code, headers, body) -> void:
var status_check = SWUtils.check_http_response(response_code, headers, body)
if is_instance_valid(GetPlayerData):
SilentWolf.free_request(wrGetPlayerData, GetPlayerData)
if status_check:
var json_body = JSON.parse_string(body.get_string_from_utf8())
var sw_result: Dictionary = SilentWolf.build_result(json_body)
if json_body.success:
SWLogger.info("SilentWolf get player data success for player: " + str(json_body.player_name))
player_name = json_body.player_name
player_data = json_body.player_data
SWLogger.debug("Player data: " + str(player_data))
sw_result["player_data"] = player_data
else:
SWLogger.error("SilentWolf get player data failure: " + str(json_body.error))
sw_get_player_data_complete.emit(sw_result)
func delete_player_weapons(player_name: String) -> void:
var weapons = { "Weapons": [] }
delete_player_data(player_name, weapons)
func remove_player_money(player_name: String) -> void:
var money = { "Money": 0 }
delete_player_data(player_name, money)
func delete_player_items(player_name: String, item_name: String) -> void:
var item = { item_name: "" }
delete_player_data(player_name, item)
func delete_all_player_data(player_name: String) -> void:
delete_player_data(player_name, {})
func delete_player_data(player_name: String, player_data: Dictionary) -> Node:
var prepared_http_req = SilentWolf.prepare_http_request()
DeletePlayerData = prepared_http_req.request
wrDeletePlayerData = prepared_http_req.weakref
DeletePlayerData.request_completed.connect(_on_DeletePlayerData_request_completed)
SWLogger.info("Calling SilentWolf to remove player data")
var payload = { "game_id": SilentWolf.config.game_id, "player_name": player_name, "player_data": player_data }
var query = JSON.stringify(payload)
var request_url = "https://api.silentwolf.com/remove_player_data"
SilentWolf.send_post_request(DeletePlayerData, request_url, payload)
return self
func _on_DeletePlayerData_request_completed(result, response_code, headers, body) -> void:
var status_check = SWUtils.check_http_response(response_code, headers, body)
if is_instance_valid(DeletePlayerData):
DeletePlayerData.queue_free()
if status_check:
var json_body = JSON.parse_string(body.get_string_from_utf8())
var sw_result: Dictionary = SilentWolf.build_result(json_body)
if json_body.success:
SWLogger.info("SilentWolf delete player data success for player: " + str(json_body.player_name))
var player_name = json_body.player_name
# return player_data after (maybe partial) removal
var player_data = json_body.player_data
sw_result["player_name"] = player_name
sw_result["player_data"] = player_data
else:
SWLogger.error("SilentWolf delete player data failure: " + str(json_body.error))
sw_delete_player_data_complete.emit(sw_result)
func get_stats() -> Dictionary:
var stats = null
if player_data:
stats = {
"strength": player_data.strength,
"speed": player_data.speed,
"reflexes": player_data.reflexes,
"max_health": player_data.max_health,
"career": player_data.career
}
return stats
func get_inventory() -> Dictionary:
var inventory = null
if player_data:
inventory = {
"weapons": player_data.weapons,
"gold": player_data.gold
}
return inventory
func set_player_data(new_player_data: Dictionary) -> void:
player_data = new_player_data
func clear_player_data() -> void:
player_name = null
player_data = null