ASplayer9119
|
Сообщение #1
21 апреля 2024 в 22:37
|
Маньяк
38 |
Всем привет! Хотел установить старый скрипт, который выводит в результатах заезда скорость с точностью до сотых: KG_ExactSpeed. Но он, походу, уже не работает. Решил написать похожий самостоятельно. Посмотрел структуру скрипта, который вычисляет сложность текста, понял как получать данные и вроде как смог разобраться как это сделать. Результат вы видите на картинке ниже: Можно заметить, что 11 и 12 место проехали практически с равной скоростью. Без скрипта у обоих бы было по 414 зн/мин. Но 11 стоит выше, т.к. на самом деле, его скороcть на сотые доли знака оказалась выше, что мой скрипт и отображает. Скрипт работает в открытых заездах и Иксах. Проверен в Обычном, Абре, разных словариках среднего размера, на отрывке книги. За остальные режимы не ручаюсь. Но, там где не работает, просто должны остаться показатели обычные как сайт сам выводит. Поломки быть не должно. Код поставляется как есть, делайте с ним что хотите! (нужно поставить тамперманки, а потом добавить данный скрипт). Если найдете какие-то баги или появятся предложения, пишите сюда или в личку. Если будет мне не лень, то внесу изменения. Вы также сами вольны модифицировать и использовать данный скрипт как того душа пожелает (только меня, как автора, не удаляйте, плиз, из заголовка, а просто добавьте себя). P.S. за первоначальное предложение по оформлению благодарность un4given скрытый текст… // ==UserScript== // @name KG_CalculatePreciseSpeed // @version 0.1.1 // @namespace klavogonki // @author ASplayer9119 // @description Показывает скорость в результах заезда до сотых // @license MIT // @match http*://klavogonki.ru/g/* // @grant none // ==/UserScript==
(function() { 'use strict';
const proxied = window.XMLHttpRequest.prototype.send;
let gameBeginTime; let textLength; let isMarathon = false;
const alreadyUpdatedPlayers = {};
window.XMLHttpRequest.prototype.send = function () { this.addEventListener('load', function () { try { const json = JSON.parse(this.responseText);
if(json.params?.gametype == 'marathon') { isMarathon = true; }
if ('begintime' in json) { gameBeginTime = json.begintime * 1000; }
if ('charsTotal' in json) { textLength = json.charsTotal; }
if ('players' in json) { json.players.forEach(({id, finished, charsTotal}) => { if (finished) { if (isMarathon) { textLength = charsTotal; }
updateSpeed(id, finished); } }); } } catch (e) {} }.bind(this)); return proxied.apply(this, [].slice.call(arguments)); };
function updateSpeed(idInGame, finishedTime) { if (!gameBeginTime || !textLength || !finishedTime || alreadyUpdatedPlayers[idInGame]) { return; }
const exactSpeed = textLength / (finishedTime - gameBeginTime) * 1000 * 60; const roundedToWholeSpeed = Math.round(exactSpeed);
const playerStatsContainer = document.getElementById('stats' + idInGame); const speedContainer = playerStatsContainer.getElementsByTagName('div')[1]; const speedSpanContainer = speedContainer.getElementsByTagName('span')[0]; const speedSpan = speedSpanContainer.getElementsByTagName('span')[0];
if (speedSpan.textContent == roundedToWholeSpeed) { const roundedToHundredthSpeed = exactSpeed.toFixed(2); const decimalStartsIdx = roundedToHundredthSpeed.indexOf('.'); const wholeNumber = roundedToHundredthSpeed.slice(0, decimalStartsIdx); const decimals = roundedToHundredthSpeed.slice(decimalStartsIdx + 1);
playerStatsContainer.style.left = '142px'; speedContainer.style.marginRight = '18px'; speedSpan.innerHTML = `${wholeNumber}<span style="font-size:0.6em">.${decimals}</span>`;
alreadyUpdatedPlayers[idInGame] = true; } } })(); Последний раз отредактировано 23 апреля 2024 в 12:03 пользователем ASplayer9119
|
un4given
|
Сообщение #2
21 апреля 2024 в 22:55
|
Клавокодер
122 |
Спасибо, написано весьма красиво, поставил, настроил под себя, пользуюсь и другим рекомендую!
|
Вова_10
|
Сообщение #3
22 апреля 2024 в 20:51
|
Супермен
37 |
а как поставить его по ссылке?
|
ASplayer9119
|
Сообщение #4
22 апреля 2024 в 21:50
|
Маньяк
38 |
Вова_10 писал(а): а как поставить его по ссылке? По ссылке - никак. Просто нажми в Tampermonkey "Создать новый скрипт", вставь код отсюда и сохрани. И будет у тебя работать в заездах.
|
Вова_10
|
Сообщение #5
23 апреля 2024 в 22:16
|
Супермен
37 |
Спасибо большое, заработало!
|
Вова_10
|
Сообщение #6
23 апреля 2024 в 22:21
|
Супермен
37 |
а как его настроить-то, Ун4гивен говорил
|
ASplayer9119
|
Сообщение #7
23 апреля 2024 в 22:28
|
Маньяк
38 |
Пожалуйста. Он захотел вместо сотых долей себе показывать тысячные. Если хочешь также, то поменяй exactSpeed.toFixed(2) на exactSpeed.toFixed(3) в коде.
|
Вова_10
|
Сообщение #8
23 апреля 2024 в 22:38
|
Супермен
37 |
|
un4given
|
Сообщение #9
23 апреля 2024 в 22:41
|
Клавокодер
122 |
Вова_10 писал(а): а 4 можно? :) можно и 10, но будет вылазить за пределы дозволенного.
|
carmero
|
Сообщение #10
25 апреля 2024 в 21:46
|
Маньяк
50 |
У меня этот скрипт почему-то конфликтует со скриптом "сохранить в бортжурнале". Последний перестаёт работать...
|
ASplayer9119
|
Сообщение #11
25 апреля 2024 в 22:09
|
Маньяк
38 |
Сорян, такое не тестил, т.к. не устанавливал себе "сохранить в бортжурнале". Но кто-то, у кого есть - всегда может поправить, если есть желание и возможность и выложить свои правки. Как написано в шапке, можете делать с кодом, что хотите :-) Иначе ждите, когда мне не будет лень поковыряться. Еще раз сорян
|
un4given
|
Сообщение #12
25 апреля 2024 в 22:48
|
Клавокодер
122 |
carmero писал(а): У меня этот скрипт почему-то конфликтует со скриптом "сохранить в бортжурнале". Последний перестаёт работать... Штош, скрипт «сохранить в БЖ» валится в этом куске кода: var matches = statsContainer.textContent.match(/(\d{2}:\d{2}\.\d)(\d+) зн\/мин(\d+ ошиб\S+ \([\d,%]+\))/); if (!matches) { throw new Error('result stats were not parsed.'); } Понятно, почему валится: ожидается целое число, а мы там имеем число с точкой, которое не пролазит по регэкспу. Если есть возможность изменить у себя исходник скрипта «сохранить в БЖ», то предлагаю такой костыль: var matches = statsContainer.textContent.match(/(\d{2}:\d{2}\.\d)([\d.]+) зн\/мин(\d+ ошиб\S+ \([\d,%]+\))/);
|