Skip to content

Instantly share code, notes, and snippets.

@gengar
Last active November 22, 2015 12:57
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save gengar/e2a0ed8e9482b1cc14a1 to your computer and use it in GitHub Desktop.
Save gengar/e2a0ed8e9482b1cc14a1 to your computer and use it in GitHub Desktop.
// ==UserScript==
// @name puyopContestManager
// @namespace https://twitter.com/kaki_puyo
// @description ぷよパークの3DSぷよ通対戦会の登録を補助する
// @include http://www.puyop.com/Contest
// @version 0.1.0
// @grant unsafeWindow
// @grant GM_xmlhttpRequest
// ==/UserScript==
// ぷよパークの定期大会や対戦会の登録を補助する
// という夢を見ていたのさ
var $d = unsafeWindow.document;
function createElement(tag, attr) {
var e = $d.createElement(tag);
for (let i in attr) {
e[i] = attr[i];
}
return e;
}
function matchRightContext(ma) {
return ma.input.slice(ma.index + ma[0].length);
}
const kn = "零一二三四五六七八九";
const kk = "十百千万";
function parseKanjiInt(str) {
const re = /^([二三四五六七八九])?([十百千万])|^([零一二三四五六七八九])$/;
let acc = 0;
for (let ma; ma = re.exec(str); ) {
str = matchRightContext(ma);
acc += (ma[2] ?
(ma[1] ?
kn.indexOf(ma[1]) :
1) * Math.pow(10,
1 + kk.indexOf(ma[2])) :
kn.indexOf(ma[3]));
}
return acc;
}
function div(x, y) {
return Math.floor(x / y);
}
function toKanjiString(num) {
if (num < 10) {
return kn.charAt(num);
}
else {
let r = (num % 10);
let buf = [r == 0 ? "" : kn.charAt(r)];
for (let kki = 0, n = div(num, 10); n; kki++, n = div(n, 10)) {
let k = n % 10;
if (k == 1) {
buf.unshift(kk[kki]);
}
else if (k > 1) {
buf.unshift(kn.charAt(k) + kk[kki]);
}
}
return buf.join("");
}
}
function succeedNumberingString(str) {
let maybe_num = parseInt(str);
if (isNaN(maybe_num)) {
if (/[一二三四五六七八九十百千]+/.test(str)) {
return toKanjiString(parseKanjiInt(str) + 1);
}
else {
throw "unsupported numbering";
}
}
else {
return maybe_num;
}
}
function day2ms(n) {
return n * 24 * 60 * 60 * 1000;
}
function parseContestTime(str) {
let ma = /(\d+)年(\d+)月(\d+)日(.) (\d+)時(\d+)分/.exec(str);
if (ma) {
return new Date(ma[1], ma[2] - 1, ma[3], ma[4], ma[5]);
}
else {
throw "parse error";
}
}
function parseContestList(text) {
let html = (new DOMParser).parseFromString(text, "text/html");
let list = html.getElementsByClassName("contestList")[0];
let items = list.getElementsByTagName("li");
return Array.prototype.map.call(
items,
item => {
let ref = name => item.getElementsByClassName(name)[0].textContent;
return {name: ref("contestInfoLine"),
date: parseContestTime(ref("contestTime")),
wins: parseInt(/^\d+/.exec(ref("contestWin"))[0]),
comment: ref("contestRemarks")};
});
}
function searchLastContest(cont) {
GM_xmlhttpRequest({
method: "GET",
url: "http://www.puyop.com/Contest/end/1/12/36/////3////////3DS%E3%81%B7%E3%82%88%E9%80%9A%E5%AF%BE%E6%88%A6%E4%BC%9A",
onload: function(response) {
try {
cont(parseContestList(response.responseText));
} catch (er) {
console.log("onload:");
console.log(er);
console.log(er.stack);
}
},
onerror: function(response) {
console.log("onerror:");
console.log(response);
}
});
}
function setContestRegister(name, val) {
const prefix = "contestRegister_";
$d.getElementById(prefix + name).value = val;
}
function fillTheForm(ev) {
try {
let button = ev.target;
let originalValue = button.value;
button.disabled = true;
button.value = "loading...";
searchLastContest(x => {
performFillTheForm(x);
button.value = originalValue;
button.disabled = false;
});
} catch (er) {
console.log("fillTheForm:");
console.log(er);
console.log(er.stack);
}
}
function Contest(obj) {
for (let prop in obj) {
this[prop] = obj[prop];
}
}
Contest.prototype = {
platform: 12,
rule: 36,
type: 3,
length: 4 * 60 + 30
};
function format2d(n) {
return (0 <= n && n <= 9 ? "0" : "") + n;
}
function formatDate(date) {
return (date.getFullYear() + "/" +
format2d(date.getMonth() + 1) + "/" +
format2d(date.getDate()));
}
function performFillTheForm(contestList) {
let pattern = /第(.*?)回3DSぷよ通対戦会/;
let interval = day2ms(14);
let length = 4 * 60 + 30; // m
let contest = new Contest(contestList.find(x => pattern.exec(x.name)));
let startTime = contest.date.getTime() + interval;
{
let ma = pattern.exec(contest.name);
setContestRegister("name",
ma[0].replace(ma[1],
succeedNumberingString(ma[1])));
}
setContestRegister("selectSeries", contest.platform);
setContestRegister("match_rule_id", contest.rule);
{
let startDate = new Date(startTime);
setContestRegister("limit_date", formatDate(startDate));
setContestRegister("limit_hour", startDate.getHours());
setContestRegister("limit_minute", div(startDate.getMinutes(), 30) * 30);
}
setContestRegister("win", contest.wins);
setContestRegister("contest_type_id", contest.type);
{
let ev = $d.createEvent("Event");
ev.initEvent("change", false, true);
$d.getElementById("contestRegister_contest_type_id").dispatchEvent(ev);
}
{
let endDate = new Date(startTime + length * 60 * 1000);
setContestRegister("limit_end_date", formatDate(endDate));
setContestRegister("limit_end_hour", endDate.getHours());
setContestRegister("limit_end_minute", endDate.getMinutes());
}
setContestRegister("remarks", contest.comment);
}
try {
let header = $d.getElementById("modal-contest_register").getElementsByClassName("modal-header")[0];
header.getElementsByTagName("h3")[0].style = 'float: left;';
let button = createElement('input', {type: 'button',
value: "3DS通対戦会"});
button.addEventListener("click",
exportFunction(fillTheForm,
unsafeWindow,
{ defineAs: fillTheForm.name }),
false);
header.appendChild(button);
} catch (er) {
console.log("<top>");
console.log(er);
console.log(er.stack);
}
/*
platform 12
入力項目:
name platform rule start wins rateVolatility type (end rankCondition) comment
contest:
pattern interval length
latest:
name
*/
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment