bog

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

您需要先安裝使用者腳本管理器擴展,如 TampermonkeyGreasemonkeyViolentmonkey 之後才能安裝該腳本。

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

您需要先安裝使用者腳本管理器擴充功能,如 TampermonkeyViolentmonkey 後才能安裝該腳本。

您需要先安裝使用者腳本管理器擴充功能,如 TampermonkeyUserscripts 後才能安裝該腳本。

你需要先安裝一款使用者腳本管理器擴展,比如 Tampermonkey,才能安裝此腳本

您需要先安裝使用者腳本管理器擴充功能後才能安裝該腳本。

(我已經安裝了使用者腳本管理器,讓我安裝!)

你需要先安裝一款使用者樣式管理器擴展,比如 Stylus,才能安裝此樣式

你需要先安裝一款使用者樣式管理器擴展,比如 Stylus,才能安裝此樣式

你需要先安裝一款使用者樣式管理器擴展,比如 Stylus,才能安裝此樣式

你需要先安裝一款使用者樣式管理器擴展後才能安裝此樣式

你需要先安裝一款使用者樣式管理器擴展後才能安裝此樣式

你需要先安裝一款使用者樣式管理器擴展後才能安裝此樣式

(我已經安裝了使用者樣式管理器,讓我安裝!)

/*
// ==UserScript==
// @name        bog
// @namespace   BOG
// @version     1.1
// @description ぼけおめ大リーグ 昇格/残留/降格の自動チェック
// @include     /http://2\.pro\.tok2\.com/(~|%7E)reflection/league\d+/vote\.cgi.*$/
// @run-at      document-end
// @require     https://cdnjs.cloudflare.com/ajax/libs/jquery/2.1.3/jquery.js
// @require     https://cdnjs.cloudflare.com/ajax/libs/underscore.js/1.7.0/underscore.js
// ==/UserScript==
 */

(function() {
  var CharacteristicNamesManager, Color, EndResultPageManager, InterimResultPageManager, LeagueConfig, LeagueConfig1A, LeagueConfig2A, LeagueConfig3A, LeagueConfigMajor, Player, PlayersManager, Progress, Range, ResultPageManager, getLeagueConfig, getLeagueId, getProgress, main,
    __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; },
    __hasProp = {}.hasOwnProperty;

  Player = (function() {
    function Player(_at_name) {
      this.name = _at_name;
      this.scores = [];
      this.rank = null;
    }

    Player.prototype.addScore = function(score) {
      return this.scores.push(score);
    };

    return Player;

  })();

  PlayersManager = (function() {
    function PlayersManager() {
      this.players = [];
    }

    PlayersManager.prototype.addScore = function(name, score) {
      var player;
      player = _.findWhere(this.players, {
        name: name
      });
      if (!player) {
        player = new Player(name);
        this.players.push(player);
      }
      return player.addScore(parseInt(score, 10));
    };

    PlayersManager.prototype.getPlayers = function() {
      var maxScores;
      maxScores = _.map(this.players, function(player) {
        return _.max(player.scores);
      });
      maxScores.sort(function(a, b) {
        return b - a;
      });
      _.each(this.players, function(player) {
        return player.rank = _.indexOf(maxScores, _.max(player.scores));
      });
      return this.players;
    };

    return PlayersManager;

  })();

  CharacteristicNamesManager = (function() {
    function CharacteristicNamesManager() {
      localStorage.characteristicNames = localStorage.characteristicNames || JSON.stringify([]);
    }

    CharacteristicNamesManager.prototype.toggle = function(name) {
      var names;
      names = JSON.parse(localStorage.characteristicNames);
      if (_.contains(names, name)) {
        names = _.without(names, name);
      } else {
        names.push(name);
      }
      return localStorage.characteristicNames = JSON.stringify(names);
    };

    CharacteristicNamesManager.prototype.getNames = function() {
      return JSON.parse(localStorage.characteristicNames);
    };

    return CharacteristicNamesManager;

  })();

  Range = (function() {
    function Range(_at_begin, _at_end, _at_color) {
      this.begin = _at_begin;
      this.end = _at_end;
      this.color = _at_color;
    }

    return Range;

  })();

  Color = (function() {
    function Color() {}

    Color.promotion = "#ff99ff";

    Color.stay = "#99cc00";

    Color.demotion = "#66ccff";

    Color.characteristic = "#ffd900";

    return Color;

  })();

  Progress = (function() {
    function Progress() {}

    Progress.unexpected = 0;

    Progress.interim = 1;

    Progress.end = 2;

    return Progress;

  })();

  ResultPageManager = (function() {
    function ResultPageManager(_at_leagueConfig) {
      this.leagueConfig = _at_leagueConfig;
    }

    ResultPageManager.prototype.extractRankTable = function() {};

    ResultPageManager.prototype.extractRankRows = function() {
      var rankTable;
      rankTable = this.extractRankTable();
      return _.filter($(rankTable).find("tr"), function(tr) {
        var regexp;
        regexp = /^\d+位$/;
        return regexp.test($(tr).find("td").eq(0).text());
      });
    };

    ResultPageManager.prototype.extractName = function(row) {};

    ResultPageManager.prototype.extractScore = function(row) {};

    ResultPageManager.prototype.extractPlayers = function() {
      var playersManager, rows;
      playersManager = new PlayersManager;
      rows = this.extractRankRows();
      _.each(rows, (function(_this) {
        return function(row) {
          var name, score;
          name = _this.extractName(row);
          score = _this.extractScore(row);
          return playersManager.addScore(name, score);
        };
      })(this));
      return playersManager.getPlayers();
    };

    ResultPageManager.prototype.highlightRankTable = function() {
      var highlightedNames, players, ranges, rows;
      players = this.extractPlayers();
      rows = this.extractRankRows();
      ranges = this.leagueConfig.getRanges();
      highlightedNames = [];
      return _.each(rows, (function(_this) {
        return function(row) {
          var name, player, range;
          name = _this.extractName(row);
          if (!_.contains(highlightedNames, name)) {
            player = _.findWhere(players, {
              name: name
            });
            range = _.find(ranges, function(range) {
              return range.begin <= player.rank && player.rank < range.end;
            });
            _this.highlightRankRow(row, range.color);
            return highlightedNames.push(name);
          }
        };
      })(this));
    };

    ResultPageManager.prototype.highlightRankRow = function(row, color) {};

    ResultPageManager.prototype.characterizeRankTable = function(playersName) {
      var characterizedNames, rows;
      rows = this.extractRankRows();
      characterizedNames = [];
      return _.each(rows, (function(_this) {
        return function(row) {
          var name;
          name = _this.extractName(row);
          if (_.contains(playersName, name) && !_.contains(characterizedNames, name)) {
            _this.characterizeRankRow(row, Color.characteristic);
            return characterizedNames.push(name);
          }
        };
      })(this));
    };

    ResultPageManager.prototype.characterizeRankRow = function(row, color) {};

    ResultPageManager.prototype.setEvents = function() {};

    return ResultPageManager;

  })();

  InterimResultPageManager = (function(_super) {
    __extends(InterimResultPageManager, _super);

    function InterimResultPageManager(leagueConfig) {
      InterimResultPageManager.__super__.constructor.call(this, leagueConfig);
    }

    InterimResultPageManager.prototype.extractRankTable = function() {
      return _.find($("table"), function(table) {
        var regexp;
        regexp = /人が投票した時点での順位$/;
        return regexp.test($(table).find("tr").eq(0).find("td").eq(0).text());
      });
    };

    InterimResultPageManager.prototype.extractName = function(row) {
      return $(row).find("td").eq(5).text();
    };

    InterimResultPageManager.prototype.extractScore = function(row) {
      return parseInt($(row).find("td").eq(1).text(), 10);
    };

    InterimResultPageManager.prototype.highlightRankRow = function(row, color) {
      return $(row).find("td").css({
        backgroundColor: color
      });
    };

    InterimResultPageManager.prototype.characterizeRankRow = function(row, color) {
      return $(row).find("td").eq(5).css({
        backgroundColor: color
      });
    };

    InterimResultPageManager.prototype.setEvents = function() {
      var rows;
      rows = this.extractRankRows();
      return _.each(rows, (function(_this) {
        return function(row) {
          $(row).css({
            cursor: "pointer"
          });
          return $(row).on("click", function() {
            var cnm;
            cnm = new CharacteristicNamesManager;
            cnm.toggle(_this.extractName(row));
            _this.highlightRankTable();
            return _this.characterizeRankTable(cnm.getNames());
          });
        };
      })(this));
    };

    return InterimResultPageManager;

  })(ResultPageManager);

  EndResultPageManager = (function(_super) {
    __extends(EndResultPageManager, _super);

    function EndResultPageManager(leagueConfig) {
      EndResultPageManager.__super__.constructor.call(this, leagueConfig);
    }

    EndResultPageManager.prototype.extractRankTable = function() {
      return _.find($("table"), function(table) {
        var regexp;
        regexp = /終了日:\d{4}年\d{2}月\d{2}日\d{2}時$/;
        return regexp.test($(table).find("tr").eq(0).find("td").eq(0).text());
      });
    };

    EndResultPageManager.prototype.extractName = function(row) {
      var container, regexp;
      regexp = /^(?:\d+\/\d+\/\d+  \[一言\]  )(.+)(?:さんの作品)$/;
      container = $(row).find("td").eq(2).find("div.SMALL1");
      return regexp.exec(container.text().trim())[1];
    };

    EndResultPageManager.prototype.extractScore = function(row) {
      return parseInt($(row).find("td").eq(1).text(), 10);
    };

    EndResultPageManager.prototype.highlightRankRow = function(row, color) {
      return $(row).find("td").eq(0).css({
        backgroundColor: color
      });
    };

    return EndResultPageManager;

  })(ResultPageManager);

  LeagueConfig = (function() {
    function LeagueConfig(_at_beginStay, _at_beginDemotion) {
      this.beginStay = _at_beginStay != null ? _at_beginStay : 5;
      this.beginDemotion = _at_beginDemotion != null ? _at_beginDemotion : 15;
    }

    LeagueConfig.prototype.getRanges = function() {
      var ranges;
      ranges = [];
      ranges.push(new Range(0, this.beginStay, Color.promotion));
      ranges.push(new Range(this.beginStay, this.beginDemotion, Color.stay));
      ranges.push(new Range(this.beginDemotion, Number.POSITIVE_INFINITY, Color.demotion));
      return ranges;
    };

    return LeagueConfig;

  })();

  LeagueConfigMajor = (function(_super) {
    __extends(LeagueConfigMajor, _super);

    function LeagueConfigMajor() {
      LeagueConfigMajor.__super__.constructor.call(this, 1, 10);
    }

    return LeagueConfigMajor;

  })(LeagueConfig);

  LeagueConfig3A = (function(_super) {
    __extends(LeagueConfig3A, _super);

    function LeagueConfig3A() {
      LeagueConfig3A.__super__.constructor.call(this, 5, 15);
    }

    return LeagueConfig3A;

  })(LeagueConfig);

  LeagueConfig2A = (function(_super) {
    __extends(LeagueConfig2A, _super);

    function LeagueConfig2A() {
      LeagueConfig2A.__super__.constructor.call(this, 5, 15);
    }

    return LeagueConfig2A;

  })(LeagueConfig);

  LeagueConfig1A = (function(_super) {
    __extends(LeagueConfig1A, _super);

    function LeagueConfig1A() {
      LeagueConfig1A.__super__.constructor.call(this, 10, 10);
    }

    return LeagueConfig1A;

  })(LeagueConfig);

  getLeagueId = function() {
    var matches;
    matches = location.href.match(/\/league(\d+)\//);
    if (matches !== null) {
      return parseInt(matches[1]);
    } else {
      return null;
    }
  };

  getLeagueConfig = function(leagueId) {
    switch (leagueId) {
      case 4:
        return new LeagueConfigMajor;
      case 3:
        return new LeagueConfig3A;
      case 2:
        return new LeagueConfig2A;
      case 1:
        return new LeagueConfig1A;
      default:
        return new LeagueConfig;
    }
  };

  getProgress = function() {
    var isEndResultPage, isInterimResultPage;
    isInterimResultPage = _.find($("table"), function(table) {
      var regexp;
      regexp = /人が投票した時点での順位$/;
      return regexp.test($(table).find("tr").eq(0).find("td").eq(0).text());
    });
    isEndResultPage = _.find($("table"), function(table) {
      var regexp;
      regexp = /終了日:\d{4}年\d{2}月\d{2}日\d{2}時$/;
      return regexp.test($(table).find("tr").eq(0).find("td").eq(0).text());
    });
    if (isInterimResultPage) {
      return Progress.interim;
    }
    if (isEndResultPage) {
      return Progress.end;
    }
    return Progress.unexpected;
  };

  main = function() {
    var leagueConfig, leagueId, resultPageManager;
    leagueId = getLeagueId();
    if (leagueId === null) {
      return;
    }
    leagueConfig = getLeagueConfig(leagueId);
    resultPageManager = null;
    switch (getProgress()) {
      case Progress.interim:
        resultPageManager = new InterimResultPageManager(leagueConfig);
        break;
      case Progress.end:
        resultPageManager = new EndResultPageManager(leagueConfig);
        break;
      default:
        resultPageManager = null;
    }
    if (resultPageManager === null) {
      return;
    }
    resultPageManager.highlightRankTable();
    resultPageManager.characterizeRankTable((new CharacteristicNamesManager).getNames());
    return resultPageManager.setEvents();
  };

  main();

}).call(this);