AtCoderSubmitSearchSettings

add default settings for submit search

Voor het installeren van scripts heb je een extensie nodig, zoals Tampermonkey, Greasemonkey of Violentmonkey.

Voor het installeren van scripts heb je een extensie nodig, zoals {tampermonkey_link:Tampermonkey}.

Voor het installeren van scripts heb je een extensie nodig, zoals Tampermonkey of Violentmonkey.

Voor het installeren van scripts heb je een extensie nodig, zoals Tampermonkey of Userscripts.

Voor het installeren van scripts heb je een extensie nodig, zoals {tampermonkey_link:Tampermonkey}.

Voor het installeren van scripts heb je een gebruikersscriptbeheerder nodig.

(Ik heb al een user script manager, laat me het downloaden!)

Voor het installeren van gebruikersstijlen heb je een extensie nodig, zoals {stylus_link:Stylus}.

Voor het installeren van gebruikersstijlen heb je een extensie nodig, zoals {stylus_link:Stylus}.

Voor het installeren van gebruikersstijlen heb je een extensie nodig, zoals {stylus_link:Stylus}.

Voor het installeren van gebruikersstijlen heb je een gebruikersstijlbeheerder nodig.

Voor het installeren van gebruikersstijlen heb je een gebruikersstijlbeheerder nodig.

Voor het installeren van gebruikersstijlen heb je een gebruikersstijlbeheerder nodig.

(Ik heb al een beheerder - laat me doorgaan met de installatie!)

// ==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;
    });
});