Greasy Fork

UtilLibrary

Util function library

目前为 2020-06-23 提交的版本。查看 最新版本

此脚本不应直接安装,它是一个供其他脚本使用的外部库。如果您需要使用该库,请在脚本元属性加入:// @require https://update.greasyfork.icu/scripts/405927/819518/UtilLibrary.js

// ==UserScript==
// @name         UtilLibrary
// @namespace    [email protected]
// @version      0.4.0
// @description  Util function library
// @author       [email protected]
// @match        *://*/*
// @grant        GM_openInTab
// ==/UserScript==


// LIBRARY: START
const Util = (() => {


var LOGGING_ID = "";

const LOGGING_LEVELS = [
    "INFO",
    "NOTE",
    "WARNING",
    "ERROR"
];

var MINIMUM_LOGGING_LEVEL = LOGGING_LEVELS.findIndex(
    (element) => (element == "NOTE")
);

var LOG_MESSAGES_WITHOUT_LOGGING_LEVEL = true;


///
/// Log a message.
///
const Log = (...args) => {
    var loggingLevelIndex = LOGGING_LEVELS.findIndex(
        (element) => (element == args[0])
    );
    
    if (loggingLevelIndex != -1) {
        if (loggingLevelIndex < MINIMUM_LOGGING_LEVEL) {
            return;
        }
        
        //args = args.slice(1);
    }
    else if (!LOG_MESSAGES_WITHOUT_LOGGING_LEVEL) {
        // Don't log messages without a logging level
        return;
    }
    
    console.log.apply(
        null,
        [
            (new Date()).toISOString()
            + " " + LOGGING_ID + ":\n"
        ].concat(args)
    );
};


///
/// Recurse parent elements until one with the given class is found.
///
function GetParentWithClass(element, className) {
    while (element != null) {
        if (element.classList.contains(className)) {
            return element;
        }
        
        element = element.parentElement;
    }
    
    return null;
}


///
/// Listen for mouse movements and save mouse position.
///
var mousePosition = {
    "x": 0,
    "y": 0
};
document.addEventListener(
    "mousemove",
    (event) => {
        mousePosition.x = event.clientX;
        mousePosition.y = event.clientY;
    },
    true
);


var URL_OPEN_LIMIT = 20;
var _urlsOpened = 0;

///
/// Open a window with a given URL and delay (timeout).
///
const OpenUrl = (url, openInBackground) => {
    if (!openInBackground) {
        openInBackground = false;
    }
    
    Log(_urlsOpened, URL_OPEN_LIMIT);
    if (_urlsOpened >= URL_OPEN_LIMIT) {
        return false;
    }
    
    Log("OpenUrl(" + url + ")");
    ++_urlsOpened;
    /*/
    setTimeout(
        function () {
            window.open(url);
        },
        10 * _urlsOpened
    );
    /*/
    GM_openInTab(url, openInBackground);
    //*/
    
    return true;
};


///
/// Reset the opened URL counter.
///
const ResetOpenedUrlCounter = () => {
    urlsOpened = 0;
};


///
/// Query a selector until it isn't null.
///
const WaitForSelector = (selector, maxWaitTime) => {
    var querySelector = null;
    querySelector = (resolve, maxWait, startTime) => {
        startTime = startTime || (new Date()).getMilliseconds();
        var currentTime = (new Date()).getMilliseconds();
        
        Log(startTime, startTime + maxWait, currentTime);
        
        if (currentTime >= (startTime + maxWait)) {
            resolve(null);
            
            return;
        }
        
        var element = document.querySelector(selector);
        
        if (element == null) {
            // Element not found, try again next frame
            setTimeout(
                () => querySelector(resolve, maxWait, startTime),
                0
            );
            
            return;
        }
        
        // Element found, resolve
        resolve(element);
    };
    
    maxWaitTime = maxWaitTime || 500;
    
    return new Promise(
        (resolve) => querySelector(resolve, maxWaitTime)
    );
};


// LIBRARY: Return public members
return {
    Log,
    LOGGING_ID,
    LOGGING_LEVELS,
    MINIMUM_LOGGING_LEVEL,
    LOG_MESSAGES_WITHOUT_LOGGING_LEVEL,
    
    GetParentWithClass,
    
    mousePosition,
    
    OpenUrl,
    ResetOpenedUrlCounter,
    URL_OPEN_LIMIT,
    
    WaitForSelector
};


// LIBRARY: END
})();