Compare commits
No commits in common. "b82f5e4c19ea5e0358221a4042f305652435b5a4" and "a40ccab3c8bd610afbecbc1fc9b91ea151872673" have entirely different histories.
b82f5e4c19
...
a40ccab3c8
199
caching.gd
199
caching.gd
@ -1,117 +1,49 @@
|
|||||||
extends Node
|
extends Node
|
||||||
|
|
||||||
|
var _card_id
|
||||||
signal cache_done
|
var _img_path
|
||||||
|
|
||||||
|
|
||||||
var _req_headers
|
var _req_headers
|
||||||
|
|
||||||
|
signal cache_done
|
||||||
|
|
||||||
var _consts = preload("res://data/consts.gd")
|
var _consts = preload("res://data/consts.gd")
|
||||||
|
|
||||||
func _init() -> void:
|
func _init() -> void:
|
||||||
_req_headers = PackedStringArray(["User-Agent: " + _consts.APP_NAME + "/" + _consts.APP_VERSION, "Accept: */*"])
|
_req_headers = PackedStringArray(["User-Agent: " + _consts.APP_NAME + "/" + _consts.APP_VERSION, "Accept: */*"])
|
||||||
|
|
||||||
|
|
||||||
func _cache_error(err: String) -> String:
|
func _cache_error(err: String) -> String:
|
||||||
return "CACHE::ERROR::" + err + "\n"
|
return "CACHE::ERROR::" + err + "\n"
|
||||||
|
|
||||||
|
|
||||||
func _get_dict_from_file(filepath: String) -> Dictionary:
|
func _check_cache(id: String) -> bool:
|
||||||
var file = FileAccess.open(filepath, FileAccess.READ)
|
if !FileAccess.file_exists("user://card_cache/" + id + "/card.json"):
|
||||||
var data = JSON.parse_string(file.get_as_text())
|
return false
|
||||||
|
if !FileAccess.file_exists("user://card_cache/" + id + "/card.png"):
|
||||||
return data
|
return false
|
||||||
|
return true
|
||||||
## get_card_data_from_name
|
|
||||||
##
|
|
||||||
## _name: String [br]
|
|
||||||
## A wrapper for searching for a card by name. Use **get_card_data_from_id** where possible, as it avoids an expensive search for the new card, if the card has been cached already.
|
|
||||||
func get_card_data_from_name(_name: String) -> Dictionary:
|
|
||||||
return _get_card_data_from_bulk("name", _name)
|
|
||||||
|
|
||||||
|
|
||||||
## get_card_data_from_id
|
func custom_query_fetch(query: String) -> String:
|
||||||
##
|
var error = await _do_custom_http_request_card(query)
|
||||||
## id: String [br]
|
if error != OK:
|
||||||
## This is the preferred wrapper to use when fetching card data, it checks the cache for preexisting data and uses that if it's available. Otherwise, it will search the bulk json for the data.
|
return "NONE"
|
||||||
func get_card_data_from_id(id: String) -> Dictionary:
|
OS.delay_msec(100)
|
||||||
if FileAccess.file_exists("user://card_cache/" + id + "/card.json"):
|
await _do_http_request_imgs(_card_id)
|
||||||
return _get_dict_from_file("user://card_cache/" + id + "/card.json")
|
OS.delay_msec(100)
|
||||||
return _get_card_data_from_bulk("id", id)
|
cache_done.emit()
|
||||||
|
return _card_id
|
||||||
|
|
||||||
|
|
||||||
func _get_card_data_from_bulk(field: String, search_query: String) -> Dictionary:
|
func _do_custom_http_request_card(query: String) -> Error:
|
||||||
var file = FileAccess.open("user://card_cache/bulk.json", FileAccess.READ)
|
|
||||||
var bulk_json = JSON.parse_string(file.get_as_text())
|
|
||||||
|
|
||||||
var selected_entry = null
|
|
||||||
for entry in bulk_json:
|
|
||||||
if entry[field] == search_query:
|
|
||||||
selected_entry = entry
|
|
||||||
break
|
|
||||||
continue
|
|
||||||
file = null
|
|
||||||
|
|
||||||
if selected_entry == null:
|
|
||||||
return {}
|
|
||||||
|
|
||||||
if selected_entry["image_status"] != "missing":
|
|
||||||
_fetch_card_img(selected_entry)
|
|
||||||
|
|
||||||
var dir = DirAccess.open("user://")
|
|
||||||
dir.make_dir_recursive("user://card_cache/" + selected_entry["id"] + "/")
|
|
||||||
dir = null
|
|
||||||
|
|
||||||
file = FileAccess.open("user://card_cache/" + selected_entry["id"] + "/card.json", FileAccess.WRITE)
|
|
||||||
file.store_line(JSON.stringify(selected_entry, "\t"))
|
|
||||||
file = null
|
|
||||||
|
|
||||||
return selected_entry
|
|
||||||
|
|
||||||
func _fetch_card_img(data: Dictionary) -> Error:
|
|
||||||
if FileAccess.file_exists("user://card_cache/" + data["id"] + "card.png"):
|
|
||||||
return OK
|
|
||||||
|
|
||||||
var httpr = HTTPRequest.new()
|
var httpr = HTTPRequest.new()
|
||||||
add_child(httpr)
|
add_child(httpr)
|
||||||
|
var error = httpr.request(query, _req_headers)
|
||||||
var err = httpr.request((data["image_uris"])["png"], _req_headers)
|
|
||||||
if err != OK:
|
|
||||||
push_error(_cache_error("GET_REQUEST") + "An error occured in the Scryfall request.")
|
|
||||||
return FAILED
|
|
||||||
var resp = await httpr.request_completed
|
|
||||||
|
|
||||||
var img = Image.new()
|
|
||||||
err = img.load_png_from_buffer(resp[3])
|
|
||||||
if err != OK:
|
|
||||||
push_error(_cache_error("IMG_LOADING") + "Couldn't load the image.")
|
|
||||||
return FAILED
|
|
||||||
|
|
||||||
var dir = DirAccess.open("user://")
|
|
||||||
dir.make_dir_recursive("user://card_cache/" + data["id"] + "/")
|
|
||||||
dir = null
|
|
||||||
|
|
||||||
img.save_png("user://card_cache/" + data["id"] + "/card.png")
|
|
||||||
img = null
|
|
||||||
|
|
||||||
return OK
|
|
||||||
|
|
||||||
func get_bulk_data(force: bool) -> Error:
|
|
||||||
if FileAccess.file_exists("user://card_cache/bulk.json"):
|
|
||||||
if force:
|
|
||||||
DirAccess.remove_absolute("user://card_cahce/bulk.json")
|
|
||||||
else:
|
|
||||||
return OK
|
|
||||||
|
|
||||||
var httpr = HTTPRequest.new()
|
|
||||||
add_child(httpr)
|
|
||||||
|
|
||||||
var error = httpr.request("https://api.scryfall.com/bulk-data/unique-artwork", _req_headers)
|
|
||||||
if error != OK:
|
if error != OK:
|
||||||
push_error(_cache_error("GET_REQUEST") + "An error occurred in the Scryfall request.")
|
push_error(_cache_error("GET_REQUEST") + "An error occurred in the Scryfall request.")
|
||||||
return FAILED
|
|
||||||
|
|
||||||
var response = await httpr.request_completed
|
var response = await httpr.request_completed
|
||||||
|
|
||||||
if response[0] != HTTPRequest.RESULT_SUCCESS:
|
if response[0] != HTTPRequest.RESULT_SUCCESS:
|
||||||
push_error(_cache_error("GET_REQUEST") + "Failed to fetch card data from Scryfall")
|
push_error(_cache_error("GET_REQUEST") + "Failed to fetch card data from Scryfall")
|
||||||
return FAILED
|
return FAILED
|
||||||
@ -120,33 +52,78 @@ func get_bulk_data(force: bool) -> Error:
|
|||||||
var card_content = JSON.parse_string(unprocessed_body)
|
var card_content = JSON.parse_string(unprocessed_body)
|
||||||
if card_content == null:
|
if card_content == null:
|
||||||
push_error(_cache_error("PARSING") + "Failed to parse the Scryfall card results.")
|
push_error(_cache_error("PARSING") + "Failed to parse the Scryfall card results.")
|
||||||
return FAILED
|
|
||||||
|
|
||||||
|
_card_id = card_content["id"]
|
||||||
error = httpr.request(card_content["download_uri"], _req_headers)
|
if _check_cache(_card_id):
|
||||||
if error != OK:
|
|
||||||
push_error(_cache_error("GET_REQUEST") + "An error occurred in the Scryfall request.")
|
|
||||||
return FAILED
|
|
||||||
|
|
||||||
response = await httpr.request_completed
|
|
||||||
if response[0] != HTTPRequest.RESULT_SUCCESS:
|
|
||||||
push_error(_cache_error("GET_REQUEST") + "Failed to fetch card data from Scryfall")
|
|
||||||
return FAILED
|
|
||||||
|
|
||||||
unprocessed_body = response[3].get_string_from_utf8()
|
|
||||||
card_content = JSON.parse_string(unprocessed_body)
|
|
||||||
if card_content == null:
|
|
||||||
push_error(_cache_error("PARSING") + "Failed to parse the Scryfall card results.")
|
|
||||||
return FAILED
|
return FAILED
|
||||||
|
|
||||||
var dir = DirAccess.open("user://")
|
var dir = DirAccess.open("user://")
|
||||||
dir.make_dir_recursive("user://card_cache/") # lets ensure the path is there
|
dir.make_dir_recursive("user://card_cache/" + _card_id + "/") # lets ensure the path is there
|
||||||
dir = null
|
dir = null
|
||||||
|
|
||||||
var data_cache = FileAccess.open("user://card_cache/bulk.json", FileAccess.WRITE)
|
var card_cache = FileAccess.open("user://card_cache/" + _card_id + "/card.json", FileAccess.WRITE)
|
||||||
data_cache.store_string(unprocessed_body)
|
card_cache.store_string(unprocessed_body) # cache the json response
|
||||||
data_cache = null
|
card_cache = null # closes the file
|
||||||
|
|
||||||
|
var image_uris = card_content["image_uris"]
|
||||||
|
_img_path = image_uris["png"]
|
||||||
|
return OK
|
||||||
|
|
||||||
|
|
||||||
|
func fetch_card(id: String) -> void:
|
||||||
|
if _check_cache(id):
|
||||||
|
return
|
||||||
|
|
||||||
|
await _do_http_id_request_card(id)
|
||||||
|
OS.delay_msec(100)
|
||||||
|
await _do_http_request_imgs(id)
|
||||||
|
OS.delay_msec(100)
|
||||||
cache_done.emit()
|
cache_done.emit()
|
||||||
|
|
||||||
return OK
|
|
||||||
|
func _do_http_request_imgs(id: String) -> void:
|
||||||
|
var httpr = HTTPRequest.new()
|
||||||
|
add_child(httpr)
|
||||||
|
|
||||||
|
var error = httpr.request(_img_path, _req_headers)
|
||||||
|
if error != OK:
|
||||||
|
push_error(_cache_error("GET_REQUEST") + "An error occurred in the Scryfall request.")
|
||||||
|
var response = await httpr.request_completed
|
||||||
|
|
||||||
|
var img = Image.new()
|
||||||
|
error = img.load_png_from_buffer(response[3])
|
||||||
|
if error != OK:
|
||||||
|
push_error(_cache_error("IMG_LOADING") + "Couldn't load the image.")
|
||||||
|
|
||||||
|
img.save_png("user://card_cache/" + id + "/card.png")
|
||||||
|
img = null
|
||||||
|
|
||||||
|
|
||||||
|
func _do_http_id_request_card(id: String) -> void:
|
||||||
|
var httpr = HTTPRequest.new()
|
||||||
|
add_child(httpr)
|
||||||
|
var error = httpr.request("https://api.scryfall.com/cards/" + id, _req_headers)
|
||||||
|
if error != OK:
|
||||||
|
push_error(_cache_error("GET_REQUEST") + "An error occurred in the Scryfall request.")
|
||||||
|
|
||||||
|
var response = await httpr.request_completed
|
||||||
|
|
||||||
|
if response[0] != HTTPRequest.RESULT_SUCCESS:
|
||||||
|
push_error(_cache_error("GET_REQUEST") + "Failed to fetch card data from Scryfall")
|
||||||
|
return
|
||||||
|
|
||||||
|
var unprocessed_body = response[3].get_string_from_utf8()
|
||||||
|
var card_content = JSON.parse_string(unprocessed_body)
|
||||||
|
if card_content == null:
|
||||||
|
push_error(_cache_error("PARSING") + "Failed to parse the Scryfall card results.")
|
||||||
|
|
||||||
|
var dir = DirAccess.open("user://")
|
||||||
|
dir.make_dir_recursive("user://card_cache/" + id + "/") # lets ensure the path is there
|
||||||
|
dir = null
|
||||||
|
|
||||||
|
var card_cache = FileAccess.open("user://card_cache/" + id + "/card.json", FileAccess.WRITE)
|
||||||
|
card_cache.store_string(unprocessed_body) # cache the json response
|
||||||
|
card_cache = null # closes the file
|
||||||
|
|
||||||
|
var image_uris = card_content["image_uris"]
|
||||||
|
_img_path = image_uris["png"]
|
||||||
|
10
tabletop.gd
10
tabletop.gd
@ -2,24 +2,18 @@ extends Node2D
|
|||||||
|
|
||||||
var player_class = preload("res://player.gd")
|
var player_class = preload("res://player.gd")
|
||||||
var deck_input = preload("res://deck_input.gd")
|
var deck_input = preload("res://deck_input.gd")
|
||||||
var _caching = preload("res://caching.gd")
|
|
||||||
|
|
||||||
|
|
||||||
# Called when the node enters the scene tree for the first time.
|
# Called when the node enters the scene tree for the first time.
|
||||||
func _ready() -> void:
|
func _ready() -> void:
|
||||||
var cache = _caching.new()
|
|
||||||
add_child(cache)
|
|
||||||
cache.get_bulk_data(false)
|
|
||||||
# TODO: Create 2-4 player instances as children of this tabletop node.
|
# TODO: Create 2-4 player instances as children of this tabletop node.
|
||||||
|
|
||||||
var player = player_class.new()
|
var player = player_class.new()
|
||||||
add_child(player)
|
add_child(player)
|
||||||
move_child(player, 0)
|
move_child(player, 0)
|
||||||
|
|
||||||
cache.get_card_data_from_name("1996 World Champion")
|
var deck = deck_input.new()
|
||||||
|
add_child(deck)
|
||||||
#var deck = deck_input.new()
|
|
||||||
#add_child(deck)
|
|
||||||
|
|
||||||
|
|
||||||
pass # Replace with function body.
|
pass # Replace with function body.
|
||||||
|
Loading…
x
Reference in New Issue
Block a user