Discussão privada importada não aparece na caixa de entrada do autor

Olá, estou tentando importar mensagens privadas de um banco de dados vBulletin5.

Funciona, mas no perfil do autor a discussão aparece apenas em “enviadas”, não na “caixa de entrada”.

No perfil do outro participante, a discussão aparece corretamente tanto na “caixa de entrada” quanto em “enviadas”.

Perfil do autor:
Aparece em “enviadas”

Mas não na “caixa de entrada”

Perfil do outro participante:
Aparece em ambos:

Como posso fazer com que a discussão apareça na caixa de entrada do autor?

Se necessário, aqui está meu código atual, um pouco bagunçado:

  def import_pm
    puts "", "importando tópicos de PMs..."

    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?

        # se for a primeira postagem
        if pm['parentid'] == 8 
          #next unless post = topic_lookup_from_imported_post_id("pm-#{pm["pmid"]}")

          target_usernames = []
          target_userids = []
          # obter lista de usuários
          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 "um dos IDs de participante é 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 # pm consigo mesmo?
            # skip = true
            p[:target_usernames] = "system"
            puts "pm-#{pm['nodeid']} não tem destinatário"
          end
        # se não for a primeira postagem
        else
          next unless topic = topic_lookup_from_imported_post_id("pm-#{pm["starter"]}")
          p[:topic_id] = topic[:topic_id]

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

A partir do explorador de dados, notei que o valor de participant_count está incorreto:
image

Está escrito 1, mas há duas pessoas na conversa.
Se eu atualizar o campo participant_count do tópico para 2, assim:

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

o tópico agora aparece na caixa de entrada do autor:

Não observei esse comportamento ao atualizar outros campos, como reply_count, por exemplo, então parece ser específico de participant_count e talvez de outros campos.

No meu script de importação, tentei adicionar isso:

p[:participant_count] = target_usernames.count

Mas não funcionou. Acho que não podemos definir esse campo nos métodos dos importadores.

Então estou um pouco travado aqui. Gostaria que meus usuários tivessem todas as suas MPs com respostas na caixa de entrada, não apenas aquelas que eles mesmos não iniciaram.

Alguma ideia?

Alguma opinião sobre isso, @kris.kotlarek?

Obrigado por mencionar esse bug. Verifiquei pessoalmente e você está certo: quando participant_count está incorreto, a mensagem não fica visível na caixa de entrada do autor da mensagem.

Além disso, você tem razão de que, mesmo que você adicione explicitamente esse parâmetro ao create_posts, ele não é definido corretamente.

Isso ocorre porque o TopicCreate possui uma lista explícita de parâmetros permitidos:

Hoje vou criar um PR para o Discourse para aceitar esse atributo no modo de importação.

Enquanto isso, para não esperar pela versão mais recente do Discourse, você pode executar no final do seu script:

Topic.private_messages.map(&:update_statistics) - isso deve corrigir todos os números.

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

Após ser mesclado e implantado, você poderá usá-lo da seguinte forma:

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

Ele deve estar sob [:topic_opts] porque o método create_posts está avaliando post_creator, o que aciona topic_creator.