Лайфхаки BAS

Pinned Moved LifeHacks
  • @yumilen для чего тебе id действия что ты с ним дальше хочешь сделать?

  • @gamid Лог часто является точкой обозначения каких-то действий или данных, поэтому айдишник лога часто используется для быстрого перемещения по скрипту

  • @yumilen В общем, чисто случайно нашел ответ но свой вопрос. Берите, кому надо
    ScriptWorker.GetCurrentAction() - возвращает ID текущего экшина

  • @fox Немного пошаманил тут над вашими сорсами и написал универсальный log_html()
    Функция, также, как и обычный log() выводит айдишник экшина с той лишь разницей, что он не кликабельный.
    В общем, пользуйтесь, кому надо:

    /** _LogHTML()
     * 
     * @param [mix] text - text to log
     * @param [string] color - text color
     * @param [string|Array|Object] define - print parameters
     *  Empty define print all data
     *  [string] ('id, time, thread'), empty string, print only text
     *  [Array] (['id', 'time', 'thread']), empty array, print only text
     *  [Object] ({id: true, time: true, thread: true}), empty object, print only text
     *    @example ({id: false, time: false, thread: false} == {}),
     *    @example ({id: true, time: false, thread: false} == {id: true})
     */
    function _LogHTML(text, color, define){
        var id, time, thread, logHtml;
    
        define = (typeof define == 'string') ? define.split(/[\s,.|:;]+/g) : define;
        if(typeof define === 'object' && define !== null){
            if(Array.isArray(define)){
                id = define.indexOf('id') > -1;
                time = define.indexOf('time') > -1;
                thread = define.indexOf('thread') > -1;
            }
            else{
                id = define.id == true;
                time = define.time == true;
                thread = define.thread == true;
            }
        }
        else id = time = thread = true;
        id = id ? '<span style="color: grey">[' + ScriptWorker.GetCurrentAction() + ']</span>' : '';
        time = time ? ' ' + getTime() : '';
        thread =  thread ? ' Поток №' + thread_number() : '';
    
        logHtml = (id || time || thread) ? id + '<span style="color: white">' + time + thread + ' : </span>' : '';
        logHtml += '<span style="color:' + (color ? color : 'white') + '">' + text + '</span>';
    
    	function getTime(){
    		var checkTime = function(i){ return (i < 10) ? "0" + i : i; };
    		var d = new Date();
    		var hh = checkTime(d.getHours());
    		var mm = checkTime(d.getMinutes());
    		var ss = checkTime(d.getSeconds());	
    		return '[' + hh + ':' + mm + ':' + ss + ']';
    	};
    
    	Logger.WriteHtml(logHtml, text);
    }
    
  • @yumilen said in Лайфхаки BAS:

    @fox Немного пошаманил тут над вашими сорсами и написал универсальный log_html()

    Интересный вариант, редко на форуме встретишь красивый, качественный код.


    Только в файле лога будет неразбериха:
    0_1547930361581_9e4c6ffb-dc44-438d-beeb-59f084f4a1f7-изображение.png


    ни каких опозновательных данных:
    0_1547930421177_888e60ab-be85-46b5-823e-ebff4c3472e0-изображение.png

    Потому что в функции log_html() два атрибута:

    log_html("<span style='color:yellow'>ТЕКСТ который отображается в логе</span>","ТЕКСТ который записывается в файл лога")
    

    а вы записываете в лог только текст:

    Logger.WriteHtml(logHtml, text);
    

    Функция, также, как и обычный log() выводит айдишник экшина с той лишь разницей, что он не кликабельный.

    Чтобы id был кликабельным, можно указать на него ссылку:

    log_html("<a href='action://action366852852' style='color:gray;'>[366852852]</a>")
    

    Вот версия вашей функции с кликабельным id и обычной информацией в текстовом логе:

    /** _LogHTML()
     * 
     * @param [mix] text - text to log
     * @param [string] color - text color
     * @param [string|Array|Object] define - print parameters
     *  Empty define print all data
     *  [strijng] ('id, time, thread'), empty string, print only text
     *  [Array] (['id', 'time', 'thread']), empty array, print only text
     *  [Object] ({id: true, time: true, thread: true}), empty object, print only text
     *    @example ({id: false, time: false, thread: false} == {}),
     *    @example ({id: true, time: false, thread: false} == {id: true})
     */
    function _LogHTML(text, color, define){
        var id, time, thread, logHtml, textLog;
    
        define = (typeof define == 'string') ? define.split(/[\s,.|:;]+/g) : define;
        if(typeof define === 'object' && define !== null){
            if(Array.isArray(define)){
                id = define.indexOf('id') > -1;
                time = define.indexOf('time') > -1;
                thread = define.indexOf('thread') > -1;
            }
            else{
                id = define.id == true;
                time = define.time == true;
                thread = define.thread == true;
            }
        }
        else id = time = thread = true;
        id = id ? '<a href="action://action' + ScriptWorker.GetCurrentAction() + '" style="color:gray;">[' + ScriptWorker.GetCurrentAction() + ']</a>' : '';
        time = time ? ' ' + getTime() : '';
        thread =  thread ? ' Поток №' + thread_number() : '';
    
        logHtml = (id || time || thread) ? id + '<span style="color: white">' + time + thread + ' : </span>' : '';
        logHtml += '<span style="color:' + (color ? color : 'white') + '">' + text + '</span>';
    
        textLog = '[' + ScriptWorker.GetCurrentAction() + ']' + time + thread + ' : ' + text
    
    	function getTime(){
    		var checkTime = function(i){ return (i < 10) ? "0" + i : i; };
    		var d = new Date();
    		var hh = checkTime(d.getHours());
    		var mm = checkTime(d.getMinutes());
    		var ss = checkTime(d.getSeconds());	
    		return '[' + hh + ':' + mm + ':' + ss + ']';
    	};
    
    	Logger.WriteHtml(logHtml, textLog);
    }
    

    0_1547932097727_e6ea81b1-4225-443d-831c-e98a69df1a39-изображение.png


    0_1547932125168_2ef32fc0-f931-42d8-9f35-a34e32806826-изображение.png


    Вот тестовый скрипт

  • @fox Да, спасибо. Не знал как сделать кликабельность, а с выводом лога в файл не заморачивался, поскольку редко использую.
    Общими усилиями функция доведена до нормального рабочего состояния и это хорошо.
    Не плохо было бы ее еще замостырить в какой-нибудь экшин с соответствующими полями и чеками, а если б еще какой Colorpicker, то вообще было бы супер, но я еще пока толком не разобрался с разработкой модулей, хоть и имею общее представление и при сильном желании мог бы упаковать, но, это, пока, не в приоритете.
    Еще, интересно, возможно ли, в файле, вместо стандартного black и red указывать значение параметра функции color?

  • @fox И еще, на счет кликабельности...
    Если бы разработчик увеличил время подсветки экшина после клика, скажем, так до 3-х секунд, то было бы лучше, а то, часто, пока, после клика перейду с одного окна в другое, то подсветка исчезает.
    Естественно, эта проблема возникает, когда при записи браузер используется в полноэкранном режиме, но я, например, обычно так и использую

  • @xclsv
    Спасибо за свой метод. Как раз пригоден из-за первого пункта для меня.
    Так же, если вы хотите спрятать свой код, но не хотите, чтобы при компиляции он сработал, то можете заюзать заведомо невыполнимые условия. Например:
    If 0>1 или while 0>1
    А внутри запихнуть конструкцию, которую выполнять не нужно.

    Что касается невозможности использовать функцию из-за того, что случаи могут быть разными, то тут необходимо создавать переменные входные параметры, которые можно задавать перед началом функции. Я раньше делал так.

  • @olegtut said in Лайфхаки BAS:

    @xclsv
    Спасибо за свой метод. Как раз пригоден из-за первого пункта для меня.
    Так же, если вы хотите спрятать свой код, но не хотите, чтобы при компиляции он сработал, то можете заюзать заведомо невыполнимые условия. Например:
    If 0>1 или while 0>1
    А внутри запихнуть конструкцию, которую выполнять не нужно.

    Что касается невозможности использовать функцию из-за того, что случаи могут быть разными, то тут необходимо создавать переменные входные параметры, которые можно задавать перед началом функции. Я раньше делал так.

    if и while можно писать со значением просто 0, чтобы они не выполнялись.

  • @fox
    Да, но мне этот метод не особо нравится. Я же люблю прослеживать семантическую логику везде. Мне нравится именно читать код. Ведь читая такую конструкцию, получаешь: "Если ноль, то", а это математически меня запутает :D

  • @olegtut
    С точки зрения мат.логики, If 0 также правильно, как if 0>1.
    Операции внутри оператора условия выполняются тогда и только тогда, когда выражение истинно. В данном случае 0 преобразуется к false, то есть не к истине, а любое другое значение преобразуется к true. Если внутри выражения нет операторов, то это всё равно выражение.
    Но согласен с тем, что человеческой логике это противоречит =)

  • @olegtut said in Лайфхаки BAS:

    @fox
    Да, но мне этот метод не особо нравится. Я же люблю прослеживать семантическую логику везде. Мне нравится именно читать код. Ведь читая такую конструкцию, получаешь: "Если ноль, то", а это математически меня запутает :D

    Это так, но это плохой тон. Можно вообще писать код в стиле обсуфикатора и он будет работать. Только Вас уволят за это, если работаете в компании )

  • Думаю очень годный лайфхак:

    Чтобы убрать весь звук со страниц из скриптов BAS нужно добавить в файл chrome_command_line.txt строку

    --mute-audio
    

    upd: Пользователь @Mic предложил альтернативный вариант отключения звука
    https://community.bablosoft.com/topic/11145/bas-палится/24

    upd2: Начиная с 24 версии BAS звук можно отключить в настройках профиля браузера

    chrome://settings/content/sound
    

    тестовый скрипт: 1934.xml

  • @drprime said in Лайфхаки BAS:

    Добавлю так же полезную штуку - прогрессбар.

    progress_maximum(100)
    progress_value(10)
    

    Выглядит это так
    0_1557990924619_7fa3ad64-41e2-4495-a837-c18ab42ad974-изображение.png

    К сожалению прогресс бар виден только во вкладке "результаты", которую видят далеко не все пользователи. По этому я решил сделать прогресс бар в логе:

    0_1557991465746_support62.gif

    Функция рисует прогресс бар из таблицы с двумя колонками без рамки

    progressbar = function(val,max){
    var res = parseInt(val * 1000 / max )
    if(val == 0) log_html('<table style="border-color:#000000" width="1000" cellspacing="0" cellpadding="4" border="0"><tr><td bgcolor="#F0FFF0"</td></tr></table>')
    if(val >= max) log_html('<table style="border-color:#000000" width="1000" cellspacing="0" cellpadding="4" border="0"><tr><td bgcolor="#32CD32"</td></tr></table>')
    if(val != 0 && val < max)log_html('<table style="border-color:#000000" width="1000" cellspacing="0" cellpadding="4" border="0"><tr><td bgcolor="#32CD32" width="' + res + '"></td><td bgcolor="#F0FFF0" ></td></tr></table>')
    }
    

    Думаю описывать, что такое val и max в этой функции излишне :D


    Использовать необходимо вместе с действием "Очистить лог", я специально не стал добавлять очистку лога в саму функцию, на случай если помимо прогресс бара нужно что то вывести в лог.

    Так выглядит лог без чистки:
    0_1557991896086_57484118-e735-480e-906b-77f2e20d8ce5-изображение.png


    html код таблицы лежит в открытом виде, так что изменить длину, цвет, или добавить текст не составит труда. Если этот прогресс бар зайдёт, добавлю дополнительную функцию настройки внешнего вида.


    Вот тестовый скрипт



    Ещё вариант с установкой цвета:

    progressbar = function(val,max,color){
    var res = parseInt(val * 1000 / max )
    if(val == 0) log_html('<table style="border-color:#000000" width="1000" cellspacing="0" cellpadding="4" border="0"><tr><td bgcolor="#F0FFF0"</td></tr></table>')
    if(val >= max) log_html('<table style="border-color:#000000" width="1000" cellspacing="0" cellpadding="4" border="0"><tr><td bgcolor="' + color + '"</td></tr></table>')
    if(val != 0 && val < max)log_html('<table style="border-color:#000000" width="1000" cellspacing="0" cellpadding="4" border="0"><tr><td bgcolor="' + color + '" width="' + res + '"></td><td bgcolor="#F0FFF0" ></td></tr></table>')
    }
    

    Пример использования

    progressbar(35,100,"#00BFFF")
    

    0_1557994592588_2ab0a545-3784-4b2d-9deb-5212c36cc178-изображение.png


    С глобальными переменными (или объектом в глобальной переменной) можно установить прогресс бар на несколько потоков:
    0_1557994637924_support63.gif

  • Добавлена информация с рекомендацией ожидания после крупных обновлений и о том как скачать предыдущую версию

  • Добавлена информация о том, как подключать разные программы на BAS к разным VPN соединениям/также можно разделять чтобы в BAS было VPN соединение, а на компьютере нет

  • Добавлены пункты:
    13. Взаимодействие с командной строкой
    14. Интеграция с языком программирования

  • Добавлены пункты:
    15. Модуль парсинга JSON
    16. Бесконечный цикл

  • Конвертор BAS Cookie для Google Chrome расширения EditThisCookie
    Проверял на mail.ru, facebook.com и еще на нескольких сайтах возможно есть сайты на которых не будет работать

    0_1563099815733_BasCookieToChromeEditThisCookie.xml

  • @fox Здравствуйте, не могли подсказать или скинуть шаблон как распределить на несколько потоков?