سكريبت استيراد Discourse من IPS4

المساعدة في تشكيل استيراد الرسائل الخاصة

هناك كود مكتوب للإصدار السابق من ipb3
في الإصدار الجديد من ips4، تم إعادة تسمية بعض الجداول

ملخص

def import_private_messages
puts “”, “جاري استيراد الرسائل الخاصة…”

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 "معالجة #{private_messages.count} رسائل"
  break if private_messages.count < 1
  puts "معالجة . . . "
  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?

    # المستخدمين الذين يشاركون في هذه الرسالة الخاصة.
    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 "تم العثور على مستخدم: #{to_user} -- #{user_id} -- #{username}"
        else
          puts "لا يمكن العثور على المستخدم: #{to_user}"
        end
      end
    rescue
      puts "تجاوز pm-#{m['pmtextid']} `to_user_array` تالفة -- #{to_user_array.inspect}"
      skip = true
    end

    participants = target_userids
    participants << mapped[:user_id]
    begin
      participants.sort!
    rescue
      puts "معرف أحد المشاركين هو nil -- #{participants.inspect}"
    end

    if last_private_message_topic_id != m['topic_id']
      last_private_message_topic_id = m['topic_id']
      puts "رسالة جديدة: #{m['topic_id']}: #{title} من #{m['fromuserid']} (#{mapped[:user_id]})" unless QUIET
      # رسالة موضوع
      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 # رسالة خاصة مع نفسك؟
        # skip = true
        mapped[:target_usernames] = "system"
        puts "pm-#{m['pmtextid']} ليس لها مستهدف (#{m['touserarray']})"
      end
    else # رد
      topic_id = topic_lookup_from_imported_post_id("pm-#{topic_id}")
      if !topic_id
        skip = true
      end
      mapped[:topic_id] = topic_id
      puts "رسالة رد #{topic_id}: #{m['topic_id']}: من #{m['fromuserid']} (#{mapped[:user_id]})"  unless QUIET
    end
    #        puts "#{target_usernames} -- #{mapped[:target_usernames]}"
    #        puts "إضافة #{mapped}"
    skip ? nil : mapped
    #        puts "#{'-'*50}> تمت الإضافة"
  end
end

هذا هو شكل الجدول الآن

تظهر المشكلة مع mt_invited_members

إذا قمت بإزالة هذا السطر من الرسالة من الطلب، فسيتم استيراده ولكن سلسلة الردود تضيع. بالكاد أفهم ما الذي يحتاج إلى تعديله حتى يتم استيراد الرسائل الخاصة بشكل صحيح.
حاولت استبدال mt_invited_members بـ mt_starter_id

لم يتم استيراد الرسائل على الإطلاق

في الوقت الحالي، تمكّنت من إعداد أحد سكريبتين للاستيراد ينقل البيانات من IPS 4.5 إلى Discourse.

المستخدمون
الصور الرمزية
الرسائل الخاصة (جزئيًا)
التصنيفات
المنتديات
المواضيع

أواجه بعض المشاكل في استيراد المرفقات. بمجرد اكتمال السكريبت، سأشاركه بالتأكيد مع الجمهور.

جدول المحتويات