Script de importación de Discourse a IPS4

Ayudar a configurar la importación de mensajes privados

Hay código escrito para la versión anterior de IPB3.
En la nueva versión de IPS4, algunas tablas han sido renombradas.

Resumen

def import_private_messages
puts “”, “importando mensajes privados…”

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 "Procesando #{private_messages.count} mensajes"
  break if private_messages.count < 1
  puts "Procesando . . . "
  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?

    # usuarios que forman parte de este mensaje privado.
    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 "Usuario encontrado: #{to_user} -- #{user_id} -- #{username}"
        else
          puts "No se pudo encontrar el usuario: #{to_user}"
        end
      end
    rescue
      puts "Saltando pm-#{m['pmtextid']} `to_user_array` está roto -- #{to_user_array.inspect}"
      skip = true
    end

    participants = target_userids
    participants << mapped[:user_id]
    begin
      participants.sort!
    rescue
      puts "uno de los IDs de los participantes es nil -- #{participants.inspect}"
    end

    if last_private_message_topic_id != m['topic_id']
      last_private_message_topic_id = m['topic_id']
      puts "Nuevo mensaje: #{m['topic_id']}: #{title} de #{m['fromuserid']} (#{mapped[:user_id]})" unless QUIET
      # mensaje del tema inicial
      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 # ¿mensaje privado contigo mismo?
        # skip = true
        mapped[:target_usernames] = "system"
        puts "pm-#{m['pmtextid']} no tiene destinatario (#{m['touserarray']})"
      end
    else # respuesta
      topic_id = topic_lookup_from_imported_post_id("pm-#{topic_id}")
      if !topic_id
        skip = true
      end
      mapped[:topic_id] = topic_id
      puts "Mensaje de respuesta #{topic_id}: #{m['topic_id']}: de #{m['fromuserid']} (#{mapped[:user_id]})"  unless QUIET
    end
    #        puts "#{target_usernames} -- #{mapped[:target_usernames]}"
    #        puts "Añadiendo #{mapped}"
    skip ? nil : mapped
    #        puts "#{'-'*50}> añadido"
  end
end

Así es como se ve la tabla ahora

El problema ocurre con mt_invited_members

Si eliminas esta línea del mensaje de la consulta, se importa pero se pierde la cadena de respuestas. Apenas entiendo qué modificaciones deben hacerse para que los mensajes privados se importen correctamente.
Intenté sustituir mt_invited_members por mt_starter_id

Los mensajes no se han importado en absoluto

Por el momento, he logrado crear uno de dos scripts de importación que migra desde IPS 4.5 a Discourse.

Usuarios
Avatares
Mensajes privados (parcialmente)
Categorías
Foros
Temas

Tengo algunos problemas al importar archivos adjuntos. Cuando el script esté completo, definitivamente lo compartiré con el público.

Tabla de contenidos