Files
Sprout-Farm/SproutFarm-Frontend/Components/HTTPTextureRect.gd
2025-09-24 15:06:30 +08:00

107 lines
3.2 KiB
GDScript
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
extends TextureRect
class_name HTTPTextureRect
signal loading_started
signal loading_finished(success: bool)
# HTTP请求节点
var http_request: HTTPRequest
func _ready():
# 创建HTTP请求节点
http_request = HTTPRequest.new()
add_child(http_request)
# 连接信号
http_request.request_completed.connect(_on_request_completed)
# 从URL加载图像
func load_from_url(url: String, custom_headers: Array = []) -> void:
if url.is_empty():
push_error("HTTPTextureRect: URL不能为空")
loading_finished.emit(false)
return
loading_started.emit()
# 发起HTTP请求
var error = http_request.request(url, custom_headers)
if error != OK:
push_error("HTTPTextureRect: 发起HTTP请求失败错误码: " + str(error))
loading_finished.emit(false)
# HTTP请求完成的回调函数
func _on_request_completed(result, response_code, headers, body):
if result != HTTPRequest.RESULT_SUCCESS:
push_error("HTTPTextureRect: HTTP请求失败错误码: " + str(result))
loading_finished.emit(false)
return
if response_code != 200:
push_error("HTTPTextureRect: HTTP请求返回非200状态码: " + str(response_code))
loading_finished.emit(false)
return
# 检查内容类型
var content_type = ""
for header in headers:
if header.to_lower().begins_with("content-type:"):
content_type = header.substr(13).strip_edges().to_lower()
#print("HTTPTextureRect: 内容类型: ", content_type)
break
# 创建图像
var image = Image.new()
var error = ERR_INVALID_DATA
# 根据内容类型选择加载方法
if content_type.begins_with("image/jpeg") or content_type.begins_with("image/jpg"):
error = image.load_jpg_from_buffer(body)
elif content_type.begins_with("image/png"):
error = image.load_png_from_buffer(body)
elif content_type.begins_with("image/webp"):
error = image.load_webp_from_buffer(body)
elif content_type.begins_with("image/bmp"):
error = image.load_bmp_from_buffer(body)
else:
# 未知内容类型,尝试常见格式
error = image.load_jpg_from_buffer(body)
if error != OK:
error = image.load_png_from_buffer(body)
if error != OK:
error = image.load_webp_from_buffer(body)
if error != OK:
error = image.load_bmp_from_buffer(body)
# 检查加载结果
if error != OK:
push_error("HTTPTextureRect: 无法加载图像,错误码: " + str(error))
loading_finished.emit(false)
return
# 创建纹理并应用
var texture = ImageTexture.create_from_image(image)
self.texture = texture
#print("HTTPTextureRect: 图像加载成功,尺寸: ", image.get_width(), "x", image.get_height())
loading_finished.emit(true)
# 加载QQ头像的便捷方法
func load_qq_avatar(qq_number: String) -> void:
if not qq_number.is_valid_int():
push_error("HTTPTextureRect: QQ号必须为纯数字")
loading_finished.emit(false)
return
# 使用QQ头像API
#var url = "https://q.qlogo.cn/headimg_dl?dst_uin=" + qq_number + "&spec=640&img_type=png"
var url = "http://q1.qlogo.cn/g?b=qq&nk="+qq_number+"&s=100"
# 添加浏览器模拟头
var headers = [
"User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36",
"Accept: image/png,image/jpeg,image/webp,image/*,*/*;q=0.8"
]
# 加载图像
load_from_url(url, headers)