プライベートメッセージのインポートを支援してください
以前の 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 "参加者の ID のいずれかが 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 # 自分自身への PM?
# 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 を代入しようと試みました。
しかし、メッセージは全くインポートされませんでした。





