diff --git a/AtCoderColorNEWS.js b/AtCoderColorNEWS.js index a99bc2b..9a8f097 100644 --- a/AtCoderColorNEWS.js +++ b/AtCoderColorNEWS.js @@ -1,16 +1,20 @@ // ==UserScript== // @name AtcoderColorNEWS +// @description お気に入りの人々の、色の変化を通知します。 // @namespace https://github.com/null-null-programming // @version 0.1 // @author null_null -// @match https://atcoder.jp -// @require https://cdn.rawgit.com/jaredreich/notie.js/a9e4afbeea979c0e6ee50aaf5cb4ee80e65d225d/notie.js +// @license MIT +// @match https://atcoder.jp/* // @require https://ajax.googleapis.com/ajax/libs/jquery/3.3.1/jquery.min.js // ==/UserScript== (async function () { - //既に通知したかどうかをcookieで判定する。imformedFlagがtrueのときのみ通知する。 - if (imformedFlag() === false) return; + //直近のコンテスト + const latestContestScreenName = await getLatestContestScreenName(); + + //既に通知したかどうかをlocalStorageで判定する。imformedFlagがtrueのときのみ通知する。 + if (imformedFlag(latestContestScreenName) === false) return; //お気に入りリストを取得 let favList = JSON.parse(localStorage.fav); @@ -18,8 +22,6 @@ //レートを色に変換するリスト let color = ['灰', '茶', '緑', '水', '青', '黄', '橙', '赤', '自由']; - //直近のコンテスト - const latestContestScreenName = getLatestContestScreenName(); //直近コンテストの結果一覧 const latestContestResult = await getContestResultData(latestContestScreenName); @@ -44,40 +46,21 @@ if (preRate >= nowRate) return ""; //繋げる文字列を返す - return `${E(username)}さんのレートが${color[nowRate]}色に変わりました!
`; + return `${E(username)}さんのレートが${color[nowRate]}色に変わりました!\n`; }).join(""); if (string.length > 0) { - notie.alert(3, string, 20); //20秒後、またはクリックで消える + window.alert(string); //20秒後、またはクリックで消える } - //cookieを1ヶ月保存する。今回のコンテスト名で上書きする。 - document.cookie = 'preContest=' + getLatestContestScreenName() + ',max-age=60*60*24*30'; + //localStorageに通知したコンテスト名を保存する。 + localStorage.setItem('keyContestName', latestContestScreenName); })(); -function imformedFlag() { - //cookieが存在するか? 存在しない場合は今回が初使用なので通知する。 - let res = true; - if (document.cookie.indexOf("preContest=") >= 0) { - //cookie_name:preContestを取得する - let cookieName = document.cookie.split(';'); - //各々のcookiezを取り出す - cookieName.forEach(function (value) { - //cookie名と値に分ける - let cookie_content = value.split('='); - - if (cookie_content[0] === ' preContest') { - //保存されているクッキーの名前を取得 - let cookieContestName = cookie_content[1].split(','); - //cookieに保存されているコンテスト名と直近のコンテスト名が同じ場合は通知済み - if (cookieContestName[0] === getLatestContestScreenName()) { - res = false; - return; - } - } - }) - } - return res; +//通知済みかどうかを調べる +function imformedFlag(latestContestScreenName) { + if (localStorage.getItem('keyContestName') !== latestContestScreenName) return true; + return false; } //Rateを色に変換する @@ -85,15 +68,12 @@ function getColorIndex(rate) { return Math.min(8, Math.floor(rate / 400)); } -//TODO:改良する。 //直近のコンテスト名を取得する。 -function getLatestContestScreenName() { - //AtCoder Grand Contest XXX - let contestScreenName = document.getElementById("collapse-contest").getElementsByClassName("table table-default table-striped table-hover table-condensed small")[2].getElementsByTagName('small')[1].innerHTML; - //contests/agcXXX - contestScreenName = contestScreenName.split('"')[1]; - //agcXXX - contestScreenName = contestScreenName.split('/').pop(); +async function getLatestContestScreenName() { + let parser = new DOMParser(); + let archiveDom = parser.parseFromString((await $.get("https://atcoder.jp/contests/archive")), "text/html"); + let contestScreenName = archiveDom.querySelector("#main-container > div.row > div.col-lg-9.col-md-8 > div.panel.panel-default > div > table > tbody > tr:nth-child(1) > td:nth-child(2) > a"); + contestScreenName = contestScreenName.toString().split('/').pop(); return contestScreenName; } diff --git a/README.md b/README.md index 69ca770..e930fd6 100644 --- a/README.md +++ b/README.md @@ -4,3 +4,12 @@ AtCoderのuserscriptです。 お気に入りに入れている方の色の変化を通知します。 +# 使いかた +1:ブラウザにTampermonkeyをインストールします  +URL:https://www.tampermonkey.net + + +2:GreasyForkでAtCoderColorNEWSをインストールします +URL:https://greasyfork.org/en/scripts/387896-atcodercolornews + +