Code:
// ==UserScript==
// @name Switch Accounts
// @version 0.1
// @author Calculamatrise
// @match *://frhd.kanoapps.com/*
// @match *://www.freeriderhd.com/*
// @icon https://www.google.com/s2/favicons?domain=freeriderhd.com
// @grant none
// ==/UserScript==
function createElement(type, options) {
let element = document.createElement(type);
for (const attribute in options) {
if (typeof options[attribute] === "object") {
if (attribute === "style") {
for (const property in options[attribute]) {
element.style.setProperty(property, options[attribute][property]);
}
} else if (attribute === "children") {
element.append(...options[attribute]);
}
} else if (typeof options[attribute] === "function") {
element.addEventListener(attribute, options[attribute]);
} else {
if (attribute.startsWith("inner")) {
element[attribute] = options[attribute];
} else {
element.setAttribute(attribute, options[attribute]);
}
}
}
return element;
}
function createUserElement({ login, password }) {
let container = createElement("div", {
children: [
createElement("button", {
class: "new-button button-type-1",
innerText: login,
style: {
width: "82%"
},
click() {
document.querySelector("#simplemodal-overlay")?.remove();
document.querySelector("#signup_login_container")?.remove();
Application.Helpers.AjaxHelper.post("/auth/standard_login", { login, password }).done(function(response) {
response.result && Application.events.publish("auth.login", response.data.user, response.data.user_stats);
});
}
}),
createElement("button", {
class: "btn new-button button-type-1 moderator-remove-race",
innerText: "X",
style: {
height: "100%",
'margin-right': 0,
width: "16%"
},
click() {
let accounts = JSON.parse(localStorage.getItem("switcher-accounts")) ?? [];
accounts.splice(accounts.indexOf(accounts.find((account) => account.login === login)), 1);
localStorage.setItem("switcher-accounts", JSON.stringify(accounts));
container.remove();
}
})
],
style: {
display: "flex",
'justify-content': "space-between",
margin: "4px",
width: "100%"
}
});
return container;
}
Application.events.subscribe("mainview.loaded", window.onload = function() {
let logout = document.querySelector("a.logout");
logout.removeAttribute("id");
logout.innerText = "Switch";
logout.addEventListener("click", function() {
let overlay = createElement("div", {
class: "simplemodal-overlay",
id: "simplemodal-overlay",
style: {
height: "100%",
left: 0,
opacity: 0.5,
position: "fixed",
top: 0,
width: "100%",
'z-index': 1001
}
});
let container = createElement("div", {
children: [
createElement("span", {
class: "core_icons core_icons-icon_close signup-login-modal-close",
click() {
overlay.remove();
container.remove();
}
}),
createElement("div", {
children: (JSON.parse(localStorage.getItem("switcher-accounts")) ?? []).map((account) => createUserElement(account)),
id: "accounts-container",
style: {
display: "flex",
'flex-direction': "column"
}
}),
createElement("button", {
class: "btn new-button button-type-2",
innerText: "Add account",
style: {
'font-size': "16px",
height: "36px",
margin: "4px",
width: "100%"
},
click() {
if (document.querySelector("div#login-container")) {
this.innerText = "Add account";
this.classList.remove("moderator-remove-race");
document.querySelector("div#login-container").remove();
return;
}
this.before(createElement("div", {
children: [
createElement("input", {
class: "field auth-field",
id: "save-account-login",
placeholder: "Username or Email",
style: {
'border-radius': "20px",
margin: "4px",
width: "100%"
},
type: "text"
}),
createElement("input", {
class: "field auth-field",
id: "save-account-password",
placeholder: "Password",
style: {
'border-radius': "20px",
margin: "4px",
width: "100%"
},
type: "password"
}),
createElement("button", {
class: "new-button button-type-1",
innerText: "Save account",
style: {
margin: "4px",
width: "100%"
},
click() {
Application.Helpers.AjaxHelper.post("/auth/standard_login", { login: document.querySelector("#save-account-login")?.value, password: document.querySelector("#save-account-password")?.value }).done((response) => {
if (response.result) {
let accounts = JSON.parse(localStorage.getItem("switcher-accounts")) || [];
if (accounts.find(({ login }) => login === response.data.user.d_name)) {
return;
}
accounts.push({
login: response.data.user.d_name,
password: document.querySelector("#save-account-password")?.value
});
document.querySelector("#accounts-container")?.append(createUserElement(accounts[accounts.length - 1]));
localStorage.setItem("switcher-accounts", JSON.stringify(accounts));
this.parentElement.remove();
}
});
}
})
],
id: "login-container",
style: {
display: "flex",
'flex-direction': "column",
'margin-top': "16px"
}
}));
this.classList.add("moderator-remove-race");
this.innerText = "Cancel";
}
})
],
class: "simplemodal-container",
id: "signup_login_container",
style: {
display: "flex",
'flex-direction': "column",
height: "50%",
left: "36%",
padding: "50px",
position: "fixed",
top: "25%",
width: "360px",
'z-index': 1002
}
});
document.body.append(overlay, container);
});
});