Tidy up your Dashboard

Tidy Up Your Dashboard is a Userscript which brings along a lot of features for improving the user experience on Warlight.

当前为 2017-11-13 提交的版本,查看 最新版本

您需要先安装一个扩展,例如 篡改猴Greasemonkey暴力猴,之后才能安装此脚本。

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

您需要先安装一个扩展,例如 篡改猴暴力猴,之后才能安装此脚本。

您需要先安装一个扩展,例如 篡改猴Userscripts ,之后才能安装此脚本。

您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey,才能安装此脚本。

您需要先安装用户脚本管理器扩展后才能安装此脚本。

(我已经安装了用户脚本管理器,让我安装!)

您需要先安装一款用户样式管理器扩展,比如 Stylus,才能安装此样式。

您需要先安装一款用户样式管理器扩展,比如 Stylus,才能安装此样式。

您需要先安装一款用户样式管理器扩展,比如 Stylus,才能安装此样式。

您需要先安装一款用户样式管理器扩展后才能安装此样式。

您需要先安装一款用户样式管理器扩展后才能安装此样式。

您需要先安装一款用户样式管理器扩展后才能安装此样式。

(我已经安装了用户样式管理器,让我安装!)

// ==UserScript==
// @name Tidy up your Dashboard
// @namespace https://greasyfork.org/users/10154
// @grant none
// @run-at document-start
// @match https://www.warlight.net/*
// @description Tidy Up Your Dashboard is a Userscript which brings along a lot of features for improving the user experience on Warlight.
// @version 1.99.99
// @icon http://i.imgur.com/XzA5qMO.png
// @require https://code.jquery.com/jquery-1.11.2.min.js
// ==/UserScript==
window.MULIS_USERSCRIPT = true;
var version = GM_info.script.version;

this.$$$ = jQuery.noConflict(true);
this.$ = $$$;
setupImages();


console.log(123)
function setupImages() {
    window.IMAGES = {
        EYE: 'https://i.imgur.com/kekYrsO.png',
        CROSS: 'https://i.imgur.com/RItbpDS.png',
        QUESTION: 'https://i.imgur.com/TUyoZOP.png',
        PLUS: 'https://i.imgur.com/lT6SvSY.png',
        SAVE: 'https://i.imgur.com/Ze4h3NQ.png',
        BOOKMARK: 'https://i.imgur.com/c6IxAql.png'

    }
}

$$$(document).ready(function() {
if(location.href.match(/.*temp\?Muli.*/i)) {
   console.log("active")
    $$$("body").html("<h1>Export Muli's userscript Settings</h1>")
    $$$("body").append("Copy or download this text and save it somewhere on your computer!<br><br><textarea style='display:block;width:100%; height: 500px' id='exportSettingsBox'></textarea><a id='downloadExportSettingsFile' href='' download='tuyd_settings.txt'>Download Text-File</a></div>")

   }
})

setupDatabase()

if (document.readyState == 'complete' || document.readyState == 'interactive') {
    
    DOM_ContentReady();
} else {
    window.document.addEventListener("DOMContentLoaded", DOM_ContentReady);
}

function DOM_ContentReady() {
    Database.init(function() {
        exportSettings();
    })

}

