93 lines
3.4 KiB
GDScript
93 lines
3.4 KiB
GDScript
extends Node
|
|
|
|
const ERROR_MESSAGES: Array[String] = [
|
|
"NO_TEACHER_SETTINGS_ON_DEVICE",
|
|
"LANGUAGE_NOT_SUPPORTED",
|
|
"NO_VALID_LANGUAGE_DATA_AVAILABLE"
|
|
]
|
|
const PACKAGE_LOADER_SCENE: PackedScene = preload("res://sources/menus/language_selection/package_downloader.tscn")
|
|
|
|
var device_language: String
|
|
var teacher_settings: TeacherSettings
|
|
|
|
@onready var error_popup: ConfirmPopup = $ErrorPopup
|
|
|
|
|
|
func _ready() -> void:
|
|
await get_tree().process_frame
|
|
if (ServerManager as ServerManagerClass).is_local_web_mode():
|
|
UserDataManager.ensure_joy_local_profile()
|
|
UserDataManager.set_language("fr_FR", true)
|
|
UserDataManager.save_all()
|
|
go_to_package_download()
|
|
return
|
|
device_language = UserDataManager.get_device_settings().language
|
|
Log.trace("LanguageCheck: Starting with device language %s" % device_language)
|
|
# Check the teacher settings, if we are logged in (this scene should not be accessible otherwise)
|
|
teacher_settings = UserDataManager.teacher_settings
|
|
if not teacher_settings:
|
|
Log.error("LanguageCheck: TeacherSettings not found")
|
|
UserDataManager.logout()
|
|
_show_error(ERROR_MESSAGES[0])
|
|
return
|
|
Log.trace("LanguageCheck: Re-validating language with server on every login")
|
|
if not await ServerManager.check_internet_access():
|
|
Log.trace("LanguageCheck: No internet access")
|
|
try_with_local_data()
|
|
return
|
|
Log.trace("LanguageCheck: Internet access confirmed. Asking server for user language")
|
|
var res: Dictionary = await ServerManager.get_user_language()
|
|
if not res.has("code") or res.code != 200 or not res.has("body") or not (res.body as Dictionary).has("language"):
|
|
Log.trace("LanguageCheck: Server answer is not usable")
|
|
try_with_local_data()
|
|
return
|
|
var server_language: Variant = (res.body as Dictionary).language
|
|
if server_language is String and server_language in Utils.SUPPORTED_LOCALES.keys():
|
|
Log.trace("LanguageCheck: Language validated by server")
|
|
teacher_settings.language = server_language
|
|
teacher_settings.server_language_validated = true
|
|
UserDataManager.set_language(server_language as String, true)
|
|
else:
|
|
Log.warn("LanguageCheck: Language received from server is invalid or not defined")
|
|
var local_language: String = teacher_settings.language
|
|
if not local_language in Utils.SUPPORTED_LOCALES.keys():
|
|
if not device_language in Utils.SUPPORTED_LOCALES.keys():
|
|
UserDataManager.logout()
|
|
_show_error(ERROR_MESSAGES[2])
|
|
return
|
|
local_language = device_language
|
|
res = await ServerManager.set_user_language(local_language)
|
|
if res.has("code") and res.code == 200:
|
|
UserDataManager.set_language(local_language, true)
|
|
else:
|
|
UserDataManager.set_language(local_language, false)
|
|
|
|
UserDataManager.save_all()
|
|
go_to_package_download()
|
|
|
|
|
|
func try_with_local_data() -> void:
|
|
Log.trace("LanguageCheck: Try with local data")
|
|
if device_language in Utils.SUPPORTED_LOCALES.keys():
|
|
teacher_settings.language = device_language
|
|
teacher_settings.server_language_validated = false
|
|
go_to_package_download()
|
|
return
|
|
else:
|
|
Log.error("LanguageCheck: Device language %s is not in supported languages" % device_language)
|
|
_show_error(tr(ERROR_MESSAGES[1]) % device_language)
|
|
return
|
|
|
|
|
|
func _show_error(message: String) -> void:
|
|
error_popup.content_text = message
|
|
error_popup.show()
|
|
|
|
|
|
func go_to_package_download() -> void:
|
|
var error: Error = get_tree().change_scene_to_packed(PACKAGE_LOADER_SCENE)
|
|
if error != OK:
|
|
Log.error(error_string(error))
|
|
_show_error(error_string(error))
|
|
|