WFCD/warframe-nexus-query

View on GitHub
lib/AttachmentCreator.js

Summary

Maintainability
A
0 mins
Test Coverage
import n from 'numeral';

import MarketComponent from './market/v1/summary.js'; // eslint-disable-line no-unused-vars

const numerFmt = '0,0';
const wfcdLogo = 'https://warframestat.us/wfcd_logo_color.png';

const noResultAttachment = {
  type: 'rich',
  title: 'No result',
  color: 0xff55ff,
  url: 'https://warframe.market',
  footer: {
    text: 'Price data provided by NexusHub.co & Warframe.Market',
    icon_url: wfcdLogo,
  },
};

const baseAttachment = {
  type: 'rich',
  title: '',
  color: 0xff00ff,
  url: '',
  fields: [],
  thumbnail: { url: '' },
  footer: {
    icon_url: wfcdLogo,
    text: 'Data by NexusHub.co & Warframe.Market',
  },
};

/**
 * Calculate the safe value for a provided value
 * @param  {string} value provided value
 * @returns {string}       safe value
 */
function safeValue(value) {
  return value ? `${Number.parseInt(value, 10)}p` : 'No Data';
}

/**
 * Calculate the safe value for a provided value
 * @param  {string} value1 provided minimum value
 * @param  {string} value2 provided maximum value
 * @returns {string}       safe value
 */
function safeRange(value1, value2) {
  return value1 ? `${Number.parseInt(value1, 10)}p - ${Number.parseInt(value2, 10)}p` : 'No Data';
}

/**
 * Build a field from provided nexus & market components
 * @param  {MarketComponent} mComponent market component
 * @returns {Object}            built field
 */
function fieldValue(mComponent) {
  let mMedian;
  let mRange;

  if (mComponent) {
    mMedian = safeValue(mComponent.prices.soldPrice);
    mRange = safeRange(mComponent.prices.minimum, mComponent.prices.maximum);
  }

  return {
    name: mComponent.name.trim(),
    value:
      '```haskell\n' +
      `${'Value'.padEnd(6, ' ')} | Market\n` +
      `${'Median'.padEnd(6, ' ')} | ${mMedian}\n` +
      `${'Range'.padEnd(6, ' ')} | ${mRange}\n` +
      '```\n' +
      `Trade Tax: ${n(mComponent.tradingTax).format(numerFmt)}cr\n`,
    inline: false,
  };
}

/**
 * Create the attachment itself
 */
export default class AttachmentCreator {
  /**
   * Build an attachment from the provided components
   * @param  {Array<MarketComponent>} components -
   * collected array of components with market data
   * @param  {string} query           Search query that these components match
   * @param  {string} [platform='pc'] Platform for the request, defaults to 'pc'
   * @returns {Object}                 Discord-ready attachment describing the item
   */
  attachmentFromComponents(components, query, platform = 'pc') {
    if (!components || !components.length || !Array.isArray(components)) return noResultAttachment;

    const attachment = JSON.parse(JSON.stringify(baseAttachment));
    const marketComponents = components.filter(
      (component) => component && component.type === 'market-v1' && typeof component.prices.soldPrice !== 'undefined'
    );

    /* istanbul ignore else */
    if (marketComponents.length > 0) {
      marketComponents.forEach((marketComponent, index) => {
        if (!index) {
          attachment.color = parseInt(marketComponent.color, 16);
          attachment.title = `[${platform.toUpperCase()}] ${marketComponent.name.replace(/\sset/i, '')}`;
          attachment.url = marketComponent.url;
          attachment.thumbnail.url = marketComponent.thumbnail;
        }

        attachment.fields.push(fieldValue(marketComponent));
      });

      attachment.footer = {
        icon_url: wfcdLogo,
        text: 'Price data provided by Warframe.Market',
      };
    } else {
      return noResultAttachment;
    }
    /* istanbul ignore else */
    if (attachment.fields.length) {
      return attachment;
    }
    /* istanbul ignore next */
    return noResultAttachment;
  }
}