about summary refs log tree commit diff
diff options
context:
space:
mode:
authormultiple creatures <dev@multiple-creature.party>2019-10-13 20:14:54 -0500
committermultiple creatures <dev@multiple-creature.party>2019-10-13 20:14:54 -0500
commit47cd2611bf4dc5f9fa14e5c82c032912a9b8cab8 (patch)
tree7fc6a21e3cd550145e1bc469a441f8b8b1502603
parent592790418d37483f247696f81b24ad62e3448842 (diff)
(optionally) announce the success of werewolf transformations
-rw-r--r--Gemfile2
-rw-r--r--Gemfile.lock2
-rw-r--r--app/models/form/admin_settings.rb2
-rw-r--r--app/views/admin/settings/edit.html.haml5
-rw-r--r--app/workers/scheduler/werewolf_scheduler.rb44
-rw-r--r--config/locales/en.yml3
-rw-r--r--config/settings.yml1
-rw-r--r--config/sidekiq.yml3
8 files changed, 62 insertions, 0 deletions
diff --git a/Gemfile b/Gemfile
index aa818123e..b7bd864ed 100644
--- a/Gemfile
+++ b/Gemfile
@@ -151,3 +151,5 @@ end
 gem 'concurrent-ruby', require: false
 
 gem "ruby-bbcode", "~> 2.0"
+
+gem "sun_calc", "~> 0.1.0"
diff --git a/Gemfile.lock b/Gemfile.lock
index fd0d751d2..e2d951be2 100644
--- a/Gemfile.lock
+++ b/Gemfile.lock
@@ -596,6 +596,7 @@ GEM
       multi_json (~> 1.8)
     strong_migrations (0.3.1)
       activerecord (>= 3.2.0)
+    sun_calc (0.1.0)
     temple (0.8.1)
     terminal-table (1.8.0)
       unicode-display_width (~> 1.1, >= 1.1.1)
@@ -767,6 +768,7 @@ DEPENDENCIES
   stoplight (~> 2.1.3)
   streamio-ffmpeg (~> 3.0)
   strong_migrations (~> 0.3)
+  sun_calc (~> 0.1.0)
   thor (~> 0.20)
   tty-command (~> 0.8)
   tty-prompt (~> 0.18)
diff --git a/app/models/form/admin_settings.rb b/app/models/form/admin_settings.rb
index a2ea2489b..8eea46b18 100644
--- a/app/models/form/admin_settings.rb
+++ b/app/models/form/admin_settings.rb
@@ -36,6 +36,7 @@ class Form::AdminSettings
     show_replies_in_public_timelines
     auto_reject_unknown
     auto_mark_known
+    werewolf_status
   ).freeze
 
   BOOLEAN_KEYS = %i(
@@ -53,6 +54,7 @@ class Form::AdminSettings
     show_replies_in_public_timelines
     auto_reject_unknown
     auto_mark_known
+    werewolf_status
   ).freeze
 
   UPLOAD_KEYS = %i(
diff --git a/app/views/admin/settings/edit.html.haml b/app/views/admin/settings/edit.html.haml
index 80f76c3c5..60d6c51f4 100644
--- a/app/views/admin/settings/edit.html.haml
+++ b/app/views/admin/settings/edit.html.haml
@@ -87,6 +87,11 @@
   %hr.spacer/
 
   .fields-group
+    = f.input :werewolf_status, as: :boolean, wrapper: :with_label, label: t('admin.settings.werewolf_status.title'), hint: t('admin.settings.werewolf_status.desc_html')
+
+  %hr.spacer/
+
+  .fields-group
     = f.input :min_invite_role, wrapper: :with_label, collection: %i(disabled user moderator admin), label: t('admin.settings.registrations.min_invite_role.title'), label_method: lambda { |role| role == :disabled ? t('admin.settings.registrations.min_invite_role.disabled') : t("admin.accounts.roles.#{role}") }, include_blank: false, collection_wrapper_tag: 'ul', item_wrapper_tag: 'li'
 
   .fields-group
diff --git a/app/workers/scheduler/werewolf_scheduler.rb b/app/workers/scheduler/werewolf_scheduler.rb
new file mode 100644
index 000000000..6b5764887
--- /dev/null
+++ b/app/workers/scheduler/werewolf_scheduler.rb
@@ -0,0 +1,44 @@
+# frozen_string_literal: true
+
+class Scheduler::WerewolfScheduler
+  include Sidekiq::Worker
+  include Redisable
+
+  STATUS = ENV.fetch('WEREWOLF_STATUS', 'Werewolves successful.')
+  FOOTER = ENV.fetch('WEREWOLF_FOOTER', ':werewolf: werewolf-status')
+
+  sidekiq_options unique: :until_executed
+
+  def perform
+    return if redis.exists('werewolf-status')
+    return unless Setting.werewolf_status
+
+    moon_fraction = SunCalc.moon_illumination(Time.now.utc)[:fraction]
+
+    return unless moon_fraction >= 0.998
+
+    redis.setex('werewolf-status', 1.day, 1)
+
+    announcer = find_announcer_acct
+    return if announcer.nil?
+
+    s = PostStatusService.new.call(
+      announcer,
+      visibility: :public,
+      text: STATUS,
+      footer: FOOTER,
+      content_type: 'text/console',
+    )
+
+    DistributionWorker.perform_async(s.id)
+    ActivityPub::DistributionWorker.perform_async(s)
+  end
+
+  private
+
+  def find_announcer_acct
+    announcer = ENV['ANNOUNCEMENTS_USER'].to_i
+    return if announcer == 0
+    Account.find_by(id: announcer)
+  end
+end
diff --git a/config/locales/en.yml b/config/locales/en.yml
index 934555da8..51f2406d8 100644
--- a/config/locales/en.yml
+++ b/config/locales/en.yml
@@ -511,6 +511,9 @@ en:
       auto_mark_known:
         desc_html: Learn known accounts from outgoing interactions and incoming repeats from packmates.
         title: Auto-learn known accounts
+      werewolf_status:
+        desc_html: Enable werewolf status Easter egg (requires an announcer account)
+        title: Werewolf status
       title: Site settings
     statuses:
       back_to_account: Back to account page
diff --git a/config/settings.yml b/config/settings.yml
index ac2cf63a0..70aadd574 100644
--- a/config/settings.yml
+++ b/config/settings.yml
@@ -67,6 +67,7 @@ defaults: &defaults
   default_content_type: 'text/x-bbcode+markdown'
   auto_reject_unknown: true
   auto_mark_known: true
+  werewolf_status: true
 
 development:
   <<: *defaults
diff --git a/config/sidekiq.yml b/config/sidekiq.yml
index cb4cb2d2b..7c2092315 100644
--- a/config/sidekiq.yml
+++ b/config/sidekiq.yml
@@ -25,6 +25,9 @@
   prune_database_scheduler:
     every: '1d'
     class: Scheduler::PruneDatabaseScheduler
+  werewolf_scheduler:
+    every: '1h'
+    class: Scheduler::WerewolfScheduler
   media_cleanup_scheduler:
     cron: '<%= Random.rand(0..59) %> <%= Random.rand(3..5) %> * * *'
     class: Scheduler::MediaCleanupScheduler