bog-league

ぼけおめ大リーグ 昇格/残留/降格の自動チェック

当前为 2015-02-15 提交的版本,查看 最新版本

  1. /*
  2. // ==UserScript==
  3. // @name bog-league
  4. // @namespace http://userscripts.taiman.xyz
  5. // @version 0.1
  6. // @description ぼけおめ大リーグ 昇格/残留/降格の自動チェック
  7. // @include /http://2\.pro\.tok2\.com/(~|%7E)reflection/league\d+/vote\.cgi.*$/
  8. // @run-at document-end
  9. // @require https://cdnjs.cloudflare.com/ajax/libs/jquery/2.1.3/jquery.js
  10. // @require https://cdnjs.cloudflare.com/ajax/libs/underscore.js/1.7.0/underscore.js
  11. // ==/UserScript==
  12. */
  13.  
  14. (function() {
  15. var CharacteristicNamesManager, Color, EndResultPageManager, InterimResultPageManager, LeagueConfig, LeagueConfig1A, LeagueConfig2A, LeagueConfig3A, LeagueConfigMajor, Player, PlayersManager, Progress, Range, ResultPageManager, getLeagueConfig, getLeagueId, getProgress, main,
  16. __extends = function(child, parent) { for (var key in parent) { if (__hasProp.call(parent, key)) child[key] = parent[key]; } function ctor() { this.constructor = child; } ctor.prototype = parent.prototype; child.prototype = new ctor(); child.__super__ = parent.prototype; return child; },
  17. __hasProp = {}.hasOwnProperty;
  18.  
  19. Player = (function() {
  20. function Player(_at_name) {
  21. this.name = _at_name;
  22. this.scores = [];
  23. this.rank = null;
  24. }
  25.  
  26. Player.prototype.addScore = function(score) {
  27. return this.scores.push(score);
  28. };
  29.  
  30. return Player;
  31.  
  32. })();
  33.  
  34. PlayersManager = (function() {
  35. function PlayersManager() {
  36. this.players = [];
  37. }
  38.  
  39. PlayersManager.prototype.addScore = function(name, score) {
  40. var player;
  41. player = _.findWhere(this.players, {
  42. name: name
  43. });
  44. if (!player) {
  45. player = new Player(name);
  46. this.players.push(player);
  47. }
  48. return player.addScore(parseInt(score, 10));
  49. };
  50.  
  51. PlayersManager.prototype.getPlayers = function() {
  52. var maxScores;
  53. maxScores = _.map(this.players, function(player) {
  54. return _.max(player.scores);
  55. });
  56. maxScores.sort(function(a, b) {
  57. return b - a;
  58. });
  59. _.each(this.players, function(player) {
  60. return player.rank = _.indexOf(maxScores, _.max(player.scores));
  61. });
  62. return this.players;
  63. };
  64.  
  65. return PlayersManager;
  66.  
  67. })();
  68.  
  69. CharacteristicNamesManager = (function() {
  70. function CharacteristicNamesManager() {
  71. localStorage.characteristicNames = localStorage.characteristicNames || JSON.stringify([]);
  72. }
  73.  
  74. CharacteristicNamesManager.prototype.toggle = function(name) {
  75. var names;
  76. names = JSON.parse(localStorage.characteristicNames);
  77. if (_.contains(names, name)) {
  78. names = _.without(names, name);
  79. } else {
  80. names.push(name);
  81. }
  82. return localStorage.characteristicNames = JSON.stringify(names);
  83. };
  84.  
  85. CharacteristicNamesManager.prototype.getNames = function() {
  86. return JSON.parse(localStorage.characteristicNames);
  87. };
  88.  
  89. return CharacteristicNamesManager;
  90.  
  91. })();
  92.  
  93. Range = (function() {
  94. function Range(_at_begin, _at_end, _at_color) {
  95. this.begin = _at_begin;
  96. this.end = _at_end;
  97. this.color = _at_color;
  98. }
  99.  
  100. return Range;
  101.  
  102. })();
  103.  
  104. Color = (function() {
  105. function Color() {}
  106.  
  107. Color.promotion = "#ff99ff";
  108.  
  109. Color.stay = "#99cc00";
  110.  
  111. Color.demotion = "#66ccff";
  112.  
  113. Color.characteristic = "#ffd900";
  114.  
  115. return Color;
  116.  
  117. })();
  118.  
  119. Progress = (function() {
  120. function Progress() {}
  121.  
  122. Progress.unexpected = 0;
  123.  
  124. Progress.interim = 1;
  125.  
  126. Progress.end = 2;
  127.  
  128. return Progress;
  129.  
  130. })();
  131.  
  132. ResultPageManager = (function() {
  133. function ResultPageManager(_at_leagueConfig) {
  134. this.leagueConfig = _at_leagueConfig;
  135. }
  136.  
  137. ResultPageManager.prototype.extractRankTable = function() {};
  138.  
  139. ResultPageManager.prototype.extractRankRows = function() {
  140. var rankTable;
  141. rankTable = this.extractRankTable();
  142. return _.filter($(rankTable).find("tr"), function(tr) {
  143. var regexp;
  144. regexp = /^\d+位$/;
  145. return regexp.test($(tr).find("td").eq(0).text());
  146. });
  147. };
  148.  
  149. ResultPageManager.prototype.extractName = function(row) {};
  150.  
  151. ResultPageManager.prototype.extractScore = function(row) {};
  152.  
  153. ResultPageManager.prototype.extractPlayers = function() {
  154. var playersManager, rows;
  155. playersManager = new PlayersManager;
  156. rows = this.extractRankRows();
  157. _.each(rows, (function(_this) {
  158. return function(row) {
  159. var name, score;
  160. name = _this.extractName(row);
  161. score = _this.extractScore(row);
  162. return playersManager.addScore(name, score);
  163. };
  164. })(this));
  165. return playersManager.getPlayers();
  166. };
  167.  
  168. ResultPageManager.prototype.highlightRankTable = function() {
  169. var highlightedNames, players, ranges, rows;
  170. players = this.extractPlayers();
  171. rows = this.extractRankRows();
  172. ranges = this.leagueConfig.getRanges();
  173. highlightedNames = [];
  174. return _.each(rows, (function(_this) {
  175. return function(row) {
  176. var name, player, range;
  177. name = _this.extractName(row);
  178. if (!_.contains(highlightedNames, name)) {
  179. player = _.findWhere(players, {
  180. name: name
  181. });
  182. range = _.find(ranges, function(range) {
  183. return range.begin <= player.rank && player.rank < range.end;
  184. });
  185. _this.highlightRankRow(row, range.color);
  186. return highlightedNames.push(name);
  187. }
  188. };
  189. })(this));
  190. };
  191.  
  192. ResultPageManager.prototype.highlightRankRow = function(row, color) {};
  193.  
  194. ResultPageManager.prototype.characterizeRankTable = function(playersName) {
  195. var characterizedNames, rows;
  196. rows = this.extractRankRows();
  197. characterizedNames = [];
  198. return _.each(rows, (function(_this) {
  199. return function(row) {
  200. var name;
  201. name = _this.extractName(row);
  202. if (_.contains(playersName, name) && !_.contains(characterizedNames, name)) {
  203. _this.characterizeRankRow(row, Color.characteristic);
  204. return characterizedNames.push(name);
  205. }
  206. };
  207. })(this));
  208. };
  209.  
  210. ResultPageManager.prototype.characterizeRankRow = function(row, color) {};
  211.  
  212. ResultPageManager.prototype.setEvents = function() {};
  213.  
  214. return ResultPageManager;
  215.  
  216. })();
  217.  
  218. InterimResultPageManager = (function(_super) {
  219. __extends(InterimResultPageManager, _super);
  220.  
  221. function InterimResultPageManager(leagueConfig) {
  222. InterimResultPageManager.__super__.constructor.call(this, leagueConfig);
  223. }
  224.  
  225. InterimResultPageManager.prototype.extractRankTable = function() {
  226. return _.find($("table"), function(table) {
  227. var regexp;
  228. regexp = /人が投票した時点での順位$/;
  229. return regexp.test($(table).find("tr").eq(0).find("td").eq(0).text());
  230. });
  231. };
  232.  
  233. InterimResultPageManager.prototype.extractName = function(row) {
  234. return $(row).find("td").eq(5).text();
  235. };
  236.  
  237. InterimResultPageManager.prototype.extractScore = function(row) {
  238. return parseInt($(row).find("td").eq(1).text(), 10);
  239. };
  240.  
  241. InterimResultPageManager.prototype.highlightRankRow = function(row, color) {
  242. return $(row).find("td").css({
  243. backgroundColor: color
  244. });
  245. };
  246.  
  247. InterimResultPageManager.prototype.characterizeRankRow = function(row, color) {
  248. return $(row).find("td").eq(5).css({
  249. backgroundColor: color
  250. });
  251. };
  252.  
  253. InterimResultPageManager.prototype.setEvents = function() {
  254. var rows;
  255. rows = this.extractRankRows();
  256. return _.each(rows, (function(_this) {
  257. return function(row) {
  258. $(row).css({
  259. cursor: "pointer"
  260. });
  261. return $(row).on("click", function() {
  262. var cnm;
  263. cnm = new CharacteristicNamesManager;
  264. cnm.toggle(_this.extractName(row));
  265. _this.highlightRankTable();
  266. return _this.characterizeRankTable(cnm.getNames());
  267. });
  268. };
  269. })(this));
  270. };
  271.  
  272. return InterimResultPageManager;
  273.  
  274. })(ResultPageManager);
  275.  
  276. EndResultPageManager = (function(_super) {
  277. __extends(EndResultPageManager, _super);
  278.  
  279. function EndResultPageManager(leagueConfig) {
  280. EndResultPageManager.__super__.constructor.call(this, leagueConfig);
  281. }
  282.  
  283. EndResultPageManager.prototype.extractRankTable = function() {
  284. return _.find($("table"), function(table) {
  285. var regexp;
  286. regexp = /終了日:\d{4}年\d{2}月\d{2}日\d{2}時$/;
  287. return regexp.test($(table).find("tr").eq(0).find("td").eq(0).text());
  288. });
  289. };
  290.  
  291. EndResultPageManager.prototype.extractName = function(row) {
  292. var container, regexp;
  293. regexp = /^(?:\d+\/\d+\/\d+  \[一言\]  )(.+)(?:さんの作品)$/;
  294. container = $(row).find("td").eq(2).find("div.SMALL1");
  295. return regexp.exec(container.text().trim())[1];
  296. };
  297.  
  298. EndResultPageManager.prototype.extractScore = function(row) {
  299. return parseInt($(row).find("td").eq(1).text(), 10);
  300. };
  301.  
  302. EndResultPageManager.prototype.highlightRankRow = function(row, color) {
  303. return $(row).find("td").eq(0).css({
  304. backgroundColor: color
  305. });
  306. };
  307.  
  308. return EndResultPageManager;
  309.  
  310. })(ResultPageManager);
  311.  
  312. LeagueConfig = (function() {
  313. function LeagueConfig(_at_beginStay, _at_beginDemotion) {
  314. this.beginStay = _at_beginStay != null ? _at_beginStay : 5;
  315. this.beginDemotion = _at_beginDemotion != null ? _at_beginDemotion : 15;
  316. }
  317.  
  318. LeagueConfig.prototype.getRanges = function() {
  319. var ranges;
  320. ranges = [];
  321. ranges.push(new Range(0, this.beginStay, Color.promotion));
  322. ranges.push(new Range(this.beginStay, this.beginDemotion, Color.stay));
  323. ranges.push(new Range(this.beginDemotion, Number.POSITIVE_INFINITY, Color.demotion));
  324. return ranges;
  325. };
  326.  
  327. return LeagueConfig;
  328.  
  329. })();
  330.  
  331. LeagueConfigMajor = (function(_super) {
  332. __extends(LeagueConfigMajor, _super);
  333.  
  334. function LeagueConfigMajor() {
  335. LeagueConfigMajor.__super__.constructor.call(this, 1, 10);
  336. }
  337.  
  338. return LeagueConfigMajor;
  339.  
  340. })(LeagueConfig);
  341.  
  342. LeagueConfig3A = (function(_super) {
  343. __extends(LeagueConfig3A, _super);
  344.  
  345. function LeagueConfig3A() {
  346. LeagueConfig3A.__super__.constructor.call(this, 5, 15);
  347. }
  348.  
  349. return LeagueConfig3A;
  350.  
  351. })(LeagueConfig);
  352.  
  353. LeagueConfig2A = (function(_super) {
  354. __extends(LeagueConfig2A, _super);
  355.  
  356. function LeagueConfig2A() {
  357. LeagueConfig2A.__super__.constructor.call(this, 5, 15);
  358. }
  359.  
  360. return LeagueConfig2A;
  361.  
  362. })(LeagueConfig);
  363.  
  364. LeagueConfig1A = (function(_super) {
  365. __extends(LeagueConfig1A, _super);
  366.  
  367. function LeagueConfig1A() {
  368. LeagueConfig1A.__super__.constructor.call(this, 10, 10);
  369. }
  370.  
  371. return LeagueConfig1A;
  372.  
  373. })(LeagueConfig);
  374.  
  375. getLeagueId = function() {
  376. var matches;
  377. matches = location.href.match(/\/league(\d+)\//);
  378. if (matches !== null) {
  379. return parseInt(matches[1]);
  380. } else {
  381. return null;
  382. }
  383. };
  384.  
  385. getLeagueConfig = function(leagueId) {
  386. switch (leagueId) {
  387. case 4:
  388. return new LeagueConfigMajor;
  389. case 3:
  390. return new LeagueConfig3A;
  391. case 2:
  392. return new LeagueConfig2A;
  393. case 1:
  394. return new LeagueConfig1A;
  395. default:
  396. return new LeagueConfig;
  397. }
  398. };
  399.  
  400. getProgress = function() {
  401. var isEndResultPage, isInterimResultPage;
  402. isInterimResultPage = _.find($("table"), function(table) {
  403. var regexp;
  404. regexp = /人が投票した時点での順位$/;
  405. return regexp.test($(table).find("tr").eq(0).find("td").eq(0).text());
  406. });
  407. isEndResultPage = _.find($("table"), function(table) {
  408. var regexp;
  409. regexp = /終了日:\d{4}年\d{2}月\d{2}日\d{2}時$/;
  410. return regexp.test($(table).find("tr").eq(0).find("td").eq(0).text());
  411. });
  412. if (isInterimResultPage) {
  413. return Progress.interim;
  414. }
  415. if (isEndResultPage) {
  416. return Progress.end;
  417. }
  418. return Progress.unexpected;
  419. };
  420.  
  421. main = function() {
  422. var leagueConfig, leagueId, resultPageManager;
  423. leagueId = getLeagueId();
  424. if (leagueId === null) {
  425. return;
  426. }
  427. leagueConfig = getLeagueConfig(leagueId);
  428. resultPageManager = null;
  429. switch (getProgress()) {
  430. case Progress.interim:
  431. resultPageManager = new InterimResultPageManager(leagueConfig);
  432. break;
  433. case Progress.end:
  434. resultPageManager = new EndResultPageManager(leagueConfig);
  435. break;
  436. default:
  437. resultPageManager = null;
  438. }
  439. if (resultPageManager === null) {
  440. return;
  441. }
  442. resultPageManager.highlightRankTable();
  443. resultPageManager.characterizeRankTable((new CharacteristicNamesManager).getNames());
  444. return resultPageManager.setEvents();
  445. };
  446.  
  447. main();
  448.  
  449. }).call(this);