Как сделать «взаимную блокировку»?

Редакция: Я думал, что проявил смекалку, но ошибся. См. следующее сообщение.

Привет, просто хотел поделиться тем, что мне удалось выяснить… Я использую Discourse в качестве форума на существующем сайте для участников, и на этом сайте участники могут блокировать друг друга. Когда пользователь A блокирует пользователя B, оба они не могут видеть друг друга, взаимодействовать и так далее.

Мне нужно было перенести эту же функциональность в Discourse. Я ломал голову над тем, как это реализовать, и, кажется, наконец разобрался:

  1. Я настроил веб-хук в Discourse для получения событий, чтобы перехватывать событие user_logged_in.

  2. Когда пользователь входит в систему, я прохожусь по его списку «заблокированных» на моём сайте.

  3. Для каждого другого участника, которого он пытается заблокировать, я использую API Discourse (обратите внимание: это никак не связано с SSO!), чтобы «игнорировать» этого пользователя.

  4. И вот здесь начинается самое хитрое: я также говорю Discourse, чтобы другой пользователь игнорировал основного пользователя, который сейчас входит в систему. Другими словами, и пользователь A (который сейчас входит), и пользователь B (который находится в списке блокировок пользователя A) «игнорируют» друг друга.

  5. Обратите внимание: при отправке сообщения «Игнорировать» я должен убедиться, что оба участника имеют как минимум уровень TL2, поскольку функция «Игнорировать» доступна только с TL2. Если у них уровень ниже, мне приходится быстро повышать их до TL2, прежде чем завершить действие «Игнорировать». Повышение пользователя до TL2 вызывает некоторые побочные эффекты (запуск продвинутого скрипта discobot, выдача значков), с которыми мне пришлось разобраться.

И ещё: я скрываю список «Игнорируемых» в профиле пользователя Discourse (простой CSS), поскольку на основном сайте есть интерфейс для управления заблокированными пользователями. Мне не нужно, чтобы участники Discourse видели список игнорируемых в Discourse вообще.

Надеюсь, это поможет другим, кому нужна подобная функциональность…

Итак, в чём проблема. Функция «Игнорировать» в Discourse не полностью скрывает другого пользователя. Она делает их сообщения невидимыми (и справляется с этим действительно блестяще)… и заменяет их ссылкой «ПОКАЗАТЬ x СКРЫТЫХ СООБЩЕНИЙ»… это я легко могу скрыть с помощью CSS, так что ничего страшного.

НО! Если кто-то процитировал заблокированного пользователя, вы всё ещё видите его аватар и имя (но не саму цитату) в сообщении, а также видите его аватар и имя в индикаторах ответов на сообщения. Чёрт.

Это означает, что если Пользователь А блокирует Пользователя Б на моём сайте… и я применяю трюк с двойным игнорированием (игнорирование в обоих направлениях), как я описывал в своём предыдущем сообщении… то Пользователь Б (который сам никогда не блокировал Пользователя А) внезапно видит какие-то странные вещи в сообщениях Пользователя А на форуме. И может понять, что Пользователь А заблокировал его. Таким образом, раскрывается конфиденциальная информация (кого заблокировал Пользователь А) для Пользователя Б. Что на моём сайте совсем не хорошо… вообще.

Ахххх

Так что, похоже, я дошёл до точки, где мне, вероятно, наконец придётся выучить RoR :wink: и написать плагин, который расширит существующую функциональность «Игнорировать», чтобы действительно, действительно стирать все следы пользователя из списка «Игнорировать». Тогда я смогу вернуться к своей идее с двойной блокировкой…

Верно, функция игнорирования в Discourse не является полноценным блокированием (поэтому мы и не называем её «блокировкой»). Она больше подходит для случаев, когда кто-то не нарушает правила сообщества, но просто немного раздражает.

Вопрос о полноценной функции блокировки уже поднимался ранее, но мы обычно рассматриваем его так:

Привет, Крис, спасибо за этот ответ.

Итак, предупреждаю: сейчас последует очень небольшая защитная тирада, причём она направлена не столько на вас, сколько на всех тех, кто говорил мне, что мне не нужна блокировка… :wink:

Я занимаюсь практическим управлением сообществами уже целую вечность (ещё со времён работы в AOL, CompuServe и GEnie, где я занимался сообществом в их досках сообщений и чат-комнатах). Сейчас я управляю собственным сайтом сообщества. Форумы — часть этого сайта, и именно там взаимодействует значительная (хотя и не вся) часть моего сообщества.

