Discord Status Animator (Manual edit/Non-UI)

Automatically changes your Discord status

Устаревшая версия за 14.06.2021. Перейдите к последней версии.

Чтобы установить этот скрипт, вы сначала должны установить расширение браузера, например Tampermonkey, Greasemonkey или Violentmonkey.

Чтобы установить этот скрипт, вы сначала должны установить расширение браузера, например Tampermonkey или Violentmonkey.

Чтобы установить этот скрипт, вы сначала должны установить расширение браузера, например Tampermonkey или Violentmonkey.

Чтобы установить этот скрипт, вы сначала должны установить расширение браузера, например Tampermonkey или Userscripts.

Чтобы установить этот скрипт, сначала вы должны установить расширение браузера, например Tampermonkey.

Чтобы установить этот скрипт, вы должны установить расширение — менеджер скриптов.

(у меня уже есть менеджер скриптов, дайте мне установить скрипт!)

Чтобы установить этот стиль, сначала вы должны установить расширение браузера, например Stylus.

Чтобы установить этот стиль, сначала вы должны установить расширение браузера, например Stylus.

Чтобы установить этот стиль, сначала вы должны установить расширение браузера, например Stylus.

Чтобы установить этот стиль, сначала вы должны установить расширение — менеджер стилей.

Чтобы установить этот стиль, сначала вы должны установить расширение — менеджер стилей.

Чтобы установить этот стиль, сначала вы должны установить расширение — менеджер стилей.

(у меня уже есть менеджер стилей, дайте мне установить скрипт!)

// ==UserScript==
// @name         Discord Status Animator (Manual edit/Non-UI)
// @namespace    https://github.com/Hakorr/status-animator
// @run-at       document-start
// @version      1.1
// @description  Automatically changes your Discord status
// @author       HKR
// @match        https://discord.com/*
// @grant        none
// ==/UserScript==

(function() {
	//Welcome! Don't be scared by the code, I was too lazy to do an UI for this.
	//All you have to edit is the statusanimation function's code (Around the line 40)
	
	var name = "Status Animator";
	var version = "V1.1";
	var run = true;

	//A Cookie will be made with this name, feel free to edit it
	var cookie_name = "StatusToken";
	var delete_cookie_after_a_week = true;
	
	//Your status will be changed to these after you close the Discord tab
	var default_status_text = "";
	var default_status_emoji = "";
	var default_status_state = "online";
	
	//Animation blocks////////////////
	/*
	 - status(emoji,text,state);
		-> state = invisible, dnd, idle, online
	 - await delay(ms);
	
	*/async function statusanimation() {
	////////////////////////////////////
	   
		status("👐","This","online");
		await delay(500);
		
		status("👀","Is","dnd");
		await delay(500);
		
		status("😶","A","idle");
		await delay(500);
		
		status("✨","Test","invisible");
		await delay(500);
		
		status("","");
		await delay(2000);
		
	/////////////////////////////
	if (run) statusanimation(); }
	
	//Do not edit after this line (If you don't know what you're doing)
	///////////////////////////////////////////////////////////////////
	
	//Function to read the saved cookie
	window.getCookie = function(name) {
		var match = document.cookie.match(new RegExp('(^| )' + name + '=([^;]+)'));
		if (match) return match[2];
	}
	
	//Set the Discord Token as a Cookie for future use of the script
	//If there is no Token cookie
	if(document.cookie.indexOf(cookie_name + "=") == -1) {
		//Ask user if they want to refresh the page to get the token
		if(confirm("\"" + cookie_name + "\" cookie not found. Refreshing Discord to get it.\n\n- " + name + " " + version)) {
			
			//Load the page again and create a new element which will have the token in its localStorage
			location.reload();
			var i = document.createElement('iframe');
			document.body.appendChild(i);
			
			//Get Token from localStorage
			var token = i.contentWindow.localStorage.token
			token = token.slice(1, -1);
			
			//Delete cookie after a week or not
			if(delete_cookie_after_a_week) 
				document.cookie = cookie_name + "=" + token + "; secure=true; max-age=604800; path=/";
			else
				document.cookie = cookie_name + "=" + token + "; secure=true; path=/";

		} else throw new Error("[Not an actually uncaught] User stopped the Status Animator. \n\nNo cookie was found and user decided not to continue.");
	}
	
	var status_text = "";
	var status_emoji = "";
	var status_state = "";
	//Function that changes the status variables (Saves up a bit space)
	function status(emoji,text,state) {
		if(run) {
			status_text = text;
			status_emoji = emoji;
			status_state = state;
			
			setstatus();
		}
	}
	
	//Get Discord Token from saved Cookie
	var token = getCookie(cookie_name);

	//HTTP Request's URL address
	var url = "https://discord.com/api/v9/users/@me/settings";
	
	//Function that handles the HTTP request for the status change
	function setstatus() {

		var request = new XMLHttpRequest(); 
		request.open("PATCH", url); 
		request.setRequestHeader("Accept", "*/*" ); 
		request.setRequestHeader("Content-Type", "application/json"); 
		request.setRequestHeader("Authorization", token);
		request.send(JSON.stringify({"custom_status":{"text":status_text,"emoji_name":status_emoji}}));

		//If the request failed
		request.onreadystatechange = () => {
			if (request.status != 200) {
				run = false; 
				throw new Error("[Not an actually uncaught] Failed to update status. \n\nThe HTTP request failed. Most likely because the authorization token is incorrect.");
			}
		};
			
		
		if(status_state == "invisible" || status_state == "dnd" || status_state == "idle" || status_state == "online") {
			var request2 = new XMLHttpRequest(); 
			request2.open("PATCH", url); 
			request2.setRequestHeader("Accept", "*/*" ); 
			request2.setRequestHeader("Content-Type", "application/json"); 
			request2.setRequestHeader("Authorization", token);
			request2.send(JSON.stringify({"status":status_state}));
			
			//If the request failed
			request2.onreadystatechange = () => {
				if (request2.status != 200) {
					run = false; 
					throw new Error("[Not an actually uncaught] Failed to update status. \n\nThe HTTP request failed. Most likely because the authorization token is incorrect.");
				}
			};
		}
	}
	
	//Simple delay function for animation
	function delay(t) {
		return new Promise(function(resolve) {
		  setTimeout(resolve, t)
		});
	}
	
	//Start the animation for the first time
	if (run) statusanimation();
	
	//Edit (Clear by default) status before exiting
	window.onbeforeunload = function () {
		run = false;
		
		status_text = default_status_text;
		status_emoji = default_status_emoji;
		
		if(status_state == "invisible" || status_state == "dnd" || status_state == "idle" || status_state == "online")
		status_state = default_status_state;
	
		setstatus();
		
		return "";
	};
})();