class Mission < ActiveRecord::Base extend FriendlyId friendly_id :title, use: :slugged validates_presence_of :title, :slug belongs_to :owner, :class_name => "User" has_many :mission_agents, :dependent => :destroy has_many :agent_steps, :through => :mission_agents has_many :rewards accepts_nested_attributes_for :mission_agents, allow_destroy:true mount_uploader :cover_img, MissionCoverUploader process_in_background :cover_img after_initialize do |user| check_for_time_left end def agent_count return self.mission_agents.count end def confirmed_agent_count confirmed_agents = 0 self.mission_agents.each do |agent| if agent.user != nil confirmed_agents = confirmed_agents + 1 end end return confirmed_agents end def agent_count_stats return String.new("#{self.confirmed_agent_count}/#{self.agent_count}") end def step_count total_steps = 0 self.mission_agents.each do |agent| total_steps = total_steps + agent.agent_steps.count end return total_steps end def completed_steps_count completed_steps = 0 self.mission_agents.each do |agent| agent.agent_steps.each do |step| if step.completed completed_steps = completed_steps + 1 end end end return completed_steps end def step_count_stats return String.new("#{self.completed_steps_count}/#{self.step_count}") end def percentage_completed steps_mod = 0.8 agents_mod = 0.3 completed = (completed_steps_count * steps_mod) + (confirmed_agent_count * agents_mod) total = (step_count * steps_mod) + (agent_count * agents_mod) if total > 0 percentage = (100/total) * completed else if self.status == 3 percentage = 100 else percentage = 0 end end return percentage end def is_agent(user) if user if self.mission_agents.where(user_id: user.id).count > 0 return true end end return false end def all_steps_completed if self.step_count > 0 self.mission_agents.each do |agent| agent.agent_steps.each do |step| if step.completed == false || step.completed == nil return false end end end return true else return false end end def check_for_time_left if self.status == 2 && self.end_date != nil if self.seconds_left <= 0 self.check_for_completion end end end def check_for_completion if self.status == 1 || self.status == 2 if seconds_left > 0 if self.all_steps_completed self.completed end else self.failed end end end # LAUNCH def launch if self.status == 1 || self.status == nil if self.duration_scale == "days" self.end_date = self.duration_number.days.from_now elsif self.duration_scale == "hours" self.end_date = self.duration_number.hours.from_now end self.launch_date = Time.now self.status = 2 self.save return true end return false end def completed analytics = Analytics.new analytics.track('Mission completed') self.update(status: 3) self.rewards.each do |reward| reward.distribute end end def failed analytics = Analytics.new analytics.track('Mission failed') self.update(status: 4) end def seconds_left if self.end_date seconds_left = self.end_date - Time.now return seconds_left else return 0 end end def time_left array = self.time_left_stats return "#{array[0]} #{array[1]}" end def time_left_stats if self.status == 3 || self.status == 4 time = '0' time_scale = (I18n.t 'time.seconds') elsif self.status == 1 && self.end_date == nil time = '?' elsif self.end_date days_left = self.seconds_left / 60 / 60 / 24 if days_left >= 2 time = days_left.round.to_s time_scale = (I18n.t 'time.days') elsif days_left < 2 hours_left = self.seconds_left / 60 / 60 if hours_left >= 2 time = hours_left.round.to_s time_scale = (I18n.t 'time.hours') elsif hours_left < 2 minutes_left = self.seconds_left / 60 if minutes_left > 3 time = minutes_left.round.to_s time_scale = (I18n.t 'time.minutes') elsif minutes_left <= 3 time = self.seconds_left.round.to_s time_scale = (I18n.t 'time.seconds') end end end else time = '∞' time_scale = '' end if time_scale != '' time_scale = (time_scale.to_s + ' ' + (I18n.t 'time.remaining')) end array = [time, time_scale] return array end # Step Submissions for Mission Control def step_submissions submissions = Array.new self.mission_agents.each do |agent| agent.agent_steps.each do |step| if step.step_submissions.count > 0 if step.step_submissions.last.validated == nil submissions << step.step_submissions.last end end end end return submissions end end