Discourse Retort

Мой Script framework to rearrange topics and categories получил новую функцию, которая выходит за рамки простого перемещения тем и категорий!

Я обычно не забываю предупреждать, что не знаю Ruby или Ruby on Rails, поэтому мой код скорее идиосинкразичен, чем идиоматичен. Но, судя по тестированию, он работает!

  def migrateRetortToReactions(allowed:, likes: nil, emojimap: nil)
    # мигрируем, где это возможно, не переопределяя существующие лайки
    # это неизбежно упрощённое преобразование, согласованное только благодаря порядку PostDetail
    # попытка предпочесть одну запись PostDetail другой не предпринимается
    emojimap = {} if emojimap.nil?
    allowed.each do |a|
      emojimap[a] = a
    end
    retort = "retort".freeze
    emojiType = "emoji".freeze
    usermap = Hash.new { |hash, username| hash[username] = User.find_by_username(username) }
    postmap = Hash.new { |hash, post_id| hash[post_id] = Post.find(post_id) }
    likeType = PostActionType.where(name_key: "like").pluck(:id).first

    PostDetail.where(extra: retort).each do |pd|
      begin
        p = postmap[pd.post_id]
      rescue
        # PostDetail не согласован относительно удаления
        $stderr.puts sprintf("Не удалось найти пост для %d: %s / %s", pd.post_id, pd.key, pd.value)
        next
      end
      emoji = pd.key.split('|').first
      users = JSON.parse(pd.value)
      users.each do |user|
        u = usermap[user]
        next if u.nil? # изменённое имя пользователя или удалённый пользователь оставляют «сиротские» Retorts
        if likes.include?(emoji)
          pa = PostAction.where(post_id: p.id, user_id: u.id, post_action_type_id: likeType).first
          next unless pa.nil?
          $stderr.puts sprintf("Добавляем лайк для Retort %s пользователя %s в %s", emoji, user, p.url)
          PostActionCreator.create(u, p, :like, created_at: pd.created_at, silent: true)
        elsif emojimap.has_key?(emoji)
          e = emojimap[emoji]
          r = DiscourseReactions::Reaction.where(post_id: p.id, reaction_type: emojiType, reaction_value: e).first_or_create
          ru = DiscourseReactions::ReactionUser.where(user_id: u.id, post_id: p.id).first
          next unless ru.nil?
          $stderr.puts sprintf("Конвертируем Retort %s в Reaction %s для пользователя %s в %s", emoji, e, user, p.url)
          DiscourseReactions::ReactionUser.create(reaction_id: r.id, user_id: u.id, post_id: p.id, created_at: pd.created_at)
        else
          $stderr.puts sprintf("Игнорируем несоответствующий Retort %s для пользователя %s в %s", emoji, user, p.url)
        end
      end
    end
  end

Я использую созданный мной фреймворк для предоставления YAML-конфигурации, которая выглядит так:

- migrateRetortToReactions:
    allowed:
      - rofl
      - astonished
      - crossed_fingers
      - sob
      - thinking
      - grimacing
      - frowning_face
      - drum
    likes:
      - dart
      - +1
      - joy
      - "100"
      - brain
      - heart
      - heart_eyes
      - hearts
    emojimap:
      rage: sob
      four_leaf_clover: crossed_fingers
      cry: sob
      open_mouth: astonished
      scream: frowning_face

Однако вы можете просто обернуть это в Ruby-скрипт, сделав эти аргументы буквальным Ruby-кодом, поместить его в директорию script/ и запустить.

2 лайка