Script that speeds up Activity Making
// ==UserScript== // @name AniList - Activity Assistant // @namespace https://www.youtube.com/c/NurarihyonMaou/ // @version 1.3.6 // @description Script that speeds up Activity Making // @author NurarihyonMaou // @match https://anilist.co/* // @icon https://www.google.com/s2/favicons?sz=64&domain=anilist.co // @require https://code.jquery.com/jquery-3.6.0.js // @require https://code.jquery.com/ui/1.13.1/jquery-ui.js // @resource IMPORTED_CSS https://code.jquery.com/ui/1.13.1/themes/base/jquery-ui.css // @grant GM_getResourceText // @grant GM_addStyle // @grant GM_getValue // @grant GM_setValue // ==/UserScript== const $ = window.jQuery; const x_csrf_token = $("head script:contains('window.al_token')").text().split(/[“"”]+/g)[1]; const imported_CSS = GM_getResourceText("IMPORTED_CSS"); const list_Style = 'ul.ui-autocomplete { background-color: rgb(21, 31, 46); color: RGB(159,173,189); }'; const category_Style = '.ui-autocomplete-category { font-weight: bold; padding: .2em .4em; margin: .8em 0 .2em;line-height: 1.5;}'; GM_addStyle(list_Style); GM_addStyle(imported_CSS); GM_addStyle(category_Style); let autoComplete = []; let textArea, prefix, wordsConnector, caretPos, CaretPos; let allWords, currentWord, lastSearched, words; (function init() { textArea = document.getElementsByClassName("el-textarea__inner"); if (textArea.length > 0) { if (GM_getValue("wordsConnector") == undefined || GM_getValue("prefix") == undefined) { prefix = prompt("Type a Character that You want to use as a Prefix for using the AutoComplete. You can change it later by Typing - 'changePrefix'", "."); wordsConnector = prompt("Type a Character that You want to use as a Connector for Multiple-Word-Search. You can change it later by Typing - 'wordsConnector'", "_"); GM_setValue("prefix", prefix); GM_setValue("wordsConnector", wordsConnector); } else { wordsConnector = GM_getValue("wordsConnector"); prefix = GM_getValue("prefix"); } $(textArea).after('<input type="hidden" id="testArea">'); function searchQuery(word) { var query = ` query($search:String,$isAdult:Boolean){anime:Page(perPage:8){pageInfo{total}r###lts:media(type:ANIME,isAdult:$isAdult,search:$search){id title{romaji, english, native}coverImage{medium}type format bannerImage isLicensed startDate{year}}}manga:Page(perPage:8){pageInfo{total}r###lts:media(type:MANGA,isAdult:$isAdult,search:$search){id title{romaji, english, native}coverImage{medium}type format bannerImage isLicensed startDate{year}}}characters:Page(perPage:8){pageInfo{total}r###lts:characters(search:$search){id name{full, native, alternative}image{medium}}}staff:Page(perPage:8){pageInfo{total}r###lts:staff(search:$search){id primaryOccupations name{full, native, alternative}image{medium}}}studios:Page(perPage:13){pageInfo{total}r###lts:studios(search:$search){id name}}users:Page(perPage:8){r###lts:users(search:$search){id name avatar{medium}}}} `; var variables = { search: word }; var url = 'https://anilist.co/graphql', options = { method: 'POST', headers: { 'Content-Type': 'application/json', 'Accept': 'application/json', "x-csrf-token": x_csrf_token }, body: JSON.stringify({ query: query, variables: variables }) }; fetch(url, options).then(handleResponse) .then(handleData) .catch(handleError); function handleResponse(response) { return response.json().then(function (json) { return response.ok ? json : Promise.reject(json); }); } function handleData(data) { autoComplete = []; $.each(data.data.anime.r###lts, function (index, element) { autoComplete.push({ 'value': 'https://anilist.co/anime/' + element.id, 'label': [element.title.romaji, element.title.english, element.title.native], 'category': 'Anime' }); }); $.each(data.data.manga.r###lts, function (index, element) { autoComplete.push({ 'value': 'https://anilist.co/manga/' + element.id, 'label': [element.title.romaji, element.title.english, element.title.native], 'category': 'Manga' }); }); $.each(data.data.characters.r###lts, function (index, element) { autoComplete.push({ 'value': '[' + element.name.full + '](https://anilist.co/character/' + element.id + ")", 'label': [element.name.full, element.name.native, element.name.alternative], 'category': 'Characters' }); }); $.each(data.data.staff.r###lts, function (index, element) { autoComplete.push({ 'value': '[' + element.name.full + '](https://anilist.co/staff/' + element.id + ")", 'label': [element.name.full, element.name.native, element.name.alternative], 'category': 'Staff' }); }); $.each(data.data.users.r###lts, function (index, element) { autoComplete.push({ 'value': '@' + element.name, 'label': element.name, 'category': 'Users' }); }); $.each(data.data.studios.r###lts, function (index, element) { autoComplete.push({ 'value': '[' + element.name + '](https://anilist.co/studio/' + element.id + ")", 'label': element.name, 'category': 'Studios' }); }); } function handleError(error) { alert('Error, check console'); console.error(error); } } $.widget("custom.catcomplete", $.ui.autocomplete, { _create: function () { this._super(); this.widget().menu("option", "items", "> :not(.ui-autocomplete-category)"); }, _renderMenu: function (ul, items) { var that = this, currentCategory = ""; $.each(items, function (index, item) { var li; if (item.category != currentCategory) { ul.append("<li class='ui-autocomplete-category'>" + item.category + "</li>"); currentCategory = item.category; } li = that._renderItemData(ul, item); let useThisLabel = Array.isArray(item.label) ? item.label[0] : item.label; if (item.category) { li.attr("aria-label", item.category + " : " + useThisLabel); } li.children().text(useThisLabel); }); } }); function ReturnWord(text, caretPos) { let preText = text.substring(0, caretPos); allWords = preText.split(/\s+/); return allWords[allWords.length - 1]; } function GetCaretPosition(ctrl) { if (document.selection) { ctrl.focus(); let Sel = document.selection.createRange(); Sel.moveStart('character', -ctrl.value.length); CaretPos = Sel.text.length; } else if (ctrl.selectionStart || ctrl.selectionStart == '0') CaretPos = ctrl.selectionStart; return (CaretPos); } function setCaretPosition(caretPos) { if (textArea[0] != null) { if (textArea[0].createTextRange) { var range = textArea[0].createTextRange(); range.move('character', caretPos); range.select(); } else { if (textArea[0].selectionStart) { textArea[0].focus(); textArea[0].setSelectionRange(caretPos, caretPos); } else textArea[0].focus(); } } } $(textArea).on('input', function () { caretPos = GetCaretPosition(textArea[0]) currentWord = ReturnWord($(textArea).val(), caretPos).replaceAll(wordsConnector, " "); if (currentWord == "wordsConnector") { $(textArea).val($(textArea).val().replace("wordsConnector", "")); wordsConnector = prompt("Type a Character that You want to use as a Connector for Multiple-Word-Search.", wordsConnector); GM_setValue("wordsConnector", wordsConnector); } else if (currentWord == "changePrefix") { $(textArea).val($(textArea).val().replace("changePrefix", "")); prefix = prompt("Type a Character that You want to use as a Prefix for using the AutoComplete.", prefix); GM_setValue("changePrefix", prefix); } else if (currentWord.length > 2 && lastSearched != currentWord && currentWord[0] == prefix) { currentWord = currentWord.substring(1); searchQuery(currentWord); lastSearched = currentWord; } }); $(textArea).catcomplete({ delay: 500, minLength: 3, source: function (request, response) { response($.ui.autocomplete.filter( autoComplete, currentWord)); }, focus: function () { return false; }, select: function (event, ui) { let insertAutoComplete = $(textArea).val().substring(0, caretPos - currentWord.length - 1) + ui.item.value + $(textArea).val().substr(caretPos); $(textArea).val(insertAutoComplete); setCaretPosition(caretPos + ((ui.item.value).length - currentWord.length)); autoComplete = []; currentWord = ""; return false; } }); } else { setTimeout(init, 0); } })(); let oldURL; (function () { let pushState = history.pushState; let replaceState = history.replaceState; history.pushState = function () { pushState.apply(history, arguments); window.dispatchEvent(new Event("pushstate")); window.dispatchEvent(new Event("locationchange")); }; history.replaceState = function () { replaceState.apply(history, arguments); window.dispatchEvent(new Event("replacestate")); window.dispatchEvent(new Event("locationchange")); }; window.addEventListener("popstate", function () { window.dispatchEvent(new Event("locationchange")); }); })(); $(window).on("load", function () { GM_setValue("oldURL", $(location).attr("pathname").split("/")[1]); }); window.addEventListener("locationchange", function () { oldURL = GM_getValue("oldURL"); if ( (oldURL != $(location).attr("pathname").split("/")[1]) && ($(location).attr("pathname").split("/")[1] == "user" || $(location).attr("pathname").split("/")[1] == "home" || $(location).attr("pathname").split("/")[1] == "forum" || $(location).attr("pathname").split("/")[1] == "activity") ) { GM_setValue("oldURL", $(location).attr("pathname").split("/")[1]); location.reload(); } else GM_setValue("oldURL", $(location).attr("pathname").split("/")[1]); });