add achievement management
This commit is contained in:
62
app/workers/wow_achievement_detail_worker.rb
Normal file
62
app/workers/wow_achievement_detail_worker.rb
Normal file
@@ -0,0 +1,62 @@
|
||||
# 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
|
||||
wow_achievement.icon = RBattlenet::Wow::AchievementMedia.find(result.media.id).assets[0].value if result.media
|
||||
|
||||
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
|
||||
locales.each do |locale|
|
||||
Mobility.with_locale(locale[0]) { wow_achievement_criterium.description = criteria.description[locale[1]] }
|
||||
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
|
||||
locales.each do |locale|
|
||||
Mobility.with_locale(locale[0]) { wow_child_achievement_criterium.description = child_criterium.description[locale[1]] }
|
||||
end
|
||||
wow_child_achievement_criterium.save
|
||||
end
|
||||
|
||||
wow_achievement_criterium.persisted? ? wow_achievement_criterium : nil
|
||||
end
|
||||
end
|
||||
Reference in New Issue
Block a user