diff options
-rw-r--r-- | app/controllers/api/v1/werewolf_controller.rb | 64 | ||||
-rw-r--r-- | config/routes.rb | 2 |
2 files changed, 66 insertions, 0 deletions
diff --git a/app/controllers/api/v1/werewolf_controller.rb b/app/controllers/api/v1/werewolf_controller.rb new file mode 100644 index 000000000..74428a290 --- /dev/null +++ b/app/controllers/api/v1/werewolf_controller.rb @@ -0,0 +1,64 @@ +# frozen_string_literal: true + +class Api::V1::WerewolfController < Api::BaseController + respond_to :json + skip_before_action :set_cache_headers + + def index + render json: werewolf_info + end + + private + + def werewolf_info + Rails.cache.fetch("werewolf:info", expires_in: 6.hours) do + this_fraction = moon_fraction(Time.now.utc) + { + werewolf: this_fraction > 0.99, + lastwolf: last_full_moon.strftime('%F'), + nextwolf: next_full_moon.strftime('%F'), + fullness: "#{(this_fraction * 100).round}%", + } + end + end + + def last_full_moon + now = Time.now.utc.beginning_of_day + offset = 0 + growing = false + moon = moon_fraction(now) + last = 0 + + until growing && moon < last + last = moon + offset += 1 + moon = moon_fraction(now - offset.hours) + growing = true unless growing || moon < last + end + + offset -= 1 + now - offset.hours + end + + def next_full_moon + now = Time.now.utc.beginning_of_day + offset = 0 + growing = false + moon = moon_fraction(now) + last = 0 + + until growing && moon < last + last = moon + offset += 1 + moon = moon_fraction(now + offset.hours) + growing = true unless growing || moon < last + end + + offset -= 1 + now + offset.hours + end + + def moon_fraction(time) + SunCalc.moon_illumination(time)[:fraction] + end +end diff --git a/config/routes.rb b/config/routes.rb index 97a6821b3..5d7b8df97 100644 --- a/config/routes.rb +++ b/config/routes.rb @@ -398,6 +398,8 @@ Rails.application.routes.draw do namespace :push do resource :subscription, only: [:create, :show, :update, :destroy] end + + get '/werewolf', to: 'werewolf#index', as: :werewolf end namespace :v2 do |