function setupDatabase() {
    window.Database = {
        db: null,
        Table: {
            Bookmarks: "Bookmarks",
            Settings: "Settings",
            BlacklistedForumThreads: "BlacklistedForumThreads",
            TournamentData: "TournamentData"
        },
        Exports: {
            Bookmarks: "Bookmarks",
            Settings: "Settings",
            BlacklistedForumThreads: "BlacklistedForumThreads"
        },
        Row: {
            BlacklistedForumThreads: {
                ThreadId: "threadId",
                Date: "date"
            },
            Bookmarks: {
                Order: "order"
            },
            Settings: {
                Name: "name"
            },
            TournamentData: {
                Id: "tournamentId",
            }
        },
        init: function(callback) {
           if(!"indexedDB" in window) {
                return;
            }
            var openRequest = indexedDB.open("TidyUpYourDashboard_v3", 3);
            openRequest.onupgradeneeded = function(e) {
                var thisDB = e.target.result;
                if(!thisDB.objectStoreNames.contains("Bookmarks")) {
                    var objectStore = thisDB.createObjectStore("Bookmarks", {autoIncrement:true});
                    objectStore.createIndex("order", "order", {unique:true});
                }
                if(!thisDB.objectStoreNames.contains("Settings")) {
                    var objectStore = thisDB.createObjectStore("Settings", { keyPath: "name" });
                    objectStore.createIndex("name", "name", {unique: true});
                    objectStore.createIndex("value", "value", {unique: false});
                }
                if(!thisDB.objectStoreNames.contains("BlacklistedForumThreads")) {
                    var objectStore = thisDB.createObjectStore("BlacklistedForumThreads", {autoIncrement:true});
                    objectStore.createIndex("threadId", "threadId", {unique:true});
                    objectStore.createIndex("date", "date", {unique:false});
                }
                if(!thisDB.objectStoreNames.contains("TournamentData")) {
                    var objectStore = thisDB.createObjectStore("TournamentData",{ keyPath: "tournamentId" });
                    objectStore.createIndex("tournamentId", "tournamentId", {unique:true});
                    objectStore.createIndex("value", "value", {unique: false});
                }
            }

            openRequest.onsuccess = function(e) {
                db = e.target.result;
                callback()
            }

            openRequest.onerror = function(e) {
//                alert("Sorry, Tidy Up Your Dashboard is not supported")
                $$$("<div>Sorry,<br> Tidy Up Your Dashboard is not supported.</div>").dialog();
            }
        },
        update: function(table, value, key, callback) {
            var transaction = db.transaction([table],"readwrite");
            var store = transaction.objectStore(table);


            //Perform the add
            try {
                var request = store.put(value, key != undefined ? Number(key) : undefined);
                request.onerror = function(e) {
                    log(JSON.stringify(e));
                }

                request.onsuccess = function(e) {
                    callback()
                }
            } catch(e) {
            }
        },
        read: function(table, key, callback) {
            var transaction = db.transaction([table], "readonly");
            var objectStore = transaction.objectStore(table);

            var ob = objectStore.get(Number(key));

            ob.onsuccess = function(e) {
                var result = e.target.result;
                callback(result)
            }
        },
        readIndex: function(table, row, value, callback) {
            var transaction = db.transaction([table], "readonly");
            var objectStore = transaction.objectStore(table);

            var index = objectStore.index(row);
            //name is some value
            var ob = index.get(value);

            ob.onsuccess = function(e) {
                var result = e.target.result;
                callback(result)
            }
        },
        readAll: function(table, callback) {
            var transaction = db.transaction([table], "readonly");
            var objectStore = transaction.objectStore(table);
            var items = []

            var ob = objectStore.openCursor()

            ob.onsuccess = function(e) {
                var cursor = e.target.result;
                if (cursor) {
                    var item = cursor.value;
                    item.id = cursor.primaryKey;
                    items.push(item);
                    cursor.continue();
                } else {
                    callback(items)
                }
            }
        },
        add: function(table, value, callback) {
            var transaction = db.transaction([table],"readwrite");
            var store = transaction.objectStore(table);

            try {
                var request = store.add(value);
                request.onerror = function(e) {
                    log(`Error saving ${JSON.stringify(value)} in ${table}`)
                    log(JSON.stringify(e));
                }

                request.onsuccess = function(e) {
                    log(`Saved ${JSON.stringify(value)} in ${table}`)
                    callback()
                }
            } catch(e) {
                log(`Error saving ${JSON.stringify(value)} in ${table}`)
                log(JSON.stringify(e));
            }

            request.onerror = function(e) {
                log(`Error saving ${JSON.stringify(value)} in ${table}`)
                log(JSON.stringify(e));
            }

            request.onsuccess = function(e) {
                log(`Saved ${JSON.stringify(value)} in ${table}`)
                callback()
            }
        },
        delete: function(table, key, callback) {
            var transaction = db.transaction([table],"readwrite");
            var store = transaction.objectStore(table);


            //Perform the add
            var request = store.delete(key)

            request.onerror = function(e) {
                //some type of error handler
            }

            request.onsuccess = function(e) {
                callback()
            }
        },
        clear: function(table, callback) {
            var transaction = db.transaction([table],"readwrite");
            var store = transaction.objectStore(table);


            //Perform the add
            var request = store.clear();

            request.onerror = function(e) {
                //some type of error handler
            }

            request.onsuccess = function(e) {
                callback()
            }
        },

    }

}
window.userscriptSettings = [
    {
        id: 'scrollGames',
        text: 'Fixed Window with scrollable Games',
        selected: true,
        title: 'Dashboard',
        addBreak: false,
        help: 'This option displays My-, Open-, Coin-Games in a scrollable box, which removes a lot of unesessary scrolling. You can find tabs to switch between the different type of games. '
    },
    {
        id: 'hideMyGamesIcons',
        text: 'Hide Icons in "My Games"',
        selected: false,
        title: '',
        addBreak: false,
        help: 'This option hides Game-Icons like ( <img src="https://d2wcw7vp66n8b3.cloudfront.net/Images/GameInfoIcons/Teams.png">,<img src="https://d2wcw7vp66n8b3.cloudfront.net/Images/GameInfoIcons/ManualDistribution.png"> , etc) in "My Games"'
    },
    {
        id: 'autoRefreshOnFocus',
        text: 'Automatically refresh Games on Tab-Focus',
        selected: true,
        title: '',
        addBreak: false,
        help: 'This option automatically refreshes your games after switching back to WarLight from a different tab / program. This only applies if WarLight was idle for 30 or more seconds.'
    },
    {
        id: 'highlightTournaments',
        text: 'Highlight Tournament invites',
        selected: false,
        title: '',
        addBreak: false,
    },
    {
        id: 'hideRightColumn',
        text: 'Hide Right Column',
        selected: false,
        title: '',
        addBreak: false,
        help: 'This option hides the right column completely and leaves you alone with My-, Open- and Coin-Games.'
    },
    {
        id: 'hidePromotedGames',
        text: 'Hide Promoted Games',
        selected: false,
        title: '',
        addBreak: false,
        help: 'This option hides the promoted (coin) games on the dashboard'
    },
    {
        id: 'showOpenGamesTab',
        text: 'Show Open Games Tab in Menu Bar',
        selected: false,
        title: 'Global',
        addBreak: false,
        help: 'This option displays a link to the "Open Games" site right next to the "Past Games" Link.'
    },
    {
        id: 'hideCoinsGlobally',
        text: 'Hide Coins Globally',
        selected: false,
        title: '',
        addBreak: false,
        help: 'This option removes everything from Warlight related to Coins'
    },
    {
        id: 'showPrivateNotesOnProfile',
        text: 'Show Private Notes on Profile',
        selected: true,
        title: '',
        addBreak: false,
        help: 'This option will show you your Private Notes which you made on a player directly on their profile page. You can find them on the left side under the profile picture.'
    },
    {
        id: 'unlinkDashboard',
        text: 'Link Dashboard to "old" My-Games Site',
        selected: false,
        title: '',
        addBreak: false,
        help: 'This option links the Dashboard to the "old" My-Games Site'
    },
    {
        id: 'useDefaultBootLabel',
        text: 'Use the Default Boot Time Label',
        selected: false,
        title: 'Advanced',
        addBreak: false
    },
    {
        id: 'hideRefreshButton',
        text: 'Hide Refresh Button',
        selected: false,
        title: '',
        addBreak: false,
        help: 'Hide the Refresh Button. You can still refresh with R'
    },
    {
        id: 'nonUnityDashboard',
        text: 'Display HTML Dashboard when Unity is enabled',
        selected: false,
        title: '',
        addBreak: false,
        help: 'This options makes sure that you will see the HTML dashboard instead of the unity dashboard if unity is enabled.'
    },
    {
        id: 'hideOffTopic',
        text: 'Automatically hide Off-topic threads',
        selected: false,
        title: '',
        addBreak: false,
        help: 'This option automatically hides all Off-topic threads everytime you visit the "All Forum Posts"-Page'
    },
    {
        id: 'disableHideThreadOnDashboard',
        text: 'Disable right-click on the forum table',
        selected: false,
        title: '',
        addBreak: false,
        help: 'This option will allow you to right-click forum thread on the dashboard and use the default browser options.'
    },
    {
        id: 'hideCreateRandomGameForm',
        text: 'Hide Randomized Bonuses Game Form',
        selected: false,
        title: '',
        addBreak: false,
        help: 'This option will hide the randomized bonuses game form which is located on the profile page.'
    }
];

function exportSettings() {
    var settings = [];
    var deferredCount = 0;
    var resolvedCount = 0;
    var promises = [];
    $$$.each(Database.Exports, function (key, table) {
        promises[deferredCount++] = $$$.Deferred();
        Database.readAll(table, function(data) {
            settings.push({table: table, data: data})
            promises[resolvedCount++].resolve();
        })
    })
    $$$.when.apply($$$, promises).done(function () {
        var settingsString = btoa(JSON.stringify(settings))
        $$$("#exportSettingsBox").html(settingsString)
        $$$("#exportSettingsBox").focus();
        $$$("#exportSettingsBox").select();
        $$$("#downloadExportSettingsFile").click(function(){
            this.href = "data:text/plain;charset=UTF-8,"  + settingsString;
        });
    });
}