# frozen_string_literal: true class WowAchievementDetailWorker < WowSidekiqWorker def perform(wow_achievement_id) return unless (wow_achievement = WowAchievement.find_by(achievement_id: wow_achievement_id)) RBattlenet.authenticate(client_id: ENV['BLIZZARD_API_CLIENT_ID'], client_secret: ENV['BLIZZARD_API_CLIENT_SECRET']) RBattlenet.set_options(locale: 'all') # Public data result = RBattlenet::Wow::Achievement.find(wow_achievement_id) return unless result.status_code == 200 locales.each do |locale| Mobility.with_locale(locale[0]) do wow_achievement.description = result.description[locale[1]] wow_achievement.reward_description = result.reward_description[locale[1]] if result.reward_description end end wow_achievement.points = result.points wow_achievement.is_account_wide = result.is_account_wide wow_achievement.display_order = result.display_order wow_achievement.prerequisite_achievement = WowAchievement.find_by(achievement_id: result.prerequisite_achievement.id) if result.prerequisite_achievement wow_achievement.wow_achievement_category = WowAchievementCategory.find_by(category_id: result.category.id) if result.category wow_achievement.wow_achievement_criterium = find_or_create_wow_achievement_criterium(result.criteria) if result.criteria if result.media icon = RBattlenet::Wow::AchievementMedia.find(result.media.id) wow_achievement.icon = icon.assets.first.value if icon.assets.first end wow_achievement.save end def find_or_create_wow_achievement_criterium(criteria) wow_achievement_criterium = WowAchievementCriterium.find_or_initialize_by(criterium_id: criteria.id) wow_achievement_criterium.amount = criteria.amount if criteria.description locales.each do |locale| Mobility.with_locale(locale[0]) { wow_achievement_criterium.description = criteria.description[locale[1]] } end end if criteria.operator wow_achievement_criterium.operator_type = criteria.operator.type locales.each do |locale| Mobility.with_locale(locale[0]) { wow_achievement_criterium.operator_name = criteria.operator.name[locale[1]] } end end wow_achievement_criterium.save criteria.child_criteria&.each do |child_criterium| wow_child_achievement_criterium = WowAchievementCriterium.find_or_initialize_by(criterium_id: child_criterium.id) wow_child_achievement_criterium.parent_criterium = wow_achievement_criterium wow_child_achievement_criterium.amount = child_criterium.amount if child_criterium.description locales.each do |locale| Mobility.with_locale(locale[0]) { wow_child_achievement_criterium.description = child_criterium.description[locale[1]] } end end wow_child_achievement_criterium.save end wow_achievement_criterium.persisted? ? wow_achievement_criterium : nil end end