This commit is contained in:
Malte Jürgens
2022-10-14 23:16:34 +02:00
parent 1eda9d75b0
commit 100f9bf58e
13 changed files with 224 additions and 58 deletions

View File

@@ -51,10 +51,15 @@ DiscordPage::DiscordPage(QWidget *parent) : QWebEnginePage(parent) {
settings()->setAttribute(QWebEngineSettings::JavascriptCanOpenWindows, false);
settings()->setAttribute(QWebEngineSettings::ScrollAnimatorEnabled, true);
injectScriptFile("qwebchannel.js", ":/qtwebchannel/qwebchannel.js");
setUrl(QUrl("https://discord.com/app"));
setWebChannel(new QWebChannel(this));
webChannel()->registerObject("webclass", &m_webClass);
injectScriptFile("userscript.js", ":/assets/userscript.js");
injectScriptFile("vencord.js", ":/assets/vencord.js");
injectScriptFile("vencord.js", ":/assets/vencord/vencord.js");
injectScriptText("version.js",
QString("window.discordScreenaudioVersion = '%1';")
@@ -115,7 +120,9 @@ DiscordPage::DiscordPage(QWidget *parent) : QWebEnginePage(parent) {
&DiscordPage::startStream);
}
void DiscordPage::injectScriptText(QString name, QString content) {
void DiscordPage::injectScriptText(
QString name, QString content,
QWebEngineScript::InjectionPoint injectionPoint) {
qDebug(mainLog) << "Injecting " << name;
QWebEngineScript script;
@@ -123,20 +130,22 @@ void DiscordPage::injectScriptText(QString name, QString content) {
script.setSourceCode(content);
script.setName(name);
script.setWorldId(QWebEngineScript::MainWorld);
script.setInjectionPoint(QWebEngineScript::DocumentCreation);
script.setInjectionPoint(injectionPoint);
script.setRunsOnSubFrames(false);
scripts().insert(script);
}
void DiscordPage::injectScriptFile(QString name, QString source) {
void DiscordPage::injectScriptFile(
QString name, QString source,
QWebEngineScript::InjectionPoint injectionPoint) {
QFile file(source);
if (!file.open(QIODevice::ReadOnly)) {
qFatal("Failed to load %s with error: %s", source.toLatin1().constData(),
file.errorString().toLatin1().constData());
} else {
injectScriptText(name, file.readAll());
injectScriptText(name, file.readAll(), injectionPoint);
}
}

View File

@@ -2,6 +2,7 @@
#include "streamdialog.h"
#include "virtmic.h"
#include "webclass.h"
#ifdef KXMLGUI
#include <KActionCollection>
@@ -12,6 +13,7 @@
#include <QProcess>
#include <QWebEngineFullScreenRequest>
#include <QWebEnginePage>
#include <QWebEngineScript>
class DiscordPage : public QWebEnginePage {
Q_OBJECT
@@ -22,6 +24,7 @@ public:
private:
StreamDialog m_streamDialog;
QProcess m_virtmicProcess;
WebClass m_webClass;
#ifdef KXMLGUI
KHelpMenu *m_helpMenu;
#ifdef KGLOBALACCEL
@@ -37,8 +40,12 @@ private:
javaScriptConsoleMessage(QWebEnginePage::JavaScriptConsoleMessageLevel level,
const QString &message, int lineNumber,
const QString &sourceID) override;
void injectScriptText(QString name, QString content);
void injectScriptFile(QString name, QString source);
void injectScriptText(QString name, QString content,
QWebEngineScript::InjectionPoint injectionPoint =
QWebEngineScript::DocumentCreation);
void injectScriptFile(QString name, QString source,
QWebEngineScript::InjectionPoint injectionPoint =
QWebEngineScript::DocumentCreation);
void stopVirtmic();
void startVirtmic(QString target);
void toggleMute();

35
src/webclass.cpp Normal file
View File

@@ -0,0 +1,35 @@
#include "webclass.h"
#include <QDesktopServices>
#include <QUrl>
QVariant WebClass::vencordSend(QString event, QVariantList args) {
if (event == "VencordGetRepo") {
return true;
}
if (event == "VencordGetSettingsDir") {
return "~/.config/discord-screenaudio/vencord";
}
if (event == "VencordGetQuickCss") {
// TODO
return "";
}
if (event == "VencordGetSettings") {
return m_vencordSettings;
}
if (event == "VencordSetSettings") {
m_vencordSettings = args[0].toString();
return true;
}
if (event == "VencordGetUpdates") {
return QVariantMap{{"ok", true}, {"value", QVariantList()}};
}
if (event == "VencordOpenExternal") {
QDesktopServices::openUrl(QUrl(args[0].toString()));
return true;
}
if (event == "VencordOpenQuickCss") {
return true;
}
assert(false);
}

13
src/webclass.h Normal file
View File

@@ -0,0 +1,13 @@
#pragma once
#include <QObject>
#include <QVariant>
class WebClass : public QObject {
Q_OBJECT
public slots:
QVariant vencordSend(QString event, QVariantList args);
private:
QString m_vencordSettings;
};