AtCoderSubmitSearchSettings

add default settings for submit search

θα χρειαστεί να εγκαταστήσετε μια επέκταση όπως το Tampermonkey, το Greasemonkey ή το Violentmonkey για να εγκαταστήσετε αυτόν τον κώδικα.

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

θα χρειαστεί να εγκαταστήσετε μια επέκταση όπως το Tampermonkey ή το Violentmonkey για να εγκαταστήσετε αυτόν τον κώδικα.

θα χρειαστεί να εγκαταστήσετε μια επέκταση όπως το Tampermonkey ή το Userscripts για να εγκαταστήσετε αυτόν τον κώδικα.

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

Θα χρειαστεί να εγκαταστήσετε μια επέκταση διαχείρισης κώδικα χρήστη για να εγκαταστήσετε αυτόν τον κώδικα.

(Έχω ήδη έναν διαχειριστή κώδικα χρήστη, επιτρέψτε μου να τον εγκαταστήσω!)

You will need to install an extension such as Stylus to install this style.

You will need to install an extension such as Stylus to install this style.

You will need to install an extension such as Stylus to install this style.

You will need to install a user style manager extension to install this style.

You will need to install a user style manager extension to install this style.

You will need to install a user style manager extension to install this style.

(Έχω ήδη έναν διαχειριστή στυλ χρήστη, επιτρέψτε μου να τον εγκαταστήσω!)

// ==UserScript==
// @name         AtCoderSubmitSearchSettings
// @namespace    https://github.com/refine-P
// @version      1.1.1
// @description  add default settings for submit search
// @author       fine
// @license      MIT
// @include      https://atcoder.jp/contests/*/submissions*
// ==/UserScript==
"use strict";

/*
    使うときは検索の設定を変更してください
    下にパラメータの一覧があるので参考にしてください
*/

// 検索の設定
// var task = "";
var language = "C++ (GCC 9.2.1)";
var status = "AC";
var user = "";
var order = ""; // ソート基準、詳しくは下に
var desc = false; // trueで降順にする
var enableOldVersionLanguage = true; // 古いバージョンの言語の提出を検索可能にする
var enableSearchWithDefaultSetting = true; // 「デフォルト設定で検索」 を有効に

/*
    諸々のパラメータ一覧
*/

// 言語とクエリパラメータの対応関係
// (言語のアップデートでこのあたりが変更されるかも?、Twitter等で教えてもらえれば対応します)

