Лазер
|
Сообщение #1
22 октября 2023 в 15:26
|
Супермен
13 |
Аналог скрипта KG_SeparateGameLink. Новая игра создается по нажатию клавиши, а не по клику. Писал для себя. В этом деле я начинающий. Из сторонних скриптов у меня установлен только пакет KlavoTools. Насчет других - я не в курсе. Скорее всего, что-то подобное уже есть и я изобрел велосипед. При нажатии клавиши Backspace Tab создается новая игра в этом же режиме/словаре в этом же окне (таймаут 5 и 10 сек. для Одиночной и Открытой/Дружеской игры соответственно). Режим Квалификация тоже поддерживается, можно не исправлять ошибки и начинать заново, если ошибок было много и скорость была недостаточно высокая. Скачать скрипт (понадобится браузерное расширение Tampermonkey) (работает в Firefox) (скрипт KG_DisableTab из KlavoTools следует отключить) Исходный код: посмотретьЭти строчки отвечают за клавишу (Tab в данном случае): var p_tab_text = '<span style="background-color: ' + body_text_color + '; color: ' + body_bg_color + ';">Tab</span> - новая игра';
if (e.key == "Tab"){ Известные проблемы (вообще, без этого скрипта): • Играть еще раз / Ctrl+→ (при завершении) почему-то не всегда срабатывает. • Автоматически играть еще раз (скрипт KG_AutoNextRace из KlavoTools) тоже иногда тормозит. Но можно (теперь) создать новый заезд по нажатию клавиши! скрытый текст… Печатаю на 0 ошибок (попытка) в Одиночных. При первой же ошибке - рестарт. Скрипт KG_StopErrorsRace иногда не срабатывает: "Авто→" не всегда работает, новый заезд просто не создается, об этом я писал еще тогда..., поэтому просто выключаю "Авто→": Еще запускаю этот Python-скрипт, когда записываю TS, чтоб Очищать (Ctrl+Win) программу каждый раз при создании нового заезда: import keyboard
try: keyboard.on_press_key("Tab", lambda self: keyboard.send("Ctrl+Win")) keyboard.wait() except KeyboardInterrupt: pass Любые комментарии, предложения, критика - приветствуются Последний раз отредактировано 2 мая 2024 в 22:07 пользователем Лазер
|
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, работает
Душа_Чата, спасибо за код, может пригодиться
|
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
|
Клавокодер
120 |
Душа_Чата писал(а): если частишь, то выльется в отказ сервера и выйдет 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
|
Клавокодер
120 |
Лазер писал(а): Стало: 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
|
Клавокодер
120 |
Душа_Чата писал(а): никого не смущает название массива myArray? Оно по итогу сократилось, поэтому пофик.
|
Лазер
|
Сообщение #16
25 октября 2023 в 09:26
|
Супермен
13 |
Душа_Чата писал(а): никого не смущает название массива myArray? как-будто посмотрел впервые видеоурок по javascript для самых маленьких. ну да, смущает, написал же ведь: "я начинающий" (в JavaScript), так что неудивительно видеоуроки не смотрю, предпочитаю текст, гуглить и на stackoverflow ходить
|
Лазер
|
Сообщение #17
12 февраля 2024 в 14:16
|
Супермен
13 |
Выяснилось, что первоначальный скрипт (как и KG_SeparateGameLink из KlavoTools) не рестартит премиумную Абракадабру (а запускает обычную), поэтому добавлен код: скрытый текст… if (document.querySelector('#gamedesc .gametype-abra-premium')){ document.location = "/g/" + document.URL.replace(/[^0-9]/g, '') + ".replay"; } else { ... } Doctorisimus писал(а): можно использовать встроенную функцию повторного заезда да, другого способа я не знаю Баристарх писал(а): И как пришла идея забиндить что-то на бэкспейс, ведь это кнопка участвует в наборе теперь это делает Tab (сразу не догадался) , а Бэкспейс по-любому нужен в Квалификации Последний раз отредактировано 21 февраля 2024 в 23:48 пользователем Лазер
|