Complemento ActivityPub

Hola :wave:
En primer lugar, gracias por el impresionante trabajo que se ha realizado para que esto suceda. No podría estar más feliz con la decisión de trasladar nuestra comunidad a Discourse gracias a esto.

Agregué el plugin a nuestra instancia y configuré un actor. Sin embargo, cuando publico en una categoría con un actor asociado, obtengo un “Error interno del servidor”. No pude encontrar mucho en los registros aparte de que la solicitud falló con un error 500:

[sin marca de tiempo]  por PostsController#create como JSON
[sin marca de tiempo]  Parámetros: {"raw"=>"Esto es solo una prueba prueba prueba", "title"=>"Esto es solo una prueba prueba prueba", "unlist_topic"=>"false", "category"=>"10", "is_warning"=>"false", "archetype"=>"regular", "typing_duration_msecs"=>"200", "composer_open_duration_msecs"=>"3160", "shared_draft"=>"false", "draft_key"=>"new_topic", "activity_pub_visibility"=>"public", "nested_post"=>"true"}
25 de sep 15:06:38 - Procesando por PostsController#create como JSON
25 de sep 15:06:38 - Parámetros: {"raw"=>"Esto es solo una prueba prueba prueba", "title"=>"Esto es solo una prueba prueba prueba", "unlist_topic"=>"false", "category"=>"10", "is_warning"=>"false", "archetype"=>"regular", "typing_duration_msecs"=>"200", "composer_open_duration_msecs"=>"3160", "shared_draft"=>"false", "draft_key"=>"new_topic", "activity_pub_visibility"=>"public", "nested_post"=>"true"}
25 de sep 15:06:38 - 172.18.0.1 - - [25/Sep/2024:13:06:38 +0000] "POST /message-bus/3e2e0add2e9a41cc9ce7041980fe4f81/poll HTTP/1.1" 200 2438 "https://community.tuist.io/c/announcements/10" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10.15; rv:130.0) Gecko/20100101 Firefox/130.0"
25 de sep 15:06:38 - 172.18.0.1 - - [25/Sep/2024:13:06:38 +0000] "POST /message-bus/3e2e0add2e9a41cc9ce7041980fe4f81/poll HTTP/1.1" 200 115 "https://community.tuist.io/c/announcements/10" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10.15; rv:130.0) Gecko/20100101 Firefox/130.0"
[sin marca de tiempo]  2024-09-25T13:06:38Z cloudron 37a832f8-20ab-41d7-9d4d-82052354c0eb 1101 37a832f8-20ab-41d7-9d4d-82052354c0eb - 172.18.0.1 - - [25/Sep/2024:13:06:38 +0000] "POST /message-bus/3e2e0add2e9a41cc9ce7041980fe4f81/poll HTTP/1.1" 200 115 "https://community.tuist.io/c/announcements/10" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10.15; rv:130.0) Gecko/20100101 Firefox/130.0"
[sin marca de tiempo]  inicio
25 de sep 15:06:39 - inicio
[sin marca de tiempo]  inicio
25 de sep 15:06:39 - inicio
[sin marca de tiempo]  hecho
25 de sep 15:06:39 - hecho
[sin marca de tiempo]  inicio
25 de sep 15:06:39 - inicio
[sin marca de tiempo]  inicio
[sin marca de tiempo]  inicio
25 de sep 15:06:39 - inicio
25 de sep 15:06:39 - inicio
[sin marca de tiempo]  hecho
25 de sep 15:06:39 - hecho
[sin marca de tiempo]  hecho
25 de sep 15:06:39 - hecho
[sin marca de tiempo]  500 Error interno del servidor en 476ms (ActiveRecord: 0.0ms | Asignaciones: 56364)
[sin marca de tiempo]  hecho
25 de sep 15:06:39 - Completado 500 Error interno del servidor en 476ms (ActiveRecord: 0.0ms | Asignaciones: 56364)
25 de sep 15:06:39 - hecho
25 de sep 15:06:39 - 172.18.0.1 - - [25/Sep/2024:13:06:39 +0000] "POST /posts HTTP/1.1" 500 46 "https://community.tuist.io/c/announcements/10" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10.15; rv:130.0) Gecko/20100101 Firefox/130.0"
[sin marca de tiempo]  inicio
25 de sep 15:06:39 - inicio
[sin marca de tiempo]  hecho
25 de sep 15:06:39 - hecho
[sin marca de tiempo]  hecho
25 de sep 15:06:39 - hecho

