Script de importação do Discourse para IPS4

ajude a moldar a importação de mensagens privadas

há código escrito para a versão anterior do ipb3
na nova versão do ips4, algumas tabelas foram renomeadas

Resumo

def import_private_messages
puts “”, “importando mensagens privadas…”

topic_count = mysql_query("SELECT COUNT(msg_id) count FROM #{TABLE_PREFIX}message_posts").first["count"]

last_private_message_topic_id = -1

batches(BATCH_SIZE) do |offset|
  private_messages = mysql_query(<<-SQL
      SELECT msg_id pmtextid,
             msg_topic_id topic_id,
             msg_author_id fromuserid,
             mt_title title,
             msg_post message,
             
             mt_invited_members touserarray,
             
             mt_to_member_id to_user_id,
             msg_is_first_post first_post,
             msg_date dateline
        FROM #{TABLE_PREFIX}message_topics, #{TABLE_PREFIX}message_posts
       WHERE msg_topic_id = mt_id
         AND msg_date > UNIX_TIMESTAMP(STR_TO_DATE('#{IMPORT_AFTER}', '%Y-%m-%d'))
    ORDER BY msg_topic_id, msg_id
       LIMIT #{BATCH_SIZE}
      OFFSET #{offset}
  SQL
                                )

  puts "Processando #{private_messages.count} mensagens"
  break if private_messages.count < 1
  puts "Processando . . . "
  private_messages = private_messages.reject { |pm| @lookup.post_already_imported?("pm-#{pm['pmtextid']}") }

  title_username_of_pm_first_post = {}

  create_posts(private_messages, total: topic_count, offset: offset) do |m|
    skip = false
    mapped = {}

    mapped[:id] = "pm-#{m['pmtextid']}"
    mapped[:user_id] = user_id_from_imported_user_id(m['fromuserid']) || Discourse::SYSTEM_USER_ID
    mapped[:raw] = clean_up(m['message']) rescue nil
    mapped[:created_at] = Time.zone.at(m['dateline'])
    title = @htmlentities.decode(m['title']).strip[0...255]
    topic_id = nil

    next if mapped[:raw].blank?

    # usuários que fazem parte desta mensagem privada.
    target_usernames = []
    target_userids = []
    begin
      to_user_array = [ m['to_user_id'] ] + array_from_members_string(m['touserarray'])
    rescue
      puts "#{m['pmtextid']} -- #{m['touserarray']}"
      skip = true
    end

    begin
      to_user_array.each do |to_user|
        user_id = user_id_from_imported_user_id(to_user)
        username = User.find_by(id: user_id).try(:username)
        target_userids << user_id || Discourse::SYSTEM_USER_ID
        target_usernames << username if username
        if user_id
          puts "Usuário encontrado: #{to_user} -- #{user_id} -- #{username}"
        else
          puts "Não foi possível encontrar o usuário: #{to_user}"
        end
      end
    rescue
      puts "pulando pm-#{m['pmtextid']} `to_user_array` está corrompido -- #{to_user_array.inspect}"
      skip = true
    end

    participants = target_userids
    participants << mapped[:user_id]
    begin
      participants.sort!
    rescue
      puts "um dos ids dos participantes é nil -- #{participants.inspect}"
    end

    if last_private_message_topic_id != m['topic_id']
      last_private_message_topic_id = m['topic_id']
      puts "Nova mensagem: #{m['topic_id']}: #{title} de #{m['fromuserid']} (#{mapped[:user_id]})" unless QUIET
      # mensagem do tópico
      topic_id = m['topic_id']
      mapped[:title] = title
      mapped[:archetype] = Archetype.private_message
      mapped[:target_usernames] = target_usernames.join(',')
      if mapped[:target_usernames].size < 1 # mensagem privada consigo mesmo?
        # skip = true
        mapped[:target_usernames] = "system"
        puts "pm-#{m['pmtextid']} não tem destinatário (#{m['touserarray']})"
      end
    else # resposta
      topic_id = topic_lookup_from_imported_post_id("pm-#{topic_id}")
      if !topic_id
        skip = true
      end
      mapped[:topic_id] = topic_id
      puts "Mensagem de resposta #{topic_id}: #{m['topic_id']}: de #{m['fromuserid']} (#{mapped[:user_id]})"  unless QUIET
    end
    #        puts "#{target_usernames} -- #{mapped[:target_usernames]}"
    #        puts "Adicionando #{mapped}"
    skip ? nil : mapped
    #        puts "#{'-'*50}> adicionado"
  end
end

assim é como a tabela aparece agora

o problema ocorre com mt_invited_members

se você remover esta linha da mensagem da solicitação, ela é importada, mas a cadeia de respostas é perdida. Mal consigo entender quais edições precisam ser feitas para que as mensagens privadas sejam importadas corretamente.
tentei substituir mt_invited_members por mt_starter_id

as mensagens não foram importadas de forma alguma

No momento, consegui fazer um dos dois scripts de importação que importa do IPS 4.5 para o Discourse.

Usuários
Avatares
Mensagens privadas (parcialmente)
Categorias
Fóruns
Tópicos

Tenho alguns problemas ao importar anexos. Quando o script estiver concluído, com certeza compartilharei com o público.

Tabela de conteúdos