Плагин ActivityPub

На этот вопрос я знаю ответ. Нет, нельзя. Мы не можем использовать это даже внутри Mastodon, Pixelfed и подобных платформ. И правда в том, что этот плагин, да и ActivityPub в целом, не имеет ничего общего с процессом входа.

Хотя было бы здорово. Но с другой стороны — сама идея ActivityPub заключается именно в том, чтобы устранить необходимость входа в другие сервисы.

1 лайк

В этом и прелесть системы без алгоритмов :smirking_face:. Да, именно так нужно поступать, но это работает только в рамках одного экземпляра. Вам всё равно нужны подписчики.

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

Я довольно активен в Mastodon, поскольку попрощался с Meta. У меня есть аккаунты в трёх разных экземплярах. Мой основной аккаунт подписан на мои категории, а два других — на мой основной аккаунт в экземпляре. Так я максимизирую видимость, а остальное зависит от милости других пользователей.

Кстати — я заметил, что неспособность Mastodon обрабатывать Markdown и HTML немного раздражает некоторых людей.

Слишком ли рано просить добавить это в Crowdin для перевода?

Хороший вопрос.

Нам нужно будет оценить, подходит ли этот плагин для перехода из experimental в official. Если да, мы сможем добавить его в Crowdin.

Из любопытства, какой(ие) язык(ы) вы имеете в виду?

5 лайков

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

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

4 лайка

Ручной перевод всегда остаётся вариантом. И на данный момент это единственный вариант. У меня это заняло максимум 10 минут. Но, конечно, если это будет происходить автоматически, администраторам будет проще.

Да, я думаю, мы можем добавить это в Crowdin, я всё организую.

6 лайков

Темы попадают в большой мир без тегов. Возможно ли как-то добавить теги из Discourse?

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

Конечно, я мог бы просто добавлять #тег, но это немного неудобно, так как у Discourse есть свой удобный способ использования тегов.

2 лайка

https://caneandable.social/@WeirdWriter/113933429408828411

@Angus Мне интересно, можно ли сделать это тоже. Есть ли у аккаунтов, пришедших из плагина Discourse, общий идентификатор (например, метаданные типа source: Discourse), который можно искать в фидиверсе? Или, может быть, есть идентификаторы для постов?

1 лайк

Да, это возможно. Как вы верно заметили, это поднимет несколько вопросов, поскольку теги выполняют несколько разные функции в Discourse и на других платформах. Это потребует тщательного обдумывания.

Это связано с вопросом о тегах, но выходит за его рамки. Здесь есть несколько уровней. Мы могли бы реализовать специфичный для Mastodon подход к улучшению обнаружения. Также мы могли бы внедрить «нормализованный» подход к обнаружению через ActivityPub. По последнему пункту см.

Но да, мы можем обсудить дальше, каковы краткосрочные, среднесрочные и долгосрочные цели продукта, и я смогу разработать стратегию реализации, учитывая эти различные уровни. Я уже поднял этот вопрос с соответствующими специалистами по ActivityPub:

3 лайка

Я хотел бы узнать ваше мнение о том, как и можно ли адресовать акторов Discourse из Fediverse.

Этот вопрос возник у меня, когда я размышлял о том, как связать Discourse в качестве цифрового сада с Fediverse.

Если я прочитаю что-то где-то в Fediverse, я хотел бы иметь возможность переслать это на TAG@my.garden или CATEGORY@my.garden.

Что следует делать с пересланным контентом или в какие разделы Discourse должны поступать эти сообщения?

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

В настоящее время аккаунты, за которыми следит тег или категория, могут создавать новые темы в этом теге или категории.

Если у вас в Discourse есть категория под названием “fediverse”, и аккаунт fediverse@yourforum.com подписан на аккаунт в Mastodon, например fediverse@mastodon.com, то каждый раз, когда fediverse@mastodon.com создаёт новый пост (не являющийся ответом на другой пост), этот пост станет новой темой в вашей категории “fediverse”, а все ответы на этот пост станут ответами в этой теме.

