1. JavaScript / Говнокод #21310

    −54

    1. 01
    2. 02
    3. 03
    4. 04
    5. 05
    6. 06
    7. 07
    8. 08
    9. 09
    10. 10
    11. 11
    12. 12
    13. 13
    14. 14
    15. 15
    16. 16
    17. 17
    18. 18
    19. 19
    20. 20
    21. 21
    22. 22
    23. 23
    24. 24
    25. 25
    26. 26
    27. 27
    28. 28
    29. 29
    30. 30
    31. 31
    32. 32
    33. 33
    34. 34
    35. 35
    36. 36
    37. 37
    38. 38
    39. 39
    40. 40
    41. 41
    42. 42
    43. 43
    44. 44
    45. 45
    46. 46
    47. 47
    48. 48
    49. 49
    50. 50
    51. 51
    52. 52
    53. 53
    54. 54
    55. 55
    56. 56
    57. 57
    58. 58
    59. 59
    // ==UserScript==
    // @name        gc
    // @namespace   gc
    // @description gc
    // @include     http://govnokod.ru/comments
    // @version     1
    // @grant       none
    // ==/UserScript==
    function isCommentEvil(str)
    {
        var olo = [
            'CrashTesterAnusov',
            'guest0',
            'huesto',
            'barop',
            'bagor',
            'bagop',
            'guestinho',
            'BagorCtretora'
        ];
        for (var ii = 0; ii < olo.length; ++ii)
        {
            if (olo[ii] == str)
            return true;
        }
        return false;
    }(function ()
    {
        var comments = document.getElementsByClassName('entry-comment-wrapper');
        for (i = 0; i < comments.length; ++i)
        {
            var author = comments[i].getElementsByTagName('*');
            for (j = 0; j < author.length; ++j)
            {
                if (isCommentEvil(author[j].text))
                {
                    comments[i].remove();
                    break;
                    //var txt = comments[i].getElementsByTagName('*');
                    //for (var jj = 0; jj < author.length; ++jj)
                   // {
                   //     switch (txt[jj].className) {
                    //    case 'answer':
                   //         txt[jj].innerHTML = '';
                   //         break;
                   //     case 'entry-comment':
                   //             txt[jj].innerHTML = '';
                   //         break;
                   //     case 'entry-author':
                   //             txt[jj].innerHTML = '';
                   //         break;
                   //     }
                   // }
                   // break;
                }
            }
        }
    }
    ) ();

    Свиток, написанный Vindicar (http://userscripts.org/scripts/source/393166.user.js) не скрывает комменты в стоке: очень неприятно.
    Написал свой. Помогите допилить.
    У Виндика-а в свитке идёт сабклассинг процедуры, рисующей комменты. Это гарантирует, что содержимое спамных комментов будет затёрто до того, как юзер их увидит. Как он это делает?

    Запостил: voodoodal16, 01 Октября 2016

    Комментарии (34) RSS

    • показать все, что скрыто
      for (var ii = 0; ii < olo.length; ++ii)
          {
              if (olo[ii] == str)
              return true;
          }
          return false;


      return olo.indexOf(str);
      Ответить
    • показать все, что скрыто> не скрывает комменты в стоке: очень неприятно.
      А в остальных местах скрывает? Если этот скрипт ещё работает в современных, я б посмотрел к корень конец и попробовал его расширить.
      //делаем дело
      if (/govnokod\.ru\/\d+/.test(location))
      	//мы на странице поста, обрабатываем все комментарии на странице
      	processComments(Options.groups, $('body'));
      else {
      	//мы на главной или где-то еще
      	//исключение: не обрабатываем посты в профиле пользователя, иначе мы можем их так и не увидеть.
      	if (!/govnokod\.ru\/user\/\d+\/codes/.test(location))
      		processPosts(Options.groups);
      	//тем не менее, перехватим загрузку комментариев
      	hijackComments(Options.groups);
      }

      Судя по всему, обработка статических комментариев включена на страницах постов (ветка if), в стоке работает только перехват загрузки аяксовых комментариев (ветка else, функция hijackComments). Соответственно, можно добавить в ветку else (скажем, после строки hijackComments(Options.groups);) условие "если мы в стоке, обработаем статические комментарии":
      if(/\/comments/.test(location.pathname))
      	//мы в стоке, обрабатываем все комментарии на странице
      	processComments(Options.groups, $('body'));

      Поставил скрипт. Работает в современном хроме (а раньше какая-то питушня же была вроде...), только контур поста оставляет. Но это можно исправить, создав свою функцию вроде hideThread и пронеся её в меню.

      > содержимое спамных комментов будет затёрто до того, как юзер их увидит. Как он это делает?
      Интересный вопрос. Я только вореции @run-at видел: https://wiki.greasespot.net/Metadata_Block#.40run-at
      Ответить
      • показать все, что скрытоМоя модификация скрипта:
        https://gist.github.com/1024--/58880b6843a8174d1dde43844ef1d236
        1. Работает в стоке
        2. Добавляет для стока возможность скрыть пост в стоке*, если последний комментарий - гость (см. опцию "скрыть пост в стоке" в выпадающем списке настроек действий для комментария)
        * правда, тогда информация о его обновлении теряется, но с этим вопросом - к Борманду, у которого есть возможность удалить комментарии из стока, не потеряв обновления постов за счёт комментариев нормальных людей.
        Ответить
        • показать все, что скрыто> к Борманду
          А чё борманд? Я уже писал, что не буду играть в модератора. Если и получится запилить фичу с удалением - то по индивидуальным спискам в localstorage.
          Ответить
          • показать все, что скрытоКакой модератор )))

            У Вас есть (потенциальная?) возможность отдать клиенту либо список недавних комментариев для самофильтронии, либо такой сток, как будто пользователи из предложенного списка вообще не существуют.
            Ответить
            • показать все, что скрыто> список недавних комментариев
              Да, могу запилить. Надо?

              > пользователи из предложенного списка вообще не существуют
              Нет, навскидку не придумывается алгоритм, который сможет это делать за миллисекунды по списку, прилетевшему от клиента.
              Ответить
              • показать все, что скрыто> Надо?
                А чёрт знает, может и надо. Если запилить клиентский скрипт, который будет делать из этого сток без неугодных пользователей, то у Стертора будет полная иллюзия, что этих неугодных пользователей вообще нет.
                Ещё можно в экспериментальном режиме запилить режим единого диалога (если наложить на это имиджбордовский бормоскрипт да проверить, чтобы работали кнопки "ответить").

                >> список недавних комментариев
                > Да, могу запилить
                > за миллисекунды по списку
                Ну так скрипт Стертора всё равно вытянет столько комментариев, сколько нужно, чтобы сформировать сток. А если применит фильтрацию "считать все комментарии спамом, если в них нет /ы{5+}/", то вообще конец.
                Ответить
        • показать все, что скрытоРаботает, но нужен множественный выбор. Там, в раскрывающемся списке можно нужно выбрать только одно: либо скрывать комменты в стоке, либо комменты в постах.
          Ответить
    • показать все, что скрытоОткрой JS консоль на говнокоде, и ты увидишь что на странице есть объект window.comments, в котором есть много интересного.
      Object { load: comments.load(), moveForm: comments.moveForm(), postForm: comments.postForm(), vote: comments.vote(), toggleBBCodeBlock: comments.toggleBBCodeBlock(), handleCtrEnter: comments.handleCtrEnter() }

      Таким образом, перехват нужной функции становится тривиален.

      Хотя сейчас я бы задействовал MutationObserver (https://developer.mozilla.org/ru/docs/Web/API/MutationObserver) для этой цели. Универсальнее (а вдруг кто-нибудь сделает скрипт для динамического обновления комментариев, или еще что...) и не зависит от кода на странице.

      И да, userscripts.org умер (по-крайней мере у меня не открывается уже давно). Нужный тебе скрипт лежит на https://greasyfork.org/ru/scripts/2501-gk-filter/code
      Ответить
      • показать все, что скрытоДо кучи: скрипт почти наверняка не пашет в современных браузерах, так как там дергается jQuery с говнокода (а новый Greasemonkey куда строже в этом плане).

        Что касается параметра run-at - да, это вариант. В сочетании с MutationObserver можно вырезать спамецЪ уже в момент его появления. Я этим приемом пользовался в другом скрипте:
        https://greasyfork.org/ru/scripts/2498-tumblr-savior/code , строка 490 и ниже.
        Ответить
      • показать все, что скрытоПроблема в том, что я не знаю JS. Я ни разу не девелопер и не сую нос в сиподобные языки.
        Можно коротенький пример?
        Ответить
        • показать все, что скрытоПример чего конкретно?
          Ответить
          • показать все, что скрытоКак поставить перехват?
            Ответить
            • показать все, что скрытоОчень просто. Скрипты на говнокоде обращаются к window.comments.load() в нужный момент (я это узнал, читая их исходники, благо они легко доступны).
              Ты можешь просто присвоить этому полю свое значение (свою функцию), и она будет вызвана вместо оригинала. Вот код из оригинального скрипта:
              function hijackComments(groups) {
              	//перехват загрузки комментариев
              	var oldLoadComments = unsafeWindow.comments['load'];
              
              	function newLoadComments(aElemTrigger) {
              		var $parent = $(aElemTrigger).closest('.entry-comments');
              		oldLoadComments.call(this,aElemTrigger);
              		waitForSelector('.hcomment', $parent, true, function(){
              			processComments(groups, $parent);
              			});
              		}
              
              	unsafeWindow.comments['load'] = newLoadComments;
              	}

              Сначала сохраняем старую функцию, потом пишем новую. Новая вызывает старую (oldLoadComments.call(this,aElemTrigger) ;) в том же контексте (this) и с теми же параметрами (aElemTrigger), с какими была вызвана сама.
              Старая функция выполнит подгрузку комментариев. Поскольку загрузка - штука асинхронная, то приходится ждать, пока они не появятся (для этого написана waitForSelector). Когда появились - обрабатываем, этим занимается processComments. Всё происходит достаточно быстро, пользователь ничего не замечает.

              Единственное, у userscript'а свой объект window, а для доступа к объекту страницы нужно использовать unsafeWindow. Чтобы эта возможность была доступна, в заголовке userscript'а прописано @grant unsafeWindow.
              Ответить
    • показать все, что скрытоКто юзает джаваскрипт
      У того пукан кипит
      Ответить

    Добавить комментарий