// ==UserScript==
// @name Balance Changer
// @namespace http://tampermonkey.net/
// @version 1.0
// @description Скрытно меняет баланс на форуме.
// @author eretly
// @match https://lzt.market/*
// @match https://lolz.live/*
// @license MIT
// @run-at document-start
// @grant none
// ==/UserScript==
(function () {
'use strict';
const amountToAdd = 24369.32;
function formatNumber(num) {
let formattedNum = num.toLocaleString('ru-RU', { minimumFractionDigits: 2 });
if (formattedNum.endsWith(',00')) {
formattedNum = formattedNum.slice(0, -3);
}
return formattedNum;
}
function formatContestPrize(num) {
const integerOnly = parseInt(num.toString().split(/[,.]/)[0]);
return integerOnly.toLocaleString('ru-RU');
}
function modifyMarketBalance() {
const availableBalanceSpan = document.querySelector('.marketRefillBalance--Row .explain .MarketAvailableBalance[data-value="0.00"]');
if (availableBalanceSpan && !availableBalanceSpan.dataset.modified) {
try {
let currentBalance = parseFloat(availableBalanceSpan.textContent.replace(/[^\d,.-]/g, '').replace(',', '.')) || 0;
let newBalance = currentBalance + amountToAdd;
let formattedBalance = formatNumber(newBalance);
availableBalanceSpan.textContent = formattedBalance + ' ₽';
availableBalanceSpan.dataset.modified = "true";
} catch (e) {
console.error("Error", e);
}
}
}
function modifyBalance(element) {
if (!element || element.dataset.modified) return;
try {
let currentBalance = parseFloat(element.textContent.replace(/\s/g, '').replace(',', '.')) || 0;
let newBalance = currentBalance + amountToAdd;
element.textContent = formatNumber(newBalance);
element.dataset.modified = "true";
} catch (e) {
console.error("Error", e);
}
}
function modifyMethodBalance(element) {
if (!element || element.dataset.modified) return;
try {
const text = element.textContent.trim();
const balanceMatch = text.match(/\(([\d\s,.-]+)\s*₽\)/);
if (balanceMatch) {
let currentBalance = parseFloat(balanceMatch[1].replace(/\s/g, '').replace(',', '.')) || 0;
let newBalance = currentBalance + amountToAdd;
let formattedBalance = formatNumber(newBalance);
const newText = text.replace(/\([\d\s,.-]+\s*₽\)/, `(${formattedBalance} ₽)`);
element.textContent = newText;
element.dataset.modified = "true";
}
} catch (e) {
console.error("Error", e);
}
}
function modifyContestBalance() {
const contestBalanceElement = document.querySelector('#ContestPrizType--money .explain');
if (contestBalanceElement && !contestBalanceElement.dataset.modified) {
try {
const text = contestBalanceElement.textContent.trim();
const balanceMatch = text.match(/Доступный баланс\s*([\d\s,.-]+)\s*₽/);
if (balanceMatch) {
let currentBalance = parseFloat(balanceMatch[1].replace(/\s/g, '').replace(',', '.')) || 0;
let newBalance = currentBalance + amountToAdd;
let formattedBalance = formatNumber(newBalance);
const newText = text.replace(/Доступный баланс\s*[\d\s,.-]+\s*₽/, `Доступный баланс ${formattedBalance} ₽`);
contestBalanceElement.textContent = newText;
contestBalanceElement.dataset.modified = "true";
}
} catch (e) {
console.error("Error", e);
}
}
}
function modifyTransferAmount() {
document.querySelectorAll('.bigTextHeading').forEach(element => {
if (!element.dataset.modified && element.textContent.includes("Сумма перевода (Доступно для перевода")) {
try {
let match = element.textContent.match(/Доступно для перевода ([\d\s,.-]+)₽/);
if (match) {
let currentBalance = parseFloat(match[1].replace(/\s/g, '').replace(',', '.')) || 0;
let newBalance = currentBalance + amountToAdd;
let formattedBalance = formatNumber(newBalance);
element.innerHTML = `Сумма перевода (Доступно для перевода ${formattedBalance} ₽)`;
element.dataset.modified = "true";
}
} catch (e) {
console.error("Ошибка при изменении суммы перевода:", e);
}
}
});
}
function modifyLastTransferAmount() {
const transferSpans = document.querySelectorAll('.Transfer[data-amount]');
if (transferSpans.length > 0) {
const lastTransfer = transferSpans[transferSpans.length - 1];
if (!lastTransfer.dataset.modified) {
try {
let currentAmount = parseFloat(lastTransfer.dataset.amount.replace(/\s/g, '').replace(',', '.')) || 0;
let newAmount = currentAmount + amountToAdd;
let formattedAmount = formatNumber(newAmount);
lastTransfer.dataset.amount = formattedAmount;
lastTransfer.querySelector('span:first-child').textContent = formattedAmount;
lastTransfer.dataset.modified = "true";
} catch (e) {
console.error("Ошибка при изменении суммы в <span class='Transfer'>:", e);
}
}
}
}
function modifyPayoutBalance() {
if (!window.location.href.includes('https://lzt.market/balance/payout')) return;
const payoutBalanceElement = document.querySelector('.explain .MarketAvailableBalance');
if (payoutBalanceElement && !payoutBalanceElement.dataset.modified) {
try {
let currentBalance = parseFloat(payoutBalanceElement.textContent.replace(/[^\d,.-]/g, '').replace(',', '.')) || 0;
let newBalance = currentBalance + amountToAdd;
let formattedBalance = formatNumber(newBalance);
payoutBalanceElement.textContent = formattedBalance + ' ₽';
payoutBalanceElement.dataset.modified = "true";
} catch (e) {
console.error("Error", e);
}
}
}
function updateUI() {
const notEnoughMoneyElement = document.getElementById('NotEnoughMoney');
const totalMoneyPrizeElement = document.getElementById('TotalMoneyPrizeData');
const prizeInputElement = document.getElementById('prize_data_money');
const contestBalanceElement = document.querySelector('#ContestPrizType--money .explain');
if (!contestBalanceElement || !prizeInputElement || !totalMoneyPrizeElement || !notEnoughMoneyElement) return;
// Получаем измененный баланс
const balanceMatch = contestBalanceElement.textContent.match(/Доступный баланс\s*([\d\s,.-]+)\s*₽/);
if (!balanceMatch) return;
const availableBalance = parseFloat(balanceMatch[1].replace(/\s/g, '').replace(',', '.')) || 0;
// Получаем введенную сумму
const prizeAmount = parseFloat(prizeInputElement.value.replace(/\s/g, '').replace(',', '.')) || 0;
if (prizeAmount === 0 || prizeInputElement.value.trim() === '') {
// Если сумма равна 0 или поле пустое
notEnoughMoneyElement.style.display = 'none'; // Скрываем красное сообщение
totalMoneyPrizeElement.style.display = 'none'; // Скрываем блок списания
} else if (prizeAmount <= availableBalance) {
// Если сумма меньше или равна балансу
notEnoughMoneyElement.style.display = 'none'; // Скрываем красное сообщение
totalMoneyPrizeElement.style.display = 'block'; // Показываем блок списания
// Обновляем сумму списания с удалением десятичной части и с пробелами между тысячами
const valueElement = totalMoneyPrizeElement.querySelector('.Value');
if (valueElement) {
valueElement.textContent = formatContestPrize(prizeAmount);
}
} else {
// Если сумма больше баланса
notEnoughMoneyElement.style.display = 'block'; // Показываем красное сообщение
totalMoneyPrizeElement.style.display = 'none'; // Скрываем блок списания
}
}
function setupPrizeInputListener() {
const prizeInputElement = document.getElementById('prize_data_money');
if (prizeInputElement) {
prizeInputElement.addEventListener('input', () => {
setTimeout(updateUI, 100);
});
}
}
function applyChanges() {
if (window.location.href.includes('lzt.market')) {
document.querySelectorAll('.balanceValue, .Incomes').forEach(modifyBalance);
modifyMarketBalance();
document.querySelectorAll('.Method.method.full.balance.balance, .Method.method.full.balance.balance.selected').forEach(modifyMethodBalance);
modifyTransferAmount();
modifyLastTransferAmount();
modifyPayoutBalance();
}
if (window.location.href.includes('lolz.live')) {
lolzLiveSpecificFix();
modifyContestBalance();
updateUI();
setupPrizeInputListener();
}
document.documentElement.style.display = "";
}
function startObserver() {
if (!document.body) {
setTimeout(startObserver, 100);
return;
}
const observer = new MutationObserver((mutationsList) => {
for (const mutation of mutationsList) {
if (mutation.type === 'childList') {
mutation.addedNodes.forEach(node => {
if (node.nodeType === Node.ELEMENT_NODE) {
const methodBalanceElements = node.querySelectorAll ? node.querySelectorAll('.Method.method.full.balance.balance, .Method.method.full.balance.balance.selected') : [];
methodBalanceElements.forEach(modifyMethodBalance);
if (node.id === 'ContestPrizType--money' || node.querySelector('#ContestPrizType--money')) {
modifyContestBalance();
updateUI();
setupPrizeInputListener();
}
if (window.location.href.includes('https://lzt.market/balance/payout')) {
modifyPayoutBalance();
}
modifyTransferAmount();
modifyLastTransferAmount();
}
});
}
}
});
observer.observe(document.body, { childList: true, subtree: true });
}
startObserver();
document.addEventListener('DOMContentLoaded', () => {
setTimeout(applyChanges, 100);
});
window.addEventListener('load', () => {
setTimeout(applyChanges, 100);
});
function lolzLiveSpecificFix() {
const possibleSelectors = [
'#AccountMenu .balanceValue',
'.balanceRow .balanceValue',
'.Menu.HeaderMenu .balanceValue',
'.balanceValue'
];
for (let selector of possibleSelectors) {
const elements = document.querySelectorAll(selector);
if (elements.length > 0) {
elements.forEach(modifyBalance);
}
}
}
document.documentElement.style.display = "none";
setTimeout(() => {
document.documentElement.style.display = "";
}, 1);
const observer = new MutationObserver((mutationsList) => {
for (const mutation of mutationsList) {
if (mutation.type === 'childList') {
mutation.addedNodes.forEach(node => {
if (node.nodeType === Node.ELEMENT_NODE) {
applyChanges();
}
});
}
}
});
observer.observe(document.body, { childList: true, subtree: true });
})();