import Axios from 'axios'; import _ from 'lodash'; export interface EIconRecord { eicon: string; timestamp: number; } export interface EIconRecordUpdate extends EIconRecord { action: '+' | '-'; } export class EIconUpdater { static readonly FULL_DATA_URL = 'https://xariah.net/eicons/Home/EiconsDataBase/base.doc'; static readonly DATA_UPDATE_URL = 'https://xariah.net/eicons/Home/EiconsDataDeltaSince'; async fetchAll(): Promise<{ records: EIconRecord[], asOfTimestamp: number }> { const result = await Axios.get(EIconUpdater.FULL_DATA_URL); const lines = _.split(result.data, '\n'); const records = _.map(_.filter(lines, (line) => (line.trim().substr(0, 1) !== '#' && line.trim() !== '')), (line) => { const [eicon, timestamp] = _.split(line, '\t', 2); return { eicon: eicon.toLowerCase(), timestamp: parseInt(timestamp, 10) }; }); const asOfLine = _.first(_.filter(lines, (line: string) => line.substring(0, 9) === '# As Of: ')); const asOfTimestamp = asOfLine ? parseInt(asOfLine.substring(9), 10) : 0; return { records, asOfTimestamp }; } async fetchUpdates(fromTimestampInSecs: number): Promise<{ recordUpdates: EIconRecordUpdate[], asOfTimestamp: number }> { const result = await Axios.get(`${EIconUpdater.DATA_UPDATE_URL}/${fromTimestampInSecs}`); const lines = _.split(result.data, '\n'); const recordUpdates = _.map(_.filter(lines, (line) => (line.trim().substr(0, 1) !== '#' && line.trim() !== '')), (line) => { const [action, eicon, timestamp] = _.split(line, '\t', 3); return { action: action as '+' | '-', eicon: eicon.toLowerCase(), timestamp: parseInt(timestamp, 10) }; }); const asOfLine = _.first(_.filter(lines, (line: string) => line.substring(0, 9) === '# As Of: ')); const asOfTimestamp = asOfLine ? parseInt(asOfLine.substring(9), 10) : 0; return { recordUpdates, asOfTimestamp }; } }