Neopets - Quest Log Simplify

Displays all quests, daily, streak, neopass daily, and neopass weekly all on a single page! Plus quick link to complete each quest!

// ==UserScript==
// @name         Neopets - Quest Log Simplify
// @namespace    karla@neopointskarla
// @license GPL3
// @version      2025-07-01
// @description  Displays all quests, daily, streak, neopass daily, and neopass weekly all on a single page! Plus quick link to complete each quest!
// @author       Karla
// @match        *://*.neopets.com/questlog/
// @homepage     https://neopointskarla.com
// @icon         https://www.google.com/s2/favicons?sz=64&domain=neopets.com
// @grant        GM_addStyle
// @grant        GM.xmlHttpRequest
// ==/UserScript==

GM_addStyle("#QuestLogStreakRewards { display: block !important; }");
GM_addStyle("#QuestLogStreakBonus { margin-left: 40px !important; }");
GM_addStyle("#QuestLogBonusRewards { padding-bottom: 20px !important; }");
GM_addStyle(
  ".ql-bonus-img { width: 40px !important; height: 40px !important; margin-right: 0.5em !important; }",
);
GM_addStyle(".ql-bonus-img img { width: 100% !important; }");
GM_addStyle(
  ".questlog-header, .questlog-info, .ql-dots, .ql-bonus-label, .ql-progress-bar, .ql-skip, #QuestLogQuests .ql-tasks { display: none !important; }",
);
GM_addStyle(".ql-bonus-reward { flex-direction: row !important; }");
GM_addStyle(".questlog-quest { height: auto !important; }");
GM_addStyle(
  ".ql-reward img { height: 50px !important; width: 50px !important; }",
);
GM_addStyle(".ql-reward { gap: 0 !important; padding: 0 !important; }");
GM_addStyle(
  ".ql-quest-buttons { width: auto !important; margin: 0 !important; display: inline-block !important; float: right !important; }",
);
GM_addStyle(".ql-quest-description { display: inline-block !important; }");
GM_addStyle(".ql-progress { margin-top: 0 !important; }");
GM_addStyle(".questlog-bonus-rewards { padding: 0 !important; }");
GM_addStyle("#QuestLogStreakRewards { padding-bottom: 20px !important; }");
GM_addStyle(".questlog-tabs { display: none !important; }");
GM_addStyle(".ql-quest-details::after { pointer-events: none; }");

let questLogBody;
let questLogTracker;
let neopassDailyHTML;
let neopassWeeklyHTML;

{
  const formData = new FormData();
  formData.append("_ref_ck", getCK());
  formData.append("tab", "3");
  formData.append("tabGroup", "3");
  GM.xmlHttpRequest({
    method: "POST",
    url: "https://www.neopets.com/np-templates/ajax/questlog/retrieveQuests.php",
    headers: {
      "x-requested-with": "XMLHttpRequest",
    },
    data: formData,
    onload: function (response) {
      neopassDailyHTML = JSON.parse(response.responseText).output;
    },
    onerror: function (error) {
      console.error("Request failed:", error);
    },
  });
}

{
  const formData = new FormData();
  formData.append("_ref_ck", getCK());
  formData.append("tab", "3");
  formData.append("tabGroup", "4");
  GM.xmlHttpRequest({
    method: "POST",
    url: "https://www.neopets.com/np-templates/ajax/questlog/retrieveQuests.php",
    headers: {
      "x-requested-with": "XMLHttpRequest",
    },
    data: formData,
    onload: function (response) {
      neopassWeeklyHTML = JSON.parse(response.responseText).output;
    },
    onerror: function (error) {
      console.error("Request failed:", error);
    },
  });
}

const interval = setInterval(() => {
  if (document.querySelector("#QuestLogStreakBonus")) {
    clearInterval(interval);
    $(".ql-quest-details .ql-task-num").each(function (e) {
      $(this)
        .parent()
        .parent()
        .parent()
        .find(".ql-quest-title")
        .append(" - " + $(this).text());
    });

    questLogBody = document.querySelector("#QuestLogBody");
    questLogTracker = document.querySelector(
      "#QuestLogBody .questlog-bonus-rewards",
    );

    const questDescriptionEls = document.querySelectorAll(
      ".ql-quest-description",
    );
    for (let i = 0; i < questDescriptionEls.length; i += 1) {
      const qdEl = questDescriptionEls[i];
      const description = qdEl.textContent.trim();
      let link = "";
      switch (description) {
        case "Spin the Wheel of Mediocrity in Tyrannia":
          link = "https://www.neopets.com/prehistoric/mediocrity.phtml";
          break;
        case "Spin the Wheel of Excitement in Faerieland":
          link = "https://www.neopets.com/faerieland/wheel.phtml";
          break;
        case "Spin the Wheel of Misfortune in the Haunted Woods":
          link = "https://www.neopets.com/halloween/wheel/index.phtml";
          break;
        case "Spin the Wheel of Knowledge in Brightvale":
          link = "https://www.neopets.com/medieval/knowledge.phtml";
          break;
        case "Play any Game or Classic Game in the Games Room":
          link =
            "https://www.neopets.com/games/game.phtml?game_id=805&size=regular&quality=high&play=true";
          break;
        case "Purchase item(s) from any Neopian Shop":
          link = "https://www.neopets.com/generalstore.phtml";
          break;
        case "Feed any food item to one of your Neopets":
          link = "https://www.neopets.com/inventory.phtml";
          break;
        case "Customise one of your Neopets":
          link = "https://www.neopets.com/customise";
          break;
        case "Groom one of your Neopets with any grooming item":
          link = "https://www.neopets.com/inventory.phtml";
          break;
      }
      if (link) {
        const anchor = document.createElement("a");
        anchor.href = link;
        anchor.target = "_blank";
        anchor.innerHTML = description;
        qdEl.innerHTML = "";
        qdEl.append(anchor);
      }
    }
  }
}, 100);

const interval2 = setInterval(() => {
  console.log(
    questLogBody,
    questLogTracker,
    neopassDailyHTML,
    neopassWeeklyHTML,
  );
  if (
    questLogBody &&
    questLogTracker &&
    neopassDailyHTML &&
    neopassWeeklyHTML
  ) {
    {
      const outerDiv = document.createElement("div");
      outerDiv.innerHTML = neopassDailyHTML;
      const trackerEl = outerDiv.querySelector(".questlog-bonus-rewards");
      const questsEl = outerDiv.querySelector("#QuestLogQuests");
      questsEl.id = "QuestLogQuestsNPDaily";
      questLogTracker.append(trackerEl);
      questLogBody.append(questsEl);
    }
    {
      const outerDiv = document.createElement("div");
      outerDiv.innerHTML = neopassWeeklyHTML;
      const trackerEl = outerDiv.querySelector(".questlog-bonus-rewards");
      const questsEl = outerDiv.querySelector("#QuestLogQuests");
      questsEl.id = "QuestLogQuestsNPWeekly";
      questLogTracker.append(trackerEl);
      questLogBody.append(questsEl);
    }
    clearInterval(interval2);
  }
}, 100);