generated from krampus/template-godot4
	
		
			
	
	
		
			178 lines
		
	
	
		
			5.5 KiB
		
	
	
	
		
			GDScript3
		
	
	
	
	
	
		
		
			
		
	
	
			178 lines
		
	
	
		
			5.5 KiB
		
	
	
	
		
			GDScript3
		
	
	
	
	
	
| 
								 | 
							
								#######################################################################
							 | 
						||
| 
								 | 
							
								# Credit goes to the Dialogue Manager plugin for this script
							 | 
						||
| 
								 | 
							
								# Check it out at: https://github.com/nathanhoad/godot_dialogue_manager
							 | 
						||
| 
								 | 
							
								#######################################################################
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								@tool
							 | 
						||
| 
								 | 
							
								extends Button
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								#region Constants
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								const REMOTE_RELEASE_URL: StringName = "https://api.github.com/repos/ramokz/phantom-camera/releases"
							 | 
						||
| 
								 | 
							
								const UPDATER_CONSTANTS := preload("res://addons/phantom_camera/scripts/panel/updater/updater_constants.gd")
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								#endregion
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								#region @onready
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								@onready var http_request: HTTPRequest = %HTTPRequest
							 | 
						||
| 
								 | 
							
								@onready var download_dialog: AcceptDialog = %DownloadDialog
							 | 
						||
| 
								 | 
							
								@onready var download_update_panel: Control = %DownloadUpdatePanel
							 | 
						||
| 
								 | 
							
								@onready var needs_reload_dialog: AcceptDialog = %NeedsReloadDialog
							 | 
						||
| 
								 | 
							
								@onready var update_failed_dialog: AcceptDialog = %UpdateFailedDialog
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								#endregion
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								#region Variables
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								# The main editor plugin
							 | 
						||
| 
								 | 
							
								var editor_plugin: EditorPlugin
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								var needs_reload: bool = false
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								# A lambda that gets called just before refreshing the plugin. Return false to stop the reload.
							 | 
						||
| 
								 | 
							
								var on_before_refresh: Callable = func(): return true
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								#endregion
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								#region Private Functions
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								func _ready() -> void:
							 | 
						||
| 
								 | 
							
									hide()
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									# Check for updates on GitHub Releases
							 | 
						||
| 
								 | 
							
									check_for_update()
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									pressed.connect(_on_update_button_pressed)
							 | 
						||
| 
								 | 
							
									http_request.request_completed.connect(_request_request_completed)
							 | 
						||
| 
								 | 
							
									download_update_panel.updated.connect(_on_download_update_panel_updated)
							 | 
						||
| 
								 | 
							
									needs_reload_dialog.confirmed.connect(_on_needs_reload_dialog_confirmed)
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								func _request_request_completed(result: int, response_code: int, headers: PackedStringArray, body: PackedByteArray) -> void:
							 | 
						||
| 
								 | 
							
									if result != HTTPRequest.RESULT_SUCCESS: return
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									if not editor_plugin: return
							 | 
						||
| 
								 | 
							
									var current_version: String = editor_plugin.get_version()
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									# Work out the next version from the releases information on GitHub
							 | 
						||
| 
								 | 
							
									var response: Array = JSON.parse_string(body.get_string_from_utf8())
							 | 
						||
| 
								 | 
							
									if typeof(response) != TYPE_ARRAY: return
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									# GitHub releases are in order of creation, not order of version
							 | 
						||
| 
								 | 
							
									var versions: Array = response.filter(func(release):
							 | 
						||
| 
								 | 
							
										var version: String = release.tag_name.substr(1)
							 | 
						||
| 
								 | 
							
										return version_to_number(version) > version_to_number(current_version)
							 | 
						||
| 
								 | 
							
									)
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									if versions.size() > 0:
							 | 
						||
