Brazen Framework - Subscriptions Loader

Account subscriptions manager for the Brazen user scripts framework

此腳本不應該直接安裝,它是一個供其他腳本使用的函式庫。欲使用本函式庫,請在腳本 metadata 寫上: // @require https://update.greasyfork.org/scripts/424516/1847310/Brazen%20Framework%20-%20Subscriptions%20Loader.js

您需要先安裝使用者腳本管理器擴展,如 TampermonkeyGreasemonkeyViolentmonkey 之後才能安裝該腳本。

You will need to install an extension such as Tampermonkey to install this script.

您需要先安裝使用者腳本管理器擴充功能,如 TampermonkeyViolentmonkey 後才能安裝該腳本。

您需要先安裝使用者腳本管理器擴充功能,如 TampermonkeyUserscripts 後才能安裝該腳本。

你需要先安裝一款使用者腳本管理器擴展,比如 Tampermonkey,才能安裝此腳本

您需要先安裝使用者腳本管理器擴充功能後才能安裝該腳本。

(我已經安裝了使用者腳本管理器,讓我安裝!)

Advertisement:

你需要先安裝一款使用者樣式管理器擴展,比如 Stylus,才能安裝此樣式

你需要先安裝一款使用者樣式管理器擴展,比如 Stylus,才能安裝此樣式

你需要先安裝一款使用者樣式管理器擴展,比如 Stylus,才能安裝此樣式

你需要先安裝一款使用者樣式管理器擴展後才能安裝此樣式

你需要先安裝一款使用者樣式管理器擴展後才能安裝此樣式

你需要先安裝一款使用者樣式管理器擴展後才能安裝此樣式

(我已經安裝了使用者樣式管理器,讓我安裝!)

Advertisement:

// ==UserScript==
// @name         Brazen Framework - Subscriptions Loader
// @namespace    brazenvoid
// @version      1.0.3
// @author       brazenvoid
// @license      GPL-3.0-only
// @description  Account subscriptions manager for the Brazen user scripts framework
// ==/UserScript==

class BrazenSubscriptionsLoader
{
    /**
     * @callback SubscriptionLoaderGetPageCountCallback
     * @param {JQuery} page
     * @return {number}
     */

    /**
     * @callback SubscriptionLoaderGetPageUrlCallback
     * @param {string} baseUrl
     * @param {number} pageNo
     * @return {string}
     */

    /**
     * @callback SubscriptionLoaderProgressReportingCallback
     * @param {string} status
     */

    /**
     * @callback SubscriptionLoaderSubscriptionsGatheredCallback
     * @param {string[]} subscriptions
     */

    /**
     * @typedef {{url: string, getPageCount: SubscriptionLoaderGetPageCountCallback, getPageUrl: SubscriptionLoaderGetPageUrlCallback,
     *            subscriptionNameSelector: string, subscriptionsCountSelector: string}} SubscriptionLoaderConfig
     */

    /**
     * @param {SubscriptionLoaderProgressReportingCallback} onProgressUpdate
     * @param {SubscriptionLoaderSubscriptionsGatheredCallback} onSubscriptionsGathered
     */
    constructor (onProgressUpdate, onSubscriptionsGathered)
    {
        /**
         * @type {number}
         * @private
         */
        this._configIterator = 0

        /**
         * @type {SubscriptionLoaderConfig[]}
         * @private
         */
        this._configs = []

        /**
         * @type {SubscriptionLoaderProgressReportingCallback}
         * @private
         */
        this._onProgressUpdate = onProgressUpdate

        /**
         * @type {SubscriptionLoaderSubscriptionsGatheredCallback}
         * @private
         */
        this._onSubscriptionsGathered = onSubscriptionsGathered

        /**
         * @type {JQuery}
         * @private
         */
        this._sandbox = null

        /**
         * @type {SubscriptionLoaderConfig}
         * @private
         */
        this._selectedConfig = {}

        /**
         * @type {*[]}
         * @private
         */
        this._subscriptions = []
    }

    /**
     * Loads and records subscriptions by page
     * @param {number} maxPage
     * @param {number} pageNo
     * @private
     */
    _loadSubscriptionsPage (pageNo, maxPage)
    {
        this._sandbox.empty().load(this._selectedConfig.getPageUrl(this._selectedConfig.url, pageNo), () => {
            this._sandbox.find(this._selectedConfig.subscriptionNameSelector).each((index, element) => {
                this._subscriptions.push($(element).text().trim())
            })
            this._onProgressUpdate('Gathering subscriptions - ' + Math.ceil(((pageNo / maxPage) * 100)) + '% Complete')
            pageNo++
            if (pageNo <= maxPage) {
                this._loadSubscriptionsPage(pageNo, maxPage)
            } else {
                this._configIterator++
                if (this._configIterator < this._configs.length) {
                    this._processSubscriptions()
                } else {
                    this._sandbox.remove()
                    this._onProgressUpdate('Loaded ' + this._subscriptions.length + ' subscriptions. Reload?')
                    this._onSubscriptionsGathered(this._subscriptions)
                    this._configIterator = 0
                    this._subscriptions = []
                }
            }
        })
    }

    /**
     * @private
     */
    _processSubscriptions ()
    {
        this._selectedConfig = this._configs[this._configIterator]
        this._sandbox.empty().load(this._selectedConfig.url + ' ' + this._selectedConfig.subscriptionsCountSelector, () => {
            this._loadSubscriptionsPage(1, Math.ceil(this._selectedConfig.getPageCount(this._sandbox)))
        })
    }

    /**
     * @param {SubscriptionLoaderConfig} config
     * @returns {BrazenSubscriptionsLoader}
     */
    addConfig (config)
    {
        this._configs.push(config)
        return this
    }

    run ()
    {
        this._onProgressUpdate('Gathering subscriptions - 0% Complete')
        this._sandbox = $('<div id="brazen-subscriptions-loader-sandbox" hidden/>').appendTo('body')
        this._processSubscriptions()
    }
}