UNPKG

@gameroom/cli

Version:

A command line tool for Gameroom

141 lines (125 loc) 7.34 kB
const cosmetic = require('cosmetic'), { join, resolve } = require('path'), { calculateGamePrices, difference, dollarString, grGreen, timeout, tryRepeatedly, writeCSVFile } = require('../../helpers'), { Price_Charting } = require('../../models'), { spinner } = require('../../refs'), { models: { Price, Product } } = require('@gameroom/kit'), PRICE_CHARTING = cosmetic.cyan('price charting'), TRUE = 'true', FALSE = 'false' module.exports = async ({ products, write }) => { if (!process.env.PRICE_CHARTING_TOKEN) throw new Error('missing price charting env keys') spinner.info(`repricing ${grGreen('gameroom')} from ${PRICE_CHARTING} @ ${new Date().toLocaleString()}`) const csv_data = [] let matched = 0, unmatched = 0, prices_updated = 0 for (const [i, product] of products.entries()) { // instantiate csv data const data = new Price_Charting.Update({ // product product_name: product.name, product_subname: product.subname, product_id: product.id }) spinner.text = `checking ${grGreen('product')} ${i}/${products.length}` // update csv data data.update({ auto_priced: product.properties.auto_price, pcid: product.properties.pcid, baseline: product.properties.price_baseline }) if (product.properties.auto_price === TRUE) { const prices = await tryRepeatedly(() => Price.get({ filter: { key: 'product_id', value: product.id } }), (err) => spinner.warn(`error getting ${grGreen('product')} ${product.id} ${grGreen('prices')}`)) // prices const game_plus = prices.find(p => p.name === 'Disc Plus' || p.name === 'Cartridge Plus' || p.name === 'Boxed') const game_only = prices.find(p => p.name === 'Disc Only' || p.name === 'Cartridge Only') const buy_in_game_plus = prices.find(p => p.name === 'Buy In Disc Plus' || p.name === 'Buy In Cartridge Plus' || p.name === 'Buy In Boxed or CIB') const buy_in_game_only = prices.find(p => p.name === 'Buy In Disc Only' || p.name === 'Buy In Cartridge Only') // warnings for missing prices if (!game_plus) spinner.warn(`${grGreen('product')} ${product.id} missing game_plus price`) if (!game_only) spinner.warn(`${grGreen('product')} ${product.id} missing game_only price`) if (!buy_in_game_plus) spinner.warn(`${grGreen('product')} ${product.id} missing buy_in_game_plus price`) if (!buy_in_game_only) spinner.warn(`${grGreen('product')} ${product.id} missing buy_in_game_only price`) let { game_plus_amount, game_only_amount, buy_in_game_plus_amount, buy_in_game_only_amount } = calculateGamePrices(product) // update prices let updated = false while (!updated) { try { // there is a price that is not locked, and there is an new amount that is different if (game_plus && !game_plus.locked && !isNaN(game_plus_amount) && difference(game_plus.amount, game_plus_amount)) { product.properties.last_game_plus_amount = game_plus.amount await Price.update({ id: game_plus.id, amount: game_plus_amount }) spinner.succeed(`updated ${grGreen('price')} ${game_plus.id}`) data.update({ game_plus_update: TRUE, product_update: TRUE }) prices_updated++ } if (game_only && !game_only.locked && !isNaN(game_only_amount) && difference(game_only.amount, game_only_amount)) { product.properties.last_game_only_amount = game_only.amount await Price.update({ id: game_only.id, amount: game_only_amount }) spinner.succeed(`updated ${grGreen('price')} ${game_only.id}`) data.update({ game_only_update: TRUE, product_update: TRUE }) prices_updated++ } if (buy_in_game_plus && !buy_in_game_plus.locked && !isNaN(buy_in_game_plus_amount) && difference(buy_in_game_plus.amount, buy_in_game_plus_amount)) { product.properties.last_buy_in_game_plus_amount = buy_in_game_plus.amount await Price.update({ id: buy_in_game_plus.id, amount: buy_in_game_plus_amount }) spinner.succeed(`updated ${grGreen('price')} ${buy_in_game_plus.id}`) data.update({ buy_in_game_plus_update: TRUE, product_update: TRUE }) prices_updated++ } if (buy_in_game_only && !buy_in_game_only.locked && !isNaN(buy_in_game_only_amount) && difference(buy_in_game_only.amount, buy_in_game_only_amount)) { product.properties.last_buy_in_game_only_amount = buy_in_game_only.amount await Price.update({ id: buy_in_game_only.id, amount: buy_in_game_only_amount }) spinner.succeed(`updated ${grGreen('price')} ${buy_in_game_only.id}`) data.update({ buy_in_game_only_update: TRUE, product_update: TRUE }) prices_updated++ } updated = true } catch(err) { spinner.warn(`error updating ${grGreen('prices')} for ${grGreen('product')} ${product.id} : ${err}`) await timeout() } } // amounts for csv const old_game_plus_amount = game_plus ? game_plus.amount : 0 const old_game_only_amount = game_only ? game_only.amount : 0 const old_buy_in_game_plus_amount = buy_in_game_plus ? Math.abs(buy_in_game_plus.amount) : 0 const old_buy_in_game_only_amount = buy_in_game_only ? Math.abs(buy_in_game_only.amount) : 0 buy_in_game_plus_amount = Math.abs(buy_in_game_plus_amount) buy_in_game_only_amount = Math.abs(buy_in_game_only_amount) // update csv data.update({ // game_plus game_plus_id: game_plus ? game_plus.id : '', old_game_plus_amount: dollarString(old_game_plus_amount), new_game_plus_amount: dollarString(game_plus_amount), game_plus_difference: dollarString(game_plus_amount - old_game_plus_amount), // game_only game_only_id: game_only ? game_only.id : '', old_game_only_amount: dollarString(old_game_only_amount), new_game_only_amount: dollarString(game_only_amount), game_only_difference: dollarString(game_only_amount - old_game_only_amount), // buy_in_game_plus buy_in_game_plus_id: buy_in_game_plus ? buy_in_game_plus.id : '', old_buy_in_game_plus_amount: dollarString(old_buy_in_game_plus_amount), new_buy_in_game_plus_amount: dollarString(buy_in_game_plus_amount), buy_in_game_plus_difference: dollarString(buy_in_game_plus_amount - old_buy_in_game_plus_amount), // buy_in_game_only buy_in_game_only_id: buy_in_game_only ? buy_in_game_only.id : '', old_buy_in_game_only_amount: dollarString(old_buy_in_game_only_amount), new_buy_in_game_only_amount: dollarString(buy_in_game_only_amount), buy_in_game_only_difference: dollarString(buy_in_game_only_amount - old_buy_in_game_only_amount), }) // end of auto pricing } csv_data.push(data) } if (write) { const path = await writeCSVFile(join(resolve(write === true ? '.' : write), 'gameroom_auto_pricer.csv'), csv_data) spinner.succeed(`wrote data to ${path}`) } spinner.info(`total: ${products.length}`) spinner.succeed(`prices updated: ${prices_updated}`) spinner.succeed(`completed ${PRICE_CHARTING} reprice @ ${new Date().toLocaleString()}`).stop() }