mirror of
https://github.com/obsproject/obs-studio.git
synced 2026-09-19 09:41:32 +08:00
UI: Add auth. support to settings/autoconfig
Adds the ability to connect/login to an account via the settings and auto-configuration dialogs. Checks registered Auth objects, and if the Auth object matches the currently selected service in the settings window or auto-configuration dialog, will display "connect account" buttons for the user to be able to click (which are optional, they can still use stream keys if they'd prefer).
This commit is contained in:
@@ -12,6 +12,17 @@
|
||||
#include "ui_AutoConfigVideoPage.h"
|
||||
#include "ui_AutoConfigStreamPage.h"
|
||||
|
||||
#ifdef BROWSER_AVAILABLE
|
||||
#include <browser-panel.hpp>
|
||||
#include "auth-oauth.hpp"
|
||||
#endif
|
||||
|
||||
struct QCef;
|
||||
struct QCefCookieManager;
|
||||
|
||||
extern QCef *cef;
|
||||
extern QCefCookieManager *panel_cookies;
|
||||
|
||||
#define wiz reinterpret_cast<AutoConfig*>(wizard())
|
||||
|
||||
/* ------------------------------------------------------------------------- */
|
||||
@@ -222,6 +233,8 @@ AutoConfigStreamPage::AutoConfigStreamPage(QWidget *parent)
|
||||
ui->setupUi(this);
|
||||
ui->bitrateLabel->setVisible(false);
|
||||
ui->bitrate->setVisible(false);
|
||||
ui->connectAccount2->setVisible(false);
|
||||
ui->disconnectAccount->setVisible(false);
|
||||
|
||||
int vertSpacing = ui->topLayout->verticalSpacing();
|
||||
|
||||
@@ -229,6 +242,10 @@ AutoConfigStreamPage::AutoConfigStreamPage(QWidget *parent)
|
||||
m.setBottom(vertSpacing / 2);
|
||||
ui->topLayout->setContentsMargins(m);
|
||||
|
||||
m = ui->loginPageLayout->contentsMargins();
|
||||
m.setTop(vertSpacing / 2);
|
||||
ui->loginPageLayout->setContentsMargins(m);
|
||||
|
||||
m = ui->streamkeyPageLayout->contentsMargins();
|
||||
m.setTop(vertSpacing / 2);
|
||||
ui->streamkeyPageLayout->setContentsMargins(m);
|
||||
@@ -371,6 +388,94 @@ void AutoConfigStreamPage::on_show_clicked()
|
||||
}
|
||||
}
|
||||
|
||||
void AutoConfigStreamPage::OnOAuthStreamKeyConnected()
|
||||
{
|
||||
#ifdef BROWSER_AVAILABLE
|
||||
OAuthStreamKey *a = reinterpret_cast<OAuthStreamKey*>(auth.get());
|
||||
|
||||
if (a) {
|
||||
bool validKey = !a->key().empty();
|
||||
|
||||
if (validKey)
|
||||
ui->key->setText(QT_UTF8(a->key().c_str()));
|
||||
|
||||
ui->streamKeyWidget->setVisible(!validKey);
|
||||
ui->streamKeyLabel->setVisible(!validKey);
|
||||
ui->connectAccount2->setVisible(!validKey);
|
||||
ui->disconnectAccount->setVisible(validKey);
|
||||
}
|
||||
|
||||
ui->stackedWidget->setCurrentIndex((int)Section::StreamKey);
|
||||
UpdateCompleted();
|
||||
#endif
|
||||
}
|
||||
|
||||
void AutoConfigStreamPage::OnAuthConnected()
|
||||
{
|
||||
std::string service = QT_TO_UTF8(ui->service->currentText());
|
||||
Auth::Type type = Auth::AuthType(service);
|
||||
|
||||
if (type == Auth::Type::OAuth_StreamKey) {
|
||||
OnOAuthStreamKeyConnected();
|
||||
}
|
||||
}
|
||||
|
||||
void AutoConfigStreamPage::on_connectAccount_clicked()
|
||||
{
|
||||
#ifdef BROWSER_AVAILABLE
|
||||
std::string service = QT_TO_UTF8(ui->service->currentText());
|
||||
|
||||
auth = OAuthStreamKey::Login(this, service);
|
||||
if (!!auth)
|
||||
OnAuthConnected();
|
||||
#endif
|
||||
}
|
||||
|
||||
#define DISCONNECT_COMFIRM_TITLE \
|
||||
"Basic.AutoConfig.StreamPage.DisconnectAccount.Confirm.Title"
|
||||
#define DISCONNECT_COMFIRM_TEXT \
|
||||
"Basic.AutoConfig.StreamPage.DisconnectAccount.Confirm.Text"
|
||||
|
||||
void AutoConfigStreamPage::on_disconnectAccount_clicked()
|
||||
{
|
||||
QMessageBox::StandardButton button;
|
||||
|
||||
button = OBSMessageBox::question(this,
|
||||
QTStr(DISCONNECT_COMFIRM_TITLE),
|
||||
QTStr(DISCONNECT_COMFIRM_TEXT));
|
||||
|
||||
if (button == QMessageBox::No) {
|
||||
return;
|
||||
}
|
||||
|
||||
OBSBasic *main = OBSBasic::Get();
|
||||
|
||||
main->auth.reset();
|
||||
auth.reset();
|
||||
|
||||
std::string service = QT_TO_UTF8(ui->service->currentText());
|
||||
|
||||
#ifdef BROWSER_AVAILABLE
|
||||
OAuth::DeleteCookies(service);
|
||||
#endif
|
||||
|
||||
ui->streamKeyWidget->setVisible(true);
|
||||
ui->streamKeyLabel->setVisible(true);
|
||||
ui->connectAccount2->setVisible(true);
|
||||
ui->disconnectAccount->setVisible(false);
|
||||
}
|
||||
|
||||
void AutoConfigStreamPage::on_useStreamKey_clicked()
|
||||
{
|
||||
ui->stackedWidget->setCurrentIndex((int)Section::StreamKey);
|
||||
UpdateCompleted();
|
||||
}
|
||||
|
||||
static inline bool is_auth_service(const std::string &service)
|
||||
{
|
||||
return Auth::AuthType(service) != Auth::Type::None;
|
||||
}
|
||||
|
||||
void AutoConfigStreamPage::ServiceChanged()
|
||||
{
|
||||
bool showMore =
|
||||
@@ -384,6 +489,32 @@ void AutoConfigStreamPage::ServiceChanged()
|
||||
bool testBandwidth = ui->doBandwidthTest->isChecked();
|
||||
bool custom = IsCustom();
|
||||
|
||||
ui->disconnectAccount->setVisible(false);
|
||||
|
||||
#ifdef BROWSER_AVAILABLE
|
||||
if (cef) {
|
||||
if (lastService != service.c_str()) {
|
||||
bool can_auth = is_auth_service(service);
|
||||
int page = can_auth
|
||||
? (int)Section::Connect
|
||||
: (int)Section::StreamKey;
|
||||
|
||||
ui->stackedWidget->setCurrentIndex(page);
|
||||
ui->streamKeyWidget->setVisible(true);
|
||||
ui->streamKeyLabel->setVisible(true);
|
||||
ui->connectAccount2->setVisible(can_auth);
|
||||
auth.reset();
|
||||
|
||||
if (lastService.isEmpty())
|
||||
lastService = service.c_str();
|
||||
}
|
||||
} else {
|
||||
ui->connectAccount2->setVisible(false);
|
||||
}
|
||||
#else
|
||||
ui->connectAccount2->setVisible(false);
|
||||
#endif
|
||||
|
||||
/* Test three closest servers if "Auto" is available for Twitch */
|
||||
if (service == "Twitch" && wiz->twitchAuto)
|
||||
regionBased = false;
|
||||
@@ -415,6 +546,17 @@ void AutoConfigStreamPage::ServiceChanged()
|
||||
ui->bitrateLabel->setHidden(testBandwidth);
|
||||
ui->bitrate->setHidden(testBandwidth);
|
||||
|
||||
#ifdef BROWSER_AVAILABLE
|
||||
OBSBasic *main = OBSBasic::Get();
|
||||
auth.reset();
|
||||
|
||||
if (!!main->auth &&
|
||||
service.find(main->auth->service()) != std::string::npos) {
|
||||
auth = main->auth;
|
||||
OnAuthConnected();
|
||||
}
|
||||
#endif
|
||||
|
||||
UpdateCompleted();
|
||||
}
|
||||
|
||||
@@ -544,7 +686,8 @@ void AutoConfigStreamPage::UpdateServerList()
|
||||
|
||||
void AutoConfigStreamPage::UpdateCompleted()
|
||||
{
|
||||
if (ui->key->text().isEmpty()) {
|
||||
if (ui->stackedWidget->currentIndex() == (int)Section::Connect ||
|
||||
(ui->key->text().isEmpty() && !auth)) {
|
||||
ready = false;
|
||||
} else {
|
||||
bool custom = IsCustom();
|
||||
@@ -802,6 +945,9 @@ void AutoConfig::SaveStreamSettings()
|
||||
|
||||
main->SetService(newService);
|
||||
main->SaveService();
|
||||
main->auth = streamPage->auth;
|
||||
if (!!main->auth)
|
||||
main->auth->LoadUI();
|
||||
|
||||
/* ---------------------------------- */
|
||||
/* save stream settings */
|
||||
|
||||
Reference in New Issue
Block a user