feat: add festive and botkiller categories to pricebox

festives are now shown with their quality rather than "Festive" and "Strange Festive"
botkillers are sorted by release, and displayed without "Mk.I" to save space
This commit is contained in:
xenticore
2025-04-07 15:57:41 -04:00
parent eada50c0e8
commit 779cd12153

View File

@@ -187,9 +187,16 @@ async function inject() {
var updateTime: Date | null = null; var updateTime: Date | null = null;
enum PriceRowCategory {
None,
Festive,
Botkiller
}
interface PriceRow { interface PriceRow {
order: number order: number
row: HTMLTableRowElement row: HTMLTableRowElement
category: PriceRowCategory
} }
var priceRows: PriceRow[]= []; var priceRows: PriceRow[]= [];
@@ -214,7 +221,7 @@ async function inject() {
const qualityName = itemQualities[quality as unknown as keyof typeof itemQualities].toString() const qualityName = itemQualities[quality as unknown as keyof typeof itemQualities].toString()
const priceRow = createPriceRow(qualityName, data, keyPrice, locale) const priceRow = createPriceRow(qualityName, data, keyPrice, locale)
priceRows.push({order: quality == 6 ? -1 : quality, row: priceRow) priceRows.push({order: quality == 6 ? -1 : quality, row: priceRow, category: PriceRowCategory.None})
}) })
// Check item schema for Australium variant of current defindex // Check item schema for Australium variant of current defindex
@@ -231,14 +238,25 @@ async function inject() {
const priceRow = createPriceRow($T("Australium"), data, keyPrice, locale, "https://wiki.teamfortress.com/wiki/Australium_weapons") const priceRow = createPriceRow($T("Australium"), data, keyPrice, locale, "https://wiki.teamfortress.com/wiki/Australium_weapons")
priceRows.push({order: 99, row: priceRow) priceRows.push({order: 99, row: priceRow, category: PriceRowCategory.None})
resolve() resolve()
return return
})) }))
} }
var festiveHeadingRow: HTMLTableRowElement | null
// Check item schema for Festive variant of current defindex // Check item schema for Festive variant of current defindex
if(itemSchema[itemIndex].festiveVariant != null) { if(itemSchema[itemIndex].festiveVariant != null) {
/// Create subheading
festiveHeadingRow = document.createElement("tr")
const festiveHeading = document.createElement("th")
festiveHeading.className = "infobox-subheader"
festiveHeading.colSpan = 2
festiveHeading.innerText = $T("Festive")
festiveHeading.style.fontSize = '1em';
festiveHeading.style.backgroundColor = '#F5C087';
festiveHeadingRow.appendChild(festiveHeading);
promises.push(new Promise(async (resolve) => { promises.push(new Promise(async (resolve) => {
logDebug(`Fetching price for Festive ${itemName}`) logDebug(`Fetching price for Festive ${itemName}`)
var data: ItemPriceData | null var data: ItemPriceData | null
@@ -249,9 +267,9 @@ async function inject() {
log(`Festive ${itemName} is unpriced or unavailable, skipping...`) log(`Festive ${itemName} is unpriced or unavailable, skipping...`)
} }
const priceRow = createPriceRow($T("Festive"), data, keyPrice, locale, "https://wiki.teamfortress.com/wiki/Festive_weapons") const priceRow = createPriceRow($T("Unique"), data, keyPrice, locale)
priceRows.push({order: -1, row: priceRow}) priceRows.push({order: -1, row: priceRow, category: PriceRowCategory.Festive})
resolve() resolve()
return return
})) }))
@@ -265,14 +283,65 @@ async function inject() {
log(`Strange Festive ${itemName} is unpriced or unavailable, skipping...`) log(`Strange Festive ${itemName} is unpriced or unavailable, skipping...`)
} }
const priceRow = createPriceRow($T("Strange Festive"), data, keyPrice, locale, "https://wiki.teamfortress.com/wiki/Festive_weapons") const priceRow = createPriceRow($T("Strange"), data, keyPrice, locale)
priceRows.push({order: 11, row: priceRow}) priceRows.push({order: 11, row: priceRow, category: PriceRowCategory.Festive})
resolve() resolve()
return return
})) }))
} }
// Silver Mk.I, Gold Mk.II, Rust, Blood, Carbonado, Diamond, Silver Mk.II, Gold Mk.II
const botkillerOrder = [
"Silver",
"Gold",
"Rust",
"Blood",
"Carbonado",
"Diamond",
"Silver Mk.II",
"Gold Mk.II",
]
var botKillerHeadingRow: HTMLTableRowElement | null
if(itemSchema[itemIndex].botkillerVariants != null && itemSchema[itemIndex].botkillerVariants.length > 0) {
/// Create subheading
botKillerHeadingRow = document.createElement("tr")
const festiveHeading = document.createElement("th")
festiveHeading.className = "infobox-subheader"
festiveHeading.colSpan = 2
festiveHeading.innerText = $T("Botkiller")
festiveHeading.style.fontSize = '1em';
festiveHeading.style.backgroundColor = '#F5C087';
botKillerHeadingRow.appendChild(festiveHeading);
itemSchema[itemIndex].botkillerVariants.map((variantIndex) => {
const itemName = itemSchema[variantIndex].name
// FIXME: variantName should match wiki display name
const variantName = itemName.includes('Mk.II') ? itemName.split(' ')[0] + ' Mk.II' : itemName.split(' ')[0]
promises.push(new Promise(async (resolve) => {
logDebug(`Fetching price for ${itemName}`)
var data: ItemPriceData | null
try {
data = await fetchPrice(token, `${variantIndex};11`, currentTime);
updateTime = new Date(data.update)
} catch {
log(`${itemName} is unpriced or unavailable, skipping...`)
}
const priceRow = createPriceRow($T(variantName), data, keyPrice, locale, "https://wiki.teamfortress.com/wiki/Botkiller_weapons")
// FIXME: order should be by release
// Silver Mk.I, Gold Mk.II, Rust, Blood, Carbonado, Diamond, Silver Mk.II, Gold Mk.II
priceRows.push({order: botkillerOrder.indexOf(variantName), row: priceRow, category: PriceRowCategory.Botkiller})
resolve()
return
}))
})
}
if(botKillerHeadingRow) priceInfoboxHeadingRow.insertAdjacentElement('afterend', botKillerHeadingRow);
if(festiveHeadingRow) priceInfoboxHeadingRow.insertAdjacentElement('afterend', festiveHeadingRow);
Promise.all(promises).then(() => { Promise.all(promises).then(() => {
priceRows.sort((a, b) => { priceRows.sort((a, b) => {
if (a.category != b.category) { if (a.category != b.category) {
@@ -280,7 +349,17 @@ async function inject() {
} }
return a.order - b.order; return a.order - b.order;
}).reverse().forEach((element) => { }).reverse().forEach((element) => {
priceInfoboxHeadingRow.insertAdjacentElement('afterend', element.row); switch(element.category) {
case PriceRowCategory.None:
priceInfoboxHeadingRow.insertAdjacentElement('afterend', element.row);
break;
case PriceRowCategory.Festive:
festiveHeadingRow.insertAdjacentElement('afterend', element.row);
break;
case PriceRowCategory.Botkiller:
botKillerHeadingRow.insertAdjacentElement('afterend', element.row);
break;
}
}) })
if(!updateTime || !(updateTime instanceof Date) || isNaN(+updateTime)) updateTime = new Date() if(!updateTime || !(updateTime instanceof Date) || isNaN(+updateTime)) updateTime = new Date()