diff --git a/app/models/user.rb b/app/models/user.rb index 9459db7fe483eef098ba39c3bc7f737bedf7f8f8..892a07bba039e3d6bc98401428f96aaf84cb8dd1 100644 --- a/app/models/user.rb +++ b/app/models/user.rb @@ -170,6 +170,10 @@ class User < ApplicationRecord settings.default_privacy || (account.locked? ? 'private' : 'public') end + def allows_digest_emails? + settings.notification_emails['digest'] + end + def token_for_app(a) return nil if a.nil? || a.owner != self Doorkeeper::AccessToken diff --git a/app/workers/digest_mailer_worker.rb b/app/workers/digest_mailer_worker.rb index 028db89a9a4d4347b58b69e287526be5d2cc9a41..21f1c357a0e4d9cf074360e0b76b9d8f783eae41 100644 --- a/app/workers/digest_mailer_worker.rb +++ b/app/workers/digest_mailer_worker.rb @@ -9,7 +9,7 @@ class DigestMailerWorker def perform(user_id) @user = User.find(user_id) - deliver_digest if user_receives_digest? + deliver_digest if @user.allows_digest_emails? end private @@ -18,8 +18,4 @@ class DigestMailerWorker NotificationMailer.digest(user.account).deliver_now! user.touch(:last_emailed_at) end - - def user_receives_digest? - user.settings.notification_emails['digest'] - end end diff --git a/app/workers/scheduler/email_scheduler.rb b/app/workers/scheduler/email_scheduler.rb new file mode 100644 index 0000000000000000000000000000000000000000..24d0c0ebef70758164fc9879fe14e8ec2c01276e --- /dev/null +++ b/app/workers/scheduler/email_scheduler.rb @@ -0,0 +1,24 @@ +# frozen_string_literal: true +require 'sidekiq-scheduler' + +class Scheduler::EmailScheduler + include Sidekiq::Worker + + def perform + eligible_users.find_each do |user| + next unless user.allows_digest_emails? + DigestMailerWorker.perform_async(user.id) + end + end + + private + + def eligible_users + User.confirmed + .joins(:account) + .where(accounts: { silenced: false, suspended: false }) + .where(disabled: false) + .where('current_sign_in_at < ?', 20.days.ago) + .where('last_emailed_at IS NULL OR last_emailed_at < ?', 20.days.ago) + end +end diff --git a/config/locales/simple_form.en.yml b/config/locales/simple_form.en.yml index ff1a40ccd0f7980dad1abaa9d55e96f9733bd8e5..143daaa2988648fd49722be9dc0b74c18c17043e 100644 --- a/config/locales/simple_form.en.yml +++ b/config/locales/simple_form.en.yml @@ -4,7 +4,7 @@ en: hints: defaults: avatar: PNG, GIF or JPG. At most 2MB. Will be downscaled to 120x120px - digest: Sent after a long period of inactivity with a summary of mentions you've received in your absence + digest: Only sent after a long period of inactivity and only if you have received any personal messages in your absence display_name: one: <span class="name-counter">1</span> character left other: <span class="name-counter">%{count}</span> characters left diff --git a/config/sidekiq.yml b/config/sidekiq.yml index 4c35dcd43a94e7db20120a7230ac32f823039cdf..bfe29b8f818be95aa094f01315394d50daeb39ac 100644 --- a/config/sidekiq.yml +++ b/config/sidekiq.yml @@ -27,3 +27,6 @@ ip_cleanup_scheduler: cron: '<%= Random.rand(0..59) %> <%= Random.rand(3..5) %> * * *' class: Scheduler::IpCleanupScheduler + email_scheduler: + cron: '0 10 * * 2' + class: Scheduler::EmailScheduler diff --git a/lib/tasks/mastodon.rake b/lib/tasks/mastodon.rake index 33969d470c4ff07958f5db13d3842000fb5372f9..38dbed982a6abc587304d10d0f281e169f143dc4 100644 --- a/lib/tasks/mastodon.rake +++ b/lib/tasks/mastodon.rake @@ -171,11 +171,10 @@ namespace :mastodon do end namespace :emails do - desc 'Send out digest e-mails' + desc 'Send out digest e-mails (deprecated)' task digest: :environment do - User.confirmed.joins(:account).where(accounts: { silenced: false, suspended: false }).where('current_sign_in_at < ?', 20.days.ago).find_each do |user| - DigestMailerWorker.perform_async(user.id) - end + # No-op + # This task is now executed via sidekiq-scheduler end end