How to Earn the Discord Quest Badge Without Completing?

The Discord Quests are a part of the business plan because 93% of Discord users play games daily. Therefore, they have launched a Quests feature to promote the games and increase their income. As a result, you will get free in-game rewards along with a Quest Badge on Discord.

The Discord Quest pops up at the bottom left after connecting to a voice channel, prompting you to play a video game for 15 minutes while streaming to a friend. However, just for a badge, it might not be worth losing 15 to 20 GBs of hardware storage just to stream it for 15 minutes to a friend. Therefore, in this guide, we will tell you the 2 most effective ways to get a Quest badge without downloading a game or streaming to a friend.

1. Run a Script

To get the Quest badge, you will have to run a script that will automatically complete the Quests without needing to download a game. However, this script will work for every single Quest unless Discord patches it in the upcoming days.

To run a script, you will need to open the inspect element in Discord. Since you cannot do this in the Discord application, you need to install the Discord PTB (Public Test Build) and log in to your account in order to run the script.

  1. Download and install the Discord PTB from the link.
  2. Once downloaded, install it on your PC.
  3. Then, log in to your account and follow the steps to run the script.
  4. Once done, press Ctrl + Shift + I on the keyboard to open the inspect element window.
  5. Head to the console tab from the top.
  6. Then, type the command to allow pasting and hit Enter.
  7. Once done, accept the Quest and connect to any voice channel. Once connected, you need 1 friend to connect with you and watch your stream. However, if you don’t have any friends right now, you can use your other Discord account to watch your own stream.
  8. Once done, run the following script in the console and hit Enter to execute.
    let wpRequire;
    window.webpackChunkdiscord_app.push([[ Math.random() ], {}, (req) => { wpRequire = req; }]);
    let ApplicationStreamingStore, RunningGameStore, QuestsStore, ExperimentStore, FluxDispatcher, api;
    if (window.GLOBAL_ENV.SENTRY_TAGS.buildId === "366c746173a6ca0a801e9f4a4d7b6745e6de45d4") {
    ApplicationStreamingStore = Object.values(wpRequire.c).find(x => x?.exports?.default?.getStreamerActiveStreamMetadata).exports.default;
    RunningGameStore = Object.values(wpRequire.c).find(x => x?.exports?.default?.getRunningGames).exports.default;
    QuestsStore = Object.values(wpRequire.c).find(x => x?.exports?.default?.getQuest).exports.default;
    ExperimentStore = Object.values(wpRequire.c).find(x => x?.exports?.default?.getGuildExperiments).exports.default;
    FluxDispatcher = Object.values(wpRequire.c).find(x => x?.exports?.default?.flushWaitQueue).exports.default;
    api = Object.values(wpRequire.c).find(x => x?.exports?.getAPIBaseURL).exports.HTTP;
    } else {
    ApplicationStreamingStore = Object.values(wpRequire.c).find(x => x?.exports?.Z?.getStreamerActiveStreamMetadata).exports.Z;
    RunningGameStore = Object.values(wpRequire.c).find(x => x?.exports?.ZP?.getRunningGames).exports.ZP;
    QuestsStore = Object.values(wpRequire.c).find(x => x?.exports?.Z?.getQuest).exports.Z;
    ExperimentStore = Object.values(wpRequire.c).find(x => x?.exports?.Z?.getGuildExperiments).exports.Z;
    FluxDispatcher = Object.values(wpRequire.c).find(x => x?.exports?.Z?.flushWaitQueue).exports.Z;
    api = Object.values(wpRequire.c).find(x => x?.exports?.tn?.get).exports.tn;
    }
    let quest = [...QuestsStore.quests.values()].find(x => x.id !== "1245082221874774016" && x.userStatus?.enrolledAt && !x.userStatus?.completedAt && new Date(x.config.expiresAt).getTime() > Date.now());
    let isApp = navigator.userAgent.includes("Electron/");
    if (!isApp) {
    console.log("This no longer works in browser. Use the desktop app!");
    } else if (!quest) {
    console.log("You don't have any uncompleted quests!");
    } else {
    const pid = Math.floor(Math.random() * 30000) + 1000;
    
    let applicationId, applicationName, secondsNeeded, secondsDone, canPlay;
    if (quest.config.configVersion === 1) {
    applicationId = quest.config.applicationId;
    applicationName = quest.config.applicationName;
    secondsNeeded = quest.config.streamDurationRequirementMinutes * 60;
    secondsDone = quest.userStatus?.streamProgressSeconds ?? 0;
    canPlay = quest.config.variants.includes(2);
    } else if (quest.config.configVersion === 2) {
    applicationId = quest.config.application.id;
    applicationName = quest.config.application.name;
    canPlay = ExperimentStore.getUserExperimentBucket("2024-04_quest_playtime_task") > 0 && quest.config.taskConfig.tasks["PLAY_ON_DESKTOP"];
    const taskName = canPlay ? "PLAY_ON_DESKTOP" : "STREAM_ON_DESKTOP";
    secondsNeeded = quest.config.taskConfig.tasks[taskName].target;
    secondsDone = quest.userStatus?.progress?.[taskName]?.value ?? 0;
    }
    
    if (canPlay) {
    api.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,
    exePath: `c:/program files/${appData.name.toLowerCase()}/${exeName}`,
    hidden: false,
    isLauncher: false,
    id: applicationId,
    name: appData.name,
    pid: pid,
    pidPath: [pid],
    processName: appData.name,
    start: Date.now(),
    };
    games.push(fakeGame);
    FluxDispatcher.dispatch({ type: "RUNNING_GAMES_CHANGE", removed: [], added: [fakeGame], games: games });
    
    let fn = data => {
    let progress = quest.config.configVersion === 1 ? data.userStatus.streamProgressSeconds : Math.floor(data.userStatus.progress.PLAY_ON_DESKTOP.value);
    console.log(`Quest progress: ${progress}/${secondsNeeded}`);
    
    if (progress >= secondsNeeded) {
    console.log("Quest completed!");
    
    const idx = games.indexOf(fakeGame);
    if (idx > -1) {
    games.splice(idx, 1);
    FluxDispatcher.dispatch({ type: "RUNNING_GAMES_CHANGE", removed: [fakeGame], added: [], games: [] });
    }
    FluxDispatcher.unsubscribe("QUESTS_SEND_HEARTBEAT_SUCCESS", fn);
    }
    };
    FluxDispatcher.subscribe("QUESTS_SEND_HEARTBEAT_SUCCESS", fn);
    
    console.log(`Spoofed your game to ${applicationName}. Wait for ${Math.ceil((secondsNeeded - secondsDone) / 60)} more minutes.`);
    });
    } else {
    let realFunc = ApplicationStreamingStore.getStreamerActiveStreamMetadata;
    ApplicationStreamingStore.getStreamerActiveStreamMetadata = () => ({
    id: applicationId,
    pid,
    sourceName: null
    });
    
    let fn = data => {
    let progress = quest.config.configVersion === 1 ? data.userStatus.streamProgressSeconds : Math.floor(data.userStatus.progress.STREAM_ON_DESKTOP.value);
    console.log(`Quest progress: ${progress}/${secondsNeeded}`);
    
    if (progress >= secondsNeeded) {
    console.log("Quest completed!");
    
    ApplicationStreamingStore.getStreamerActiveStreamMetadata = realFunc;
    FluxDispatcher.unsubscribe("QUESTS_SEND_HEARTBEAT_SUCCESS", fn);
    }
    };
    FluxDispatcher.subscribe("QUESTS_SEND_HEARTBEAT_SUCCESS", fn);
    
    console.log(`Spoofed your stream to ${applicationName}. Stream any window in vc for ${Math.ceil((secondsNeeded - secondsDone) / 60)} more minutes.`);
    console.log("Remember that you need at least 1 other person to be in the vc!");
    }
    }
  9. After executing the script, if you see Quest Progress 30/900 or something similar out of 900, it means the script is now executed. You can check the Quest Progress by navigating to Settings > Gift Inventory.
  10. If you see any progress, wait for 15 minutes for the Quest to be over.
  11. Once done, check if you are able to claim the reward or not.

If you don’t want Discord Quests to appear in your Discord App, you can simply disable it by navigating to Settings > Privacy & Safety. Here, turn off the In-game rewards (aka Quests) option to disable the Discord Quests.

ABOUT THE AUTHOR

Hamza Mohammad Anwar


Hamza Mohammad Anwar is an intermediate JavaScript web developer with a focus on developing high-performance applications using MERN technologies. His skill set includes expertise in ReactJS, MongoDB, Express NodeJS, and other related technologies. Hamza is also a Google IT Certified professional, which highlights his competence in IT support. As an avid problem-solver, he recreates errors on his computer to troubleshoot and find solutions to various technical issues.