discord-awesomeaudio/src/discordpage.cpp

166 lines
5.5 KiB
C++
Raw Normal View History

2022-07-09 16:07:14 -04:00
#include "discordpage.h"
2022-08-02 06:41:32 -04:00
#include "log.h"
2022-07-09 16:07:14 -04:00
#include "virtmic.h"
#include <QApplication>
#include <QDesktopServices>
#include <QFile>
#include <QTimer>
#include <QWebChannel>
#include <QWebEngineScript>
#include <QWebEngineScriptCollection>
#include <QWebEngineSettings>
DiscordPage::DiscordPage(QWidget *parent) : QWebEnginePage(parent) {
setBackgroundColor(QColor("#202225"));
m_virtmicProcess.setProcessChannelMode(QProcess::ForwardedChannels);
connect(this, &QWebEnginePage::featurePermissionRequested, this,
&DiscordPage::featurePermissionRequested);
2022-07-28 11:34:54 -04:00
connect(this, &QWebEnginePage::loadStarted, [=]() {
runJavaScript(QString("window.discordScreenaudioVersion = '%1';")
.arg(QApplication::applicationVersion()));
});
2022-07-09 16:07:14 -04:00
settings()->setAttribute(QWebEngineSettings::ScreenCaptureEnabled, true);
settings()->setAttribute(QWebEngineSettings::JavascriptCanOpenWindows, true);
settings()->setAttribute(QWebEngineSettings::AllowRunningInsecureContent,
true);
settings()->setAttribute(
QWebEngineSettings::AllowWindowActivationFromJavaScript, true);
settings()->setAttribute(QWebEngineSettings::FullScreenSupportEnabled, true);
settings()->setAttribute(QWebEngineSettings::PlaybackRequiresUserGesture,
false);
2022-07-27 08:53:16 -04:00
settings()->setAttribute(QWebEngineSettings::JavascriptCanOpenWindows, false);
2022-07-09 16:07:14 -04:00
setUrl(QUrl("https://discord.com/app"));
injectScript(":/assets/userscript.js");
2022-07-28 11:34:54 -04:00
injectVersion(QApplication::applicationVersion());
2022-07-09 16:07:14 -04:00
connect(&m_streamDialog, &StreamDialog::requestedStreamStart, this,
&DiscordPage::startStream);
}
void DiscordPage::injectScript(QString source) {
2022-08-02 06:41:32 -04:00
qDebug(mainLog) << "Injecting " << source;
2022-07-09 16:07:14 -04:00
QFile userscript(source);
if (!userscript.open(QIODevice::ReadOnly)) {
qFatal("Failed to load %s with error: %s", source.toLatin1().constData(),
userscript.errorString().toLatin1().constData());
} else {
QByteArray userscriptJs = userscript.readAll();
QWebEngineScript script;
script.setSourceCode(userscriptJs);
script.setName("userscript.js");
script.setWorldId(QWebEngineScript::MainWorld);
script.setInjectionPoint(QWebEngineScript::DocumentCreation);
script.setRunsOnSubFrames(false);
scripts().insert(script);
}
}
2022-07-28 11:34:54 -04:00
void DiscordPage::injectVersion(QString version) {
QWebEngineScript script;
auto code = QString("window.discordScreenaudioVersion = '%1';").arg(version);
script.setSourceCode(code);
script.setName("version.js");
script.setWorldId(QWebEngineScript::MainWorld);
script.setInjectionPoint(QWebEngineScript::DocumentCreation);
script.setRunsOnSubFrames(false);
scripts().insert(script);
}
2022-07-09 16:07:14 -04:00
void DiscordPage::featurePermissionRequested(const QUrl &securityOrigin,
QWebEnginePage::Feature feature) {
// Allow every permission asked
setFeaturePermission(securityOrigin, feature,
QWebEnginePage::PermissionGrantedByUser);
if (feature == QWebEnginePage::Feature::MediaAudioCapture) {
if (m_virtmicProcess.state() == QProcess::NotRunning) {
2022-08-02 06:41:32 -04:00
qDebug(virtmicLog) << "Starting Virtmic with no target to make sure "
"Discord can find all the audio devices";
m_virtmicProcess.start(QApplication::arguments()[0],
{"--virtmic", "None"});
}
}
2022-07-09 16:07:14 -04:00
}
bool DiscordPage::acceptNavigationRequest(const QUrl &url,
QWebEnginePage::NavigationType type,
bool isMainFrame) {
if (type == QWebEnginePage::NavigationTypeLinkClicked) {
QDesktopServices::openUrl(url);
return false;
}
return true;
};
2022-07-27 08:53:16 -04:00
bool ExternalPage::acceptNavigationRequest(const QUrl &url,
QWebEnginePage::NavigationType type,
bool isMainFrame) {
QDesktopServices::openUrl(url);
deleteLater();
return false;
}
QWebEnginePage *DiscordPage::createWindow(QWebEnginePage::WebWindowType type) {
return new ExternalPage;
}
2022-07-09 16:07:14 -04:00
void DiscordPage::stopVirtmic() {
if (m_virtmicProcess.state() == QProcess::Running) {
2022-08-02 06:41:32 -04:00
qDebug(virtmicLog) << "Stopping Virtmic";
2022-07-09 16:07:14 -04:00
m_virtmicProcess.kill();
m_virtmicProcess.waitForFinished();
2022-07-09 16:07:14 -04:00
}
}
void DiscordPage::startVirtmic(QString target) {
2022-07-14 08:43:52 -04:00
if (target != "None") {
2022-08-02 06:41:32 -04:00
qDebug(virtmicLog) << "Starting Virtmic with target" << target;
2022-07-09 16:07:14 -04:00
m_virtmicProcess.start(QApplication::arguments()[0], {"--virtmic", target});
}
}
void DiscordPage::javaScriptConsoleMessage(
QWebEnginePage::JavaScriptConsoleMessageLevel level, const QString &message,
int lineNumber, const QString &sourceID) {
if (message == "!discord-screenaudio-start-stream") {
if (m_streamDialog.isHidden())
m_streamDialog.setHidden(false);
else
m_streamDialog.activateWindow();
2022-07-14 05:57:44 -04:00
m_streamDialog.updateTargets();
2022-07-09 16:07:14 -04:00
} else if (message == "!discord-screenaudio-stream-stopped") {
stopVirtmic();
2022-08-02 06:41:32 -04:00
} else if (message.startsWith("dsa: ")) {
qDebug(userscriptLog) << message.mid(5).toUtf8().constData();
2022-07-09 16:07:14 -04:00
} else {
2022-08-02 06:41:32 -04:00
qDebug(discordLog) << message;
2022-07-09 16:07:14 -04:00
}
}
void DiscordPage::startStream(QString target, uint width, uint height,
uint frameRate) {
stopVirtmic();
startVirtmic(target);
// Wait a bit for the virtmic to start
2022-07-14 08:43:52 -04:00
QTimer::singleShot(target == "None" ? 0 : 200, [=]() {
2022-07-09 16:07:14 -04:00
runJavaScript(QString("window.discordScreenaudioStartStream(%1, %2, %3);")
.arg(width)
.arg(height)
.arg(frameRate));
});
}