Brazen Item Attributes Resolver

Item attributes resolution helper class

Tính đến 09-11-2022. Xem phiên bản mới nhất.

Script này sẽ không được không được cài đặt trực tiếp. Nó là một thư viện cho các script khác để bao gồm các chỉ thị meta // @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。