| 
								 | 
							
										if ProjectSettings.get_setting(UPDATER_CONSTANTS.setting_updater_mode) == 1: ## For console output mode
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
											print_rich("
							 | 
						||
| 
								 | 
							
								[color=#3AB99A]   ********[/color]
							 | 
						||
| 
								 | 
							
								[color=#3AB99A] ************[/color]
							 | 
						||
| 
								 | 
							
								[color=#3AB99A]**************[/color]
							 | 
						||
| 
								 | 
							
								[color=#3AB99A]******  ***  *[/color]
							 | 
						||
| 
								 | 
							
								[color=#3AB99A]******  ***[/color]
							 | 
						||
| 
								 | 
							
								[color=#3AB99A]**********      *****[/color]
							 | 
						||
| 
								 | 
							
								[color=#3AB99A]********   ***********[/color]
							 | 
						||
| 
								 | 
							
								[color=#3AB99A]********  ***********  **[/color]
							 | 
						||
| 
								 | 
							
								[color=#3AB99A]*********  **************[/color]
							 | 
						||
| 
								 | 
							
								[color=#3AB99A]**********  *************[/color]
							 | 
						||
| 
								 | 
							
								[color=#3AB99A]**  **  **   *******   **[/color]
							 | 
						||
| 
								 | 
							
								[font_size=18][b]New Phantom Camera version is available[/b][/font_size]")
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
											if FileAccess.file_exists("res://dev_scenes/3d/dev_scene_3d.tscn"):
							 | 
						||
| 
								 | 
							
												print_rich("[font_size=14][color=#EAA15E][b]As you're using a fork of the project, you will need to update it manually[/b][/color][/font_size]")
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
											print_rich("[font_size=12]If you don't want to see this message, then it can be disabled inside:\n[code]Project Settings/Phantom Camera/Updater/Show New Release Info on Editor Launch in Output[/code]")
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
											return
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
										download_update_panel.next_version_release = versions[0]
							 | 
						||
| 
								 | 
							
										download_update_panel.show_updater_warning(
							 | 
						||
| 
								 | 
							
											versions[0].tag_name.substr(1).split("."),
							 | 
						||
| 
								 | 
							
											current_version.split(".")
							 | 
						||
| 
								 | 
							
										)
							 | 
						||
| 
								 | 
							
										_set_scale()
							 | 
						||
| 
								 | 
							
										editor_plugin.panel_button.add_theme_color_override("font_color", Color("#3AB99A"))
							 | 
						||
| 
								 | 
							
										editor_plugin.panel_button.icon = load("res://addons/phantom_camera/icons/phantom_camera_updater_panel_icon.svg")
							 | 
						||
| 
								 | 
							
										editor_plugin.panel_button.add_theme_color_override("icon_normal_color", Color("#3AB99A"))
							 | 
						||
| 
								 | 
							
										show()
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								func _on_update_button_pressed() -> void:
							 | 
						||
| 
								 | 
							
									if needs_reload:
							 | 
						||
| 
								 | 
							
										var will_refresh = on_before_refresh.call()
							 | 
						||
| 
								 | 
							
										if will_refresh:
							 | 
						||
| 
								 | 
							
											EditorInterface.restart_editor(true)
							 | 
						||
| 
								 | 
							
									else:
							 | 
						||
| 
								 | 
							
										_set_scale()
							 | 
						||
| 
								 | 
							
										download_dialog.popup_centered()
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								func _set_scale() -> void:
							 | 
						||
| 
								 | 
							
									var scale: float = EditorInterface.get_editor_scale()
							 | 
						||
| 
								 | 
							
									download_dialog.min_size = Vector2(300, 250) * scale
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								func _on_download_dialog_close_requested() -> void:
							 | 
						||
| 
								 | 
							
									download_dialog.hide()
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								func _on_download_update_panel_updated(updated_to_version: String) -> void:
							 | 
						||
| 
								 | 
							
									download_dialog.hide()
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									needs_reload_dialog.dialog_text = "Reload to finish update"
							 | 
						||
| 
								 | 
							
									needs_reload_dialog.ok_button_text = "Reload"
							 | 
						||
| 
								 | 
							
									needs_reload_dialog.cancel_button_text = "Cancel"
							 | 
						||
| 
								 | 
							
									needs_reload_dialog.popup_centered()
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									needs_reload = true
							 | 
						||
| 
								 | 
							
									text = "Reload Project"
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								func _on_download_update_panel_failed() -> void:
							 | 
						||
| 
								 | 
							
									download_dialog.hide()
							 | 
						||
| 
								 | 
							
									update_failed_dialog.dialog_text = "Updated Failed"
							 | 
						||
| 
								 | 
							
									update_failed_dialog.popup_centered()
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								func _on_needs_reload_dialog_confirmed() -> void:
							 | 
						||
| 
								 | 
							
									EditorInterface.restart_editor(true)
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								func _on_timer_timeout() -> void:
							 | 
						||
| 
								 | 
							
									if not needs_reload:
							 | 
						||
| 
								 | 
							
										check_for_update()
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								#endregion
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								#region Public Functions
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								# Convert a version number to an actually comparable number
							 | 
						||
| 
								 | 
							
								func version_to_number(version: String) -> int:
							 | 
						||
| 
								 | 
							
									var regex = RegEx.new()
							 | 
						||
| 
								 | 
							
									regex.compile("[a-zA-Z]+")
							 | 
						||
| 
								 | 
							
									if regex.search(str(version)): return 0
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									var bits = version.split(".")
							 | 
						||
| 
								 | 
							
									var version_bit: int
							 | 
						||
| 
								 | 
							
									var multiplier: int = 10000
							 | 
						||
| 
								 | 
							
									for i in bits.size():
							 | 
						||
| 
								 | 
							
										version_bit += bits[i].to_int() * multiplier / (10 ** (i))
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									return version_bit
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								func check_for_update() -> void:
							 | 
						||
| 
								 | 
							
									if ProjectSettings.get_setting(UPDATER_CONSTANTS.setting_updater_mode) == 0:  return
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									http_request.request(REMOTE_RELEASE_URL)
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								#endregion
							 |