download system
This commit is contained in:
65
flumi/Scripts/Utils/Lua/Download.gd
Normal file
65
flumi/Scripts/Utils/Lua/Download.gd
Normal file
@@ -0,0 +1,65 @@
|
||||
class_name LuaDownloadUtils
|
||||
extends RefCounted
|
||||
|
||||
static var last_user_event_time: int = 0
|
||||
static var user_event_window_ms: int = 100
|
||||
static var next_download_id: int = 1
|
||||
|
||||
static func setup_download_api(vm: LuauVM):
|
||||
vm.lua_pushcallable(_lua_download_handler, "gurt.download")
|
||||
vm.lua_getglobal("gurt")
|
||||
if vm.lua_isnil(-1):
|
||||
vm.lua_pop(1)
|
||||
vm.lua_newtable()
|
||||
vm.lua_setglobal("gurt")
|
||||
vm.lua_getglobal("gurt")
|
||||
|
||||
vm.lua_pushvalue(-2)
|
||||
vm.lua_setfield(-2, "download")
|
||||
vm.lua_pop(2)
|
||||
|
||||
static func mark_user_event():
|
||||
last_user_event_time = Time.get_ticks_msec()
|
||||
|
||||
static func _check_if_likely_user_event(current_time: int) -> bool:
|
||||
var time_since_user_event = current_time - last_user_event_time
|
||||
return time_since_user_event < user_event_window_ms
|
||||
|
||||
static func _lua_download_handler(vm: LuauVM) -> int:
|
||||
var url: String = vm.luaL_checkstring(1)
|
||||
var filename: String = ""
|
||||
|
||||
if vm.lua_gettop() >= 2 and not vm.lua_isnil(2):
|
||||
filename = vm.luaL_checkstring(2)
|
||||
else:
|
||||
filename = url.get_file()
|
||||
if filename.is_empty():
|
||||
filename = "download"
|
||||
|
||||
var current_time = Time.get_ticks_msec()
|
||||
var is_likely_user_event = _check_if_likely_user_event(current_time)
|
||||
|
||||
if not is_likely_user_event:
|
||||
vm.luaL_error("Download can only be called from within a user interaction (like a click event)")
|
||||
return 0
|
||||
|
||||
var download_id = "download_" + str(next_download_id)
|
||||
next_download_id += 1
|
||||
|
||||
var download_data = {
|
||||
"id": download_id,
|
||||
"url": url,
|
||||
"filename": filename,
|
||||
"timestamp": Time.get_unix_time_from_system()
|
||||
}
|
||||
|
||||
var lua_api = vm.get_meta("lua_api") as LuaAPI
|
||||
if lua_api:
|
||||
var operation = {
|
||||
"type": "request_download",
|
||||
"download_data": download_data
|
||||
}
|
||||
lua_api.call_deferred("_handle_dom_operation", operation)
|
||||
|
||||
vm.lua_pushstring(download_id)
|
||||
return 1
|
||||
1
flumi/Scripts/Utils/Lua/Download.gd.uid
Normal file
1
flumi/Scripts/Utils/Lua/Download.gd.uid
Normal file
@@ -0,0 +1 @@
|
||||
uid://b3nu8c4qlxj45
|
||||
@@ -16,6 +16,7 @@ static func connect_element_event(signal_node: Node, event_name: String, subscri
|
||||
if signal_node.has_signal("pressed"):
|
||||
var wrapper = func():
|
||||
LuaAudioUtils.mark_user_event()
|
||||
LuaDownloadUtils.mark_user_event()
|
||||
subscription.lua_api._on_event_triggered(subscription)
|
||||
signal_node.pressed.connect(wrapper)
|
||||
subscription.connected_signal = "pressed"
|
||||
@@ -25,6 +26,7 @@ static func connect_element_event(signal_node: Node, event_name: String, subscri
|
||||
elif signal_node is Control:
|
||||
var wrapper = func(event: InputEvent):
|
||||
LuaAudioUtils.mark_user_event()
|
||||
LuaDownloadUtils.mark_user_event()
|
||||
subscription.lua_api._on_gui_input_click(event, subscription)
|
||||
signal_node.gui_input.connect(wrapper)
|
||||
subscription.connected_signal = "gui_input"
|
||||
|
||||
@@ -379,6 +379,7 @@ func _setup_additional_lua_apis():
|
||||
LuaJSONUtils.setup_json_api(lua_vm)
|
||||
LuaWebSocketUtils.setup_websocket_api(lua_vm)
|
||||
LuaAudioUtils.setup_audio_api(lua_vm)
|
||||
LuaDownloadUtils.setup_download_api(lua_vm)
|
||||
LuaCrumbsUtils.setup_crumbs_api(lua_vm)
|
||||
LuaRegexUtils.setup_regex_api(lua_vm)
|
||||
LuaURLUtils.setup_url_api(lua_vm)
|
||||
|
||||
Reference in New Issue
Block a user