La discusión privada importada no aparece en la bandeja de entrada del autor

Hola, estoy intentando importar mensajes privados desde una base de datos vBulletin5.

Funciona, pero en el perfil del autor, la discusión solo aparece en “enviados”, no en “buzón de entrada”.

Por otro lado, en el perfil del otro participante, la discusión aparece correctamente tanto en “buzón de entrada” como en “enviados”.

Perfil del autor:
Aparece en “enviados”

Pero no en “buzón de entrada”

Perfil del otro participante:
Aparece en ambos:

¿Cómo puedo hacer que la discusión aparezca en el buzón de entrada del autor?

Si es necesario, aquí está mi código actual, algo desordenado:

  def import_pm
    puts "", "importando temas de mensajes privados..."

    pms_count = mysql_query("SELECT COUNT(nodeid) cnt, starter
        FROM #{DB_PREFIX}node
        WHERE (unpublishdate = 0 OR unpublishdate IS NULL)
        AND (approved = 1 AND showapproved = 1)    
          AND starter = 2676436
        AND contenttypeid=#{@pm};"
    ).first["cnt"]

    batches(BATCH_SIZE) do |offset|
      pms = mysql_query <<~SQL
        SELECT pm.nodeid AS pmid, pm.starter, pm.title, pm.parentid AS parentid,pm.open,pm.userid AS postuserid,pm.publishdate AS dateline,
            nv.count views, 1 AS visible, pm.sticky,
            CONVERT(CAST(rawtext AS BINARY)USING utf8) AS raw
        FROM #{DB_PREFIX}node pm
        LEFT JOIN #{DB_PREFIX}nodeview nv ON nv.nodeid=pm.nodeid
        LEFT JOIN #{DB_PREFIX}text txt ON txt.nodeid=pm.nodeid
        WHERE
          pm.contenttypeid = #{@pm}
          AND (pm.unpublishdate = 0 OR pm.unpublishdate IS NULL)
          AND pm.approved = 1 AND pm.showapproved = 1
          AND pm.starter = 2676436
        ORDER BY pm.nodeid
          LIMIT #{BATCH_SIZE}
          OFFSET #{offset}
      SQL

      break if pms.size < 1

      create_posts(pms, total: pms_count, offset: 0) do |pm|
        p = {}

        p[:id] = "pm-#{pm['pmid']}"
        p[:user_id] = user_id_from_imported_user_id(pm['postuserid']) || Discourse::SYSTEM_USER_ID
        p[:raw] = preprocess_post_raw(pm['raw']) rescue nil
        p[:created_at] = parse_timestamp(pm["dateline"]),

        topic_id = nil

        next if p[:raw].blank?

        # si es el primer mensaje
        if pm['parentid'] == 8 
          #next unless post = topic_lookup_from_imported_post_id("pm-#{pm["pmid"]}")

          target_usernames = []
          target_userids = []
          # obtener lista de usuarios
          userlist = mysql_query("select distinct userid from sentto where nodeid = #{pm["starter"]}")
          userlist.each do |user|
            userid = user_id_from_imported_user_id(user["userid"]) || Discourse::SYSTEM_USER_ID;
            target_userids << userid || Discourse::SYSTEM_USER_ID
            target_usernames << User.find_by(id: userid).try(:username) || "system"
          end

          participants = target_userids
          begin
            participants.sort!
          rescue
            puts "uno de los IDs de participante es nil -- #{participants.inspect}"
          end

          p[:title] = @htmlentities.decode(pm['title']).strip[0...255]
          p[:archetype] = Archetype.private_message
          p[:target_usernames] = target_usernames.join(',')

          if p[:target_usernames].size < 1 # ¿mensaje privado contigo mismo?
            # skip = true
            p[:target_usernames] = "system"
            puts "pm-#{pm['nodeid']} no tiene destinatario"
          end
        # si no es el primer mensaje
        else
          next unless topic = topic_lookup_from_imported_post_id("pm-#{pm["starter"]}")
          p[:topic_id] = topic[:topic_id]

        end
        puts "mensaje : #{p}\n"
        p
      end
    end
    exit
  end

Desde el explorador de datos, noté que el valor de participant_count es incorrecto:
image

Dice 1, pero hay dos personas en la conversación.
Si actualizo el campo participant_count del tema a 2 de esta manera:

Topic.find_by(id: 218613).update(participant_count: 2)

el tema ahora aparece en la bandeja de entrada del autor:

No noté este comportamiento al actualizar otros campos como reply_count, por ejemplo, así que parece ser específico de participant_count y quizás de otros campos.

En mi script de importación, intenté agregar esto:

p[:participant_count] = target_usernames.count

Pero no funcionó; supongo que no podemos establecer este campo en los métodos de los importadores.

Así que estoy un poco atascado aquí. Me gustaría que mis usuarios tuvieran todos sus mensajes privados con respuestas en su bandeja de entrada, no solo aquellos que no iniciaron ellos mismos.

¿Alguna idea?

¿Alguna opinión sobre esto @kris.kotlarek?

Gracias por mencionar ese error. Lo verifiqué yo mismo y tienes razón: cuando participant_count es incorrecto, el mensaje no es visible en la bandeja de entrada del autor del mensaje.

También es cierto que, incluso si agregas explícitamente ese parámetro a create_posts, no se establece correctamente.

Esto se debe a que TopicCreate tiene una lista explícita de parámetros permitidos:

Hoy crearé una PR para Discourse a fin de aceptar ese atributo en modo de importación.

Mientras tanto, para no esperar la última versión de Discourse, puedes ejecutar al final de tu script:

Topic.private_messages.map(&:update_statistics) - esto debería corregir todos los números.

La PR está lista - FIX: topic_creator accepts participant_count in import mode by KrisKotlarek · Pull Request #10632 · discourse/discourse · GitHub

Una vez que se fusiona y despliega, podrás usarla de la siguiente manera:

create_posts(pms, total: pms_count, offset: 0) do |pm|
...
  p[:topic_opts][:participant_count] = target_usernames.count 
...
end

Debe estar bajo [:topic_opts] porque el método create_posts evalúa post_creator, lo que activa topic_creator.