Added tags parser
parent
0a9e4f3d4f
commit
aae153caa7
|
@ -12,11 +12,13 @@ const Credentials = require("./scripts/classes/credentials.js");
|
|||
const GameInfo = require("./scripts/classes/game-info.js");
|
||||
const LoginResult = require("./scripts/classes/login-result.js");
|
||||
const UserData = require("./scripts/classes/user-data.js");
|
||||
const TagParser = require("./scripts/classes/tag-parser.js");
|
||||
|
||||
//#region Export classes
|
||||
module.exports.GameInfo = GameInfo;
|
||||
module.exports.LoginResult = LoginResult;
|
||||
module.exports.UserData = UserData;
|
||||
module.exports.TagParser = TagParser;
|
||||
//#endregion Export classes
|
||||
|
||||
//#region Export properties
|
||||
|
|
|
@ -0,0 +1,90 @@
|
|||
"use strict";
|
||||
|
||||
// Public modules from npm
|
||||
const cheerio = require("cheerio");
|
||||
|
||||
// Modules from file
|
||||
const { fetchHTML } = require("../network-helper.js");
|
||||
const f95Selector = require("../constants/css-selector.js");
|
||||
const { F95_LATEST_UPDATES } = require("../constants/url.js");
|
||||
|
||||
class TagParser {
|
||||
constructor() {
|
||||
/**
|
||||
* Dictionary mapping the keys to the F95API game tags.
|
||||
* @type Object.<number,string>
|
||||
*/
|
||||
this._tagsDict = {};
|
||||
}
|
||||
|
||||
//#region Private methods
|
||||
/**
|
||||
* @private
|
||||
* Gets the key associated with a given value from a dictionary.
|
||||
* @param {Object} object Dictionary to search
|
||||
* @param {Any} value Value associated with the key
|
||||
* @returns {String|undefined} Key found or undefined
|
||||
*/
|
||||
_getKeyByValue(object, value) {
|
||||
return Object.keys(object).find(key => object[key] === value);
|
||||
}
|
||||
//#endregion Private methods
|
||||
|
||||
/**
|
||||
* @public
|
||||
* Gets all tags, with their IDs, from F95Zone.
|
||||
*/
|
||||
async fetch() {
|
||||
// Clean dictionary
|
||||
this._tagsDict = {};
|
||||
|
||||
// Load the HTML
|
||||
const html = await fetchHTML(F95_LATEST_UPDATES);
|
||||
const $ = cheerio.load(html);
|
||||
|
||||
// Search for the tags
|
||||
const unparsedText = $(f95Selector.LU_TAGS_SCRIPT).html().trim();
|
||||
const startIndex = unparsedText.indexOf("{");
|
||||
const endIndex = unparsedText.lastIndexOf("}");
|
||||
const parsedText = unparsedText.substring(startIndex, endIndex + 1);
|
||||
const data = JSON.parse(parsedText);
|
||||
|
||||
// Extract only the data we need
|
||||
this._tagsDict = data.tags;
|
||||
}
|
||||
|
||||
/**
|
||||
* @public
|
||||
* Convert a list of tags to their respective IDs.
|
||||
* @param {String[]} tags
|
||||
*/
|
||||
tagsToIDs(tags) {
|
||||
const ids = [];
|
||||
for(const tag of tags) {
|
||||
// Extract the key from the value
|
||||
const key = this._getKeyByValue(this._tagsDict, tag);
|
||||
if(key) ids.push(parseInt(key));
|
||||
}
|
||||
return ids.sort((a, b) => a - b); // JS sort alphabetically, same old problem
|
||||
}
|
||||
|
||||
/**
|
||||
* @public
|
||||
* It converts a list of IDs into their respective tags.
|
||||
* @param {number[]} ids
|
||||
*/
|
||||
idsToTags(ids) {
|
||||
const tags = [];
|
||||
for(const id of ids) {
|
||||
// Check if the key exists in the dict
|
||||
const exist = id in this._tagsDict;
|
||||
if (!exist) continue;
|
||||
|
||||
// Save the value
|
||||
tags.push(this._tagsDict[id]);
|
||||
}
|
||||
return tags.sort();
|
||||
}
|
||||
}
|
||||
|
||||
module.exports = TagParser;
|
|
@ -20,4 +20,5 @@ module.exports = Object.freeze({
|
|||
UD_USERNAME_ELEMENT: "a[href=\"/account/\"] > span.p-navgroup-linkText",
|
||||
UD_AVATAR_PIC: "a[href=\"/account/\"] > span.avatar > img[class^=\"avatar\"]",
|
||||
LOGIN_MESSAGE_ERROR: "div.blockMessage.blockMessage--error.blockMessage--iconic",
|
||||
LU_TAGS_SCRIPT: "script:contains('latestUpdates')",
|
||||
});
|
||||
|
|
Loading…
Reference in New Issue