diff --git a/src/equicordplugins/questCompleter/index.tsx b/src/equicordplugins/questCompleter/index.tsx
index 15a91eba..ff97caa5 100644
--- a/src/equicordplugins/questCompleter/index.tsx
+++ b/src/equicordplugins/questCompleter/index.tsx
@@ -19,36 +19,19 @@
import "@equicordplugins/_misc/styles.css";
import { showNotification } from "@api/Notifications";
-import ErrorBoundary from "@components/ErrorBoundary";
import { Devs } from "@utils/constants";
import { getTheme, Theme } from "@utils/discord";
import definePlugin, { OptionType } from "@utils/types";
import { findByProps, findComponentByCodeLazy } from "@webpack";
-import { Button, FluxDispatcher, Forms, NavigationRouter, RestAPI, Tooltip, UserStore } from "@webpack/common";
+import { Button, ChannelStore, FluxDispatcher, Forms, GuildChannelStore, NavigationRouter, RestAPI, Tooltip, UserStore } from "@webpack/common";
-const HeaderBarIcon = findComponentByCodeLazy(".HEADER_BAR_BADGE_TOP:", '.iconBadge,"top"');
-const isApp = navigator.userAgent.includes("Electron/");
+const isApp = typeof DiscordNative !== "undefined";
import "./style.css";
import { definePluginSettings } from "@api/Settings";
-const ToolBarQuestsIcon = findComponentByCodeLazy("1 0 1 1.73Z");
-
-function ToolBarHeader() {
- return (
-
-
-
-
- );
-}
+const QuestIcon = findComponentByCodeLazy("10.47a.76.76");
async function openCompleteQuestUI() {
const ApplicationStreamingStore = findByProps("getStreamerActiveStreamMetadata");
@@ -72,7 +55,7 @@ async function openCompleteQuestUI() {
const applicationId = quest.config.application.id;
const applicationName = quest.config.application.name;
- const taskName = ["WATCH_VIDEO", "PLAY_ON_DESKTOP", "STREAM_ON_DESKTOP"].find(x => quest.config.taskConfig.tasks[x] != null);
+ const taskName = ["WATCH_VIDEO", "PLAY_ON_DESKTOP", "STREAM_ON_DESKTOP", "PLAY_ACTIVITY"].find(x => quest.config.taskConfig.tasks[x] != null);
// @ts-ignore
const secondsNeeded = quest.config.taskConfig.tasks[taskName].target;
// @ts-ignore
@@ -118,8 +101,6 @@ async function openCompleteQuestUI() {
RestAPI.get({ url: `/applications/public?application_ids=${applicationId}` }).then(res => {
const appData = res.body[0];
const exeName = appData.executables.find(x => x.os === "win32").name.replace(">", "");
-
- const games = RunningGameStore.getRunningGames();
const fakeGame = {
cmdLine: `C:\\Program Files\\${appData.name}\\${exeName}`,
exeName,
@@ -133,8 +114,15 @@ async function openCompleteQuestUI() {
processName: appData.name,
start: Date.now(),
};
- games.push(fakeGame);
- FluxDispatcher.dispatch({ type: "RUNNING_GAMES_CHANGE", removed: [], added: [fakeGame], games: games });
+ const realGames = RunningGameStore.getRunningGames();
+ const fakeGames = [fakeGame];
+ const realGetRunningGames = RunningGameStore.getRunningGames;
+ const realGetGameForPID = RunningGameStore.getGameForPID;
+ RunningGameStore.getRunningGames = () => fakeGames;
+ RunningGameStore.getGameForPID = pid => fakeGames.find(x => x.pid === pid);
+ FluxDispatcher.dispatch({
+ type: "RUNNING_GAMES_CHANGE", removed: realGames, added: [fakeGame], games: fakeGames
+ });
const fn = data => {
const progress = quest.config.configVersion === 1 ? data.userStatus.streamProgressSeconds : Math.floor(data.userStatus.progress.PLAY_ON_DESKTOP.value);
@@ -151,11 +139,9 @@ async function openCompleteQuestUI() {
icon: icon,
});
- const idx = games.indexOf(fakeGame);
- if (idx > -1) {
- games.splice(idx, 1);
- FluxDispatcher.dispatch({ type: "RUNNING_GAMES_CHANGE", removed: [fakeGame], added: [], games: [] });
- }
+ RunningGameStore.getRunningGames = realGetRunningGames;
+ RunningGameStore.getGameForPID = realGetGameForPID;
+ FluxDispatcher.dispatch({ type: "RUNNING_GAMES_CHANGE", removed: [fakeGame], added: [], games: [] });
FluxDispatcher.unsubscribe("QUESTS_SEND_HEARTBEAT_SUCCESS", fn);
}
};
@@ -211,6 +197,36 @@ async function openCompleteQuestUI() {
};
FluxDispatcher.subscribe("QUESTS_SEND_HEARTBEAT_SUCCESS", fn);
console.log(`Spoofed your stream to ${applicationName}.`);
+ } else if (taskName === "PLAY_ACTIVITY") {
+ const channelId = ChannelStore.getSortedPrivateChannels()[0]?.id ?? Object.values(GuildChannelStore.getAllGuilds() as any[]).find(x => x != null && x.VOCAL.length > 0).VOCAL[0].channel.id;
+ const streamKey = `call:${channelId}:1`;
+
+ const fn = async () => {
+
+ while (true) {
+ const res = await RestAPI.post({ url: `/quests/${quest.id}/heartbeat`, body: { stream_key: streamKey, terminal: false } });
+ const progress = res.body.progress.PLAY_ACTIVITY.value;
+ showNotification({
+ title: `${applicationName} - Quest Completer`,
+ body: `Current progress: ${progress}/${secondsNeeded} seconds.`,
+ icon: icon,
+ });
+
+ await new Promise(resolve => setTimeout(resolve, 20 * 1000));
+
+ if (progress >= secondsNeeded) {
+ await RestAPI.post({ url: `/quests/${quest.id}/heartbeat`, body: { stream_key: streamKey, terminal: true } });
+ break;
+ }
+ }
+
+ showNotification({
+ title: `${applicationName} - Quest Completer`,
+ body: "Quest Completed.",
+ icon: icon,
+ });
+ };
+ fn();
}
return;
}
@@ -244,10 +260,10 @@ export default definePlugin({
}
},
{
- find: "toolbar:function",
+ find: "AppTitleBar",
replacement: {
- match: /(function \i\(\i\){)(.{1,500}toolbar.{1,500}mobileToolbar)/,
- replace: "$1$self.toolbarAction(arguments[0]);$2"
+ match: /(?<=trailing:.{0,70}\(\i\.Fragment,{children:\[.*?)\]/,
+ replace: ",$self.renderQuestButton()]"
}
},
{
@@ -263,32 +279,17 @@ export default definePlugin({
return (
{tooltipProps => (
-
)}
);
},
openCompleteQuestUI,
- toolbarAction(e) {
- if (Array.isArray(e.toolbar))
- return e.toolbar.push(
-
-
-
- );
-
- e.toolbar = [
-
-
- ,
- e.toolbar,
- ];
- }
});