Расширение против Callback hell



  • @support Так будет работать?

            QString async_str = "/*!async*/";
            int async_str_length = async_str.length();
            while (true) {
                int length = Res.length();
                int index_start = Res.indexOf(");" + async_str, from);
                from = index_start + async_str_length + 2;
                bool is_one_argument = false;
                int index_search = index_start - 1;
                while (true) {
                    if (index_search >= 0) {
                        QChar c = Res.at(index_search);
                        if (c.isSpace()) {
    
                        } else if (c == '(') {
                            is_one_argument = true;
                            break;
                        } else {
                            break;
                        }
    
                        index_search--;
                    } else
                        break;
                }
    
                if (Res.indexOf(");" + async_str) < 0) {
                    break;
                }
                int index_end = index_start + async_str_length + 2;
                int open_bracket = 0;
                while (true) {
                    if (index_end >= length - 1) {
                        QString all = Res.mid(index_start + async_str_length + 2);
                        if (all.indexOf(");" + async_str) >= 0)
                            break;
                        Res = Res.replace(index_start + async_str_length + 2, all.length(), Encrypt(all, ParanoicLevel));
    
                        Res = Res.replace(index_start, async_str_length + 2, ", function(){");
                        Res = Res.append("})");
                        from = 0;
    
                        break;
                    } else {
                        QChar c = Res.at(index_end);
                        if (c == '{') {
                            open_bracket++;
                        } else if (c == '}') {
                            open_bracket--;
                            if (open_bracket < 0) {
                                QString all = Res.mid(index_start + async_str_length + 2, index_end - index_start - async_str_length - 2);
                                if (all.indexOf(");" + async_str) >= 0)
                                    break;
    
    
                                Res = Res.replace(index_end, 1, "})}");
                                Res = Res.replace(index_start + async_str_length + 2, all.length(), Encrypt(all, ParanoicLevel));
    
                                QString replace_string = "function(){";
                                if (!is_one_argument)
                                    replace_string = "," + replace_string;
    
                                Res = Res.replace(index_start, async_str_length + 2, replace_string);
                                from = 0;
    
                                break;
                            }
                        }
    
                        if (index_end == length - 1) {
                            QString all = Res.mid(index_start + async_str_length + 2);
                            if (all.indexOf(");" + async_str) >= 0)
                                break;
                            Res = Res.replace(index_start + async_str_length + 2, all.length(), Encrypt(all, ParanoicLevel));
    
    
                            Res.append("})");
                            QString replace_string = "function(){";
                            if (!is_one_argument)
                                replace_string = "," + replace_string;
    
                            Res = Res.replace(index_start, async_str_length + 2, replace_string);
                            from = 0;
    
                            break;
                        }
                        index_end++;
                    }
    
                }
    
            }
    

    В C# больше опыта, чем в C++, тем более, код сложный, исходников много. Добавил переменную со строкой /*!async*/, она будет использоваться вместо знака !, и переменную с числом длинны строки, далее заменил везде в цикле, например, index_start + 2 на index_start + async_str_length + 2, т.к. посчитал, что 2 - количество символов строки ")!", которая определяется как указатель на асинхронность функции. Прошу поправить, если не прав. Еще раз повторюсь, что опыта в С++ мало, в основном программировал на PHP и С#. Отправил pull request на гитхабе для удобства.


  • administrators

    @blackhacker Все правильно, спасибо за пулл реквест. Есть только один недочет - этот код не будет работать с форматом )! это значит, что весь старый код придется переписывать. Предлагаю в начале функции заменить /*!async*/на )!



  • @support что-то я уже совсем запутался. вроде же изначально и было задумано, чтобы заменить ! на что-то типа /*!async*/, чтобы при работе в IDE писать javascript код было удобнее, потому что из-за знака ! синтаксис теряется, и более того, код с ! не работает в eval, а знаки /* */ означают комментарий текста между ними, и синтаксис бы не терялся, и асинхронные функции работали бы


  • administrators

    @blackhacker Да, но что тогда делать с другими скриптами написанными до этого изменения(там где используется )!)? Они перестанут работать(


  • administrators

    @blackhacker Ладно, доделаю сам. Будет в завтрашней версии.



  • @support скриптами - всмысле, проектами, написанными ранее? или другими исходниками BAS? давайте тогда добавлю в код обработку обоих вариантов. я сначала думал, что вы про исходники сказали, что где-то в них используется )!


  • administrators

    @blackhacker

    всмысле, проектами, написанными ранее? или другими исходниками BAS?

    И того и другого полно.



  • @support если сильно в нагрузку исправлять, то ладно тогда. я думал, дело только в цикле, в других исходниках не нужно ничего менять. но у вас наверно и без этого много чего исправлять.

    BAS создан для непрограммистов, чтобы люди без знания программирования могли создавать шаблоны. Но о программистах тоже нужно думать) Мне например проще и удобнее подключить BAS к своему уже написанному боту, который сможет посылать в BAS команды для выполнения эмуляции браузера, а вся динамическая часть остается на боте. В BAS трудно сделать шаблон динамичным, во всяком случае, для этого придется использовать много действий в шаблоне, либо писать тот же код и выполнять его в BAS. Я бы даже порекомендовал в будущем написать модули для управления BAS через С#/PHP, т.к. это очень нужная вещь. Либо даже я могу позже с этим помочь и написать модуль для PHP, т.к. сейчас использую BAS совместно с PHP, и почти все уже готово.

    Сегодня поиском по исходникам поискал, ")!" встречается только в одном месте в одном файле помимо того цикла, который я переделывал. Вы точно уверены, что много переделывать нужно?


  • administrators

    @blackhacker Не успел в новой версии, выпущу отдельным патчем.



  • @support Хорошо, спасибо большое) Но если правда сложно, то лучше потом тогда, я не думал просто, что там многое переделывать придется. Это уж скорее для удобства больше, потому как сейчас приходится при работе с кодом в IDE сначала комментировать везде знак !, а когда надо переносить код в BAS, то обратно заменять его везде.


  • administrators

    @blackhacker В 16.4.0 можно писать /*async!*/ и будет работать.
    Например,

    load("google.com")/*async!*/
    


  • @support Еще раз хочу сказать спасибо, что стараетесь ради нас, обычных юзеров, почти безвозмездно) И софт лучше, чем у конкурентов, например чем ZennoPoster. У них в новой версии что-то там кардинально в структуре шаблонов поменялось (я не углублялся, т.к. не пользуюсь), и всем пришлось заново учиться делать шаблоны.



  • @support Спасибо, я ведь правильно понял, что теперь "!" и "/async!/" - это "синонимы"?


  • administrators

    @UlybnisJe Да, если они стоят после закрывающейся скобки.


Log in to reply
 

Looks like your connection to Bablosoft was lost, please wait while we try to reconnect.