[{{mminutes}}:{{sseconds}}] X
Пользователь приглашает вас присоединиться к открытой игре игре с друзьями .
Ctrl предыдущая следующая Ctrl Страницы
1 2 3 4 5

Форум «Программное обеспечение» / [Скрипт] Новая игра по Tab/Esc и авто(ре)старт

Лазер Сообщение #1 22 октября 2023 в 15:26
Супермен
13

Новая игра создается по нажатию клавиши (Tab или Esc), а не по клику на "Создать новый заезд" (KG_SeparateGameLink), и во время игры тоже, а не только после завершения ИЛИ автоматически сразу после завершения ИЛИ в целях поиска текста нужной сложности... (Администрации: об этом тут и тут)

Новая игра создается в этом же режиме/словаре в этом же окне с тем же таймаутом и для тех же рангов. Режим Квалификация тоже поддерживается, можно не исправлять ошибки и начинать заново, если их было много и/или скорость была недостаточно высокая.

Чтобы выбрать клавишу, надо кликнуть на нее вверху слева от " - новая игра" (Tab или Esc).

Если включить ☑Автостарт, то после завершения игры будет создана новая через 1-2-3-4-5 (на выбор) сек. (но это можно отменить, кликнув на Стоп или нажав ←BackSpace, а если выскакивает диалоговое окошко "Поздравляем..." при установлении рекорда (или "Рекорд заблокирован... Квалификация?"), то Автостарт отменяется автоматически). Использовать с осторожностью (можно не успеть сохранить в БЖ, заскриншотить и т.д.)!

Если установлен скрипт определения сложности, то можноПодобрать текст нужной сложности идея. Клавиша Pause отменяет подбор (это нужно, чтоб не подбирать вечно, если из Обычного режима перейти в Буквы). Работает только в Одиночных заездах.

Можно установить Минимальную итоговую скорость (в зн./мин.) или Максимальное время (в мс.) идея и если не уложиться в эти рамки, то будет ПРОВАЛ. Часы должны быть точные. Добавлено дополнительное значение к Спидометру - примерная скорость. Не работает в Марафоне. Может оказаться полезным этот скрипт.

Если включить ☑Не ждать других игроков на панели Настроек, то не надо будет нажимать Ctrl+Enter или кликать (чтобы) "Начать игру", не дожидаясь других ("Ожидание других игроков..."). Игра будет начинаться автоматически.

Элементы "... - новая игра..." и "Мин./Макс..." во время игры можно скрыть, если мешают. Для этого надо кликнуть на надписи. Чтоб показывать - снова кликнуть. При наведении мыши они будут показаны. После завершения игры или ПРОВАЛа будут показаны всегда, даже если скрыты во время игры.

На странице Своя игра можно установить настройки (ниже кнопки "Поехали!"). Добавлен поиск по словарям. Нажатие Tab/Esc начинает игру = клик на "Поехали!". Горячие клавиши: Home - на Главную, Enter - поставить галочку "Квалификация", F1 - выбрать "Одиночный заезд", F2 - выбрать "Игра с друзьями" с таймаутом 10 сек., F3 - выбрать "Открытая игра" с таймаутом 10 сек.
На Главной странице можно установить настройки (выше отзывов вместо "⚠️Что это? Это..."). Нажатие Tab/Esc создает первую игру из списка (ленты) последних игр (KlavoTools) или открывает страницу "Своя игра", если ленты нет. Горячие клавиши: Q - Быстрый старт, Enter - Выбрать заезд, End - Своя игра.
Горячие клавиши на странице заезда: Home - на Главную, End - на страницу "Своя игра".

Скачать скрипт (нужен Tampermonkey) (проверено в Firefox и Google Chrome, работа в других браузерах не гарантируется)
(скрипт KG_DisableTab в KlavoTools следует отключить)
Исходный код: посмотреть

Код поставляется как есть (as is), для ознакомления. Если пользуетесь, то на свой страх и риск. Автор не является профессиональным веб-разработчиком, создавал для себя и никакой ответственности не несет!

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

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

Любые комментарии, предложения, критика - приветствуются
Последний раз отредактировано 27 июля 2024 в 00:43 пользователем Лазер
Chechenya Сообщение #2 22 октября 2023 в 16:20
Супермен
6
в чем различия между "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, работает
UPD: проверил в Chrome, keydown работает, автор поста или что-то не так делает, или тролль

Душа_Чата, спасибо за очень профессиональный код, может пригодиться
Последний раз отредактировано 12 июля 2024 в 12:27 пользователем Лазер
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
Клавокодер
121
Душа_Чата писал(а):
если частишь, то выльется в отказ сервера и выйдет 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
Клавокодер
121
Лазер писал(а):
Стало:
        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
Клавокодер
121
Душа_Чата писал(а):
никого не смущает название массива 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 пользователем Лазер
Лазер Сообщение #18 12 июня 2024 в 21:22
Супермен
13
Обновление (вдруг выяснилось, что скриптом пользуется не 1 человек).

Было:
× если заезд стартовал с таймаутом 20-30-45-60 сек., то рестартился он с таймаутом 10 сек. (5 сек. в Одиночных)
× если заезд стартовал для "гонщиков-экстракиберов", то рестартился он для "новичков-экстракиберов"

Стало:
✔ если стартануть заезд с таймаутом 20-30-45-60 сек., то рестартится он с тем же таймаутом 20-30-45-60 сек. (в любых)
✔ если стартануть заезд для "гонщиков-экстракиберов", то рестартится он для "гонщиков-экстракиберов"
ASplayer9119 Сообщение #19 12 июня 2024 в 21:40
Маньяк
38
Лазер Сообщение #20 27 июня 2024 в 19:50
Супермен
13
Лазер писал(а):
Автоматически играть еще раз (скрипт KG_AutoNextRace из KlavoTools) тоже иногда тормозит

Обновление: автосоздание новой игры через 1-2-3-4-5 сек. (на выбор) после завершения (можно отменить).
Последний раз отредактировано 28 июня 2024 в 23:16 пользователем Лазер

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

Ctrl предыдущая следующая Ctrl Страницы
1 2 3 4 5

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