- // ==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 });
-
- })();