Affinity to You

Shows the "Affinity to You" that all users who have commented on any topic on MAL have with you!

目前為 2021-04-01 提交的版本,檢視 最新版本

// ==UserScript==
// @name         Affinity to You
// @namespace    AffinityShow
// @version      0.6
// @description  Shows the "Affinity to You" that all users who have commented on any topic on MAL have with you!
// @author       hacker09
// @match        https://myanimelist.net/forum/?topicid=*
// @icon         https://www.google.com/s2/favicons?domain=myanimelist.net
// @run-at       document-end
// @grant        none
// ==/UserScript==

(function() {
  'use strict';
  var UserAffinityList = []; //Create a new global array
  var MALUserParsedList = new Map(); //Creates a new map to later add all non-dup mal usernames on the page
  var ScriptUsername = document.querySelector("a.header-profile-link").innerText; //Gets the script username

  if (document.querySelector("#quickReply") !== null) //If the topic isn't locked
  { //Starts the if condition
    var AffinityList = document.createElement("button"); //Creates a btn element
    AffinityList.setAttribute("style", "display: none; background-color: snow; margin-left: 10px;"); //The CSS for the "button"
    AffinityList.setAttribute("id", "AffinityList"); //Adds an ID to the button
    AffinityList.setAttribute("class", "inputButton"); //Adds a class to the button
    document.querySelector("#quickReply").prepend(AffinityList); //Append the button above the text box element

    var ShowAffinityList = document.createElement("input"); //Creates an a element
    ShowAffinityList.setAttribute("style", "background-color: #4165ba;"); //The CSS for the input btn
    ShowAffinityList.setAttribute("id", "ShowAffinityList"); //Adds an ID to the input btn
    ShowAffinityList.setAttribute("class", "inputButton"); //Adds a class to the input btn
    ShowAffinityList.setAttribute("value", "      Show Affinity list"); //Adds the input btn default text
    ShowAffinityList.setAttribute("readonly", "readonly"); //Make the input btn default text not editable
    document.querySelector("#quickReply").prepend(ShowAffinityList); //Append the input btn above the text box element
  } //Finishes the if condition

  MALUserParsedList.set(ScriptUsername, {}); //Add the script username to the map,so that the script won't fetch the script user profile
  MALUserParsedList.set('removed-user', {}); //Add the 'removed-user' username to the map,so that the script won't fetch the non existent user profile
  document.querySelectorAll('td.forum_boardrow2 > div > div > a > strong').forEach(async function(UserName) { //Execute this function for each username on the topic page
    if (!MALUserParsedList.has(UserName.innerText)) { //If the username isn't already on the map
      MALUserParsedList.set(UserName.innerText, {}); //Add the username on the map

      const html = await (await fetch('https://myanimelist.net/profile/' + UserName.innerText)).text(); //Gets the fetch response
      var newDocument = new DOMParser().parseFromString(html, 'text/html'); //Parses the fetch response
      if (newDocument.querySelector("span[class*='bar-inner']") !== null) //If the element containing the affinity % exists
      { //Starts the if condition
        var AffinityPercentage = newDocument.querySelector("span[class*='bar-inner']").innerText.replace('--', '-').trim(); //Gets the affinity %
      } //Finishes the if condition
      else //If the element containing the affinity % doesn't exist
      { //Starts the else condition
        AffinityPercentage = ' Unkown'; //Sets the affinity % to Unkown
      } //Finishes the else condition

      if (AffinityPercentage.match('-') === null && AffinityPercentage.match('Unkown') === null) //If the - symbol doesn't exist and if the affinity isn't Unkown
      { //Starts the if condition
        UserAffinityList.push('<a href="' + UserName.parentElement.href + '" target="_blank" title="Click to open the ' + UserName.innerText + '\'s Profile">' + UserName.innerText + ' ' + AffinityPercentage + '</a>'); //Store all the topic User Names and links

        AffinityPercentage = '<strong style="color:blue; font-weight: normal;">Affinity to You ' + AffinityPercentage + '</strong>'; //Make the text blue
      } //Finishes the if condition
      else //If the - symbol DOESN'T exist
      { //Starts the else condition
        AffinityPercentage = '<strong style="color:red; font-weight: normal;">Affinity to You ' + AffinityPercentage + '</strong>'; //Make the text red
      } //Finishes the else condition

      window.jQuery('td.forum_boardrow2 > div > div > a > strong:contains("' + UserName.innerText + '")').parent().parent().parent().after(AffinityPercentage); //Add the affinity % to every topic reply that matches the fetched profile username
    } //Finishes the if condition

    if (document.querySelector("#quickReply") !== null) //If the topic isn't locked
    { //Starts the if condition
      document.querySelector("#AffinityList").innerHTML = UserAffinityList.sort(function(a, b) { //Add the sorted list to the button element
        var aA = parseFloat(a.match(/\d+(?:\.\d+)?(?=%)/)); //Get only the Affinity % numbers
        var bA = parseFloat(b.match(/\d+(?:\.\d+)?(?=%)/)); //Get only the Affinity % numbers
        return bA > aA ? 1 : -1; //Compare the Affinity % and sort the array
      }).join('<br><br>'); //Finishes the sorting condition and add "spaces" between the links
    } //Finishes the if condition

  }); //Finishes the async function

  if (document.querySelector("#quickReply") !== null) //If the topic isn't locked
  { //Starts the if condition
    document.querySelector("#ShowAffinityList").onclick = function() { //When the Show Affinity button is clicked
      var AffinityList = document.querySelector("#AffinityList"); //Store the Affinity List to a variable
      if (AffinityList.style.display === 'none') { //If the Affinity list is hidden
        AffinityList.style.display = ''; //Hide the Affinity List
        document.querySelector("#ShowAffinityList").value = "      Hide Affinity list"; //Change the Show Affinity List text to Hide Affinity List
      } else { //If the Affinity list is being shown
        AffinityList.style.display = 'none'; //Show the Affinity List
        document.querySelector("#ShowAffinityList").value = "      Show Affinity list"; //Change the Hide Affinity List text to Show Affinity List
      } //Finishes the if condition
    }; //Finishes the onclick event listener
  } //Finishes the if condition

})();