Применяя это к вашему случаю: если “я” в этом предложении — это аккаунт в фединверсе, за которым следят TAG@my.garden или CATEGORY@my.garden, то при создании нового поста или репосте (так называемом “анонсировании”) этого поста, он станет новой темой с тегом TAG или в категории CATEGORY.

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

Например, socialhub.activitypub.rocks имеет двенадцать аккаунтов Discourse через ActivityPub (теги и категории). Он получает (буквально) сотни входящих POST-запросов каждую минуту. Если бы вы развернули там подобную систему проверки, очередь на проверку мгновенно бы переполнилась, сделав её непригодной для использования.

Это имеет потенциал как идея, отчасти потому, что вы уже можете это сделать: перейдите в раздел “ActivityPub” в своём профиле, и вы увидите, что можете связать аккаунты на любом внешнем Discourse или Mastodon со своим аккаунтом пользователя Discourse. Таким образом, один из способов фильтрации контента от несвязанных аккаунтов — это контент от аккаунтов, связанных с пользователями, обладающими достаточным уровнем доверия на форуме.

3 лайка

Готово: https://discourse.crowdin.com/activity-pub — переводчики теперь могут добавлять переводы для плагина ActivityPub.

4 лайка

Существуют ли какие-либо ограничения на то, на каких актеров может подписываться категория? Я мог подписаться на свою, но не могу найти странные.

edit

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

Категория следует за аккаунтом Mastodon. Когда пост (написанный или репостнутый отслеживаемым аккаунтом) содержит изображение, оно никогда не включается. Это техническая проблема того, как Mastodon отправляет данные, как работает ActivityPub или как Discourse обрабатывает такой контент?

Что-то не так. Переводить нечего.

1 лайк

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

Мы планируем в ближайшее время улучшить поддержку изображений.

1 лайк

mastodon.social не работает каждый раз — и я пробовал аккаунты оттуда примерно полдюжины раз. Вот почему я задаюсь вопросом, не связано ли это с настройками инстанса каким-то образом.

Но один аккаунт — @ScienceScholar@mastodon.social. Другим примером может быть @GetCarter@mastodonapp.uk.

Просто ещё одна идея для будущих версий :face_with_peeking_eye:

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

1 лайк

Что это такое:

discourseactivitypub::AP::Handlers::Warning

Сообщение (3765 копий зафиксировано)

[Discourse Activity Pub] DiscourseActivityPub::AP::Handlers::Warning

Трассировка стека

