Skip to content

Instantly share code, notes, and snippets.

@isumenuka
Forked from aamiaa/CompleteDiscordQuest.md
Created January 10, 2025 18:34

Revisions

  1. @aamiaa aamiaa revised this gist Dec 13, 2024. 1 changed file with 1 addition and 0 deletions.
    1 change: 1 addition & 0 deletions CompleteDiscordQuest.md
    Original file line number Diff line number Diff line change
    @@ -15,6 +15,7 @@ How to use this script:
    <summary>Click to expand</summary>

    ```js
    delete window.$;
    let wpRequire;
    window.webpackChunkdiscord_app.push([[ Math.random() ], {}, (req) => { wpRequire = req; }]);

  2. @aamiaa aamiaa revised this gist Dec 3, 2024. 1 changed file with 27 additions and 3 deletions.
    30 changes: 27 additions & 3 deletions CompleteDiscordQuest.md
    Original file line number Diff line number Diff line change
    @@ -1,7 +1,7 @@
    ## Complete Recent Discord Quest

    > [!NOTE]
    > This does not works in browser for non-video quests! For stream/play quests use the desktop app!
    > This does not works in browser for non-video, non-activity quests! For stream/play quests use the desktop app!
    > [!NOTE]
    > When doing stream quests, you need at least 1 other account in the vc!
    @@ -21,7 +21,8 @@ window.webpackChunkdiscord_app.push([[ Math.random() ], {}, (req) => { wpRequire
    let ApplicationStreamingStore = Object.values(wpRequire.c).find(x => x?.exports?.Z?.getStreamerActiveStreamMetadata).exports.Z;
    let RunningGameStore = Object.values(wpRequire.c).find(x => x?.exports?.ZP?.getRunningGames).exports.ZP;
    let QuestsStore = Object.values(wpRequire.c).find(x => x?.exports?.Z?.getQuest).exports.Z;
    let ExperimentStore = Object.values(wpRequire.c).find(x => x?.exports?.Z?.getGuildExperiments).exports.Z;
    let ChannelStore = Object.values(wpRequire.c).find(x => x?.exports?.Z?.getAllThreadsForParent).exports.Z;
    let GuildChannelStore = Object.values(wpRequire.c).find(x => x?.exports?.ZP?.getSFWDefaultChannel).exports.ZP;
    let FluxDispatcher = Object.values(wpRequire.c).find(x => x?.exports?.Z?.flushWaitQueue).exports.Z;
    let api = Object.values(wpRequire.c).find(x => x?.exports?.tn?.get).exports.tn;

    @@ -34,7 +35,7 @@ if(!quest) {

    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)
    const secondsNeeded = quest.config.taskConfig.tasks[taskName].target
    const secondsDone = quest.userStatus?.progress?.[taskName]?.value ?? 0

    @@ -130,6 +131,29 @@ if(!quest) {

    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!")
    } else if(taskName === "PLAY_ACTIVITY") {
    const channelId = ChannelStore.getSortedPrivateChannels()[0]?.id ?? Object.values(GuildChannelStore.getAllGuilds()).find(x => x != null && x.VOCAL.length > 0).VOCAL[0].channel.id
    const streamKey = `call:${channelId}:1`

    let fn = async () => {
    console.log("Completing quest", applicationName, "-", quest.config.messages.questName)

    while(true) {
    const res = await api.post({url: `/quests/${quest.id}/heartbeat`, body: {stream_key: streamKey, terminal: false}})
    const progress = res.body.progress.PLAY_ACTIVITY.value
    console.log(`Quest progress: ${progress}/${secondsNeeded}`)

    await new Promise(resolve => setTimeout(resolve, 20 * 1000))

    if(progress >= secondsNeeded) {
    await api.post({url: `/quests/${quest.id}/heartbeat`, body: {stream_key: streamKey, terminal: true}})
    break
    }
    }

    console.log("Quest completed!")
    }
    fn()
    }
    }
    ```
  3. @aamiaa aamiaa revised this gist Nov 30, 2024. 1 changed file with 5 additions and 0 deletions.
    5 changes: 5 additions & 0 deletions CompleteDiscordQuest.md
    Original file line number Diff line number Diff line change
    @@ -160,6 +160,11 @@ They have also started checking how many people are in the vc, so make sure you
    **Q: I get a syntax error/unexpected token error**
    A: Make sure your browser isn't auto-translating this website before copying the script. Turn off any translator extensions and try again.
    **Q: I get the error `Cannot read properties of undefined (reading 'nativeModules')`**
    A: You're on a modded client which is a browser wrapper (i.e. Vesktop). Use an actual desktop app.
    **Q: I get a different error**
  4. @aamiaa aamiaa revised this gist Nov 25, 2024. 1 changed file with 40 additions and 28 deletions.
    68 changes: 40 additions & 28 deletions CompleteDiscordQuest.md
    Original file line number Diff line number Diff line change
    @@ -1,14 +1,10 @@
    ## Complete Recent Discord Quest

    > [!NOTE]
    > This no longer works in browser!
    >
    > This no longer works if you're alone in vc! Somebody else has to join you!
    >
    > This does not works in browser for non-video quests! For stream/play quests use the desktop app!
    > [!WARNING]
    > There are now two quest types ("stream" and "play")! Pay attention to the instructions!
    >
    > [!NOTE]
    > When doing stream quests, you need at least 1 other account in the vc!
    How to use this script:
    1. Accept a quest under User Settings -> Gift Inventory
    @@ -31,30 +27,42 @@ let api = Object.values(wpRequire.c).find(x => x?.exports?.tn?.get).exports.tn;

    let quest = [...QuestsStore.quests.values()].find(x => x.id !== "1248385850622869556" && 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) {
    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) {
    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 secondsNeeded = quest.config.taskConfig.tasks[taskName].target
    const secondsDone = quest.userStatus?.progress?.[taskName]?.value ?? 0

    if(taskName === "WATCH_VIDEO") {
    const tolerance = 2, speed = 10
    const diff = Math.floor((Date.now() - new Date(quest.userStatus.enrolledAt).getTime())/1000)
    const startingPoint = Math.min(Math.max(Math.ceil(secondsDone), diff), secondsNeeded)
    let fn = async () => {
    for(let i=startingPoint;i<=secondsNeeded;i+=speed) {
    try {
    await api.post({url: `/quests/${quest.id}/video-progress`, body: {timestamp: Math.min(secondsNeeded, i + Math.random())}})
    } catch(ex) {
    console.log("Failed to send increment of", i, ex.message)
    }
    await new Promise(resolve => setTimeout(resolve, tolerance * 1000))
    }
    if((secondsNeeded-secondsDone)%speed !== 0) {
    await api.post({url: `/quests/${quest.id}/video-progress`, body: {timestamp: secondsNeeded}})
    }
    console.log("Quest completed!")
    }
    fn()
    console.log(`Spoofing video for ${applicationName}. Wait for ${Math.ceil((secondsNeeded - startingPoint)/speed*tolerance)} more seconds.`)
    } else if(taskName === "PLAY_ON_DESKTOP") {
    if(!isApp) {
    console.log("This no longer works in browser for non-video quests. Use the desktop app to complete the", applicationName, "quest!")
    }

    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(">","")
    @@ -95,7 +103,11 @@ if(!isApp) {

    console.log(`Spoofed your game to ${applicationName}. Wait for ${Math.ceil((secondsNeeded - secondsDone) / 60)} more minutes.`)
    })
    } else {
    } else if(taskName === "STREAM_ON_DESKTOP") {
    if(!isApp) {
    console.log("This no longer works in browser for non-video quests. Use the desktop app to complete the", applicationName, "quest!")
    }

    let realFunc = ApplicationStreamingStore.getStreamerActiveStreamMetadata
    ApplicationStreamingStore.getStreamerActiveStreamMetadata = () => ({
    id: applicationId,
  5. @aamiaa aamiaa revised this gist Sep 12, 2024. 1 changed file with 0 additions and 6 deletions.
    6 changes: 0 additions & 6 deletions CompleteDiscordQuest.md
    Original file line number Diff line number Diff line change
    @@ -131,12 +131,6 @@ if(!isApp) {
    You can track the progress by looking at the `Quest progress:` prints in the Console tab, or by reopening the Gift Inventory tab in settings.
    ## Unsupported Quests
    The following active quests cannot be completed with this script:
    * Krunker Strike
    ## FAQ
    **Q: Ctrl + Shift + I doesn't work**
  6. @aamiaa aamiaa revised this gist Aug 9, 2024. 1 changed file with 12 additions and 24 deletions.
    36 changes: 12 additions & 24 deletions CompleteDiscordQuest.md
    Original file line number Diff line number Diff line change
    @@ -22,24 +22,14 @@ How to use this script:
    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 ApplicationStreamingStore = Object.values(wpRequire.c).find(x => x?.exports?.Z?.getStreamerActiveStreamMetadata).exports.Z;
    let RunningGameStore = Object.values(wpRequire.c).find(x => x?.exports?.ZP?.getRunningGames).exports.ZP;
    let QuestsStore = Object.values(wpRequire.c).find(x => x?.exports?.Z?.getQuest).exports.Z;
    let ExperimentStore = Object.values(wpRequire.c).find(x => x?.exports?.Z?.getGuildExperiments).exports.Z;
    let FluxDispatcher = Object.values(wpRequire.c).find(x => x?.exports?.Z?.flushWaitQueue).exports.Z;
    let api = Object.values(wpRequire.c).find(x => x?.exports?.tn?.get).exports.tn;

    let quest = [...QuestsStore.quests.values()].find(x => x.id !== "1248385850622869556" && 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!")
    @@ -141,13 +131,11 @@ if(!isApp) {
    You can track the progress by looking at the `Quest progress:` prints in the Console tab, or by reopening the Gift Inventory tab in settings.
    ## Completing The Console Quest
    While the script doesn't work on it, it is possible to complete the "play any game on your console" quest without owning a console by using Xbox's Cloud Gaming:
    ## Unsupported Quests
    The following active quests cannot be completed with this script:
    1. Connect your Xbox (aka Microsoft) account to Discord (Settings -> Connections)
    2. Go to https://xbox.com/play and login via the same Xbox account
    3. Launch a free game (such as [Fortnite](https://www.xbox.com/play/games/fortnite/BT5P2X999VH2))
    4. Leave it running for 10 minutes
    * Krunker Strike
    ## FAQ
  7. @aamiaa aamiaa revised this gist Aug 5, 2024. 1 changed file with 1 addition and 1 deletion.
    2 changes: 1 addition & 1 deletion CompleteDiscordQuest.md
    Original file line number Diff line number Diff line change
    @@ -165,7 +165,7 @@ They have also started checking how many people are in the vc, so make sure you
    **Q: I get a syntax error/unexpected token error**
    A: Make sure your browser isn't auto-translating this website. Turn off any translator extensions and try again.
    A: Make sure your browser isn't auto-translating this website before copying the script. Turn off any translator extensions and try again.
    **Q: I get a different error**
  8. @aamiaa aamiaa revised this gist Aug 5, 2024. 1 changed file with 5 additions and 0 deletions.
    5 changes: 5 additions & 0 deletions CompleteDiscordQuest.md
    Original file line number Diff line number Diff line change
    @@ -163,6 +163,11 @@ A: Discord has patched the script from working in browsers. Use the desktop app,
    They have also started checking how many people are in the vc, so make sure you join it on at least 1 other account.
    **Q: I get a syntax error/unexpected token error**
    A: Make sure your browser isn't auto-translating this website. Turn off any translator extensions and try again.
    **Q: I get a different error**
    A: Make sure you're copy/pasting the script correctly and that you've have done all the steps.
  9. @aamiaa aamiaa revised this gist Aug 5, 2024. 1 changed file with 10 additions and 1 deletion.
    11 changes: 10 additions & 1 deletion CompleteDiscordQuest.md
    Original file line number Diff line number Diff line change
    @@ -165,4 +165,13 @@ They have also started checking how many people are in the vc, so make sure you
    **Q: I get a different error**
    A: Make sure you're copy/pasting the script correctly and that you've have done all the steps.
    A: Make sure you're copy/pasting the script correctly and that you've have done all the steps.
    **Q: Can you make the script auto accept the quest/reward?**
    A: No. Both of those actions may show a captcha, so automating them is not a good idea. Just do the two clicks yourself.
    ___
    <sup>Side note: Please don't post your "fixed" or "improved" versions of the script in the comments. It creates unnecessary confusion, often doesn't fix anything, and sometimes puts other people's accounts at risk. I might redact/delete such comments without notice. Thank you for understanding.</sup>
  10. @aamiaa aamiaa revised this gist Jul 3, 2024. 1 changed file with 8 additions and 0 deletions.
    8 changes: 8 additions & 0 deletions CompleteDiscordQuest.md
    Original file line number Diff line number Diff line change
    @@ -141,6 +141,14 @@ if(!isApp) {
    You can track the progress by looking at the `Quest progress:` prints in the Console tab, or by reopening the Gift Inventory tab in settings.
    ## Completing The Console Quest
    While the script doesn't work on it, it is possible to complete the "play any game on your console" quest without owning a console by using Xbox's Cloud Gaming:
    1. Connect your Xbox (aka Microsoft) account to Discord (Settings -> Connections)
    2. Go to https://xbox.com/play and login via the same Xbox account
    3. Launch a free game (such as [Fortnite](https://www.xbox.com/play/games/fortnite/BT5P2X999VH2))
    4. Leave it running for 10 minutes
    ## FAQ
    **Q: Ctrl + Shift + I doesn't work**
  11. @aamiaa aamiaa revised this gist Jun 27, 2024. 1 changed file with 1 addition and 1 deletion.
    2 changes: 1 addition & 1 deletion CompleteDiscordQuest.md
    Original file line number Diff line number Diff line change
    @@ -39,7 +39,7 @@ if(window.GLOBAL_ENV.SENTRY_TAGS.buildId === "366c746173a6ca0a801e9f4a4d7b6745e6
    api = Object.values(wpRequire.c).find(x => x?.exports?.tn?.get).exports.tn;
    }

    let quest = [...QuestsStore.quests.values()].find(x => x.userStatus?.enrolledAt && !x.userStatus?.completedAt && new Date(x.config.expiresAt).getTime() > Date.now())
    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!")
  12. @aamiaa aamiaa revised this gist Jun 18, 2024. 1 changed file with 2 additions and 2 deletions.
    4 changes: 2 additions & 2 deletions CompleteDiscordQuest.md
    Original file line number Diff line number Diff line change
    @@ -87,7 +87,7 @@ if(!isApp) {
    FluxDispatcher.dispatch({type: "RUNNING_GAMES_CHANGE", removed: [], added: [fakeGame], games: games})

    let fn = data => {
    let progress = data.userStatus.streamProgressSeconds
    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) {
    @@ -114,7 +114,7 @@ if(!isApp) {
    })

    let fn = data => {
    let progress = data.userStatus.streamProgressSeconds
    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) {
  13. @aamiaa aamiaa revised this gist Jun 17, 2024. 1 changed file with 17 additions and 7 deletions.
    24 changes: 17 additions & 7 deletions CompleteDiscordQuest.md
    Original file line number Diff line number Diff line change
    @@ -22,12 +22,22 @@ How to use this script:
    let wpRequire;
    window.webpackChunkdiscord_app.push([[ Math.random() ], {}, (req) => { wpRequire = req; }]);

    let ApplicationStreamingStore = Object.values(wpRequire.c).find(x => x?.exports?.default?.getStreamerActiveStreamMetadata).exports.default;
    let RunningGameStore = Object.values(wpRequire.c).find(x => x?.exports?.default?.getRunningGames).exports.default;
    let QuestsStore = Object.values(wpRequire.c).find(x => x?.exports?.default?.getQuest).exports.default;
    let ExperimentStore = Object.values(wpRequire.c).find(x => x?.exports?.default?.getGuildExperiments).exports.default;
    let FluxDispatcher = Object.values(wpRequire.c).find(x => x?.exports?.default?.flushWaitQueue).exports.default;
    let api = Object.values(wpRequire.c).find(x => x?.exports?.getAPIBaseURL).exports;
    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.userStatus?.enrolledAt && !x.userStatus?.completedAt && new Date(x.config.expiresAt).getTime() > Date.now())
    let isApp = navigator.userAgent.includes("Electron/")
    @@ -55,7 +65,7 @@ if(!isApp) {
    }

    if(canPlay) {
    api.HTTP.get({url: `/applications/public?application_ids=${applicationId}`}).then(res => {
    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(">","")

  14. @aamiaa aamiaa revised this gist Jun 4, 2024. 1 changed file with 23 additions and 7 deletions.
    30 changes: 23 additions & 7 deletions CompleteDiscordQuest.md
    Original file line number Diff line number Diff line change
    @@ -25,6 +25,7 @@ window.webpackChunkdiscord_app.push([[ Math.random() ], {}, (req) => { wpRequire
    let ApplicationStreamingStore = Object.values(wpRequire.c).find(x => x?.exports?.default?.getStreamerActiveStreamMetadata).exports.default;
    let RunningGameStore = Object.values(wpRequire.c).find(x => x?.exports?.default?.getRunningGames).exports.default;
    let QuestsStore = Object.values(wpRequire.c).find(x => x?.exports?.default?.getQuest).exports.default;
    let ExperimentStore = Object.values(wpRequire.c).find(x => x?.exports?.default?.getGuildExperiments).exports.default;
    let FluxDispatcher = Object.values(wpRequire.c).find(x => x?.exports?.default?.flushWaitQueue).exports.default;
    let api = Object.values(wpRequire.c).find(x => x?.exports?.getAPIBaseURL).exports;

    @@ -36,10 +37,25 @@ if(!isApp) {
    console.log("You don't have any uncompleted quests!")
    } else {
    const pid = Math.floor(Math.random() * 30000) + 1000
    const secondsNeeded = quest.config.streamDurationRequirementMinutes * 60

    if(quest.config.variants.includes(2)) {
    api.HTTP.get({url: `/applications/public?application_ids=${quest.config.applicationId}`}).then(res => {
    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.HTTP.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(">","")

    @@ -50,7 +66,7 @@ if(!isApp) {
    exePath: `c:/program files/${appData.name.toLowerCase()}/${exeName}`,
    hidden: false,
    isLauncher: false,
    id: quest.config.applicationId,
    id: applicationId,
    name: appData.name,
    pid: pid,
    pidPath: [pid],
    @@ -77,12 +93,12 @@ if(!isApp) {
    }
    FluxDispatcher.subscribe("QUESTS_SEND_HEARTBEAT_SUCCESS", fn)

    console.log(`Spoofed your game to ${quest.config.applicationName}. Wait for ${Math.ceil(quest.config.streamDurationRequirementMinutes - (quest.userStatus?.streamProgressSeconds ?? 0) / 60)} more minutes.`)
    console.log(`Spoofed your game to ${applicationName}. Wait for ${Math.ceil((secondsNeeded - secondsDone) / 60)} more minutes.`)
    })
    } else {
    let realFunc = ApplicationStreamingStore.getStreamerActiveStreamMetadata
    ApplicationStreamingStore.getStreamerActiveStreamMetadata = () => ({
    id: quest.config.applicationId,
    id: applicationId,
    pid,
    sourceName: null
    })
    @@ -100,7 +116,7 @@ if(!isApp) {
    }
    FluxDispatcher.subscribe("QUESTS_SEND_HEARTBEAT_SUCCESS", fn)

    console.log(`Spoofed your stream to ${quest.config.applicationName}. Stream any window in vc for ${Math.ceil(quest.config.streamDurationRequirementMinutes - (quest.userStatus?.streamProgressSeconds ?? 0) / 60)} more minutes.`)
    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!")
    }
    }
  15. @aamiaa aamiaa revised this gist May 26, 2024. 1 changed file with 86 additions and 28 deletions.
    114 changes: 86 additions & 28 deletions CompleteDiscordQuest.md
    Original file line number Diff line number Diff line change
    @@ -1,26 +1,32 @@
    ## Complete Recent Discord Quest
    > [!NOTE]
    > This no longer works in browser!

    > [!NOTE]
    > This no longer works in browser!
    >
    > This no longer works if you're alone in vc! Somebody else has to join you!
    >
    > [!WARNING]
    > There are now two quest types ("stream" and "play")! Pay attention to the instructions!
    >
    How to use this script:
    1. Accept the quest under User Settings -> Gift Inventory
    2. Join a vc
    3. **Join the same vc on an alt**
    4. Stream any window (can be notepad or something)
    5. Press <kbd>Ctrl</kbd>+<kbd>Shift</kbd>+<kbd>I</kbd> to open DevTools
    6. Go to the `Console` tab
    7. Paste the following code and hit enter:
    1. Accept a quest under User Settings -> Gift Inventory
    2. Press <kbd>Ctrl</kbd>+<kbd>Shift</kbd>+<kbd>I</kbd> to open DevTools
    3. Go to the `Console` tab
    4. Paste the following code and hit enter:
    <details>
    <summary>Click to expand</summary>
    ```js
    let wpRequire;
    window.webpackChunkdiscord_app.push([[ Math.random() ], {}, (req) => { wpRequire = req; }]);

    let ApplicationStreamingStore = Object.values(wpRequire.c).find(x => x?.exports?.default?.getStreamerActiveStreamMetadata).exports.default;
    let RunningGameStore = Object.values(wpRequire.c).find(x => x?.exports?.default?.getRunningGames).exports.default;
    let QuestsStore = Object.values(wpRequire.c).find(x => x?.exports?.default?.getQuest).exports.default;
    let FluxDispatcher = Object.values(wpRequire.c).find(x => x?.exports?.default?.flushWaitQueue).exports.default;
    let api = Object.values(wpRequire.c).find(x => x?.exports?.getAPIBaseURL).exports;

    let quest = [...QuestsStore.quests.values()].find(x => x.userStatus?.enrolledAt && !x.userStatus?.completedAt && new Date(x.config.expiresAt).getTime() > Date.now())
    let isApp = navigator.userAgent.includes("Electron/")
    @@ -29,33 +35,85 @@ if(!isApp) {
    } else if(!quest) {
    console.log("You don't have any uncompleted quests!")
    } else {
    let pid = Math.floor(Math.random() * 30000) + 1000
    ApplicationStreamingStore.getStreamerActiveStreamMetadata = () => ({
    id: quest.config.applicationId,
    pid,
    sourceName: null
    })
    const pid = Math.floor(Math.random() * 30000) + 1000
    const secondsNeeded = quest.config.streamDurationRequirementMinutes * 60

    let secondsNeeded = quest.config.streamDurationRequirementMinutes * 60
    let fn = data => {
    let progress = data.userStatus.streamProgressSeconds
    console.log(`Quest progress: ${progress}/${secondsNeeded}`)
    if(quest.config.variants.includes(2)) {
    api.HTTP.get({url: `/applications/public?application_ids=${quest.config.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: quest.config.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 = data.userStatus.streamProgressSeconds
    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 ${quest.config.applicationName}. Wait for ${Math.ceil(quest.config.streamDurationRequirementMinutes - (quest.userStatus?.streamProgressSeconds ?? 0) / 60)} more minutes.`)
    })
    } else {
    let realFunc = ApplicationStreamingStore.getStreamerActiveStreamMetadata
    ApplicationStreamingStore.getStreamerActiveStreamMetadata = () => ({
    id: quest.config.applicationId,
    pid,
    sourceName: null
    })
    if(progress >= secondsNeeded) {
    console.log("Quest completed!")
    FluxDispatcher.unsubscribe("QUESTS_SEND_HEARTBEAT_SUCCESS", fn)
    let fn = data => {
    let progress = data.userStatus.streamProgressSeconds
    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 ${quest.config.applicationName}. Stream any window in vc for ${Math.ceil(quest.config.streamDurationRequirementMinutes - (quest.userStatus?.streamProgressSeconds ?? 0) / 60)} more minutes.`)
    console.log("Remember that you need at least 1 other person to be in the vc!")
    }
    FluxDispatcher.subscribe("QUESTS_SEND_HEARTBEAT_SUCCESS", fn)

    console.log(`Spoofed your stream to ${quest.config.applicationName}. Stay in vc for ${Math.ceil(quest.config.streamDurationRequirementMinutes - (quest.userStatus?.streamProgressSeconds ?? 0) / 60)} more minutes.`)
    console.log("Remember that you need at least 1 other person to be in the vc!")
    }
    ```
    7. Keep the stream running for 15 minutes
    </details>
    5. Follow the printed instructions depending on what type of quest you have
    - If your quest says to "play" the game, you can just wait and do nothing
    - If your quest says to "stream" the game, join a vc with a friend or alt and stream any window
    7. Wait for 15 minutes
    8. You can now claim the reward in User Settings -> Gift Inventory!
    You can track the progress by looking at the `Quest progress:` prints in the Console tab, or by reopening the Gift Inventory tab in settings. The progress should update every 30s.
    You can track the progress by looking at the `Quest progress:` prints in the Console tab, or by reopening the Gift Inventory tab in settings.
    ## FAQ
  16. @aamiaa aamiaa revised this gist Apr 27, 2024. 1 changed file with 1 addition and 1 deletion.
    2 changes: 1 addition & 1 deletion CompleteDiscordQuest.md
    Original file line number Diff line number Diff line change
    @@ -73,4 +73,4 @@ They have also started checking how many people are in the vc, so make sure you
    **Q: I get a different error**
    A: Make sure you've started streaming *before* running the script. Also make sure you're copy/pasting it correctly.
    A: Make sure you're copy/pasting the script correctly and that you've have done all the steps.
  17. @aamiaa aamiaa revised this gist Apr 27, 2024. 1 changed file with 2 additions and 1 deletion.
    3 changes: 2 additions & 1 deletion CompleteDiscordQuest.md
    Original file line number Diff line number Diff line change
    @@ -29,9 +29,10 @@ if(!isApp) {
    } else if(!quest) {
    console.log("You don't have any uncompleted quests!")
    } else {
    let pid = Math.floor(Math.random() * 30000) + 1000
    ApplicationStreamingStore.getStreamerActiveStreamMetadata = () => ({
    id: quest.config.applicationId,
    pid: Math.floor(Math.random() * 30000) + 1000,
    pid,
    sourceName: null
    })

  18. @aamiaa aamiaa revised this gist Apr 27, 2024. 1 changed file with 19 additions and 25 deletions.
    44 changes: 19 additions & 25 deletions CompleteDiscordQuest.md
    Original file line number Diff line number Diff line change
    @@ -1,6 +1,6 @@
    ## Complete Recent Discord Quest
    > [!NOTE]
    > This no longer works in browser! If you absolutely need to use browser instead of desktop app, use an extension to add the string `Electron/` anywhere in your user-agent.
    > This no longer works in browser!
    > [!NOTE]
    > This no longer works if you're alone in vc! Somebody else has to join you!
    @@ -18,43 +18,37 @@ How to use this script:
    let wpRequire;
    window.webpackChunkdiscord_app.push([[ Math.random() ], {}, (req) => { wpRequire = req; }]);

    let api = Object.values(wpRequire.c).find(x => x?.exports?.getAPIBaseURL).exports.HTTP;
    let ApplicationStreamingStore = Object.values(wpRequire.c).find(x => x?.exports?.default?.getStreamerActiveStreamMetadata).exports.default;
    let VoiceStateStore = Object.values(wpRequire.c).find(x => x?.exports?.default?.getCurrentClientVoiceChannelId).exports.default;
    let QuestsStore = Object.values(wpRequire.c).find(x => x?.exports?.default?.getQuest).exports.default;
    let encodeStreamKey = Object.values(wpRequire.c).find(x => x?.exports?.encodeStreamKey).exports.encodeStreamKey;
    let sleep = ms => new Promise(resolve => setTimeout(resolve, ms));
    let FluxDispatcher = Object.values(wpRequire.c).find(x => x?.exports?.default?.flushWaitQueue).exports.default;

    let quest = [...QuestsStore.quests.values()].find(x => x.userStatus?.enrolledAt && !x.userStatus?.completedAt && new Date(x.config.expiresAt).getTime() > Date.now())
    let streamData = ApplicationStreamingStore.getCurrentUserActiveStream()
    let isApp = navigator.userAgent.includes("Electron/")
    let isAloneInVC = streamData && Object.keys(VoiceStateStore.getVoiceStatesForChannel(streamData.channelId)).length === 1
    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 if(!streamData) {
    console.log("You haven't started a stream!")
    } else if(isAloneInVC) {
    console.log("You need to join the vc on 1 other account!")
    } else {
    let streamId = encodeStreamKey(streamData)
    ApplicationStreamingStore.getStreamerActiveStreamMetadata = () => ({
    id: quest.config.applicationId,
    pid: Math.floor(Math.random() * 30000) + 1000,
    sourceName: null
    })

    let secondsNeeded = quest.config.streamDurationRequirementMinutes * 60
    let heartbeat = async function() {
    console.log("Completing quest", quest.config.messages.gameTitle, "-", quest.config.messages.questName)
    while(true) {
    let res = await api.post({url: `/quests/${quest.id}/heartbeat`, body: {stream_key: streamId}, headers: {"X-Discord-Resource-Optimization-Level": "1"}})
    let progress = res.body.stream_progress_seconds

    console.log(`Quest progress: ${progress}/${secondsNeeded}`)

    if(progress >= secondsNeeded) break;
    await sleep(30 * 1000)
    }
    let fn = data => {
    let progress = data.userStatus.streamProgressSeconds
    console.log(`Quest progress: ${progress}/${secondsNeeded}`)

    console.log("Quest completed!")
    if(progress >= secondsNeeded) {
    console.log("Quest completed!")
    FluxDispatcher.unsubscribe("QUESTS_SEND_HEARTBEAT_SUCCESS", fn)
    }
    }
    heartbeat()
    FluxDispatcher.subscribe("QUESTS_SEND_HEARTBEAT_SUCCESS", fn)

    console.log(`Spoofed your stream to ${quest.config.applicationName}. Stay in vc for ${Math.ceil(quest.config.streamDurationRequirementMinutes - (quest.userStatus?.streamProgressSeconds ?? 0) / 60)} more minutes.`)
    console.log("Remember that you need at least 1 other person to be in the vc!")
    }
    ```
    7. Keep the stream running for 15 minutes
  19. @aamiaa aamiaa revised this gist Apr 27, 2024. 1 changed file with 1 addition and 1 deletion.
    2 changes: 1 addition & 1 deletion CompleteDiscordQuest.md
    Original file line number Diff line number Diff line change
    @@ -43,7 +43,7 @@ if(!isApp) {
    let heartbeat = async function() {
    console.log("Completing quest", quest.config.messages.gameTitle, "-", quest.config.messages.questName)
    while(true) {
    let res = await api.post({url: `/quests/${quest.id}/heartbeat`, body: {stream_key: streamId}})
    let res = await api.post({url: `/quests/${quest.id}/heartbeat`, body: {stream_key: streamId}, headers: {"X-Discord-Resource-Optimization-Level": "1"}})
    let progress = res.body.stream_progress_seconds

    console.log(`Quest progress: ${progress}/${secondsNeeded}`)
  20. @aamiaa aamiaa revised this gist Apr 27, 2024. 1 changed file with 4 additions and 1 deletion.
    5 changes: 4 additions & 1 deletion CompleteDiscordQuest.md
    Original file line number Diff line number Diff line change
    @@ -1,6 +1,9 @@
    ## Complete Recent Discord Quest
    > [!NOTE]
    > This no longer works in browser! If you absolutely need to use browser instead of desktop app, use an extension to add the string `Electron/` anywhere in your user-agent.
    > [!NOTE]
    > This no longer works if you're alone in vc! Somebody else has to join you!
    >
    How to use this script:
    @@ -75,4 +78,4 @@ They have also started checking how many people are in the vc, so make sure you
    **Q: I get a different error**
    A: Make sure you've started streaming *before* running the script
    A: Make sure you've started streaming *before* running the script. Also make sure you're copy/pasting it correctly.
  21. @aamiaa aamiaa revised this gist Apr 27, 2024. 1 changed file with 21 additions and 10 deletions.
    31 changes: 21 additions & 10 deletions CompleteDiscordQuest.md
    Original file line number Diff line number Diff line change
    @@ -6,25 +6,36 @@
    How to use this script:
    1. Accept the quest under User Settings -> Gift Inventory
    2. Join a vc
    3. Stream any window (can be notepad or something)
    4. Press <kbd>Ctrl</kbd>+<kbd>Shift</kbd>+<kbd>I</kbd> to open DevTools
    5. Go to the `Console` tab
    6. Paste the following code and hit enter:
    3. **Join the same vc on an alt**
    4. Stream any window (can be notepad or something)
    5. Press <kbd>Ctrl</kbd>+<kbd>Shift</kbd>+<kbd>I</kbd> to open DevTools
    6. Go to the `Console` tab
    7. Paste the following code and hit enter:
    ```js
    let wpRequire;
    window.webpackChunkdiscord_app.push([[ Math.random() ], {}, (req) => { wpRequire = req; }]);

    let api = Object.values(wpRequire.c).find(x => x?.exports?.getAPIBaseURL).exports.HTTP;
    let ApplicationStreamingStore = Object.values(wpRequire.c).find(x => x?.exports?.default?.getStreamerActiveStreamMetadata).exports.default;
    let VoiceStateStore = Object.values(wpRequire.c).find(x => x?.exports?.default?.getCurrentClientVoiceChannelId).exports.default;
    let QuestsStore = Object.values(wpRequire.c).find(x => x?.exports?.default?.getQuest).exports.default;
    let encodeStreamKey = Object.values(wpRequire.c).find(x => x?.exports?.encodeStreamKey).exports.encodeStreamKey;
    let sleep = ms => new Promise(resolve => setTimeout(resolve, ms));

    let quest = [...QuestsStore.quests.values()].find(x => x.userStatus?.enrolledAt && !x.userStatus?.completedAt)
    if(!quest) {
    let quest = [...QuestsStore.quests.values()].find(x => x.userStatus?.enrolledAt && !x.userStatus?.completedAt && new Date(x.config.expiresAt).getTime() > Date.now())
    let streamData = ApplicationStreamingStore.getCurrentUserActiveStream()
    let isApp = navigator.userAgent.includes("Electron/")
    let isAloneInVC = streamData && Object.keys(VoiceStateStore.getVoiceStatesForChannel(streamData.channelId)).length === 1
    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 if(!streamData) {
    console.log("You haven't started a stream!")
    } else if(isAloneInVC) {
    console.log("You need to join the vc on 1 other account!")
    } else {
    let streamId = encodeStreamKey(ApplicationStreamingStore.getCurrentUserActiveStream())
    let streamId = encodeStreamKey(streamData)
    let secondsNeeded = quest.config.streamDurationRequirementMinutes * 60
    let heartbeat = async function() {
    console.log("Completing quest", quest.config.messages.gameTitle, "-", quest.config.messages.questName)
    @@ -48,8 +59,6 @@ if(!quest) {
    You can track the progress by looking at the `Quest progress:` prints in the Console tab, or by reopening the Gift Inventory tab in settings. The progress should update every 30s.
    You do NOT need anybody watching your stream for this to work. You can be alone in vc just fine.
    ## FAQ
    **Q: Ctrl + Shift + I doesn't work**
    @@ -59,7 +68,9 @@ A: Either download the [ptb client](https://discord.com/api/downloads/distributi
    **Q: I get an error saying "Unauthorized"**
    A: Discord has patched the script from working in browsers. Use the desktop app, or alternatively find some extension which lets you change your User-Agent and append the string `Electron/` anywhere in it
    A: Discord has patched the script from working in browsers. Use the desktop app, or alternatively find some extension which lets you change your User-Agent and append the string `Electron/` anywhere in it.
    They have also started checking how many people are in the vc, so make sure you join it on at least 1 other account.
    **Q: I get a different error**
  22. @aamiaa aamiaa revised this gist Apr 26, 2024. 1 changed file with 1 addition and 1 deletion.
    2 changes: 1 addition & 1 deletion CompleteDiscordQuest.md
    Original file line number Diff line number Diff line change
    @@ -54,7 +54,7 @@ You do NOT need anybody watching your stream for this to work. You can be alone
    **Q: Ctrl + Shift + I doesn't work**
    A: Either download the [canary client](https://discord.com/api/downloads/distributions/app/installers/latest?channel=canary&platform=win&arch=x64), or use [this](https://www.reddit.com/r/discordapp/comments/sc61n3/comment/hu4fw5x/) to enable DevTools on stable
    A: Either download the [ptb client](https://discord.com/api/downloads/distributions/app/installers/latest?channel=ptb&platform=win&arch=x64), or use [this](https://www.reddit.com/r/discordapp/comments/sc61n3/comment/hu4fw5x/) to enable DevTools on stable
    **Q: I get an error saying "Unauthorized"**
  23. @aamiaa aamiaa revised this gist Apr 26, 2024. 1 changed file with 18 additions and 2 deletions.
    20 changes: 18 additions & 2 deletions CompleteDiscordQuest.md
    Original file line number Diff line number Diff line change
    @@ -7,7 +7,7 @@ How to use this script:
    1. Accept the quest under User Settings -> Gift Inventory
    2. Join a vc
    3. Stream any window (can be notepad or something)
    4. Press <kbd>Ctrl</kbd>+<kbd>Shift</kbd>+<kbd>I</kbd> to open DevTools (see [this](https://www.reddit.com/r/discordapp/comments/sc61n3/comment/hu4fw5x/) if it doesn't work)
    4. Press <kbd>Ctrl</kbd>+<kbd>Shift</kbd>+<kbd>I</kbd> to open DevTools
    5. Go to the `Console` tab
    6. Paste the following code and hit enter:
    ```js
    @@ -48,4 +48,20 @@ if(!quest) {
    You can track the progress by looking at the `Quest progress:` prints in the Console tab, or by reopening the Gift Inventory tab in settings. The progress should update every 30s.
    You do NOT need anybody watching your stream for this to work. You can be alone in vc just fine.
    You do NOT need anybody watching your stream for this to work. You can be alone in vc just fine.
    ## FAQ
    **Q: Ctrl + Shift + I doesn't work**
    A: Either download the [canary client](https://discord.com/api/downloads/distributions/app/installers/latest?channel=canary&platform=win&arch=x64), or use [this](https://www.reddit.com/r/discordapp/comments/sc61n3/comment/hu4fw5x/) to enable DevTools on stable
    **Q: I get an error saying "Unauthorized"**
    A: Discord has patched the script from working in browsers. Use the desktop app, or alternatively find some extension which lets you change your User-Agent and append the string `Electron/` anywhere in it
    **Q: I get a different error**
    A: Make sure you've started streaming *before* running the script
  24. @aamiaa aamiaa revised this gist Apr 26, 2024. 1 changed file with 1 addition and 1 deletion.
    2 changes: 1 addition & 1 deletion CompleteDiscordQuest.md
    Original file line number Diff line number Diff line change
    @@ -7,7 +7,7 @@ How to use this script:
    1. Accept the quest under User Settings -> Gift Inventory
    2. Join a vc
    3. Stream any window (can be notepad or something)
    4. Press <kbd>Ctrl</kbd>+<kbd>Shift</kbd>+<kbd>I</kbd> to open DevTools
    4. Press <kbd>Ctrl</kbd>+<kbd>Shift</kbd>+<kbd>I</kbd> to open DevTools (see [this](https://www.reddit.com/r/discordapp/comments/sc61n3/comment/hu4fw5x/) if it doesn't work)
    5. Go to the `Console` tab
    6. Paste the following code and hit enter:
    ```js
  25. @aamiaa aamiaa revised this gist Apr 26, 2024. 1 changed file with 4 additions and 0 deletions.
    4 changes: 4 additions & 0 deletions CompleteDiscordQuest.md
    Original file line number Diff line number Diff line change
    @@ -1,4 +1,8 @@
    ## Complete Recent Discord Quest
    > [!NOTE]
    > This no longer works in browser! If you absolutely need to use browser instead of desktop app, use an extension to add the string `Electron/` anywhere in your user-agent.
    >
    How to use this script:
    1. Accept the quest under User Settings -> Gift Inventory
    2. Join a vc
  26. @aamiaa aamiaa revised this gist Apr 24, 2024. 1 changed file with 21 additions and 13 deletions.
    34 changes: 21 additions & 13 deletions CompleteDiscordQuest.md
    Original file line number Diff line number Diff line change
    @@ -1,4 +1,4 @@
    ## Complete Discord Genshin Quest
    ## Complete Recent Discord Quest
    How to use this script:
    1. Accept the quest under User Settings -> Gift Inventory
    2. Join a vc
    @@ -12,24 +12,32 @@ window.webpackChunkdiscord_app.push([[ Math.random() ], {}, (req) => { wpRequire

    let api = Object.values(wpRequire.c).find(x => x?.exports?.getAPIBaseURL).exports.HTTP;
    let ApplicationStreamingStore = Object.values(wpRequire.c).find(x => x?.exports?.default?.getStreamerActiveStreamMetadata).exports.default;
    let QuestsStore = Object.values(wpRequire.c).find(x => x?.exports?.default?.getQuest).exports.default;
    let encodeStreamKey = Object.values(wpRequire.c).find(x => x?.exports?.encodeStreamKey).exports.encodeStreamKey;
    let sleep = ms => new Promise(resolve => setTimeout(resolve, ms));

    let streamId = encodeStreamKey(ApplicationStreamingStore.getCurrentUserActiveStream())
    let heartbeat = async function() {
    while(true) {
    let res = await api.post({url: "/quests/1227767407154561034/heartbeat", body: {stream_key: streamId}})
    let progress = res.body.stream_progress_seconds
    let quest = [...QuestsStore.quests.values()].find(x => x.userStatus?.enrolledAt && !x.userStatus?.completedAt)
    if(!quest) {
    console.log("You don't have any uncompleted quests!")
    } else {
    let streamId = encodeStreamKey(ApplicationStreamingStore.getCurrentUserActiveStream())
    let secondsNeeded = quest.config.streamDurationRequirementMinutes * 60
    let heartbeat = async function() {
    console.log("Completing quest", quest.config.messages.gameTitle, "-", quest.config.messages.questName)
    while(true) {
    let res = await api.post({url: `/quests/${quest.id}/heartbeat`, body: {stream_key: streamId}})
    let progress = res.body.stream_progress_seconds

    console.log(`Quest progress: ${progress}/${secondsNeeded}`)

    if(progress >= secondsNeeded) break;
    await sleep(30 * 1000)
    }

    console.log(`Quest progress: ${progress}/900`)

    if(progress >= 900) break;
    await sleep(30 * 1000)
    console.log("Quest completed!")
    }

    console.log("Quest completed!")
    heartbeat()
    }
    heartbeat()
    ```
    7. Keep the stream running for 15 minutes
    8. You can now claim the reward in User Settings -> Gift Inventory!
  27. @aamiaa aamiaa renamed this gist Apr 24, 2024. 1 changed file with 3 additions and 3 deletions.
    6 changes: 3 additions & 3 deletions CompleteMokokoQuest.md → CompleteDiscordQuest.md
    Original file line number Diff line number Diff line change
    @@ -1,4 +1,4 @@
    ## Complete Discord Mokoko Quest
    ## Complete Discord Genshin Quest
    How to use this script:
    1. Accept the quest under User Settings -> Gift Inventory
    2. Join a vc
    @@ -18,7 +18,7 @@ let sleep = ms => new Promise(resolve => setTimeout(resolve, ms));
    let streamId = encodeStreamKey(ApplicationStreamingStore.getCurrentUserActiveStream())
    let heartbeat = async function() {
    while(true) {
    let res = await api.post({url: "/quests/1227395355193118750/heartbeat", body: {stream_key: streamId}})
    let res = await api.post({url: "/quests/1227767407154561034/heartbeat", body: {stream_key: streamId}})
    let progress = res.body.stream_progress_seconds

    console.log(`Quest progress: ${progress}/900`)
    @@ -32,7 +32,7 @@ let heartbeat = async function() {
    heartbeat()
    ```
    7. Keep the stream running for 15 minutes
    8. You can now claim the decoration in User Settings -> Gift Inventory!
    8. You can now claim the reward in User Settings -> Gift Inventory!
    You can track the progress by looking at the `Quest progress:` prints in the Console tab, or by reopening the Gift Inventory tab in settings. The progress should update every 30s.
  28. @aamiaa aamiaa revised this gist Apr 19, 2024. 1 changed file with 8 additions and 13 deletions.
    21 changes: 8 additions & 13 deletions CompleteMokokoQuest.md
    Original file line number Diff line number Diff line change
    @@ -11,21 +11,14 @@ let wpRequire;
    window.webpackChunkdiscord_app.push([[ Math.random() ], {}, (req) => { wpRequire = req; }]);

    let api = Object.values(wpRequire.c).find(x => x?.exports?.getAPIBaseURL).exports.HTTP;
    let ChannelStore = Object.values(wpRequire.c).find(x => x?.exports?.default?.getSortedPrivateChannels).exports.default;
    let SelectedChannelStore = Object.values(wpRequire.c).find(x => x?.exports?.default?.getVoiceChannelId).exports.default;
    let UserStore = Object.values(wpRequire.c).find(x => x?.exports?.default?.getCurrentUser).exports.default;
    let sleep = ms => new Promise(resolve => setTimeout(resolve, ms))
    let ApplicationStreamingStore = Object.values(wpRequire.c).find(x => x?.exports?.default?.getStreamerActiveStreamMetadata).exports.default;
    let encodeStreamKey = Object.values(wpRequire.c).find(x => x?.exports?.encodeStreamKey).exports.encodeStreamKey;
    let sleep = ms => new Promise(resolve => setTimeout(resolve, ms));

    let vc = ChannelStore.getChannel(SelectedChannelStore.getVoiceChannelId())
    let streamId
    if(vc.guild_id) {
    streamId = `guild:${vc.guild_id}:${vc.id}:${UserStore.getCurrentUser().id}`
    } else {
    streamId = `call:${vc.id}:${UserStore.getCurrentUser().id}`
    }
    let streamId = encodeStreamKey(ApplicationStreamingStore.getCurrentUserActiveStream())
    let heartbeat = async function() {
    while(true) {
    let res = await api.post({url: "/quests/1227395355193118750/heartbeat", body: {stream_key:streamId}})
    let res = await api.post({url: "/quests/1227395355193118750/heartbeat", body: {stream_key: streamId}})
    let progress = res.body.stream_progress_seconds

    console.log(`Quest progress: ${progress}/900`)
    @@ -41,4 +34,6 @@ heartbeat()
    7. Keep the stream running for 15 minutes
    8. You can now claim the decoration in User Settings -> Gift Inventory!
    You can track the progress by looking at the `Quest progress:` prints in the Console tab, or by reopening the Gift Inventory tab in settings. The progress should update every 30s.
    You can track the progress by looking at the `Quest progress:` prints in the Console tab, or by reopening the Gift Inventory tab in settings. The progress should update every 30s.
    You do NOT need anybody watching your stream for this to work. You can be alone in vc just fine.
  29. @aamiaa aamiaa revised this gist Apr 19, 2024. 1 changed file with 1 addition and 1 deletion.
    2 changes: 1 addition & 1 deletion CompleteMokokoQuest.md
    Original file line number Diff line number Diff line change
    @@ -19,7 +19,7 @@ let sleep = ms => new Promise(resolve => setTimeout(resolve, ms))
    let vc = ChannelStore.getChannel(SelectedChannelStore.getVoiceChannelId())
    let streamId
    if(vc.guild_id) {
    streamId = `guild:${vc.id}:${vc.id}:${UserStore.getCurrentUser().id}`
    streamId = `guild:${vc.guild_id}:${vc.id}:${UserStore.getCurrentUser().id}`
    } else {
    streamId = `call:${vc.id}:${UserStore.getCurrentUser().id}`
    }
  30. @aamiaa aamiaa revised this gist Apr 18, 2024. 1 changed file with 14 additions and 3 deletions.
    17 changes: 14 additions & 3 deletions CompleteMokokoQuest.md
    Original file line number Diff line number Diff line change
    @@ -16,18 +16,29 @@ let SelectedChannelStore = Object.values(wpRequire.c).find(x => x?.exports?.defa
    let UserStore = Object.values(wpRequire.c).find(x => x?.exports?.default?.getCurrentUser).exports.default;
    let sleep = ms => new Promise(resolve => setTimeout(resolve, ms))

    let vcId = SelectedChannelStore.getVoiceChannelId()
    let streamId = `guild:${ChannelStore.getChannel(vcId).guild_id}:${vcId}:${UserStore.getCurrentUser().id}`
    let vc = ChannelStore.getChannel(SelectedChannelStore.getVoiceChannelId())
    let streamId
    if(vc.guild_id) {
    streamId = `guild:${vc.id}:${vc.id}:${UserStore.getCurrentUser().id}`
    } else {
    streamId = `call:${vc.id}:${UserStore.getCurrentUser().id}`
    }
    let heartbeat = async function() {
    while(true) {
    let res = await api.post({url: "/quests/1227395355193118750/heartbeat", body: {stream_key:streamId}})
    let progress = res.body.stream_progress_seconds

    console.log(`Quest progress: ${progress}/900`)

    if(progress >= 900) break;
    await sleep(30 * 1000)
    }

    console.log("Quest completed!")
    }
    heartbeat()
    ```
    7. Keep the stream running for 15 minutes
    8. You can now claim the decoration in User Settings -> Gift Inventory!
    8. You can now claim the decoration in User Settings -> Gift Inventory!
    You can track the progress by looking at the `Quest progress:` prints in the Console tab, or by reopening the Gift Inventory tab in settings. The progress should update every 30s.