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