/var/www/discourse/vendor/bundle/ruby/3.3.0/gems/activesupport-7.2.2.1/lib/active_support/broadcast_logger.rb:130:in block in warn' /var/www/discourse/vendor/bundle/ruby/3.3.0/gems/activesupport-7.2.2.1/lib/active_support/broadcast_logger.rb:231:in block in dispatch’
/var/www/discourse/vendor/bundle/ruby/3.3.0/gems/activesupport-7.2.2.1/lib/active_support/broadcast_logger.rb:231:in each' /var/www/discourse/vendor/bundle/ruby/3.3.0/gems/activesupport-7.2.2.1/lib/active_support/broadcast_logger.rb:231:in dispatch’
/var/www/discourse/vendor/bundle/ruby/3.3.0/gems/activesupport-7.2.2.1/lib/active_support/broadcast_logger.rb:130:in warn' /var/www/discourse/plugins/discourse-activity-pub/lib/discourse_activity_pub/logger.rb:26:in log’
/var/www/discourse/plugins/discourse-activity-pub/lib/discourse_activity_pub/logger.rb:63:in warn' /var/www/discourse/plugins/discourse-activity-pub/lib/discourse_activity_pub/ap/activity.rb:42:in rescue in block in perform_transactions’
/var/www/discourse/plugins/discourse-activity-pub/lib/discourse_activity_pub/ap/activity.rb:35:in block in perform_transactions' /var/www/discourse/vendor/bundle/ruby/3.3.0/gems/activerecord-7.2.2.1/lib/active_record/connection_adapters/abstract/transaction.rb:616:in block in within_new_transaction’
/var/www/discourse/vendor/bundle/ruby/3.3.0/gems/activesupport-7.2.2.1/lib/active_support/concurrency/null_lock.rb:9:in synchronize' /var/www/discourse/vendor/bundle/ruby/3.3.0/gems/activerecord-7.2.2.1/lib/active_record/connection_adapters/abstract/transaction.rb:613:in within_new_transaction’
/var/www/discourse/vendor/bundle/ruby/3.3.0/gems/activerecord-7.2.2.1/lib/active_record/connection_adapters/abstract/database_statements.rb:361:in transaction' /var/www/discourse/vendor/bundle/ruby/3.3.0/gems/activerecord-7.2.2.1/lib/active_record/transactions.rb:234:in block in transaction’
/var/www/discourse/vendor/bundle/ruby/3.3.0/gems/activerecord-7.2.2.1/lib/active_record/connection_adapters/abstract/connection_pool.rb:421:in with_connection' /var/www/discourse/vendor/bundle/ruby/3.3.0/gems/activerecord-7.2.2.1/lib/active_record/connection_handling.rb:296:in with_connection’
/var/www/discourse/vendor/bundle/ruby/3.3.0/gems/activerecord-7.2.2.1/lib/active_record/transactions.rb:233:in transaction' /var/www/discourse/plugins/discourse-activity-pub/lib/discourse_activity_pub/ap/activity.rb:34:in perform_transactions’
/var/www/discourse/plugins/discourse-activity-pub/lib/discourse_activity_pub/ap/activity.rb:26:in process' /var/www/discourse/plugins/discourse-activity-pub/app/jobs/discourse_activity_pub_process.rb:12:in execute’
/var/www/discourse/app/jobs/base.rb:316:in block (2 levels) in perform' /var/www/discourse/vendor/bundle/ruby/3.3.0/gems/rails_multisite-6.1.0/lib/rails_multisite/connection_management/null_instance.rb:49:in with_connection’
/var/www/discourse/vendor/bundle/ruby/3.3.0/gems/rails_multisite-6.1.0/lib/rails_multisite/connection_management.rb:21:in with_connection' /var/www/discourse/app/jobs/base.rb:303:in block in perform’
/var/www/discourse/app/jobs/base.rb:299:in each' /var/www/discourse/app/jobs/base.rb:299:in perform’
/var/www/discourse/vendor/bundle/ruby/3.3.0/gems/sidekiq-6.5.12/lib/sidekiq/processor.rb:202:in execute_job' /var/www/discourse/vendor/bundle/ruby/3.3.0/gems/sidekiq-6.5.12/lib/sidekiq/processor.rb:170:in block (2 levels) in process’
/var/www/discourse/vendor/bundle/ruby/3.3.0/gems/sidekiq-6.5.12/lib/sidekiq/middleware/chain.rb:177:in block in invoke' /var/www/discourse/lib/sidekiq/pausable.rb:132:in call’
/var/www/discourse/vendor/bundle/ruby/3.3.0/gems/sidekiq-6.5.12/lib/sidekiq/middleware/chain.rb:179:in block in invoke' /var/www/discourse/vendor/bundle/ruby/3.3.0/gems/sidekiq-6.5.12/lib/sidekiq/middleware/chain.rb:182:in invoke’
/var/www/discourse/vendor/bundle/ruby/3.3.0/gems/sidekiq-6.5.12/lib/sidekiq/processor.rb:169:in block in process' /var/www/discourse/vendor/bundle/ruby/3.3.0/gems/sidekiq-6.5.12/lib/sidekiq/processor.rb:136:in block (6 levels) in dispatch’
/var/www/discourse/vendor/bundle/ruby/3.3.0/gems/sidekiq-6.5.12/lib/sidekiq/job_retry.rb:113:in local' /var/www/discourse/vendor/bundle/ruby/3.3.0/gems/sidekiq-6.5.12/lib/sidekiq/processor.rb:135:in block (5 levels) in dispatch’
/var/www/discourse/vendor/bundle/ruby/3.3.0/gems/sidekiq-6.5.12/lib/sidekiq.rb:44:in block in <module:Sidekiq>' /var/www/discourse/vendor/bundle/ruby/3.3.0/gems/sidekiq-6.5.12/lib/sidekiq/processor.rb:131:in block (4 levels) in dispatch’
/var/www/discourse/vendor/bundle/ruby/3.3.0/gems/sidekiq-6.5.12/lib/sidekiq/processor.rb:263:in stats' /var/www/discourse/vendor/bundle/ruby/3.3.0/gems/sidekiq-6.5.12/lib/sidekiq/processor.rb:126:in block (3 levels) in dispatch’
/var/www/discourse/vendor/bundle/ruby/3.3.0/gems/sidekiq-6.5.12/lib/sidekiq/job_logger.rb:13:in call' /var/www/discourse/vendor/bundle/ruby/3.3.0/gems/sidekiq-6.5.12/lib/sidekiq/processor.rb:125:in block (2 levels) in dispatch’
/var/www/discourse/vendor/bundle/ruby/3.3.0/gems/sidekiq-6.5.12/lib/sidekiq/job_retry.rb:80:in global' /var/www/discourse/vendor/bundle/ruby/3.3.0/gems/sidekiq-6.5.12/lib/sidekiq/processor.rb:124:in block in dispatch’
/var/www/discourse/vendor/bundle/ruby/3.3.0/gems/sidekiq-6.5.12/lib/sidekiq/job_logger.rb:39:in prepare' /var/www/discourse/vendor/bundle/ruby/3.3.0/gems/sidekiq-6.5.12/lib/sidekiq/processor.rb:123:in dispatch’
/var/www/discourse/vendor/bundle/ruby/3.3.0/gems/sidekiq-6.5.12/lib/sidekiq/processor.rb:168:in process' /var/www/discourse/vendor/bundle/ruby/3.3.0/gems/sidekiq-6.5.12/lib/sidekiq/processor.rb:78:in process_one’
/var/www/discourse/vendor/bundle/ruby/3.3.0/gems/sidekiq-6.5.12/lib/sidekiq/processor.rb:68:in run' /var/www/discourse/vendor/bundle/ruby/3.3.0/gems/sidekiq-6.5.12/lib/sidekiq/component.rb:8:in watchdog’
/var/www/discourse/vendor/bundle/ruby/3.3.0/gems/sidekiq-6.5.12/lib/sidekiq/component.rb:17:in `block in safe_thread’

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

У меня была подкатегория со следующими настройками:

  • Тип объекта публикации = note (заметка)
  • Тип публикации = full topic (полная тема)
  • (Видимость = public; серая, так как выбран «полная тема»)

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

Я подумал, что если к теме/сообщению, изначально созданному в Mastodon, будут оставлены комментарии, они будут отправлены как ответы в Mastodon. Я попробовал это (для тестирования и демонстрации), и мой ответ показал зелёную стрелку ActivityPub, значит, что-то произошло. Но я не могу найти его нигде в Mastodon, и он не отображается как ответ на исходное сообщение Mastodon.

Я ответил на тему, поэтому затем попробовал ответить на пост. То же самое: значок AP зелёный, но я не могу найти ответ в Mastodon.

Мой аккаунт Mastodon не подписан на актора категории, но, как я полагаю, это не обязательно.

Редактирование 1. Исходный пост Mastodon получил комментарий из Mastodon, и он появился в теме. Значит, это направление работает отлично.

Редактирование 2. Или я всё неправильно понимаю? Когда категория подписана на актора Mastodon, она действительно просто подписывается. Это не двусторонняя система. Плагин отправляет всё, что происходит в этой категории, но это видно только тем, кто подписан на актора категории. То есть, по сути, есть два отдельных однонаправленных потока: то, что подписана эта категория, и то, что подписано на эту категорию?

Тогда есть ещё одна проблема, которая, как я полагаю, вообще не связана с плагином. Приложение Mona выдаёт ошибку 404 при попытке найти актора этой категории. Однако оригинальная веб-версия находит его сразу.

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

Извините за все странные структуры предложений и совершенно неправильное использование предлогов. AI-proofread выдаёт ошибку 500, возможно, из-за блока details.