가져온 비공개 토론이 작성자 받은 편지함에 표시되지 않음

안녕하세요, vBulletin5 데이터베이스에서 개인 메시지를 가져오려고 시도하고 있습니다.

동작은 하지만, 작성자 프로필에서 해당 토론이 "보낸 편지함"에만 표시되고 "받은 편지함"에는 표시되지 않습니다.

다른 참여자의 프로필에서는 해당 토론이 "받은 편지함"과 “보낸 편지함” 모두에 올바르게 표시됩니다.

작성자 프로필:
"보낸 편지함"에 표시됩니다.

하지만 "받은 편지함"에는 표시되지 않습니다.

다른 참여자 프로필:
두 곳 모두에 표시됩니다:

작성자의 받은 편지함에 해당 토론이 표시되도록 어떻게 해야 하나요?

필요하다면 현재 제 어수선한 코드를 공유합니다.

  def import_pm
    puts "", "importing topics PMs..."

    pms_count = mysql_query("SELECT COUNT(nodeid) cnt, starter
        FROM #{DB_PREFIX}node
        WHERE (unpublishdate = 0 OR unpublishdate IS NULL)
        AND (approved = 1 AND showapproved = 1)    
          AND starter = 2676436
        AND contenttypeid=#{@pm};"
    ).first["cnt"]

    batches(BATCH_SIZE) do |offset|
      pms = mysql_query <<-SQL
        SELECT pm.nodeid AS pmid, pm.starter, pm.title, pm.parentid AS parentid,pm.open,pm.userid AS postuserid,pm.publishdate AS dateline,
            nv.count views, 1 AS visible, pm.sticky,
            CONVERT(CAST(rawtext AS BINARY)USING utf8) AS raw
        FROM #{DB_PREFIX}node pm
        LEFT JOIN #{DB_PREFIX}nodeview nv ON nv.nodeid=pm.nodeid
        LEFT JOIN #{DB_PREFIX}text txt ON txt.nodeid=pm.nodeid
        WHERE
          pm.contenttypeid = #{@pm}
          AND (pm.unpublishdate = 0 OR pm.unpublishdate IS NULL)
          AND pm.approved = 1 AND pm.showapproved = 1
          AND pm.starter = 2676436
        ORDER BY pm.nodeid
          LIMIT #{BATCH_SIZE}
          OFFSET #{offset}
      SQL

      break if pms.size < 1

      create_posts(pms, total: pms_count, offset: 0) do |pm|
        p = {}

        p[:id] = "pm-#{pm['pmid']}"
        p[:user_id] = user_id_from_imported_user_id(pm['postuserid']) || Discourse::SYSTEM_USER_ID
        p[:raw] = preprocess_post_raw(pm['raw']) rescue nil
        p[:created_at] = parse_timestamp(pm["dateline"]),

        topic_id = nil

        next if p[:raw].blank?

        # if first post
        if pm['parentid'] == 8 
          #next unless post = topic_lookup_from_imported_post_id("pm-#{pm["pmid"]}")

          target_usernames = []
          target_userids = []
          # get user list
          userlist = mysql_query("select distinct userid from sentto where nodeid = #{pm["starter"]}")
          userlist.each do |user|
            userid = user_id_from_imported_user_id(user["userid"]) || Discourse::SYSTEM_USER_ID;
            target_userids << userid || Discourse::SYSTEM_USER_ID
            target_usernames << User.find_by(id: userid).try(:username) || "system"
          end

          participants = target_userids
          begin
            participants.sort!
          rescue
            puts "one of the participant's id is nil -- #{participants.inspect}"
          end

          p[:title] = @htmlentities.decode(pm['title']).strip[0...255]
          p[:archetype] = Archetype.private_message
          p[:target_usernames] = target_usernames.join(',')

          if p[:target_usernames].size < 1 # pm with yourself?
            # skip = true
            p[:target_usernames] = "system"
            puts "pm-#{pm['nodeid']} has no target"
          end
        # if not first post
        else
          next unless topic = topic_lookup_from_imported_post_id("pm-#{pm["starter"]}")
          p[:topic_id] = topic[:topic_id]

        end
        puts "post : #{p}\n"
        p
      end
    end
    exit
  end

데이터 탐색기에서 participant_count 값이 잘못되어 있음을 발견했습니다:
image

1로 표시되어 있지만, 대화에는 두 명이 참여하고 있습니다.
아래와 같이 토픽의 participant_count 필드를 2로 업데이트하면:

Topic.find_by(id: 218613).update(participant_count: 2)

해당 토픽이 이제 작성자의 수신함에 표시됩니다:

예를 들어 reply_count 같은 다른 필드를 업데이트할 때는 이러한 동작을 발견하지 못했으므로, 이는 participant_count 및 기타 일부 필드에 특이한 현상인 것 같습니다.

수입(import) 스크립트에서 다음 코드를 추가해 보았습니다:

p[:participant_count] = target_usernames.count

하지만 작동하지 않았습니다. 아마도 importer 메서드에서 이 필드를 설정할 수 없는 것 같습니다.

그래서 지금 약간 막혀 있습니다. 제가 시작한 것뿐 아니라, 답장이 있는 모든 개인 메시지(PM)가 사용자의 수신함에 표시되기를 바랍니다.

어떤 아이디어가 있을까요?

@kris.kotlarek 이거 어떻게 생각하세요?

그 버그를 언급해 주셔서 감사합니다. 직접 확인해 보았는데요, 말씀하신 대로 participant_count가 올바르지 않으면 메시지가 작성자의 받은 편지함에서 표시되지 않습니다.

또한, create_posts에 해당 파라미터를 명시적으로 추가하더라도 올바르게 설정되지 않는다는 점도 맞습니다.

이유는 TopicCreate에 허용된 파라미터 목록이 명시적으로 지정되어 있기 때문입니다:

오늘 Discourse에 import 모드에서 해당 속성을 수락하도록 하는 PR을 만들 예정입니다.

그동안 최신 버전의 Discourse를 기다리지 않으려면, 스크립트 마지막에 다음 코드를 실행해 보세요.

Topic.private_messages.map(&:update_statistics) - 이렇게 하면 모든 숫자가 올바르게 수정될 것입니다.

PR가 준비되었습니다 - FIX: topic_creator accepts participant_count in import mode - Pull Request #10632 - discourse/discourse - GitHub

병합 및 배포가 완료되면 다음과 같이 사용할 수 있습니다:

create_posts(pms, total: pms_count, offset: 0) do |pm|
...
  p[:topic_opts][:participant_count] = target_usernames.count 
...
end

create_posts 메서드가 post_creator를 평가하여 topic_creator를 트리거하기 때문에 [:topic_opts] 아래에 있어야 합니다.