Я полностью и абсолютно понимаю причины, по которым блокировка — не лучшая идея… Я это понимаю. Искренне. Я прочитал каждое сообщение, которое смог найти здесь, на meta.discourse. Я видел людей, умоляющих о функции «Игнорировать», я видел дебаты туда-сюда о том, почему это нехорошо, и я видел, как вы в итоге сдались и добавили это в ПО. :wink:

Во всём этом, думаю, некоторые забыли, что не все запускают сайты, которые состоят только из Discourse/только из форумного сообщества.

В моей текущей ситуации у меня уже было сильное сообщество на сайте до появления Discourse: не только в моих предыдущих форумах (с их ужасным старым ПО), но и в функции чат-комнаты на моём сайте (у которой есть свои постоянные пользователи и своё сообщество, пересекающееся с моими форумами), а также в других функциях, ориентированных на сообщество, на моём веб-сайте.

И так или иначе, мой сайт всегда предоставлял возможность сделать «полную блокировку» другого участника. Отчасти из-за проблем в сообществе, отчасти потому, что сообщество, которому я служу, ожидает, что я буду ЧРЕЗВЫЧАЙНО чувствителен к их приватности по ряду причин, включая юридические опасения (серьёзно).

Вопрос «является ли блокировка хорошей идеей?» — это не тот вопрос, который мне нужно задавать в данный момент. Даже если лично мне идея блокировки не очень нравится, корабль уже уплыл. :wink:

(Немного контекста: мои старые форумы были довольно токсичными из-за решений, принятых предыдущим владельцем сайта. Одна из причин, по которой люди требовали двустороннюю блокировку, заключалась в том дерьме, которое было на форумах. В рамках моего обновления до Discourse и запуска совершенно новых форумов я также работаю над восстановлением повреждённого форумного сообщества.)

Снова хочу чётко и ясно заявить: я полностью понимаю, почему блокировка вообще не является хорошим признаком здорового сообщества. Фактически, я работаю над тем, чтобы убедить моих участников, которые ранее были слишком склонны к блокировкам, немного расслабиться.

Итак.

Если бы я запускал абсолютно новое сообщество, я бы определённо начал с Discourse и не нуждался бы в двусторонней блокировке.

Если бы у меня был сайт, на котором уже не было возможности двусторонней блокировки (или я не обновлялся с форумного ПО, которое ранее поддерживало двустороннюю блокировку), мне бы не потребовалась двусторонняя блокировка в Discourse.

Если бы мое текущее форумное сообщество не было уже повреждено, мне бы не потребовалась двусторонняя блокировка. Но у них был ужасный опыт в прошлом, который потребовал функции блокировки, которую я был вынужден внедрить. Теперь переход на Discourse — это большой сдвиг, который уже встряхивает сообщество (это сильно отличается от того, что было у меня, так что это процесс), и сейчас не время говорить: «О, и кстати, мы отказываемся от блокировки». У меня начнётся бунт.

В любом случае. Извините за длину этого ответа, и надеюсь, я не звучу слишком защитно. :wink: Я просто не хочу втягиваться в философские дебаты о блокировке и о том, почему это «Не Здоровая Вещь».

Мне всё ещё нужна функция полной блокировки.

Я искренне и по-настоящему ценю всю обратную связь и помощь! И одна из причин, по которой я пишу всё это (и трачу время на написание этого безумно длинного сообщения), заключается в том, что я пытаюсь внести свой вклад обратно в сообщество Discourse.

Позвольте закончить этим: Я знаю, что Discourse прямо сейчас не предлагает именно то, что я прошу. Но это близко! Я не пытаюсь убедить команду Discourse добавить это в ПО (этот разговор в основном начался и закончился задолго до моего прихода)… но я пытаюсь достичь своей цели с теми инструментами, которые у меня есть… и прошу помощи у умных, изобретательных мыслителей и программистов, которых я здесь вижу… и делюсь тем, что обнаружу по пути, с другими.

Я согласен со многими вашими пунктами, но хочу прокомментировать следующее…

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

Это связано, среди прочего, с тем, что больше участников означает больше постов, что потенциально ведёт к значительно большему числу межличностных конфликтов. В то время как команда из 10 модераторов легко справляется с «модерацией» форумов, где 10, 20 или 30 тысяч участников, по мере роста базы участников всё остальное растёт ещё быстрее: больше голосов → намного больше постов → намного больше проблем.