¿Cuál es la ruta recomendada para depurar este problema?

El siguiente paso es ir a /logs en tu foro, encontrar la línea de registro correspondiente y publicar el stack trace aquí.

3 Me gusta

Aquí está el error:

Message

NoMethodError (método no definido `moderating_groups' para #<Category id: 10, name: "Announcements", color: "652D90", topic_id: 55, topic_count: 5, created_at: "2024-09-25 09:23:28.181772000 +0000", updated_at: "2024-09-27 11:53:47.131692000 +0000", user_id: 3, topics_year: 4, topics_month: 4, topics_week: 4, slug: "announcements", description: "Esta categoría se usa para anuncios por el mai...", text_color: "FFFFFF", read_restricted: false, auto_close_hours: nil, post_count: 4, latest_post_id: 108, latest_topic_id: 83, position: 7, parent_category_id: nil, posts_year: 4, posts_month: 4, posts_week: 4, email_in: nil, email_in_allow_strangers: false, topics_day: 0, posts_day: 0, allow_badges: true, name_lower: "announcements", auto_close_based_on_last_post: false, topic_template: nil, contains_messages: nil, sort_order: nil, sort_ascending: nil, uploaded_logo_id: nil, uploaded_background_id: nil, topic_featured_link_allowed: true, all_topics_wiki: false, show_subcategory_list: false, num_featured_topics: 3, default_view: nil, subcategory_list_style: "rows_with_featured_topics", default_top_period: "all", mailinglist_mirror: false, minimum_required_tags: 0, navigate_to_first_post_after_read: false, search_priority: 0, allow_global_tags: false, reviewable_by_group_id: nil, read_only_banner: nil, default_list_filter: "all", allow_unlimited_owner_edits_on_first_post: false, default_slow_mode_seconds: nil, uploaded_logo_dark_id: nil, uploaded_background_dark_id: nil>)
lib/plugin/instance.rb:376:in `public_send'
lib/plugin/instance.rb:376:in `block (2 levels) in add_to_class'
lib/plugin/instance.rb:376:in `public_send'
lib/plugin/instance.rb:376:in `block (2 levels) in add_to_class'
lib/plugin/instance.rb:376:in `public_send'
lib/plugin/instance.rb:376:in `block (2 levels) in add_to_class'
lib/plugin/instance.rb:376:in `public_send'
lib/plugin/instance.rb:376:in `block (2 levels) in add_to_class'
lib/plugin/instance.rb:576:in `block in on'
lib/discourse_event.rb:12:in `bl...

Backtrace

activemodel (7.1.3.4) lib/active_model/attribute_methods.rb:489:in `method_missing'
plugins/discourse-activity-pub/plugin.rb:367:in `block (2 levels) in activate!'
lib/plugin/instance.rb:376:in `public_send'
lib/plugin/instance.rb:376:in `block (2 levels) in add_to_class'
plugins/discourse-activity-pub/plugin.rb:331:in `block (2 levels) in activate!'
lib/plugin/instance.rb:376:in `public_send'
lib/plugin/instance.rb:376:in `block (2 levels) in add_to_class'
plugins/discourse-activity-pub/plugin.rb:337:in `block (2 levels) in activate!'
lib/plugin/instance.rb:376:in `public_send'
lib/plugin/instance.rb:376:in `block (2 levels) in add_to_class'
plugins/discourse-activity-pub/app/models/discourse_activity_pub_object.rb:99:in `after_scheduled'
plugins/discourse-activity-pub/app/models/discourse_activity_pub_activity.rb:109:in `after_scheduled'
plugins/discourse-activity-pub/lib/discourse_activity_pub/delivery_handler.rb:89:in `after_scheduled'
plugins/discourse-activity-pub/lib/discourse_activity_pub/delivery_handler.rb:15:in `perform'
plugins/discourse-activity-pub/lib/discourse_activity_pub/delivery_handler.rb:27:in `perform'
plugins/discourse-activity-pub/app/models/concerns/discourse_activity_pub/ap/model_callbacks.rb:160:in `block in activity_pub_deliver_activity'
plugins/discourse-activity-pub/app/models/concerns/discourse_activity_pub/ap/model_callbacks.rb:159:in `each'
plugins/discourse-activity-pub/app/models/concerns/discourse_activity_pub/ap/model_callbacks.rb:159:in `activity_pub_deliver_activity'
plugins/discourse-activity-pub/app/models/concerns/discourse_activity_pub/ap/model_callbacks.rb:41:in `perform_activity_pub_activity'
plugins/discourse-activity-pub/plugin.rb:455:in `block (2 levels) in activate!'
lib/plugin/instance.rb:376:in `public_send'
lib/plugin/instance.rb:376:in `block (2 levels) in add_to_class'
plugins/discourse-activity-pub/plugin.rb:661:in `block (2 levels) in activate!'
lib/plugin/instance.rb:576:in `block in on'
lib/discourse_event.rb:12:in `block in trigger'
/home/cloudron/rbenv/versions/3.2.2/lib/ruby/3.2.0/set.rb:511:in `each_key'
/home/cloudron/rbenv/versions/3.2.2/lib/ruby/3.2.0/set.rb:511:in `each'
lib/discourse_event.rb:12:in `trigger'
lib/post_creator.rb:258:in `trigger_after_events'
lib/post_creator.rb:220:in `create'
lib/new_post_manager.rb:318:in `perform_create_post'
lib/new_post_manager.rb:252:in `perform'
app/controllers/posts_controller.rb:215:in `create'
actionpack (7.1.3.4) lib/action_controller/metal/basic_implicit_render.rb:6:in `send_action'
actionpack (7.1.3.4) lib/abstract_controller/base.rb:224:in `process_action'
actionpack (7.1.3.4) lib/action_controller/metal/rendering.rb:165:in `process_action'
actionpack (7.1.3.4) lib/abstract_controller/callbacks.rb:259:in `block in process_action'
activesupport (7.1.3.4) lib/active_support/callbacks.rb:121:in `block in run_callbacks'
app/controllers/application_controller.rb:424:in `block in with_resolved_locale'
i18n (1.14.5) lib/i18n.rb:351:in `with_locale'
app/controllers/application_controller.rb:424:in `with_resolved_locale'
activesupport (7.1.3.4) lib/active_support/callbacks.rb:130:in `block in run_callbacks'
activesupport (7.1.3.4) lib/active_support/callbacks.rb:141:in `run_callbacks'
actionpack (7.1.3.4) lib/abstract_controller/callbacks.rb:258:in `process_action'
actionpack (7.1.3.4) lib/action_controller/metal/rescue.rb:25:in `process_action'
actionpack (7.1.3.4) lib/action_controller/metal/instrumentation.rb:74:in `block in process_action'
activesupport (7.1.3.4) lib/active_support/notifications.rb:206:in `block in instrument'
activesupport (7.1.3.4) lib/active_support/notifications/instrumenter.rb:58:in `instrument'
activesupport (7.1.3.4) lib/active_support/notifications.rb:206:in `instrument'
actionpack (7.1.3.4) lib/action_controller/metal/instrumentation.rb:73:in `process_action'
actionpack (7.1.3.4) lib/action_controller/metal/params_wrapper.rb:261:in `process_action'
activerecord (7.1.3.4) lib/active_record/railties/controller_runtime.rb:32:in `process_action'
actionpack (7.1.3.4) lib/abstract_controller/base.rb:160:in `process'
actionview (7.1.3.4) lib/action_view/rendering.rb:40:in `process'
rack-mini-profiler (3.3.1) lib/mini_profiler/profiling_methods.rb:89:in `block in profile_method'
actionpack (7.1.3.4) lib/action_controller/metal.rb:227:in `dispatch'
actionpack (7.1.3.4) lib/action_controller/metal.rb:309:in `dispatch'
actionpack (7.1.3.4) lib/action_dispatch/routing/route_set.rb:49:in `dispatch'
actionpack (7.1.3.4) lib/action_dispatch/routing/route_set.rb:32:in `serve'
actionpack (7.1.3.4) lib/action_dispatch/journey/router.rb:51:in `block in serve'
actionpack (7.1.3.4) lib/action_dispatch/journey/router.rb:131:in `block in find_routes'
actionpack (7.1.3.4) lib/action_dispatch/journey/router.rb:124:in `each'
actionpack (7.1.3.4) lib/action_dispatch/journey/router.rb:124:in `find_routes'
actionpack (7.1.3.4) lib/action_dispatch/journey/router.rb:32:in `serve'
actionpack (7.1.3.4) lib/action_dispatch/routing/route_set.rb:882:in `call'
lib/middleware/omniauth_bypass_middleware.rb:64:in `call'
rack (2.2.9) lib/rack/tempfile_reaper.rb:15:in `call'
rack (2.2.9) lib/rack/conditional_get.rb:40:in `call'
rack (2.2.9) lib/rack/head.rb:12:in `call'
actionpack (7.1.3.4) lib/action_dispatch/http/permissions_policy.rb:36:in `call'
lib/content_security_policy/middleware.rb:12:in `call'
lib/middleware/anonymous_cache.rb:393:in `call'
lib/middleware/csp_script_nonce_injector.rb:12:in `call'
config/initializers/008-rack-cors.rb:14:in `call'
rack (2.2.9) lib/rack/session/abstract/id.rb:266:in `context'
rack (2.2.9) lib/rack/session/abstract/id.rb:260:in `call'
actionpack (7.1.3.4) lib/action_dispatch/middleware/cookies.rb:689:in `call'
actionpack (7.1.3.4) lib/action_dispatch/middleware/callbacks.rb:29:in `block in call'
activesupport (7.1.3.4) lib/active_support/callbacks.rb:101:in `run_callbacks'
actionpack (7.1.3.4) lib/action_dispatch/middleware/callbacks.rb:28:in `call'
actionpack (7.1.3.4) lib/action_dispatch/middleware/debug_exceptions.rb:29:in `call'
actionpack (7.1.3.4) lib/action_dispatch/middleware/show_exceptions.rb:31:in `call'
logster (2.20.0) lib/logster/middleware/reporter.rb:40:in `call'
lib/freedom_patches/rails_rack_logger_from_rails_7_2.rb:35:in `call_app'
lib/freedom_patches/rails_rack_logger_from_rails_7_2.rb:22:in `call'
config/initializers/100-quiet_logger.rb:20:in `call'
config/initializers/100-silence_logger.rb:29:in `call'
actionpack (7.1.3.4) lib/action_dispatch/middleware/request_id.rb:28:in `call'
lib/middleware/enforce_hostname.rb:24:in `call'
rack (2.2.9) lib/rack/method_override.rb:24:in `call'
actionpack (7.1.3.4) lib/action_dispatch/middleware/executor.rb:14:in `call'
actionpack (7.1.3.4) lib/action_dispatch/middleware/static.rb:25:in `call'
rack (2.2.9) lib/rack/sendfile.rb:110:in `call'
rack-mini-profiler (3.3.1) lib/mini_profiler.rb:191:in `call'
message_bus (4.3.8) lib/message_bus/rack/middleware.rb:60:in `call'
lib/middleware/request_tracker.rb:360:in `call'
actionpack (7.1.3.4) lib/action_dispatch/middleware/remote_ip.rb:92:in `call'
railties (7.1.3.4) lib/rails/engine.rb:536:in `call'
railties (7.1.3.4) lib/rails/railtie.rb:226:in `public_send'
railties (7.1.3.4) lib/rails/railtie.rb:226:in `method_missing'
rack (2.2.9) lib/rack/urlmap.rb:74:in `block in call'
rack (2.2.9) lib/rack/urlmap.rb:58:in `each'
rack (2.2.9) lib/rack/urlmap.rb:58:in `call'
unicorn (6.1.0) lib/unicorn/http_server.rb:634:in `process_client'
unicorn (6.1.0) lib/unicorn/http_server.rb:739:in `worker_loop'
unicorn (6.1.0) lib/unicorn/http_server.rb:547:in `spawn_missing_workers'
unicorn (6.1.0) lib/unicorn/http_ser

Env

HTTP HOSTS: community.tuist.io

Hola, soy el administrador de lemmy.dbzer0.com y me encantaría ver una mayor interacción entre lemmy y discourse, ya que siento que estas dos piezas encajan de forma mucho más nativa que discourse y mastodon.

Estoy interesado principalmente en una forma para que los usuarios de lemmy puedan ver e interactuar con temas sin tener que crear nuevas cuentas para cada foro de discourse.

Por lo que entiendo, el mayor problema es que el plugin apub no representa las categorías de discourse como grupos apub, lo que impide que lemmy las vea, ¿verdad?

De todos modos, quiero ponerme a disposición, en caso de que deseen tener acceso a una instancia de lemmy y a un administrador para probar. Mi cuenta en lemmy es https://lemmy.dbzer0.com/u/db0

5 Me gusta

Hola chicos, volveré a ofrecer soporte regular para este plugin desde ahora hasta al menos marzo del próximo año. Si has estado usando este plugin y tienes alguna dificultad, ¡por favor házmelo saber! Responderé a tantas preguntas pendientes como pueda.

Cada usuario en Discourse es un Actor. El proceso de seguimiento en Discourse funciona igual que en Lemmy, y como se detalla más adelante en FEP-1b12. La razón por la que aún no puedes seguir Actores de Discourse (es decir, que el enfoque principal ha sido seguir categorías) es porque los foros se centran inherentemente en temas, es decir, discusiones que intrínsecamente involucran a múltiples usuarios. De hecho, este es el enfoque que han adoptado otras aplicaciones de ActivityPub de estilo foro, y es en lo que hemos estado trabajando en el grupo de trabajo de W3C Forum and Threaded Discussion (junto con NodeBB y software similar).

Lo que describes es la diferencia entre la federación “Solo primer mensaje” y “Tema completo”. Lo que esperas es cómo funciona la federación “Tema completo”. Por favor, consulta la documentación y los vídeos instructivos sobre esto aquí.

Este error significa que no estás ejecutando una versión actualizada de Discourse. El plugin ActivityPub actualmente requiere la última versión de Discourse para funcionar.

No, el plugin ActivityPub cumple plenamente con FEP-1b12, que fue escrito por Nutomic (el creador de Lemmy) para describir la federación basada en grupos. ¿Has intentado federar entre Lemmy y Discourse?

2 Me gusta

¿Puedes investigar por qué meta no muestra correctamente mi dominio y no muestra ningún contenido de meta?

1 me gusta

¿Hay algún servidor de Discourse con este plugin con el que podamos probar? Supongo que este foro no lo utiliza, ¿verdad?

1 me gusta

Meta usa activitypub, por ejemplo, este tema no estaba federado:

Y este otro sí lo estaba:

¿Dónde puedo ver esta información? Además, el segundo enlace no está disponible para mí.

La URL (en contraposición a la URI de la AP) de esa página es

Puedes ver la información de la AP haciendo clic en el icono de la AP.

1 me gusta

Me cuesta encontrar un solo tema de Apub. Mayormente, el icono no existe

Y si existe, está deshabilitado.

Sin embargo, seguí el enlace que publicaste y busqué la URL en lemmy (que es como se recuperarían los enlaces a los que no se había suscrito previamente) y no se puede encontrar. Tampoco encuentro el foro de anuncios en absoluto para poder suscribirme.

1 me gusta

OK, lo encontré buscando como announcements@meta.discourse.org y me suscribí. Voy a intentar suscribirme a algunos temas más para ver si puedo ver nuevas publicaciones en lemmy.

EDITAR: Algunas comunidades son encontrables como Feature y Announcements, pero Support, Plugin y Bug no se pueden encontrar https://lemmy.dbzer0.com/search?q=!plugin%40meta.discourse.org&type=Communities&listingType=All&page=1&sort=TopAll

2 Me gusta

Eso es porque no tienen Actores. Por favor, consulta la documentación y los vídeos instructivos. Verás que a cada Categoría se le debe asignar un Actor antes de que sea localizable.

En meta, creo que solo Announcements y Feature tienen Actores creados para ellos.

4 Me gusta

Pero soy una instancia externa que intenta obtener contenido federado de ti. No tengo visibilidad de eso, ¿verdad?

EDITAR: Oh, ahora veo la pestaña de federación, pero solo a veces. Otras veces no aparece

2 Me gusta

Sí, eso se abordará pronto. Si no la ves, simplemente actualiza la página y aparecerá. Hazme saber cómo te va.

Solo una nota de que @mcdanlj y yo estamos discutiendo esto en privado. Es probable que sea un problema histórico (es decir, porque Michael fue uno de los primeros en adoptarlo).

4 Me gusta

Sí, dos preguntas:

  1. ¿Qué pasa con no poder encontrar un hilo federado existente como New and improved About page at /about is live - Announcements - Discourse Meta? Intenté buscarlo en lemmy pero no aparece.
  2. ¿Por qué algunos hilos de un tema están federados y otros no? ¿Cómo puedo saberlo?

De todos modos, ¿quizás Following an ActivityPub Actor también se puede actualizar con información relacionada con lemmy?

1 me gusta

Podrías preguntarles tanto a los desarrolladores de Lemmy como a @angus en Lemmy - SocialHub para que puedan coordinarse mejor. La interoperabilidad con Lemmy sería :tada:


@angus, en un artículo reciente del blog de Mastodon hay algo que vale la pena implementar, por ejemplo, para el tema destacado en el perfil de un usuario, si ese tema fue iniciado por este usuario:

Hemos decidido crear un nuevo tipo de etiqueta OpenGraph: el mismo tipo de etiquetas que tienes en tu sitio web para determinar qué miniatura aparecerá en la vista previa de la página cuando se comparte en Discord, iMessage o Mastodon. Se ve así: <meta name="fediverse:creator" content="@Gargron@mastodon.social" />.

La metaetiqueta aparecería en el tema, para que Mastodon pueda enlazar al perfil del usuario. Sé que no hay un actor de usuario en Discourse, pero si el actor de ActivityPub es, digamos, una editorial, y el tema trata sobre su catálogo, entonces el caso de uso tiene sentido. :wink:

1 me gusta

Sí, como sugiere @hellekin, creo que una discusión más profunda sobre Lemmy / Discourse se manejaría mejor aquí:

Dado que reanudo el trabajo en este plugin, por favor, publique sus preguntas más detalladas sobre Lemmy allí y responderé pronto.

Gracias, lo pensaré.

Hay Actores de Usuario en Discourse. Simplemente no puedes seguirlos (actualmente). Dado que esta idea errónea ha surgido tres veces hoy, estoy pensando en mostrar esto en alguna parte de la interfaz de usuario. En respuesta a la pregunta de seguimiento “¿Por qué no puedes seguir actores de usuario si existen?”, primero hay que responder a la pregunta anterior “¿Por qué querrías seguir actores de usuario en Discourse?” (es decir, ¿cuál es un caso de uso real?).

(Soy consciente de que Discourse Follow existe, yo lo construí, sin embargo, hay una diferencia entre seguir a un usuario dentro de una instancia para fines de notificación/descubrimiento y seguir a un Actor de Usuario en el fediverso).

4 Me gusta

Esto se solucionará una vez que se fusione.

Tenga en cuenta también que pronto escribiré un tema de “cómo hacerlo” de Lemmy <> Discourse aquí en meta con un video instructivo. Si está utilizando, o desea utilizar, Lemmy para federarse con Discourse, por favor comparta sus pensamientos / experiencias aquí y me aseguraré de abordarlos en las instrucciones.

2 Me gusta

Oh, buen cambio que acaba de llegar:

:tada:

3 Me gusta