135 lines
3.9 KiB
GDScript
135 lines
3.9 KiB
GDScript
@icon("res://addons/twitcher/assets/auth-icon.svg")
|
|
@tool
|
|
extends Twitcher
|
|
|
|
## Delegate class for the oOuch Library.
|
|
class_name TwitchAuth
|
|
|
|
const HttpUtil = preload("res://addons/twitcher/lib/http/http_util.gd")
|
|
|
|
static var _log: TwitchLogger = TwitchLogger.new("TwitchAuth")
|
|
|
|
## The requested devicecode to show to the user for authorization
|
|
signal device_code_requested(device_code: OAuth.OAuthDeviceCodeResponse);
|
|
|
|
## Where and how to authorize.
|
|
@export var oauth_setting: OAuthSetting:
|
|
set(val):
|
|
oauth_setting = val
|
|
if auth != null: auth.oauth_setting = oauth_setting
|
|
if token_handler != null: token_handler.oauth_setting = oauth_setting
|
|
update_configuration_warnings()
|
|
## Shows the what to authorize page of twitch again. (for example you need to relogin with a different account aka bot account)
|
|
@export var force_verify: bool
|
|
## Where should the tokens be saved into
|
|
@export var token: OAuthToken:
|
|
set(val):
|
|
token = val
|
|
if token_handler != null: token_handler.token = token
|
|
update_configuration_warnings()
|
|
## Scopes for the token that should be requested
|
|
@export var scopes: OAuthScopes:
|
|
set(val):
|
|
scopes = val
|
|
if auth != null: auth.scopes = scopes
|
|
update_configuration_warnings()
|
|
|
|
## Takes care to authorize the user
|
|
@onready var auth: OAuth
|
|
## Takes care to fetch and refresh oauth tokens
|
|
@onready var token_handler: TwitchTokenHandler
|
|
|
|
|
|
var is_authenticated: bool:
|
|
get(): return auth.is_authenticated()
|
|
|
|
|
|
func _init() -> void:
|
|
child_entered_tree.connect(_on_enter_child)
|
|
# There could be better locations but this ensures that its there when an
|
|
# auth is needed.
|
|
var http_logger = TwitchLogger.new("Http")
|
|
HttpUtil.set_logger(http_logger.e, http_logger.i, http_logger.d)
|
|
|
|
|
|
func _on_enter_child(node: Node) -> void:
|
|
if node is OAuth: auth = node
|
|
if node is TwitchTokenHandler: token_handler = node
|
|
|
|
|
|
func _ready() -> void:
|
|
OAuth.set_logger(_log.e, _log.i, _log.d);
|
|
if oauth_setting == null: oauth_setting = create_default_oauth_setting()
|
|
_ensure_children()
|
|
|
|
|
|
func _ensure_children() -> void:
|
|
if token_handler == null:
|
|
token_handler = TwitchTokenHandler.new()
|
|
token_handler.name = "TokenHandler"
|
|
|
|
if auth == null:
|
|
auth = OAuth.new()
|
|
auth.name = "OAuth"
|
|
|
|
_sync_childs()
|
|
|
|
if not auth.is_inside_tree():
|
|
add_child(auth)
|
|
auth.owner = owner
|
|
if not token_handler.is_inside_tree():
|
|
add_child(token_handler)
|
|
token_handler.owner = owner
|
|
|
|
|
|
func _sync_childs() -> void:
|
|
token_handler.oauth_setting = oauth_setting
|
|
token_handler.token = token
|
|
auth.token_handler = token_handler
|
|
auth.oauth_setting = oauth_setting
|
|
auth.scopes = scopes
|
|
auth.force_verify = &"true" if force_verify else &"false"
|
|
|
|
|
|
func authorize() -> bool:
|
|
_sync_childs()
|
|
if await auth.login():
|
|
token_handler.process_mode = Node.PROCESS_MODE_INHERIT
|
|
return true
|
|
return false
|
|
|
|
|
|
func refresh_token() -> void:
|
|
auth.refresh_token()
|
|
|
|
|
|
static func create_default_oauth_setting() -> OAuthSetting:
|
|
var oauth_setting = OAuthSetting.new()
|
|
oauth_setting.authorization_flow = OAuth.AuthorizationFlow.AUTHORIZATION_CODE_FLOW
|
|
oauth_setting.device_authorization_url = "https://id.twitch.tv/oauth2/device"
|
|
oauth_setting.token_url = "https://id.twitch.tv/oauth2/token"
|
|
oauth_setting.authorization_url = "https://id.twitch.tv/oauth2/authorize"
|
|
oauth_setting.cache_file = "user://auth.conf"
|
|
oauth_setting.redirect_url = "http://localhost:7170"
|
|
return oauth_setting
|
|
|
|
|
|
## Checks if the correctly setup
|
|
func is_configured() -> bool:
|
|
return _get_configuration_warnings().is_empty()
|
|
|
|
|
|
func _get_configuration_warnings() -> PackedStringArray:
|
|
var result: PackedStringArray = []
|
|
if oauth_setting == null:
|
|
result.append("OAuthSetting missing")
|
|
else:
|
|
var oauth_setting_problems : PackedStringArray = oauth_setting.get_valididation_problems()
|
|
if not oauth_setting_problems.is_empty():
|
|
result.append("OAuthSetting is invalid")
|
|
result.append_array(oauth_setting_problems)
|
|
if scopes == null:
|
|
result.append("OAuthScopes is missing")
|
|
if token == null:
|
|
result.append("OAuthToken is missing")
|
|
return result
|