AtCoderSubmitSearchSettings

add default settings for submit search

You will need to install an extension such as Tampermonkey, Greasemonkey or Violentmonkey to install this script.

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

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

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

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

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

(I already have a user script manager, let me install it!)

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.

ستحتاج إلى تثبيت إضافة مثل Stylus لتثبيت هذا النمط.

ستحتاج إلى تثبيت إضافة لإدارة أنماط المستخدم لتتمكن من تثبيت هذا النمط.

ستحتاج إلى تثبيت إضافة لإدارة أنماط المستخدم لتثبيت هذا النمط.

ستحتاج إلى تثبيت إضافة لإدارة أنماط المستخدم لتثبيت هذا النمط.

(لدي بالفعل مثبت أنماط للمستخدم، دعني أقم بتثبيته!)

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