Brazen Item Attributes Resolver

Item attributes resolution helper class

Fra og med 09.11.2022. Se den nyeste version.

Dette script bør ikke installeres direkte. Det er et bibliotek, som andre scripts kan inkludere med metadirektivet // @require https://update.greasyforks.org/scripts/429587/1115000/Brazen%20Item%20Attributes%20Resolver.js

// ==UserScript==
// @name         Brazen Item Attributes Resolver
// @namespace    brazenvoid
// @version      2.0.0
// @author       brazenvoid
// @license      GPL-3.0-only
// @description  Item attributes resolution helper class
// ==/UserScript==

class BrazenItemAttributesResolver
{
    /**
     * @typedef {{itemLinkSelector: JQuery.Selector, itemDeepAnalysisSelector: JQuery.Selector, requestDelay: number,
     *            onDeepAttributesResolution: Function}} ItemAttributesResolverConfiguration
     */
    
    /**
     * @callback ItemAttributesResolverCallback
     * @param {JQuery} item
     * @return {*}
     */
    
    /**
     * @param {ItemAttributesResolverConfiguration} configuration
     */
    constructor(configuration)
    {
        /**
         * @type {{}}
         * @private
         */
        this._attributes = {}
        
        /**
         * @type {{}}
         * @private
         */
        this._deepAttributes = {}
        
        /**
         * @type {boolean}
         * @private
         */
        this._hasDeepAttributes = false
        
        /**
         * @type {JQuery.Selector}
         * @protected
         */
        this._itemLinkSelector = configuration.itemLinkSelector
        
        /**
         * @type {JQuery.Selector}
         * @protected
         */
        this._itemDeepAnalysisSelector = configuration.itemDeepAnalysisSelector
    
        /**
         * @type {Function}
         * @private
         */
        this._onDeepAttributesResolution = configuration.onDeepAttributesResolution
        
        /**
         * @type {number}
         * @private
         */
        this._requestDelay = configuration.requestDelay
        
        /**
         * @type {number}
         * @private
         */
        this._requestIteration = 1
        
        /**
         * @type {JQuery<HTMLElement> | jQuery | HTMLElement}
         * @private
         */
        this._sandbox = $('<div id="brazen-item-attributes-resolver-sandbox" hidden/>').appendTo('body')
    }
    
    /**
     * @param {string} name
     * @param {ItemAttributesResolverCallback} resolutionCallback
     * @returns {this}
     */
    addAttribute(name, resolutionCallback)
    {
        this._attributes[name] = resolutionCallback
        return this
    }
    
    /**
     * @param {string} name
     * @param {ItemAttributesResolverCallback} resolutionCallback
     * @returns {this}
     */
    addDeepAttribute(name, resolutionCallback)
    {
        this._deepAttributes[name] = resolutionCallback
        this._hasDeepAttributes = true
        return this
    }
    
    /**
     * @returns {BrazenItemAttributesResolver}
     */
    completeResolutionRun()
    {
        this._requestIteration = 1;
        return this
    }
    
    /**
     * @param {JQuery} item
     * @param {string} attributeName
     * @returns {*}
     */
    get(item, attributeName)
    {
        return typeof item[0].scriptAttributes === 'undefined' ? null : item[0].scriptAttributes[attributeName] || null
    }
    
    /**
     * @param {JQuery} item
     * @param {Function|null} afterResolutionCallback
     */
    resolveAttributes(item, afterResolutionCallback = null)
    {
        let attributesBag = {}
        item[0].scriptAttributes = attributesBag
        
        for (const attributeName in this._attributes) {
            attributesBag[attributeName] = this._attributes[attributeName](item)
        }
        if (this._hasDeepAttributes) {
            let url = item.find(this._itemLinkSelector).attr('href')
            if (url) {
                Utilities.sleep(this._requestIteration * this._requestDelay).then(() => {
                    try {
                        this._sandbox.load(url + ' ' + this._itemDeepAnalysisSelector, () => {
                            for (const attributeName in this._deepAttributes) {
                                attributesBag[attributeName] = this._deepAttributes[attributeName](this._sandbox)
                            }
                            this._onDeepAttributesResolution(item)
                            this._sandbox.empty()
                        })
                    } catch (error) {
                        console.error('Deep attributes loading failed.')
                    }
                })
                this._requestIteration++
            }
        }
    }
    
    /**
     * @param {JQuery} item
     * @param {string} attributeName
     * @param {*} value
     * @returns {BrazenItemAttributesResolver}
     */
    set(item, attributeName, value)
    {
        item[0].scriptAttributes[attributeName] = value
        return this
    }
}
长期地址
遇到问题?请前往 GitHub 提 Issues。