Gamesquad URL Converter

Automatically redirect old URLs of Gamesquad Forum to new ones, inspired by @JRV

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

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

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

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

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

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

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

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

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

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

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

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

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

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

// ==UserScript==
// @name         Gamesquad URL Converter
// @namespace    http://tampermonkey.net/
// @version      0.1.3.2
// @license      GPLv3
// @description  Automatically redirect old URLs of Gamesquad Forum to new ones, inspired by @JRV
// @author       micalex
// @match        *://*.gamesquad.com/*
// @grant        none
// ==/UserScript==
(function() {
  const url = window.location.href;
  const regexMap = {
    google: /http:\/\/forums.gamesquad.com\/showthread.php\?([0-9]+)-/,
    archive: /http:\/\/forums.gamesquad.com\/archive\/index.php\/t-([0-9]+)/,
    gamesquad: /http:\/\/forums.gamesquad.com\/showthread.php\?t=([0-9]+)/,
    oldNewGamesquad: /http:\/\/www.gamesquad.com\/xenforo\/index.php\?[^.]+\.([0-9]+)/,
    oldPostUrl: /http:\/\/forums.gamesquad.com\/showpost.php\?p=([0-9]+)/,
    forumdisplay: /http:\/\/forums.gamesquad.com\/forumdisplay.php\?(\d+)-(.+)/,
    member: /http:\/\/forums.gamesquad.com\/member.php\?(\d+)-(.+)/
  };
  const baseNewUrlMap = {
    google: 'https://www.gamesquad.com/forums/index.php?threads/',
    archive: 'https://www.gamesquad.com/forums/index.php?threads/',
    gamesquad: 'https://www.gamesquad.com/forums/index.php?threads/',
    oldNewGamesquad: 'https://www.gamesquad.com/forums/index.php?threads/',
    oldPostUrl: 'https://www.gamesquad.com/forums/index.php?posts/',
    forumdisplay: 'https://gamesquad.com/forums/index.php?forums/',
    member: 'https://www.gamesquad.com/forums/index.php?members/'
  };

  const xhr = new XMLHttpRequest();
  xhr.open('HEAD', url, true);
  xhr.onload = function() {
    if (xhr.status === 404) {
      const match = Object.entries(regexMap).find(([key, regex]) => url.match(regex));
      if (match) {
        let newUrl = '';
        const rule = match[0];
        if (rule === 'forumdisplay') {
          const matches = url.match(regexMap.forumdisplay);
          const forumId = matches[1];
          let forumName = matches[2];
          forumName = forumName.toLowerCase().startsWith('asl-') ? forumName.slice(4).toLowerCase() : forumName.toLowerCase();
          newUrl = baseNewUrlMap.forumdisplay + forumName + '.' + forumId + '/';
        } else if (rule === 'member') {
          const matches = url.match(regexMap.member);
          const memberId = matches[1];
          const memberName = matches[2].toLowerCase();
          newUrl = baseNewUrlMap.member + memberName + '.' + memberId + '/';
        } else {
          const threadId = url.match(regexMap[rule])[1];
          const baseNewUrl = baseNewUrlMap[rule];
          newUrl = baseNewUrl + threadId;
          const query = url.indexOf('?') > -1 ? url.substring(url.indexOf('?') + 1) : '';
          const queryParts = query ? query.split('&') : [];
          const newQuery = queryParts.slice(1).join('&');
          newUrl = newUrl + (newQuery ? '&' + newQuery : '');
        }
        document.body.innerHTML = '';
        document.title = 'Detected old URL, redirecting';
        const container = document.createElement('div');
        container.className = 'container';
        document.body.appendChild(container);
        const text = document.createElement('div');
        text.className = 'text';
        text.textContent = 'Detected old URL, redirecting';
        let dots = 0;
        const interval = setInterval(() => {
          dots = (dots + 1) % 4;
          text.textContent = `Detected old URL, redirecting${'.'.repeat(dots)}`;
        }, 500);
        container.appendChild(text);
        setTimeout(() => {
          clearInterval(interval);
          window.location.href = newUrl;
        }, 2000);
      } else if (!document.title.includes('Oops!')) {
        document.body.innerHTML = '';
        document.title = 'Unable to match string as old gamesquad URL.';
        const container = document.createElement('div');
        container.className = 'container';
        document.body.appendChild(container);
        const errorMessage = document.createElement('div');
        errorMessage.className = 'text';
        errorMessage.textContent = 'Unable to match string as old gamesquad URL.';
        container.appendChild(errorMessage);
        const backButton = document.createElement('button');
        backButton.className = 'back-button';
        const action = window.history.length > 1 ? { text: 'Back', handler: () => window.history.go(-1) } : { text: 'Close', handler: () => window.close() };
        backButton.textContent = action.text;
        backButton.onclick = action.handler;
        container.appendChild(backButton);
        const style = document.createElement('style');
        style.textContent = `
          .container {
            display: flex;
            flex-direction: column;
            align-items: center;
            justify-content: center;
            height: 100vh;
          }
          .text {
            font-size: 24px;
            font-weight: bold;
            color: #000;
            text-align: center;
            margin-bottom: 20px;
          }
          .back-button {
            padding: 10px 20px;
            border: none;
            border-radius: 5px;
            background-color: #4CAF50;
            color: #fff;
            cursor: pointer;
            margin: 0 auto;
            display: block;
          }
        `;
        document.head.appendChild(style);
      }
    } else {
      return;
    }
  };
  xhr.send();
})();