[{{mminutes}}:{{sseconds}}] X
Пользователь приглашает вас присоединиться к открытой игре игре с друзьями .

Форум «Программное обеспечение» / Скрипт: рестарт по нажатию клавиши

Лазер Сообщение #1 22 октября 2023 в 15:26
Супермен
13
Писал для себя. В этом деле я начинающий. Из сторонних скриптов у меня (был) установлен только пакет KlavoTools. Насчет других - не в курсе. Скорее всего, что-то подобное уже есть и я изобрел велосипед.

При нажатии клавиши Backspace Tab (можно поменять) создается новая игра в этом же режиме в этом же окне (таймаут 5 и 10 сек. для Одиночной и Открытой игры соответственно). Режим Квалификация тоже поддерживается, можно не исправлять ошибки и начинать заново, если все равно ошибок было много и скорость была недостаточно высокая.

Скачать скрипт (понадобится браузерное расширение Tampermonkey)
Исходный код:
скрытый текст…

Эта строчка отвечает за клавишу (Tab в данном случае):
if (e.key == "Tab"){

Кнопки Играть еще раз и Ctrl+→ (при завершении) не всегда срабатывают. Автоматически играть еще раз (KG_AutoNextRace) тоже глючит. Но можно (теперь) создать новый заезд по нажатию одной клавиши!

скрытый текст…

Любые комментарии, предложения, критика - приветствуются
Последний раз отредактировано 24 февраля 2024 в 13:22 пользователем Лазер
Chechenya Сообщение #2 22 октября 2023 в 16:20
Маньяк
5
в чем различия между "CTRL" и "->" или не будет сбрасывать на мертвую страницу при рестарте через скрипт
Лазер Сообщение #3 22 октября 2023 в 16:26
Супермен
13
Chechenya писал(а):
в чем различия между "CTRL" и "->" или не будет сбрасывать на мертвую страницу при рестарте через скрипт

насколько я знаю, на мертвую страницу сбрасывает если просто Обновить страницу (F5, Ctrl+R) в браузере, там написано "Эта игра уже началась"
обновляется страница с URL вида (https://klavogonki.ru/g/?gmid=12345)
скрипт не обновляет страницу, а открывает новую по нужной ссылке (https://klavogonki.ru/create/?) в текущем окне
почему Ctrl+→ и "Играть еще раз" иногда заедают - не знаю

вместо Backspace вписал Insert - работает, по нажатию Insert создается новый заезд
Последний раз отредактировано 22 октября 2023 в 17:18 пользователем Лазер
Баристарх Сообщение #4 22 октября 2023 в 17:23
Гонщик
1
Лазер, не знаю, в чём конкретно преимущество твоего скрипта. И как пришла идея забиндить что-то на бэкспейс, ведь это кнопка участвует в наборе. Но стрл-стрелка здесь работает через раз из-за проблем с фокусом. Поэтому чтобы перейти в другую игру, нужно сначала нажать таб, тогда фокус переместится куда надо, а ктрл-стрелка гарантированно сработает.
Так что скрипт однозначно избыточный.
Лазер Сообщение #5 22 октября 2023 в 17:34
Супермен
13
Баристарх писал(а):
Лазер, не знаю, в чём конкретно преимущество твоего скрипта. И как пришла идея забиндить что-то на бэкспейс, ведь это кнопка участвует в наборе. Но стрл-стрелка здесь работает через раз из-за проблем с фокусом. Поэтому чтобы перейти в другую игру, нужно сначала нажать таб, тогда фокус переместится куда надо, а ктрл-стрелка гарантированно сработает.

Похоже, ты не читал, как всегда, и KlavoTools'ом→KG_StopErrorsRace не пользовался. Писал я его для себя. Может кому-то еще пригодится.
Я же написал: набираю до первой ошибки, так что бэкспейс не участвует в моем наборе (можно забиндить на другую клавишу). Далее Провал или Fail (KG_StopErrorsRace)
скрытый текст…

, а новый заезд не создается, и нужно заходить в Заезды→Создать игру (мышкой) или по-другому создавать новый. Лишние телодвижения. А со скриптом я просто жму Backspace, в двух случаях: ошибка (Провал) и успешное завершение (и не нужно нажимать таб, чтоб "фокус переместился куда надо", не нужно нажимать Ctrl+→, не нужно браться за мышь и кликать по Играть еще раз).
Баристарх писал(а):
Так что скрипт однозначно избыточный.

По качеству кода, оптимизации - согласен. Я начинающий. Но он работает.
Последний раз отредактировано 23 октября 2023 в 19:58 пользователем Лазер
kazimur Сообщение #6 22 октября 2023 в 18:49
Профи
1
Хорошая идея.
Исправил для себя начало скрипта для обработки Escape:
document.body.addEventListener('keyup', function (e) {
    if (e.which == 27) {

У меня Chrome и keydown не работает. Лучше использовать keyup - это работает стабильно во всех браузерах.
Душа_Чата Сообщение #7 22 октября 2023 в 19:05
Маньяк
2
Создал компактную функцию, которая отдаёт корректную ссылку на любой режим или словарь.

// Static timeout

function createGameLink() {
    const protocol = "https";
    const hostname = "klavogonki.ru";
    const pathname = "/create/";
    const type = "normal";
    const levelFrom = "1";
    const levelTo = "9";
    const timeout = "10";

    const gametype = document.querySelector('#gamedesc span')?.getAttribute('class')?.replace(/-/g, '=');
    const voc = document.querySelector('#gamedesc a')?.getAttribute('href').match(/\d+/)?.[0];

    // Construct the URL based on the defined constants and extracted values
    const url = `${protocol}://${hostname}${pathname}?type=${type}&level_from=${levelFrom}&level_to=${levelTo}&timeout=${timeout}&submit=1${voc ? `&voc=${voc}` : ''}${gametype ? `&${gametype}` : ''}`;

    return url;
}

// Dynamic timeout

function createGameLink() {
    const protocol = 'https';
    const hostname = 'klavogonki.ru';
    const pathname = '/create/';
    const type = 'normal';
    const levelFrom = '1';
    const levelTo = '9';

    // Get the gameDescriptionElement
    const gameDescriptionElement = document.querySelector('#gamedesc');

    // Extract timeout value from the text nodes inside gameDescriptionElement or use default '10'
    const timeout = (gameDescriptionElement?.textContent.match(/таймаут\s*(\d+)/)?.[1] || '10');

    // Extract gametype and voc values using gameDescriptionElement as the selector context
    const gametype = gameDescriptionElement?.querySelector('span')?.getAttribute('class')?.replace(/-/g, '=');
    const voc = gameDescriptionElement?.querySelector('a')?.getAttribute('href').match(/\d+/)?.[0];

    // Construct the URL based on the defined constants and extracted values
    const url = `${protocol}://${hostname}${pathname}?type=${type}&level_from=${levelFrom}&level_to=${levelTo}&timeout=${timeout}&submit=1${voc ? `&voc=${voc}` : ''}${gametype ? `&${gametype}` : ''}`;

    return url;
}
Последний раз отредактировано 22 октября 2023 в 19:32 пользователем Душа_Чата
Лазер Сообщение #8 22 октября 2023 в 19:35
Супермен
13
kazimur, спасибо за замечание, изменил код, теперь там keyup вместо keydown, работает

Душа_Чата, спасибо за код, может пригодиться
Doctorisimus Сообщение #9 23 октября 2023 в 01:31
Супермен
61
можно использовать встроенную функцию повторного заезда
(function(){
    document.addEventListener('keydown', function(e) {
        if ((e.code === 'ControlRight') && (e.location === 2)) {
            document.location = document.URL.replace(/[^d]/g, '') + ".replay";
        }
    }, false);
    return false;
})();

НЕЛЬЗЯ
Последний раз отредактировано 23 октября 2023 в 16:56 пользователем Doctorisimus
Душа_Чата Сообщение #10 23 октября 2023 в 01:56
Маньяк
2
Doctorisimus писал(а):
можно использовать встроенную функцию повторного заезда
(function(){
    document.addEventListener('keydown', function(e) {
        if ((e.code === 'ControlRight') && (e.location === 2)) {
            document.location = document.URL.replace(/[^d]/g, '') + ".replay";
        }
    }, false);
    return false;
})();


на replay имеется ограничение на количество создаваемых заездов за определённый промежуток времени. если частишь, то выльется в отказ сервера и выйдет 403.
un4given Сообщение #11 23 октября 2023 в 02:43
Клавокодер
119
Душа_Чата писал(а):
если частишь, то выльется в отказ сервера и выйдет 403.

true
Лазер Сообщение #12 24 октября 2023 в 12:19
Супермен
13
Изменил код, сделал короче.
Было:
        if (gametype == 'gametype=voc'){
            let a_href = document.querySelector('#gamedesc span a').getAttribute('href');
            const myArray = a_href.split("/");
            let number = myArray[2];
            gametype = gametype + "&voc=" + number;
        }

Стало:
        if (gametype == 'gametype=voc'){
            let number = document.querySelector('#gamedesc span a').getAttribute('href').split("/")[2];
            gametype = gametype + "&voc=" + number;
        }
un4given Сообщение #13 24 октября 2023 в 13:07
Клавокодер
119
Лазер писал(а):
Стало:
        if (gametype == 'gametype=voc'){
            let number = document.querySelector('#gamedesc span a').getAttribute('href').split("/")[2];
            gametype = gametype + "&voc=" + number;
        }


Ну тогда можно ещё сократить:
        if (gametype == 'gametype=voc'){
            gametype = gametype + "&voc=" + document.querySelector('#gamedesc span a').getAttribute('href').split("/")[2];
        }


Душа_Чата Сообщение #14 25 октября 2023 в 02:20
Маньяк
2
никого не смущает название массива myArray? как-будто посмотрел впервые видеоурок по javascript для самых маленьких.
un4given Сообщение #15 25 октября 2023 в 02:32
Клавокодер
119
Душа_Чата писал(а):
никого не смущает название массива myArray?

Оно по итогу сократилось, поэтому пофик.
Лазер Сообщение #16 25 октября 2023 в 09:26
Супермен
13
Душа_Чата писал(а):
никого не смущает название массива myArray? как-будто посмотрел впервые видеоурок по javascript для самых маленьких.

ну да, смущает, написал же ведь: "я начинающий" (в JavaScript), так что неудивительно
видеоуроки не смотрю, предпочитаю текст, гуглить и на stackoverflow ходить
Лазер Сообщение #17 12 февраля 2024 в 14:16
Супермен
13
Выяснилось, что первоначальный скрипт (как и KG_SeparateGameLink из KlavoTools) не рестартит премиумную Абракадабру (а запускает обычную), поэтому добавлен код:
скрытый текст…

Doctorisimus писал(а):
можно использовать встроенную функцию повторного заезда

да, другого способа я не знаю
Баристарх писал(а):
И как пришла идея забиндить что-то на бэкспейс, ведь это кнопка участвует в наборе

теперь это делает Tab (сразу не догадался), а Бэкспейс по-любому нужен в Квалификации
Последний раз отредактировано 21 февраля 2024 в 23:48 пользователем Лазер

Чтобы писать в форуме, нужно зарегистрироваться.


Связаться
Выделить
Выделите фрагменты страницы, относящиеся к вашему сообщению
Скрыть сведения
Скрыть всю личную информацию
Отмена