ATLYSS TechPendium

Module:Trade Items

Viewing old revision of Module:Trade_Items

You are viewing an old revision of this page from 2/18/2026, 9:48:30 AM.

View latest version
This Module contains Wiki logic and must be loaded using require keyword inside other logic modules.
Note that require supports only static imports.
This module can be {{#invoke}}-ed to render dynamic parts of the page.
const Utils = await require("Utils");
const Wiki = await require("Wiki");
const { latest: latestVersion } = await requireData("Versions");
const { TooltipBuilder } = await require("Tooltip_Builder");

function renderTable(items, version, notes = {}) {
    let wikitext = "";
    let tooltips = "";

    const notesAvailable = !!Object.keys(notes).length;

    wikitext += '{| class="wiki-table" style="width: auto;"\n';
    wikitext += `! colspan=${notesAvailable ? "4" : "3"} | Version: ${Wiki.versionSelector(version, "Trade_Items", "wikiTable")}:\n`;
    wikitext += '|-\n';
    wikitext += `! Name !! Rarity !! Max Stack${notesAvailable ? " !! Notes" : ""}\n`;


    for (const id in items) {
        const item = items[id];

        wikitext += '|-\n';

        const tooltipId = `TradeItem:Table:${id}`;

        // Name
        wikitext += `| data-tooltip-id="${tooltipId}" | [[Trade Items/${item.name || id}|${item.name || id}]]\n`;

        // Rarity
        if (item.rarity) {
            wikitext += `| ${Wiki.wikiRarity(item.rarity)}\n`;
        } else {
            wikitext += `| N/A}\n`;
        }

        // Max Stack
        if (item.stack?.max) {
            wikitext += `| ${item.stack.max}\n`;
        } else {
            wikitext += `| N/A\n`;
        }

        // Optional Notes
        if (notesAvailable) {
            if (notes[item.name]) {
                wikitext += `| ${notes[item.name]}\n`;
            } else {
                wikitext += "|\n";
            }
        }

        // Add tooltip
        const tooltip = new TooltipBuilder(tooltipId);
        tooltip.addLine(`'''${item.name || id}'''`);
        if (item.description) {
            const lines = item.description.replace(/\n{2,}/g, "\n").split('\n');
            for (const line of lines) {
                tooltip.addLine(line.replace(/<color=(.*?)>(.*?)<\/color>/g, "<span style='color:$1;'>$2</span>"));
            }
        }
        tooltips += tooltip.build();
    }

    wikitext += '|}\n';
    wikitext += tooltips;

    return wikitext;
}

function renderNavbox(items, version) {
    let wikitext = '';

    const versionTooltip = new TooltipBuilder(`TradeItem:Navbox:Version:${version.replace(/\./g, '_')}`);
    versionTooltip.addLine(`Data version: '''${version}''' <span class="${version === latestVersion ? 'latest' : 'outdated'}">(${version === latestVersion ? 'latest' : 'outdated'})</span>`);

    wikitext += `{| class="wiki-table navbox"\n`;
    wikitext += `! Version: ${Wiki.versionCode(version, versionTooltip)}\n`;
    wikitext += `|-\n`;
    wikitext += `! Trade Items Navigation\n`;

    const itemsList = [];
    let tooltips = "";

    for (const id in items) {
        const item = items[id];

        const tooltipId = `TradeItem:Navbox:${id}`;

        itemsList.push(`<span data-tooltip-id="${tooltipId}">[[Trade Items/${item.name || id}|${item.name || id}]]</span>`);

        // Add tooltip
        const tooltip = new TooltipBuilder(tooltipId);
        tooltip.addLine(`'''${item.name || id}'''`);
        if (item.description) {
            const lines = item.description.replace(/\n{2,}/g, "\n").split('\n');
            for (const line of lines) {
                tooltip.addLine(line.replace(/<color=(.*?)>(.*?)<\/color>/g, "<span style='color:$1;'>$2</span>"));
            }
        }
        tooltips += tooltip.build();
    }

    wikitext += `|-\n`;
    wikitext += `| ${itemsList.join(' • ')}\n`;
    wikitext += `|}\n`;
    wikitext += tooltips;

    return wikitext;
}

async function wikiTable(props) {
    const args = Utils.resolveArgs(props);
    const selectedVersion = args["version"] || args[0];
    const notes = args["notes"];

    const { data, version } = await Utils.resolveData("Trade_Items", false, selectedVersion);

    if (Utils.isModuleEmpty(data)) {
        return `<div id="Trade_Items-wikiTable">⚠️ Trade item data is unavailable for version ${version}.${Wiki.versionSelector(version, "Trade_Items", "wikiTable")}</div>`;
    }

    const parsedNotes = notes?.length
        ? notes.split(",").reduce((acc, pair) => {
            const [key, ...rest] = pair.split(":");

            if (!key) return acc;

            acc[key.trim()] = rest.join(":").trim();
            return acc;
        }, {})
        : notes;

    const sortedData = Utils.sortObjectByKey(data);

    return `<div id="Trade_Items-wikiTable">${renderTable(sortedData, version, parsedNotes || {})}</div>`
};

async function TEST_navbox() {
    const { data, version } = await Utils.resolveData("Trade_Items", true);

    if (Utils.isModuleEmpty(data)) {
        return '⚠️ Trade item data is unavailable for all known versions.';
    }

    const sortedData = Utils.sortObjectByKey(data);

    let output = '';
    output += renderNavbox(sortedData, version);

    return output;
};

async function wikiTooltip(props) {
    const args = Utils.resolveArgs(props);
    const { data, version } = await Utils.resolveData("Trade_Items", true);

    if (Utils.isModuleEmpty(data)) {
        return '⚠️ Trade item data is unavailable for all known versions.';
    }

    const itemId = (args["item"] || args[0])?.toLowerCase()?.replace(/\s+/g, '_');
    const itemData = data[itemId];

    if (!itemData) {
        return `⚠️ Trade item '${args["item"] || args[0]}' not found in data version ${version}.`;
    }

    const tooltip = new TooltipBuilder(`TradeItem:item:${itemId}`);
    tooltip.addLine(`'''${itemData.name || args["item"] || args[0]}'''`);
    if (itemData.description) {
        const lines = itemData.description.replace(/\n{2,}/g, "\n").split('\n');
        for (const line of lines) {
            tooltip.addLine(line.replace(/<color=(.*?)>(.*?)<\/color>/g, "<span style='color:$1;'>$2</span>"));
        }
    }

    return `<span data-tooltip-id="TradeItem:item:${itemId}">[[Trade Items/${itemData.name || args["item"] || args[0]}|${itemData.name || args["item"] || args[0]}]]</span>` + tooltip.build();
}

exports = {
    wikiTable,
    TEST_navbox,
    wikiTooltip
}
Last Edited by LiveGobe on 2/18/2026, 9:48:30 AM

This page categories: