Greasy Fork

来自缓存

Greasy Fork is available in English.

FIMFiction - Random Story

Adds a button to jump to a random story page

您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey 篡改猴Greasemonkey 油猴子Violentmonkey 暴力猴,才能安装此脚本。

您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey 篡改猴,才能安装此脚本。

您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey 篡改猴Violentmonkey 暴力猴,才能安装此脚本。

您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey 篡改猴Userscripts ,才能安装此脚本。

您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey 篡改猴,才能安装此脚本。

您需要先安装一款用户脚本管理器扩展后才能安装此脚本。

(我已经安装了用户脚本管理器,让我安装!)

您需要先安装一款用户样式管理器扩展,比如 Stylus,才能安装此样式。

您需要先安装一款用户样式管理器扩展,比如 Stylus,才能安装此样式。

您需要先安装一款用户样式管理器扩展,比如 Stylus,才能安装此样式。

您需要先安装一款用户样式管理器扩展后才能安装此样式。

您需要先安装一款用户样式管理器扩展后才能安装此样式。

您需要先安装一款用户样式管理器扩展后才能安装此样式。

(我已经安装了用户样式管理器,让我安装!)

// ==UserScript==
// @name        FIMFiction - Random Story
// @namespace   Selbi
// @include     http*://*fimfiction.net/*
// @version     2.0
// @description Adds a button to jump to a random story page
// ==/UserScript==

let chatButton = document.querySelector(".user_toolbar > ul:first-child > li:last-child");
let randomStoryButton = chatButton.cloneNode(true);
randomStoryButton.onclick = function() {
  randomStoryButton.querySelector("i").classList = "fa fa-spinner fa-spin fa-pulse";
  navigateToRandomStory()
};
randomStoryButton.querySelector("a").href = "#";
randomStoryButton.querySelector("i").classList = "fa fa-random";
randomStoryButton.querySelector("span").innerHTML = "Random Story";
chatButton.after(randomStoryButton);

function navigateToRandomStory() {
  let url = buildRandomStoryHref();
  window.location = url;
}

function buildRandomStoryHref() {
  let storyCount = getApproxTotalStoryCount();
  let url = randomValidStoryUrl(storyCount, 10);
  return url;
}

function getApproxTotalStoryCount() {
  let xhr = new XMLHttpRequest();
  xhr.open('GET', "https://www.fimfiction.net/stories?order=latest", false);
  xhr.send();
  
  // Very dirty, this could be done with fancy XML parsing to find
  // the biggest story ID on the page, but we just care about a very
  // rough estimate count of all stories, so this probably works
  let firstStoryId = (/data-story-id="(\d+)"/m).exec(xhr.responseText)[1];
  return parseInt(firstStoryId);
}

function randomValidStoryUrl(storyCount, attemptsLeft) {
  if (attemptsLeft > 0) {
    let randomStoryId = Math.floor(storyCount * Math.random());
    let url = buildUrl(randomStoryId);
    if (isValidPage(url)) {
      return url;
    }
    return randomValidStoryUrl(storyCount, attemptsLeft - 1);
  }
  return buildUrl(1888); // MLD lul
}

function isValidPage(url) {
  let xhr = new XMLHttpRequest();
  xhr.open('GET', url, false);
  xhr.send();
  
  if (xhr.status === 200) {
    let title = (/<title>(.*?)<\/title>/m).exec(xhr.responseText)[1];
    return !title.startsWith("Login To Story");
  }
  return false;
}

function buildUrl(id) {
  return "https://www.fimfiction.net/story/" + id;
}