// 最新バージョン
var languageValuesLatest = {
    "": "",
    "C (GCC 9.2.1)": "4001",
    "C (Clang 10.0.0)": "4002",
    "C++ (GCC 9.2.1)": "4003",
    "C++ (Clang 10.0.0)": "4004",
    "Java (OpenJDK 11.0.6)": "4005",
    "Python (3.8.2)": "4006",
    "Bash (5.0.11)": "4007",
    "bc (1.07.1)": "4008",
    "Awk (GNU Awk 4.1.4)": "4009",
    "C# (.NET Core 3.1.201)": "4010",
    "C# (Mono-mcs 6.8.0.105)": "4011",
    "C# (Mono-csc 3.5.0)": "4012",
    "Clojure (1.10.1.536)": "4013",
    "Crystal (0.33.0)": "4014",
    "D (DMD 2.091.0)": "4015",
    "D (GDC 9.2.1)": "4016",
    "D (LDC 1.20.1)": "4017",
    "Dart (2.7.2)": "4018",
    "dc (1.4.1)": "4019",
    "Erlang (22.3)": "4020",
    "Elixir (1.10.2)": "4021",
    "F# (.NET Core 3.1.201)": "4022",
    "F# (Mono 10.2.3)": "4023",
    "Forth (gforth 0.7.3)": "4024",
    "Fortran(GNU Fortran 9.2.1)": "4025",
    "Go (1.14.1)": "4026",
    "Haskell (GHC 8.8.3)": "4027",
    "Haxe (4.0.3); js": "4028",
    "Haxe (4.0.3); Java": "4029",
    "JavaScript (Node.js 12.16.1)": "4030",
    "Julia (1.4.0)": "4031",
    "Kotlin (1.3.71)": "4032",
    "Lua (Lua 5.3.5)": "4033",
    "Lua (LuaJIT 2.1.0)": "4034",
    "Dash (0.5.8)": "4035",
    "Nim (1.0.6)": "4036",
    "Objective-C (Clang 10.0.0)": "4037",
    "Common Lisp (SBCL 2.0.3)": "4038",
    "OCaml (4.10.0)": "4039",
    "Octave (5.2.0)": "4040",
    "Pascal (FPC 3.0.4)": "4041",
    "Perl (5.26.1)": "4042",
    "Raku (Rakudo 2020.02.1)": "4043",
    "PHP (7.4.4)": "4044",
    "Prolog (SWI-Prolog 8.0.3)": "4045",
    "PyPy2 (7.3.0)": "4046",
    "PyPy3 (7.3.0)": "4047",
    "Racket (7.6)": "4048",
    "Ruby (2.7.1)": "4049",
    "Rust (1.42.0)": "4050",
    "Scala (2.13.1)": "4051",
    "Java (OpenJDK 1.8.0)": "4052",
    "Scheme (Gauche 0.9.9)": "4053",
    "Standard ML (MLton 20130715)": "4054",
    "Swift (5.2.1)": "4055",
    "Text (cat 8.28)": "4056",
    "TypeScript (3.8)": "4057",
    "Visual Basic (.NET Core 3.1.101)": "4058",
    "Zsh (5.4.2)": "4059",
    "COBOL - Fixed (OpenCOBOL 1.1.0)": "4060",
    "COBOL - Free (OpenCOBOL 1.1.0)": "4061",
    "Brainfuck (bf 20041219)": "4062",
    "Ada2012 (GNAT 9.2.1)": "4063",
    "Unlambda (2.0.0)": "4064",
    "Cython (0.29.16)": "4065",
    "Sed (4.4)": "4066",
    "Vim (8.2.0460)": "4067"
};

// 古いバージョン
var languageValuesOld = {
    'C++14 (GCC 5.4.1)': '3003',
    'Bash (GNU bash v4.3.11)': '3001',
    'C (GCC 5.4.1)': '3002',
    'C (Clang 3.8.0)': '3004',
    'C++14 (Clang 3.8.0)': '3005',
    'C# (Mono 4.6.2.0)': '3006',
    'Clojure (1.8.0)': '3007',
    'Common Lisp (SBCL 1.1.14)': '3008',
    'D (DMD64 v2.070.1)': '3009',
    'D (LDC 0.17.0)': '3010',
    'D (GDC 4.9.4)': '3011',
    'Fortran (gfortran v4.8.4)': '3012',
    'Go (1.6)': '3013',
    'Haskell (GHC 7.10.3)': '3014',
    'Java7 (OpenJDK 1.7.0)': '3015',
    'Java8 (OpenJDK 1.8.0)': '3016',
    'JavaScript (node.js v5.12)': '3017',
    'OCaml (4.02.3)': '3018',
    'Pascal (FPC 2.6.2)': '3019',
    'Perl (v5.18.2)': '3020',
    'PHP (5.6.30)': '3021',
    'Python2 (2.7.6)': '3022',
    'Python3 (3.4.3)': '3023',
    'Ruby (2.3.3)': '3024',
    'Scala (2.11.7)': '3025',
    'Scheme (Gauche 0.9.3.3)': '3026',
    'Text (cat)': '3027',
    'Visual Basic (Mono 4.0.1)': '3028',
    'C++ (GCC 5.4.1)': '3029',
    'C++ (Clang 3.8.0)': '3030',
    'Objective-C (GCC 5.3.0)': '3501',
    'Objective-C (Clang3.8.0)': '3502',
    'Swift (swift-2.2-RELEASE)': '3503',
    'Rust (1.15.1)': '3504',
    'Sed (GNU sed 4.2.2)': '3505',
    'Awk (mawk 1.3.3)': '3506',
    'Brainfuck (bf 20041219)': '3507',
    'Standard ML (MLton 20100608)': '3508',
    'PyPy2 (5.6.0)': '3509',
    'PyPy3 (2.4.0)': '3510',
    'Crystal (0.20.5)': '3511',
    'F# (Mono 4.0)': '3512',
    'Unlambda (0.1.3)': '3513',
    'Lua (5.3.2)': '3514',
    'LuaJIT (2.0.4)': '3515',
    'MoonScript (0.5.0)': '3516',
    'Ceylon (1.2.1)': '3517',
    'Julia (0.5.0)': '3518',
    'Octave (4.0.2)': '3519',
    'Nim (0.13.0)': '3520',
    'TypeScript (2.1.6)': '3521',
    'Perl6 (rakudo-star 2016.01)': '3522',
    'Kotlin (1.0.0)': '3523',
    'PHP7 (7.0.15)': '3524',
    'COBOL - Fixed (OpenCOBOL 1.1.0)': '3525',
    'COBOL - Free (OpenCOBOL 1.1.0)': '3526'
};

