Discourse Import IPS4 Skript

Helfen Sie mit, den Import privater Nachrichten zu gestalten

Es gibt Code, der für die vorherige Version von IPB3 geschrieben wurde.
In der neuen Version von IPS4 wurden einige Tabellen umbenannt.

Zusammenfassung

def import_private_messages
puts “”, “Importiere private Nachrichten…”

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

    # Benutzer, die Teil dieser privaten Nachricht sind.
    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 "Benutzer gefunden: #{to_user} -- #{user_id} -- #{username}"
        else
          puts "Benutzer nicht gefunden: #{to_user}"
        end
      end
    rescue
      puts "Überspringe pm-#{m['pmtextid']} `to_user_array` ist defekt -- #{to_user_array.inspect}"
      skip = true
    end

    participants = target_userids
    participants << mapped[:user_id]
    begin
      participants.sort!
    rescue
      puts "Eine der Teilnehmer-IDs ist nil -- #{participants.inspect}"
    end

    if last_private_message_topic_id != m['topic_id']
      last_private_message_topic_id = m['topic_id']
      puts "Neue Nachricht: #{m['topic_id']}: #{title} von #{m['fromuserid']} (#{mapped[:user_id]})" unless QUIET
      # Themen-Nachricht
      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 # PN mit sich selbst?
        # skip = true
        mapped[:target_usernames] = "system"
        puts "pm-#{m['pmtextid']} hat kein Ziel (#{m['touserarray']})"
      end
    else # Antwort
      topic_id = topic_lookup_from_imported_post_id("pm-#{topic_id}")
      if !topic_id
        skip = true
      end
      mapped[:topic_id] = topic_id
      puts "Antwort-Nachricht #{topic_id}: #{m['topic_id']}: von #{m['fromuserid']} (#{mapped[:user_id]})"  unless QUIET
    end
    #        puts "#{target_usernames} -- #{mapped[:target_usernames]}"
    #        puts "Füge #{mapped} hinzu"
    skip ? nil : mapped
    #        puts "#{'-'*50}> hinzugefügt"
  end
end

So sieht die Tabelle jetzt aus

Das Problem tritt bei mt_invited_members auf.

Wenn Sie diese Zeile der Nachricht aus der Anfrage entfernen, wird sie importiert, aber die Kette der Antworten geht verloren. Ich verstehe kaum, welche Änderungen vorgenommen werden müssen, damit private Nachrichten korrekt importiert werden.
Ich habe versucht, mt_invited_members durch mt_starter_id zu ersetzen.

Nachrichten wurden überhaupt nicht importiert.

Momentan habe ich es geschafft, eines von zwei Import-Skripten zu erstellen, das von IPS 4.5 nach Discourse importiert.

Benutzer
Avatare
Private Nachrichten (teilweise)
Kategorien
Foren
Themen

Beim Importieren von Anhängen gibt es noch einige Probleme. Sobald das Skript fertig ist, werde ich es definitiv der Öffentlichkeit zur Verfügung stellen.

Inhaltsverzeichnis