AtCoderの成績表をTwitterでシェアする際、ツイートに記載する項目をカスタマイズします。
// ==UserScript==
// @name AtCoderCustomResultSheetShare
// @namespace https://github.com/Ajinoko33
// @version 1.0
// @description AtCoderの成績表をTwitterでシェアする際、ツイートに記載する項目をカスタマイズします。
// @match https://atcoder.jp/users/*/history/share/*
// @author Ajinoko33
// @license MIT
// ==/UserScript==
(function () {
'use strict';
// カスタマイズ
// bool値を変更することによってあなた独自に有効化/無効化することができます。
const writeRank = true; // 順位を記載
const shortenContest = true; // コンテスト名を短縮
const writePerf = true; // パフォーマンスを記載
const writeRating = true; // レート変化を記載
const writeFirstClass = true; // 初参加時(Algorithm/Heuristic)に段級位を記載
const writeHighest = true; // Highest更新を記載
const writeAtcoderTag = true; // "#AtCoder"を記載
const writeContestTag = true; // コンテスト名のハッシュタグ("#ABC999"など)を記載
// 処理
function shorten(name) {
if (name.includes("AtCoder Beginner Contest ")) return name.replace("AtCoder Beginner Contest ", "ABC");
else if (name.includes("AtCoder Regular Contest ")) return name.replace("AtCoder Regular Contest ", "ARC");
else if (name.includes("AtCoder Grand Contest ")) return name.replace("AtCoder Grand Contest ", "AGC");
else if (name.includes("AtCoder Heuristic Contest ")) return name.replace("AtCoder Heuristic Contest ", "AHC");
else return name;
}
let rows = document.getElementsByClassName("no-break");
let username = "";
let contest = "";
let rank = "";
let perf = "";
let rating = "";
let ratingClass = "";
let firsttime = false;
let highest = false;
let classUp = false;
for (let i = 0; i < rows.length; i++) {
let element = rows[i];
if (element.innerText == "ユーザ名") username = element.nextElementSibling.innerText.trim();
else if (element.innerText == "コンテスト名") contest = element.nextElementSibling.innerText;
else if (element.innerText == "順位") rank = element.nextElementSibling.childNodes[0].innerText.slice(0, -2);
else if (element.innerText == "パフォーマンス") perf = element.nextElementSibling.innerText;
else if (element.innerText == "レーティング") {
let fulltext = element.nextElementSibling.innerText;
if (fulltext.includes("初参加")) {
firsttime = true;
rating = element.nextElementSibling.childNodes[0].innerText;
} else {
if (fulltext.includes("Highest")) highest = true;
rating = element.nextElementSibling.childNodes[1].innerText + "→" + element.nextElementSibling.childNodes[3].innerText + " " + element.nextElementSibling.childNodes[5].innerText;
if (rating.includes("+")) rating += " :)";
else if (rating.includes("-")) rating += " :(";
else rating += " :|";
}
} else if (element.innerText == "段級位") {
if (element.nextElementSibling.childNodes.length == 5) {
classUp = true;
ratingClass = element.nextElementSibling.childNodes[3].innerText;
} else {
ratingClass = element.nextElementSibling.innerText;
}
}
}
let atcoderTag = "#AtCoder";
let contestTag = "#" + shorten(contest).replaceAll(/\s+/g, "");
let text = "";
if (writeRank) text += username + "さんの" + (shortenContest ? shorten(contest) : contest) + "での成績:" + rank + "位\n";
if (writePerf && perf != "") text += "パフォーマンス:" + perf + "相当\n";
if (writeRating && rating != "") text += "レーティング:" + rating + "\n";
if (writeFirstClass && firsttime) text += "段級位:" + ratingClass + "\n";
if (writeHighest && highest) {
if (classUp) text += "Highestを更新し、" + ratingClass + "になりました!\n";
else text += "Highestを更新しました!\n";
}
if (writeAtcoderTag) text += atcoderTag + (writeContestTag ? " " : "\n");
if (writeContestTag) text += contestTag + "\n";
let parNodeTweetButton = document.getElementsByClassName("a2a_button_twitter")[0].parentNode;
parNodeTweetButton.setAttribute("data-a2a-title", text);
})();