// 結果のステータス一覧
var statusList = ['', 'AC', 'WA', 'TLE', 'MLE', 'RE', 'CE', 'QLE', 'OLE', 'IE', 'WJ', 'WR', 'Judging'];

// 何を基準にソートするか
var orderValues = {
    "": "",
    "提出日時": "created",
    "得点": "score",
    "コード長": "source_length",
    "実行時間": "time_consumption",
    "メモリ": "memory_consumption"
};


/*
    提出の検索の設定を反映
*/
$(function(){
    // 言語とクエリパラメータの対応関係の構築
    var languageValues;
    // https://qiita.com/kou_pg_0131/items/16c63879be55b85387aa
    if (enableOldVersionLanguage) {
        languageValues = {...languageValuesLatest, ...languageValuesOld};
    } else {
        languageValues = {...languageValuesLatest};
    }

    // 古いバージョンの言語の提出を検索可能にする場合
    // 言語選択の欄に古いバージョンの言語を追加する
    if (enableOldVersionLanguage) {
        var selectLanguage = document.getElementById('select-language');
        for (var lang in languageValuesOld) {
            if (!lang) continue;
            var langOption = document.createElement('option');
            langOption.innerText = lang;
            langOption.value = languageValuesOld[lang];
            selectLanguage.insertAdjacentElement('beforeend', langOption);
        }
    }

    if (!enableSearchWithDefaultSetting) return;

    // クエリパラメータが有効か確認
    var messages = [];
    if (!(language in languageValues)) {
        messages.push(`Language: ${language} doesn't exists!`);
    }
    if (statusList.indexOf(status) < 0) {
        messages.push(`Status: ${status} doesn't exists!`);
    }
    if (!(order in orderValues)) {
        messages.push(`OrderBy: ${order} doesn't exists!`);
    }
    if (messages.length > 0) {
        alert(messages.join('\n'));
        return;
    }

    // ボタンの配置がゴミ過ぎるので、誰か良い感じにする方法あったら教えてください...
    $('.form-group:last').append('<div><button type="submit" class="btn btn-primary btn-sm">デフォルト設定で検索</button></div>');
    var target_button = $('.form-group:last div:last button')
    target_button.css('margin', '2px 0');

    // 吹き出し: https://blog.shuffleee.com/2666/
    target_button.attr('data-toggle', 'popover');
    target_button.attr('data-placement', 'top');
    target_button.attr('data-content', `<table class="table"><thead><th colspan="2" style="text-align:center">Default Settings</th></thead><tbody><tr><th>Language</th><td>${language}</td></tr><tr><th>Status</th><td>${status}</td></tr><th>User</th><td>${user}</td></tr><th>OrderBy</th><td>${order} (desc: ${desc})</td></tbody></table>`)
    target_button.popover({
        trigger: 'hover', // click,hover,focus,manualを選択出来る
        html: true,
    });

    target_button.click(function(e){
        e.preventDefault();

        // 問題は後から選ぶはずなのでこのタイミングで取得
        var task = $('#select-task').val();

        // クエリパラメータを追加
        var baseURL = location.href.split('?')[0];
        var queryParameters = `?f.Task=${task}&f.Language=${languageValues[language]}&f.Status=${status}&f.User=${user}&orderBy=${orderValues[order]}&desc=${desc}`;
        var newURL = baseURL + queryParameters;

        window.location.href = newURL;
    });
});