Это одна из главных причин, по которой все крупные социальные сети предлагают функцию блокировки. Другая причина — с юридической точки зрения: если кто-то заявляет, что его травит другой участник, а сайт ничего не предпринимает (возможно, потому что администрация считает, что травли нет — «это всё в его воображении»), но затем этот пользователь совершает самоубийство, сайт может понести ответственность. Если кто-то искренне чувствует, что его травят, то для него это именно так — неважно, что думаем вы или я. Важно то, что мы несём ответственность за благополучие участников, и один из лучших способов избавить их от таких ощущений — прекратить это взаимодействие. Лучше всего это достигается, если дать им возможность самостоятельно блокировать тех, кто причиняет им страдания (или иногда навязывать это им самим).

Эпоха, когда мы были и судьями, и присяжными, давно прошла — и нам не следует оставаться в такой роли. Не наша задача решать, что вызывает или не вызывает у других страдания.

Именно поэтому я также считаю, что нам нужны более современные инструменты модерации: модераторы не должны оказываться в ситуации, когда им приходится редактировать посты участников (что чаще всего воспринимается как цензура). Если пост неприемлем, мы должны просто скрывать его из виду и предлагать автору отредактировать, а затем помещать правки в очередь на проверку.

Я думаю (и надеюсь!), что Discourse может стать лидером в этом вопросе.

Сказано очень точно. (И это не обязательно гипотетическая ситуация: в нашем конкретном сообществе нам уже приходилось привлекать правоохранительные органы.) Размышления о подобных ситуациях и предоставление участникам инструментов для самостоятельного управления — это критически важно… и я бы утверждал, что это критически важно для любого, кто управляет хорошим сообществом.

Я согласен, такая опция помогла бы enormously. В целом мы никогда не будем редактировать чужие сообщения на нашем форуме… именно по этим причинам… наши участники были бы крайне чувствительны к тому, что мы вмешиваемся в их слова. В данный момент у нас в Discourse есть только два варианта работы с проблемным контентом: (а) удалить сообщение или (b) не удалять его. Это немного грубо, и «когда у тебя только молоток, всё кажется гвоздём» :hammer: :grin: (Я также понимаю, что разговор о будущих инструментах модерации, вероятно, лучше вести в другой теме…)

Отличная идея. Мне нравится, что это возвращает ответственность на автора поста.

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

…и снимает много напряжения с команды модераторов :smiley:

Попробуйте пометить сообщение как «Неподходящее», но используйте кнопку «Принять меры» вместо «Пожаловаться». Сообщение будет скрыто, и пользователю будет предоставлена возможность отредактировать его, сделав более приемлемым, после чего сообщение автоматически появится снова.

Единственное, чего здесь не хватает, — это создать элемент проверки для этого редактирования.

Да, я думаю, что система флагов отлично подошла бы для этого. Помимо вышеупомянутого, было бы идеально также включить «рекомендуемые изменения» или какой-либо тип сообщения, которое можно отправить пользователю (возможно, обязательное, если флаг был отправлен модератором или когда он обрабатывается в очереди обзоров).

Нет, этого не произойдет. Если требование о полной блокировке (которая исторически никогда не была функцией программного обеспечения форумов) является незыблемым, вам следует перейти на другое бесплатное программное обеспечение с открытым исходным кодом. Извините!

Тем не менее, я считаю, что взаимное игнорирование на основе API — это хорошее временное решение.

  • блокировка означает «дополнительно, этот человек больше не сможет видеть мои сообщения», а не только «я больше не хочу видеть сообщения этого человека».

Забавный побочный эффект моей уловки с «взаимным игнорированием» заключается в том, что теперь я получаю кучу таких писем. Буквально десятки. Есть ли способ их отключить? Мне жаль, что они исчезнут (я думаю, они очень полезны для выявления потенциальных проблем в сообществе), но поскольку мне приходится использовать функцию «Игнорировать», чтобы мои блоки работали, эти уведомления становятся непреднамеренным побочным эффектом.

Вы проверяли настройки своего сайта, чтобы увидеть, можно ли изменить пороговое значение? Это первое, что я бы сделал.

Я прочитал часть этого, но это немного выше моего понимания:

