# frozen_string_literal: true class WowCharacterAchievementsWorker < WowSidekiqWorker def perform(wow_character_id) return unless (wow_character = WowCharacter.find_by(character_id: wow_character_id)) RBattlenet.set_options(locale: 'en_US') params = { realm: wow_character.wow_realm.slug, name: wow_character.name.downcase } result = RBattlenet::Wow::Character::Achievements.find(params) return unless result.status_code == 200 result.achievements&.each do |achievement| next unless (wow_achievement = WowAchievement.find_by(achievement_id: achievement.id)) wow_achievement_completed = CompletedWowAchievement.where( wow_achievement: wow_achievement, wow_character: wow_character ).first_or_initialize wow_achievement_completed.completed_timestamp = Time.at(achievement.completed_timestamp.to_s[0..-4].to_i).utc wow_achievement_completed.save if achievement.criteria next unless (wow_achievement_criterium = WowAchievementCriterium.find_by(criterium_id: achievement.criteria.id)) wow_achievement_criterium_completed = CompletedWowAchievementCriterium.where( wow_achievement_criterium: wow_achievement_criterium, wow_character: wow_character ).first_or_initialize wow_achievement_criterium_completed.is_completed = achievement.criteria.is_completed wow_achievement_criterium_completed.amount = achievement.criteria.amount if achievement.criteria.amount wow_achievement_criterium_completed.save achievement.criteria.child_criteria&.each do |child_criteria| next unless (wow_achievement_child_criterium = WowAchievementCriterium.find_by(criterium_id: child_criteria.id)) wow_achievement_child_criterium_completed = CompletedWowAchievementCriterium.where( wow_achievement_criterium: wow_achievement_child_criterium, wow_character: wow_character ).first_or_initialize wow_achievement_child_criterium_completed.is_completed = child_criteria.is_completed wow_achievement_child_criterium_completed.amount = child_criteria.amount if child_criteria.amount wow_achievement_child_criterium_completed.save end end end end end