Script d'importation Discourse pour IPS4

Aidez à façonner l’importation des messages privés

Il existe du code écrit pour l’ancienne version d’IPB3.
Dans la nouvelle version d’IPS4, certaines tables ont été renommées.

Résumé

def import_private_messages
puts “”, “importation des messages privés…”

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 "Traitement de #{private_messages.count} messages"
  break if private_messages.count < 1
  puts "Traitement en cours . . . "
  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?

    # Utilisateurs faisant partie de ce message privé.
    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 "Utilisateur trouvé : #{to_user} -- #{user_id} -- #{username}"
        else
          puts "Impossible de trouver l'utilisateur : #{to_user}"
        end
      end
    rescue
      puts "saut de pm-#{m['pmtextid']} `to_user_array` est cassé -- #{to_user_array.inspect}"
      skip = true
    end

    participants = target_userids
    participants << mapped[:user_id]
    begin
      participants.sort!
    rescue
      puts "l'un des ID des participants est nil -- #{participants.inspect}"
    end

    if last_private_message_topic_id != m['topic_id']
      last_private_message_topic_id = m['topic_id']
      puts "Nouveau message : #{m['topic_id']}: #{title} de #{m['fromuserid']} (#{mapped[:user_id]})" unless QUIET
      # message du sujet de discussion
      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 # mp avec soi-même ?
        # skip = true
        mapped[:target_usernames] = "system"
        puts "pm-#{m['pmtextid']} n'a pas de destinataire (#{m['touserarray']})"
      end
    else # réponse
      topic_id = topic_lookup_from_imported_post_id("pm-#{topic_id}")
      if !topic_id
        skip = true
      end
      mapped[:topic_id] = topic_id
      puts "Message de réponse #{topic_id}: #{m['topic_id']}: de #{m['fromuserid']} (#{mapped[:user_id]})"  unless QUIET
    end
    #        puts "#{target_usernames} -- #{mapped[:target_usernames]}"
    #        puts "Ajout de #{mapped}"
    skip ? nil : mapped
    #        puts "#{'-'*50}> ajouté"
  end
end

Voici à quoi ressemble la table maintenant

Le problème survient avec mt_invited_members

Si vous supprimez cette ligne du message dans la requête, il est importé, mais la chaîne de réponses est perdue. Je comprends à peine quelles modifications doivent être apportées pour que les messages privés soient importés correctement.
J’ai essayé de remplacer mt_invited_members par mt_starter_id

Les messages n’ont pas du tout été importés

Pour le moment, j’ai réussi à créer l’un des deux scripts d’importation qui transfère les données d’Ips 4.5 vers Discourse.

Utilisateurs
Avatars
Messages privés (partiellement)
Catégories
Forums
Sujets

Je rencontre quelques difficultés pour importer les pièces jointes. Une fois le script terminé, je le partagerai bien sûr avec le public.

table des matières