Есть ли способ, чтобы администратор сайта мог настроить так, что если Пользователь А игнорирует Пользователя B, то Пользователь B также игнорируется и больше не имеет доступа к сообщениям Пользователя A?

Заранее спасибо — я провожу исследование, чтобы передать эту информацию администратору.

Ларри!

Нет, на Discourse нельзя полностью заблокировать кого-либо… самое радикальное действие, которое может предпринять обычный пользователь, — это игнорирование (игнорируемый человек может видеть ваш контент, но вы не можете видеть его).

@awesomerobot Может ли администратор заблокировать кого-либо на сайте или в его отдельных частях?

Конечно, без этого нам не справиться со спамерами — администраторы могут банить пользователей и даже их IP-адреса, если те начнут создавать новые аккаунты.

Я должен вмешаться, потому что я видел, как это повлияло на наш собственный очень разнообразный форум Discourse.

Принудительная двусторонняя блокировка — это ужасная, ужасная идея, которая навязывает волю форума уязвимому человеку, которого вы пытаетесь защитить. По сути, вы говорите: «Я понимаю, что вы чувствуете себя небезопасно и некомфортно рядом с этим пользователем, но мы не можем просто позволить вам скрыть его сообщения — мы сделаем так, чтобы факт вашего действия стал обнаружимым, и теперь у этого пользователя может появиться ещё одна причина взорваться и напасть на вас».

Многие члены Twitter, публично идентифицирующие себя как женщины, приложили согласованные усилия, чтобы заставить Twitter понять, почему это ужасная идея, и разрешить функцию «скрыть» — удалять пользователя из вашего просмотра и ленты без уведомления его о том, что вы это сделали.

Это верно и в реальном мире, где сам факт получения охранным ордера против преследователя может привести к насилию, так как преследователи чаще нарушают выданные ордера.

Только по этой причине, если эта функция вообще будет в Discourse, она должна выбираться по инициативе заявителя, а не по воле модератора или сайта.

Я бы сказал, что если пользователь просит заблокировать кого-то, и сайт сообщает пользователю, что он заблокирован пользователем X без согласия, и заблокированный пользователь эскалирует конфликт, то это тоже реальный случай для ответственности с точки зрения сайта. Но более того, это безусловно окажет сдерживающее влияние на людей, использующих функцию блокировки вообще (что я видел на собственном опыте), а также передаст власть агрессору: «Ты не можешь заблокировать меня, потому что я узнаю!».

Я должен безоговорочно согласиться здесь. Это либо никогда не должно быть функцией Discourse, либо оно обязательно должно быть опциональным только по инициативе заявителя, и должны быть чётко объяснены реальные риски эскалации.

Многие люди очень сильно расстраиваются, когда их сообщение удаляют, чувствуют себя «зацензурированными» или «отменёнными», или когда на них навязывают динамику власти, которая им не нравится. Но не заблуждайтесь, назовите это как хотите, но модерация и есть цензура, и она подразумевает обязательное требование защищать участников от мести в результате — по той же причине, по которой запросы на модерацию должны оставаться анонимными.

Звучит так, будто проблема была в том, как вы это реализовали..

Когда мы подходим к участникам, мы обычно делаем это с позиции администратора, например: «Стало очевидно, что ваши отношения с пользователем X зашли в тупик, из которого нет выхода, поэтому мы считаем, что в интересах всех участников, чтобы вы с этого момента игнорировали друг друга…»

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

Нет, речь не о подходе: «Этот пользователь заставляет меня чувствовать себя небезопасно или некомфортно, и я хотел бы не видеть его сообщения» — это абсолютно обоснованная просьба, которая вообще никак не зависит от того, согласны с ней модераторы или нет.

Предоставление пользователям контроля над тем, что они потребляют, — благородная цель, независимо от того, что мы, как операторы форума, предпочли бы.

Потому что альтернатива заключается в том, что пользователь покинет сообщество, и его вклад будет утерян. Они не должны «терпеть» микроменеджмент со стороны сайта в виде необходимости дважды блокировать или уведомлять игнорируемого пользователя. Или, если по каким-то причинам это должно быть опцией, она должна быть включена по выбору пользователя (opt-in).

Иначе это означает отказ пользователю, выразившему обеспокоенность в отношении другого пользователя, в праве на самостоятельность. Это их глаза. Они имеют право контролировать, что попадает в их поле зрения, и кто знает об их решениях.