Viewing old revision of Module:Trade_Items
You are viewing an old revision of this page from 2/19/2026, 11:07:45 AM.
View latest versionconst 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 wikiNavbox() {
const { data, version } = await Utils.resolveData("Trade_Items", true);
if (Utils.isModuleEmpty(data)) {
return '⚠️ Trade items 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 items 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,
wikiNavbox,
wikiTooltip
}