@tool extends MarginContainer #signal request_completed(response) const GdMarkDownReader = preload("res://addons/gdUnit4/src/update/GdMarkDownReader.gd") const GdUnitUpdateClient = preload("res://addons/gdUnit4/src/update/GdUnitUpdateClient.gd") const GdUnitUpdateProgress = preload("res://addons/gdUnit4/src/update/GdUnitUpdate.gd") @onready var _md_reader: GdMarkDownReader = GdMarkDownReader.new() @onready var _update_client: GdUnitUpdateClient = $GdUnitUpdateClient @onready var _header: Label = $Panel/GridContainer/PanelContainer/header @onready var _update_button: Button = $Panel/GridContainer/Panel/HBoxContainer/update @onready var _content: RichTextLabel = $Panel/GridContainer/PanelContainer2/ScrollContainer/MarginContainer/content @onready var _update_progress :GdUnitUpdateProgress = %update_banner var _debug_mode := false var _patcher := GdUnitPatcher.new() var _current_version := GdUnit4Version.current() func _ready() -> void: _update_button.set_disabled(false) _md_reader.set_http_client(_update_client) @warning_ignore("return_value_discarded") #GdUnitFonts.init_fonts(_content) _update_progress.set_visible(false) _update_progress.hidden.connect(func() -> void: _update_button.set_disabled(false) ) func request_releases() -> bool: if _debug_mode: _update_progress._debug_mode = _debug_mode _header.text = "A new version 'v4.4.4' is available" _update_button.set_disabled(false) return true var response :GdUnitUpdateClient.HttpResponse = await _update_client.request_latest_version() if response.status() != 200: _header.text = "Update information cannot be retrieved from GitHub!" message_h4("\n\nError: %s" % response.response(), Color.INDIAN_RED) return false var latest_version := _update_client.extract_latest_version(response) # if same version exit here no update need if latest_version.is_greater(_current_version): _patcher.scan(_current_version) _header.text = "A new version '%s' is available" % latest_version var download_zip_url := extract_zip_url(response) _update_progress.setup(_update_client, download_zip_url) _update_button.set_disabled(false) return true else: _header.text = "No update is available." _update_button.set_disabled(true) return false func _colored(message_: String, color: Color) -> String: return "[color=#%s]%s[/color]" % [color.to_html(), message_] func message_h4(message_: String, color: Color, clear := true) -> void: if clear: _content.clear() _content.append_text("[font_size=16]%s[/font_size]" % _colored(message_, color)) func message(message_: String, color: Color) -> void: _content.clear() _content.append_text(_colored(message_, color)) func _process(_delta: float) -> void: if _content != null and _content.is_visible_in_tree(): _content.queue_redraw() func show_update() -> void: if not GdUnitSettings.is_update_notification_enabled(): _header.text = "No update is available." message_h4("The search for updates is deactivated.", Color.CORNFLOWER_BLUE) _update_button.set_disabled(true) return if not await request_releases(): return _update_button.set_disabled(true) prints("Scan for GdUnit4 Update ...") message_h4("\n\n\nRequest release infos ... ", Color.SNOW) _content.add_image(GdUnitUiTools.get_spinner(), 32, 32) var content: String if _debug_mode: await get_tree().create_timer(.2).timeout var template := FileAccess.open("res://addons/gdUnit4/test/update/resources/http_response_releases.txt", FileAccess.READ).get_as_text() content = await _md_reader.to_bbcode(template) else: var response :GdUnitUpdateClient.HttpResponse = await _update_client.request_releases() if response.status() == 200: content = await extract_releases(response, _current_version) else: message_h4("\n\n\nError checked request available releases!", Color.INDIAN_RED) return # finally force rescan to import images as textures if Engine.is_editor_hint(): await rescan() message(content, Color.CADET_BLUE) _update_button.set_disabled(false) func extract_zip_url(response: GdUnitUpdateClient.HttpResponse) -> String: var body :Array = response.response() return body[0]["zipball_url"] func extract_releases(response: GdUnitUpdateClient.HttpResponse, current_version: GdUnit4Version) -> String: await get_tree().process_frame var result := "" for release :Dictionary in response.response(): var release_version := str(release["tag_name"]) if GdUnit4Version.parse(release_version).equals(current_version): break var release_description := _colored("